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