Serveur Kerberos
Sources de la documentation :
Procédure validée sur Debian 13.
Présentation du projet
Nous souhaitons installer un serveur Kerberos utilisant un serveur OpenLDAP comme base de données. Nous utiliserons ce serveur Kerberos pour l'authentification de postes clients. Nous verrons également comment utiliser Kerberos comme système d'authentification pour des applications Web utilisant Apache2.
Kerberos est un protocole d'authentification réseau qui repose sur un mécanisme de clés secrètes (chiffrement symétrique) et l'utilisation de tickets, et non de mots de passe en clair, évitant ainsi le risque d'interception frauduleuse des mots de passe des utilisateurs.
Source : Wikipedia
Installation et configuration du serveur Kerberos
Dans le fichier /etc/hosts, ajouter le nom de domaine du serveur à l'adresse IP locale :
127.0.0.1 localhost test.local krb.test.local
Sur le serveur, installer les paquets suivants :
apt install krb5-kdc krb5-kdc-ldap krb5-admin-server schema2ldif
Lors de l'installation des paquets, répondre aux questions comme suit :
- Royaume ("realm") Kerberos version 5 par défaut
- TEST.LOCAL
- Serveurs Kerberos du royaume
- krb.test.local
- Serveur administratif du royaume Kerberos
- krb.test.local
Créer le royaume Kerberos :
krb5_newrealm
Lors de cette initialisation, saisir le mot de passe principal de la base de données Kerberos.
Reportez-vous à l'article sur l'installation d'OpenLDAP pour la création de l'annuaire LDAP.
Décompresser et installer le schéma LDAP pour Kerberos :
cp /usr/share/doc/krb5-kdc-ldap/kerberos.schema.gz /etc/ldap/schema/ gunzip /etc/ldap/schema/kerberos.schema.gz ldap-schema-manager -i /etc/ldap/schema/kerberos.schema
Créer les comptes utilisés par Kerberos pour interagir avec l'annuaire LDAP en créant le fichier krbAdminEntities.ldif. Pour générer le hash salé du mot de passe, utiliser la commande slappasswd :
dn: uid=kdc-service,dc=test,dc=local
uid: kdc-service
objectClass: account
objectClass: simpleSecurityObject
userPassword: {SSHA}6mKmNt/TNbPGjS4651ae8rkPnogkea43
description: Compte utilisé par Kerberos KDC
dn: uid=kadmin-service,dc=test,dc=local
uid: kadmin-service
objectClass: account
objectClass: simpleSecurityObject
userPassword: {SSHA}6mKmNt/TNbPGjS4651ae8rkPnogkea43
description: Compte utilisé pour l'administration du serveur Kerberos
Appliquer les changements :
ldapadd -x -D "cn=admin,dc=test,dc=local" -f krbAdminEntities.ldif -W
Modifier les permissions pour les comptes nouvellement ajoutés en créant le fichier krbAdminEntitiesGrants.ldif :
dn: olcDatabase={1}mdb,cn=config
add: olcAccess
olcAccess: {2}to attrs=krbPrincipalKey
by anonymous auth
by dn.exact="uid=kdc-service,dc=test,dc=local" read
by dn.exact="uid=kadmin-service,dc=test,dc=local" write
by self write
by * none
-
add: olcAccess
olcAccess: {3}to dn.subtree="cn=krbContainer,dc=test,dc=local"
by dn.exact="uid=kdc-service,dc=test,dc=local" read
by dn.exact="uid=kadmin-service,dc=test,dc=local" write
by * none
-
add: olcAccess
olcAccess: {4}to dn.subtree="ou=Utilisateurs,dc=test,dc=local"
by dn.exact="uid=kdc-service,dc=test,dc=local" read
by dn.exact="uid=kadmin-service,dc=test,dc=local" write
by * none
Appliquer les changements :
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f krbAdminEntitiesGrants.ldif
Modifier la configuration Kerberos pour utiliser l'annuaire comme base de données. Pour cela, éditer le fichier /etc/krb5.conf :
[libdefaults]
default_realm = TEST.LOCAL
# The following krb5.conf variables are only for MIT Kerberos.
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
rdns = false
# The following libdefaults parameters are only for Heimdal Kerberos.
fcc-mit-ticketflags = true
[realms]
TEST.LOCAL = {
kdc = krb.test.local
admin_server = krb.test.local
default_domain = test.local
database_module = openldap_ldapconf
}
[domain_realm]
.test.local = TEST.LOCAL
test.local = TEST.LOCAL
[dbdefaults]
ldap_kerberos_container_dn = cn=krbContainer,dc=test,dc=local
[dbmodules]
openldap_ldapconf = {
db_library = kldap
# if either of these is false, then the ldap_kdc_dn needs to
# have write access
disable_last_success = true
disable_lockout = true
ldap_kdc_dn = "uid=kdc-service,dc=test,dc=local"
ldap_kadmind_dn = "uid=kadmin-service,dc=test,dc=local"
ldap_service_password_file = /etc/krb5kdc/service.keyfile
ldap_servers = ldapi:///
ldap_conns_per_server = 5
}
Initialiser le royaume dans l'annuaire LDAP :
kdb5_ldap_util -D cn=admin,dc=test,dc=local create -subtrees dc=test,dc=local -r TEST.LOCAL -s -H ldapi:///
Enregistrer dans l'annuaire le mot de passe utilisé pour se connecter au serveur LDAP :
kdb5_ldap_util -D cn=admin,dc=test,dc=local stashsrvpw -f /etc/krb5kdc/service.keyfile uid=kdc-service,dc=test,dc=local kdb5_ldap_util -D cn=admin,dc=test,dc=local stashsrvpw -f /etc/krb5kdc/service.keyfile uid=kadmin-service,dc=test,dc=local
Ajouter les ACL pour l'administrateur Kerberos en créant le fichier /etc/krb5kdc/kadm5.acl :
*/admin@TEST.LOCAL *
Redémarrer les services Kerberos :
systemctl restart krb5-kdc.service krb5-admin-server.service
Pour ajouter un utilisateur dans l'annuaire avec les paramètres Kerberos, lancer la commande suivante :
kadmin.local -q "addprinc -x \"dn=cn=pdubois,ou=Utilisateurs,dc=test,dc=local\" pdubois"
Configuration du client PAM
Installer les paquets nécessaires :
apt install sssd-ldap sssd-krb5 ldap-utils krb5-user
Créer le fichier de configuration SSSD avec les permissions nécessaires :
[sssd] config_file_version = 2 domains = test.local [domain/test.local] id_provider = ldap ldap_uri = ldap://test.local ldap_search_base = dc=test,dc=local ldap_default_bind_dn = cn=kerberos,dc=test,dc=local ldap_default_authtok = test auth_provider = krb5 krb5_server = krb.test.local krb5_kpasswd = krb.test.local krb5_realm = TEST.LOCAL cache_credentials = True ldap_id_use_start_tls = false # Si LDAP sans TLS
Redémarrer SSSD :
systemctl restart sssd.service
Activer la création automatique du répertoire personnel lors de la première connexion :
pam-auth-update --enable mkhomedir
Raccordement d'un serveur Web Apache2
Installer les paquets nécessaires :
apt install libapache2-mod-auth-gssapi apache2
Si Apache2 était déjà installé, pensez à redémarrer le service.
Ajouter un principal permettant au serveur Apache d'interagir avec Kerberos :
kadmin.local -q "addprinc HTTP/krb.test.local"
Enregistrer le keytab associé dans /etc/apache2/webserver.keytab HTTP/krb.test.local :
kadmin.local -q "ktadd -k /etc/apache2/webserver.keytab HTTP/krb.test.local"
Modifier les permissions du fichier keytab de sorte que seul Apache puisse y accéder :
chown www-data:www-data /etc/apache2/webserver.keytab chmod 400 /etc/apache2/webserver.keytab
Ajouter la section suivante au fichier de configuration VirtualHost du service pour lequel vous souhaitez activer le SSO par Kerberos :
<Location "/">
AuthType GSSAPI
AuthName "Kerberos Authentication"
GssapiCredStore keytab:/etc/apache2/webserver.keytab
GssapiAllowedMech krb5
GssapiNegotiateOnce Off
GssapiSSLonly On
GssapiLocalName On
Require valid-user
</Location>
Activer l'authentification avec Kerberos en modifiant les lignes suivantes dans la configuration avancée de Firefox (accessible en saisissant about:config dans la barre d'adresse) :
- network.negotiate-auth.delegation-uris
- .test.local
- network.negotiate-auth.trusted-uris
- .test.local