1 - Installation du serveur de ticket KDC

Cet article présente en détails les opérations nécessaires à la mise en place d'un serveur de ticket KerberosV (krb5kdc) ainsi que le programme nécessaire à l'administration distance (kadmind), permettant aux administrateur de gérer les différentes identités (principal selon la terminologie kerberos).

Points à garder en tête avant de mettre en place une archi kerberos:

Pour prévenir ces problèmes nous avons en interne un paquet debian contenant toutes les confs et un scripts chargés d'effectuer les tests 'pré vol'. Extrait de la version pour debian/sarge:

echo "Fichier /etc/hosts"
/bin/cp /etc/hosts $BACKUPS/hosts
sed -ie 's/^127.0.0.1.*$/127.0.0.1       localhost localhost.localdomain/' /etc/hosts

echo "First some Kerberbos/DNS sanity checks ..."
HOST=${HOST:-`hostname -f`}
INA=`$DIG $HOST`
PTR=`$DIG -x $INA`

if [ "$PTR" != "$HOST." ];
   then
       echo "[ERROR] Dns isn't setup correctly. Unable to proceed:"
       echo " $HOST IN A give $INA "
       echo " $INA  PTR  give $PTR "
       exit 10
fi

echo "Verification date"
NTP_INIT=ntp
if [ -x /etc/init.d/ntp-server ]; then
   NTP_INIT=ntp-server
fi
invoke-rc.d $NTP_INIT stop

/usr/sbin/ntpdate pool.ntp.org
sed -i -e 's/#server/server/g' /etc/ntp.conf
invoke-rc.d $NTP_INIT start

Bon revenons à nos moutons, va falloir s'y mettre à se foutu KDC.

Il faut tout d'abord configurer le fichier kdc.conf (debian: /etc/krb5kdc/kdc.conf) pour ajouter notre nouveau realm, exemple:

SYSADMIN.NET = {
                database_name = /var/lib/krb5kdc/sysadmin
                admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
                acl_file = /etc/krb5kdc/kadm5.acl
                key_stash_file = /etc/krb5kdc/stash-sysadmin
                kdc_ports = 750,88
                max_life = 10h 0m 0s
                max_renewable_life = 7d 0h 0m 0s
                master_key_type = des3-hmac-sha1
                supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3
                default_principal_flags = +preauth
        }

Qu'a ton fait ici ?

dans l'ordre:

  1. On définit un emplacement de stockage de la base de mots de passes (database_name)
  2. L'emplacement de la keytab d'admin (admin_keytab, cf man kadmind) qui contient les entrées kadmin/admin et kadmin/changepw pour le domaine
  3. Une liste d'acl gérant l'accès à l'interface d'admin
  4. L'emplacement de la clef de cryptage (key_stash_file) qui protège la base (super sensible)
  5. Les ports d'écoutes
  6. La durée de vie maximum d'un ticket,
  7. La durée de vie maximum d'un ticket renouvelé
  8. le format de la master_key
  9. Une liste de format de cryptage actifs sur le domaine et des salts associés.
  10. Enfin nous rajoutons le flag preauth aux comptes kerberos, cette fonction permet de limiter les possiblitées de brute-force offline des comptes kerberos.

Maintenant il faut s'occuper de la création de la base

Executons la commande suivante, en root: kdb5_util -r SYSADMIN.NET create -s

PS: L'outil va demander un mot de passe utilisé pour sécuriser la base, ce mot de passe ne sert quasiment jamais (notez quand même que l'oublier peut-être une mauvaise idée), donc utilisez un truc très long alacon(tm)(c).

Reste à spécifier qui aura le droit d'effectuer des opérations admin sur le realm, cela se gère via le fichier d'acl dont nous avons déjà parlé.

Ex: pour autoriser les principaux de la forme nom/admin@SYSADMIN.NET à effectuer toute type d'opération: */admin@SYSADMIN.NET *

Si l'on veut que untel puisse seulement lire la base: untel@SYSADMIN.NET il

Liste des droits possibles:

Note: Chaque privilège est annulable en utilisant la majuscule associée (a <> A, etc)

Dernière chose (et pas des moindres): la création du premier compte d'admin. En l'état actuel on ne peut pas utiliser l'outil 'normal' (kadmin) car le démon n'est pas lancé et il serait difficile de s'authentifier de toute façons. Il faut donc utiliser une version spéciale de kadmin, j'ai nommé kadmin.local permettant de passer outre les acl et le serveur d'admin:
kadmin.local -q "addprinc username/admin"


Configuration client:

Reste à configurer le fichier /etc/krb5.conf pour pouvoir faire des tests en local:

[libdefaults]
# parametres par défaults:
        default_realm = SYSADMIN.NET
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
#
[realms]
# associations des serveurs / realms
SYSADMIN.NET = {
        kdc = kdc1.sysadmin.net
        #kdc = kdc2.sysadmin.net
        admin_server = kdc1.sysadmin.net
}
#
[domain_realm]
# liaison nom de domaines / realm
        sysadmin.net = SYSADMIN.NET
        asyd.net   = SYSADMIN.NET
#
[logging]
        kdc = SYSLOG:INFO:DAEMON
        admin_server = SYSLOG:INFO:DAEMON
        default = SYSLOG:INFO:DAEMON

Ca y est vous devriez pouvoir aisément vous authentifier auprès du serveur kerberos local en utilisant la commande kinit et vérifier le résultat en utilisant klist.

TODO: la dernière version de MIT Kerberos (1.6) semble pouvoir utiliser un openldap pour stocker la base de principal .. a fouiller: Configuring Kerberos with OpenLDAP back-end. Permet d'utiliser la replication ldap pour synchroniser les kdc
Fichier attachéTaille
setup-kerberos.sh3.42 Ko