samba – stocker vos clés publiques SSH dans AD

L'authentification par clé publique a longtemps été considérée comme l'une des méthodes les plus sûres d'authentification SSH à distance. Cependant, l'utilisation de la même paire de clés pour plus d'une machine peut poser des risques de sécurité, surtout si cette clé n'est pas sécurisée par une phrase de chiffrement. Pour cette raison, je vous propose d'utilisé Samba4 Active Directory comme magasin de clés publiques SSH.

Pré-requis

  • Faire une sauvegarde complète de votre AD Samba4.
  • Activer le paramètre de modification des schemas dans la section global de votre fichier /etc/samba/smb.conf.

    dsdb:schema update allowed = true
  • Relancer le service samba-ad-dc
# /etc/init.d/samba-ad-dc restart

Mise en place du schéma pour accueillir les clés publiques

  • Depuis une machine windows (avec les outils RSAT) ouvrir une console et executer la commande suivante :
regsvr32 schmmgmt.dll

2019-10-12 11.49.23

Toujours dans cette console, exécuter la commande suivante afin d'ouvrir une seconde console afin de lancer un mmc

runas /user:FORMATION\Administrator cmd
mmc

2019-10-12 11.28.12

  • Ajouter le composant logiciel enfichable Schéma Active Directory
  • Clique droit sur Attributs, Créer un attribut…
  • Liser l'avertissement et continuer :
    2019-10-12 11.45.06

  • Renseigner les informations suivantes
    • Nom commun et Nom complet LDAP avec sshPublicKey
    • ID d'objet X.500 unique 1.3.6.1.4.1.24552.1.1.1.13
    • Sélectionner pour Syntaxe Chaîne IA5
    • Cocher À valeurs multiples

sshPublicKeys

  • Clique droit sur Classes, Créer une classe…
  • Renseigner les informations suivantes
    • Nom commun et Nom complet LDAP avec ldapPublicKey
    • ID d'objet X.500 unique 1.3.6.1.4.1.24552.500.1.1.2.0
    • Classe parente top
    • Type de classe Auxiliaire

2019-10-12 11.30.55

  • Cliquer sur Suivant afin d'ajouter l'attribut sshPublicKeys précédemment créé.

2019-10-12 11.31.18

  • Etendre l'objet Classes et ouvrir les propriétés de user afin d'ajouter la classe auxiliaire ldapPublicKey aux relations.

2019-10-12 12.03.55

  • Depuis ADUC, afficher les fonctionnalités avancées afin d'accéder à l'onglet Éditeur d'attributs sur la fiche utilisateur.

2019-10-12 12.07.25

Activer la prise en charge des clés publiques sur votre serveur OpenSSH (ici debian9)

# more /etc/ssh/sshd_config
...
PubkeyAuthentication yes
AuthorizedKeysCommand /usr/bin/ssh-ldap-pubkey-wrapper
AuthorizedKeysCommandUser nobody
#AuthorizedKeysCommand /usr/bin/fetchSSHKeysFromLDAP
#AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
...
# apt-get install python-pip python-ldap python-pyldap
# pip install ssh-ldap-pubkey

# mv /usr/local/bin/ssh-ldap-pubkey /usr/bin/
# mv /usr/local/bin/ssh-ldap-pubkey-wrapper /usr/bin/

# vi /etc/ldap/ldap.conf
...
# SSL sur AD
TLS_CACERTDIR   /etc/ssl/certs/
TLS_REQCERT never
...
# more /etc/ldap.conf


# /etc/ldap.conf
#
# This is the configuration file for OpenSSH LDAP Public Keys (ssh-ldap-pubkey).
#
# This file actually uses a subset of directives from configuration file of the
# LDAP nameservice switch library and the LDAP PAM module, so the same file can
# be used for all these services.
#

# Specifies the URI(s) of the LDAP server(s) to connect to. The URI scheme may
# be ldap, or ldaps, specifying LDAP over TCP or SSL respectively. A port
# number can be specified; the default port number for the selected protocol
# is used if omitted.
uri ldap://10.0.2.4

# The distinguished name of the search base.
base DC=formation,DC=fr

# The LDAP version to use. Default is 3 if supported by client library.
#ldap_version 3

# Enable SASL and specify mechanism to use (currently supported: GSSAPI).
#sasl GSSAPI

# The distinguished name to bind to the server with.
# Default is to bind anonymously.
binddn CN=Administrateur,CN=Users,DC=formation,DC=fr

# The credentials to bind with. Default is no credential.
bindpw Pa$$w0rd

# The search scope; sub, one, or base.
scope sub

# Specifies if the client should automatically follow referrals returned
# by LDAP servers. This must be typically disabled for Active Directory.
# Default is "on".
referrals off

# Search timelimit in seconds (0 for indefinite).
timelimit 5

# Bind/connect timelimit (0 for indefinite).
bind_timelimit 5

# The filter to use when retrieving user information, additional to the login
# attribute value assertion (pam_login_attribute=<login>).
pam_filter objectclass=user

# The user ID attribute (defaults to 'uid').
pam_login_attribute sAMAccountName

# RFC2307bis naming contexts
# Syntax is:
#   nss_base_XXX  base?scope?filter
# where scope is {base,one,sub} and filter is a filter to be &'d with the
# default filter.
#nss_base_passwd    ou=People,dc=example,dc=org?one
nss_base_passwd CN=Users,DC=formation,DC=fr?one

# CA certificates for server certificate verification.
tls_cacertdir /etc/ssl/certs

# Name of LDAP attribute used for SSH public keys.
pubkey_attr sshPublicKey

Afficher la clé présente dans l'AD pour un utilisateur précis

root@debian9:~# ssh-ldap-pubkey list -u colombet
No public keys found.
root@debian9:~# ssh-ldap-pubkey add -D CN=Administrateur,CN=Users,DC=formation,DC=fr -u colombet ~/.ssh/id_rsa.pub
Enter LDAP password for 'CN=Administrateur,CN=Users,DC=formation,DC=fr':
Key has been stored: root@debian9
root@debian9:~# ssh-ldap-pubkey list -u colombet
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcCAbvhse37NgMUhLTT6OhxR9cecaz0NIMVE1B1bq3llR+OGBvyI41nTj+l6pNUqwhvVTHWhHpePOuv562hL6+OTZPlbmYC4NUYFXEOP+M3WgoqlDbKQQoKX4zxznOgcf85xh9w9IrJrlj0H7dJxdEcuModh+E2WsY7LAFHp7UyD5rsPuGAlXqw1oXgEWqInD9JQOFK4KkH35wCWAYGxfZYOemMol/xQfc1ORC65loivXDQfG7oQjk8UfaDH5RM6OsEk9yjBawYB5pCT+XiV9V6OBqno2llc3t9ZmBPjSUzrMbFca8eloOD2CUYwm3vYdFq4MZQ6VngYFFCFY9hR+j root@debian9

Ajouter une clé à l'utilisateur colombet :

# ssh-ldap-pubkey add -D CN=Administrateur,CN=Users,DC=formation,DC=fr -u colombet ~/.ssh/id_rsa.pub

Supprimer la clé publique root@debian9 de l'utilisateur colombet :

# ssh-ldap-pubkey del -u colombet -D CN=Administrateur,CN=Users,DC=formation,DC=fr root@debian9

Gestion de la clé depuis l'utilisateur :

root@debian9:~# su - colombet

colombet@debian9:~$ ssh-ldap-pubkey list
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcCAbvhse37NgMUhLTT6OhxR9cecaz0NIMVE1B1bq3llR+OGBvyI41nTj+l6pNUqwhvVTHWhHpePOuv562hL6+OTZPlbmYC4NUYFXEOP+M3WgoqlDbKQQoKX4zxznOgcf85xh9w9IrJrlj0H7dJxdEcuModh+E2WsY7LAFHp7UyD5rsPuGAlXqw1oXgEWqInD9JQOFK4KkH35wCWAYGxfZYOemMol/xQfc1ORC65loivXDQfG7oQjk8UfaDH5RM6OsEk9yjBawYB5pCT+XiV9V6OBqno2llc3t9ZmBPjSUzrMbFca8eloOD2CUYwm3vYdFq4MZQ6VngYFFCFY9hR+j root@debian9

colombet@debian9:~$ ssh-ldap-pubkey del root@debian9
Enter login (LDAP) password for user 'colombet':
Deleted keys:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcCAbvhse37NgMUhLTT6OhxR9cecaz0NIMVE1B1bq3llR+OGBvyI41nTj+l6pNUqwhvVTHWhHpePOuv562hL6+OTZPlbmYC4NUYFXEOP+M3WgoqlDbKQQoKX4zxznOgcf85xh9w9IrJrlj0H7dJxdEcuModh+E2WsY7LAFHp7UyD5rsPuGAlXqw1oXgEWqInD9JQOFK4KkH35wCWAYGxfZYOemMol/xQfc1ORC65loivXDQfG7oQjk8UfaDH5RM6OsEk9yjBawYB5pCT+XiV9V6OBqno2llc3t9ZmBPjSUzrMbFca8eloOD2CUYwm3vYdFq4MZQ6VngYFFCFY9hR+j root@debian9

Debug

# ldapsearch -h debian9.formation.fr -b 'CN=Users,DC=formation,DC=fr' '(sAMAccountName='"${1%@*}"')' -D 'CN=Administrator,CN=Users,DC=formation,DC=fr' -w 'Pa$$w0rd' 'sshPublicKeys' | sed -n '/^ /{H;d};/sshPublicKeys:/x;$g;s/\n *//g;s/sshPublicKeys: //gp'


# ldapsearch -h dc1ad.formation.fr -b 'CN=Users,DC=formation,DC=fr' '(sAMAccountName='"${1%@*}"')' -D 'CN=Administrateur,CN=Users,DC=formation,DC=fr' -w 'Pa$$w0rd' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

Références

Ajout dans le schema AD

https://github.com/LasLabs/ansible-ad-ssh-key-deployer
https://blog.laslabs.com/2016/08/storing-ssh-keys-in-active-directory/
https://blog.laslabs.com/2017/04/managing-ssh-keys-stored-in-active-directory/
http://david-latham.blogspot.com/2012/12/extending-ad-schema-on-samba4.html

OpenSSH et les clés publiques

https://github.com/jirutka/ssh-ldap-pubkey
https://www.ossramblings.com/using-ldap-to-store-ssh-public-keys-with-sssd
https://patrikwm.github.io/2016/11/11/001-Centos-SSH-Active-Directory.html
https://wiki.lereset.org/ateliers:serveurmail:ldap-ssh