« Services/Kerberos/Install » : différence entre les versions

De TartareFR
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Ligne 89 : Ligne 89 :
</pre>
</pre>
Chaque champs peut avoir un joker ( astérisque *)
Chaque champs peut avoir un joker ( astérisque *)
* principal''': Il spécifie tout ou partie d'un nom du compte kerberos
* '''principal''': Il spécifie tout ou partie d'un nom du compte kerberos
* permissions: voir le tableau '''Permissions d'administration'''
* '''permissions''': voir le tableau '''Permissions d'administration'''
* target_principal: paramètre optionnel. Il spécifie tout ou partie de domaine Kerberos
* '''target_principal''': paramètre optionnel. Il spécifie tout ou partie de domaine Kerberos
* restrictions: paramètre optionnel. C'est une chaine de caractère représentant les options. Les options possibles sont:
* '''restrictions''': paramètre optionnel. C'est une chaine de caractère représentant les options. Les options possibles sont:
** {+|-}flagname: l'option est forcée à la valeur indiquée. Les options admissibles ici sont les mêmes que les permissions préfixés du signe + ou - (voir le tableau ''Permissions d'administration'')
** {+|-}flagname: l'option est forcée à la valeur indiquée. Les options admissibles ici sont les mêmes que les permissions préfixés du signe + ou - (voir le tableau ''Permissions d'administration'')
** clearpolicy: la politique est forcé avec un paramètre vide (pas de politique)
** clearpolicy: la politique est forcé avec un paramètre vide (pas de politique)

Version du 24 mars 2015 à 14:09

Fonctionnement

  1. Le client demande un ticket au KDC (Centre de distribution de clés) en s'authentifiant
  2. Si l'authentification a réussi, le KDC envoie un ticket au client.
  3. Le client fait la demande de ressource au serveur cible en présentant son ticket Kerberos

KerberosSimple.svg

Les comptes sont appelé principal pour kerberos. Ce peut être un utilisateur, un hôte, un service, etc...

Pré-requis

  • Les clients doivent avoir un nom d'hôte pleinement qualifié et resolvable via un serveur DNS ou via le fichier <path>/etc/hosts</path>
  • Les heures doivent être synchronisées entre les serveurs (via <app>chronyd</app> ou <app>ntpd</app>)

Installation du serveur

Installation

yum install krb5-server krb5-workstation 

Configuration

Idea.png
Rappel des conventions d'écriture
  • le nom de domaine est en minuscule (didier.dnsdynamic.net)
  • le nom du royaume est en majuscule (DIDIER.DNSDYNAMIC.NET)

Remplacement du domaine example.com par le notre dans les fichiers de configuration.

sed -i -e 's/EXAMPLE.COM/DIDIER.DNSDYNAMIC.NET/g' -e 's/example.com/didier.dnsdynamic.net/g' /etc/krb5.conf
sed -i -e 's/EXAMPLE.COM/DIDIER.DNSDYNAMIC.NET/g' /var/kerberos/krb5kdc/kdc.conf
sed -i -e 's/EXAMPLE.COM/DIDIER.DNSDYNAMIC.NET/g' /var/kerberos/krb5kdc/kadm5.acl
TextFileIcon16.png <path>/etc/krb5.conf</path>
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = DIDIER.DNSDYNAMIC.NET
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 DIDIER.DNSDYNAMIC.NET = {
 kdc = kerberos.didier.dnsdynamic.net
 admin_server = kerberos.didier.dnsdynamic.net
}

[domain_realm]
 .didier.dnsdynamic.net = DIDIER.DNSDYNAMIC.NET
 didier.dnsdynamic.net = DIDIER.DNSDYNAMIC.NET
TextFileIcon16.png <path>/var/kerberos/krb5kdc/kdc.conf</path>
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 DIDIER.DNSDYNAMIC.NET = {
  master_key_type = aes256-cts
  #database_name = /var/kerberos/krb5kdc/principal
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
  #default_principal_flags = +preauth
 }
TextFileIcon16.png <path>/var/kerberos/krb5kdc/kadm5.acl</path>
*/admin@DIDIER.DNSDYNAMIC.NET       *

Les droits d'administration sont fixés dans le fichier <path>/var/kerberos/krb5kdc/kadm5.acl</path> et sont sous la forme

principal  permissions  [target_principal  [restrictions] ]

exemple

*/admin@DIDIER.DNSDYNAMIC.NET *
admin                         *

Chaque champs peut avoir un joker ( astérisque *)

  • principal: Il spécifie tout ou partie d'un nom du compte kerberos
  • permissions: voir le tableau Permissions d'administration
  • target_principal: paramètre optionnel. Il spécifie tout ou partie de domaine Kerberos
  • restrictions: paramètre optionnel. C'est une chaine de caractère représentant les options. Les options possibles sont:
    • {+|-}flagname: l'option est forcée à la valeur indiquée. Les options admissibles ici sont les mêmes que les permissions préfixés du signe + ou - (voir le tableau Permissions d'administration)
    • clearpolicy: la politique est forcé avec un paramètre vide (pas de politique)
    • policy pol: la politique est forcé au paramètre pol
    • -{expire, pwexpire, maxlife, maxrenewlife} time: l'option est forcée à la valeur indiquée.
Permissions d'administration
Permission Commentaire
a [Dis]allows the addition of principals or policies
c [Dis]allows the changing of passwords for principals
d [Dis]allows the deletion of principals or policies
i [Dis]allows inquiries about principals or policies
l [Dis]allows the listing of principals or policies
m [Dis]allows the modification of principals or policies
p [Dis]allows the propagation of the principal database (used in Incremental database propagation)
s [Dis]allows the explicit setting of the key for a principal
x Short for admcil. All privileges
* Same as x.

Initialisation

On créer la base de données. Cette étape peut être très longue s'il n'y a pas assez d'entropie. Pour s'assurer qu'il y en ai assez, on peut lancer la commande @find / 1>/dev/null 2>&1@ dans un autre shell afin d'en générer. A la fin, la commande demande la futur mot de passe de la base (xk0un7mysx)

kdb5_util create -s

On ouvre le firewall pour kerberos (port 88)

firewall-cmd --permanent --add-service=kerberos
firewall-cmd --reload

On démarre les services

systemctl start krb5kdc
systemctl start kadmin
systemctl enable kadmin
systemctl enable krb5kdc

Tests

On va lister les principals déjà disponibles

kadmin.local
Authenticating as principal root/admin@DIDIER.DNSDYNAMIC.NET with password.
kadmin.local: listprincs
K/M@DIDIER.DNSDYNAMIC.NET
kadmin/admin@DIDIER.DNSDYNAMIC.NET
kadmin/changepw@DIDIER.DNSDYNAMIC.NET
kadmin/kerberos.didier.dnsdynamic.net@DIDIER.DNSDYNAMIC.NET
krbtgt/DIDIER.DNSDYNAMIC.NET@DIDIER.DNSDYNAMIC.NET
kadmin.local:  exit

Puis ajouter un principal pour l'utilisateur didier

kadmin.local
kadmin.local: ank didier
WARNING: no policy specified for didier@DIDIER.DNSDYNAMIC.NET; defaulting to no policy
Enter password for principal "didier@DIDIER.DNSDYNAMIC.NET": 
Re-enter password for principal "didier@DIDIER.DNSDYNAMIC.NET": 
Principal "didier@DIDIER.DNSDYNAMIC.NET" created.
kadmin.local:  exit

On vérifie que l'utilisateur didier peut acquérir un jeton kerberos. Si la commande ne renvoie rien, c'est que ça s'est bien passé.

kinit didier

On liste les jetons distribués

klist
Ticket cache: KEYRING:persistent:0:0
Default principal: didier@DIDIER.DNSDYNAMIC.NET

Valid starting       Expires              Service principal
25/02/2015 10:47:09  26/02/2015 10:47:06  krbtgt/DIDIER.DNSDYNAMIC.NET@DIDIER.DNSDYNAMIC.NET
        renew until 25/02/2015 10:47:09

On vérifie que l'utilisateur didier ne peut que changer son mot de passe (politique par défaut)

kadmin -p didier
Authenticating as principal didier with password.
Password for didier@DIDIER.DNSDYNAMIC.NET: 
kadmin:  listprincs
get_principals: Operation requires ``list'' privilege while retrieving list.
kadmin:  cpw didier
Enter password for principal "didier@DIDIER.DNSDYNAMIC.NET": 
Re-enter password for principal "didier@DIDIER.DNSDYNAMIC.NET": 
Password for "didier@DIDIER.DNSDYNAMIC.NET" changed.
kadmin:  exit

Pour chaque hôte devant être géré par Kerberos

  • on ajoute un principal avec un mot de passe aléatoire
  • on l'exporte dans un keytab local (celui-ci sera copié dans un deuxième temps sur l'hôte concerné)
kadmin.local
Authenticating as principal didier/admin@DIDIER.DNSDYNAMIC.NET with password.

kadmin.local:  ank -randkey host/test.didier.dnsdynamic.net@DIDIER.DNSDYNAMIC.NET 
WARNING: no policy specified for host/test.didier.dnsdynamic.net@DIDIER.DNSDYNAMIC.NET; defaulting to no policy
Principal "host/test.didier.dnsdynamic.net@DIDIER.DNSDYNAMIC.NET" created.

kadmin.local:  ktadd -k /tmp/krb5.keytab host/test.didier.dnsdynamic.net   
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type des3-cbc-sha1 added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type arcfour-hmac added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type camellia256-cts-cmac added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type camellia128-cts-cmac added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type des-hmac-sha1 added to keytab FILE:/tmp/krb5.keytab.
Entry for principal host/test.didier.dnsdynamic.net with kvno 3, encryption type des-cbc-md5 added to keytab FILE:/tmp/krb5.keytab.

kadmin.local:  exit

On copie ensuite ce keytab local sur le client kerberos (serveur SSH, serveur web, etc...)

Installation sur les clients

On installe les outils kerberos

yum install krb5-workstation

On édite (ou on copie le fichier depuis le serveur) /etc/krb5.conf

On ajoute un utilisateur système didier

useradd -s /bin/bash -m didier
passwd didier

On vérifie que l'utilisateur didier peut acquérir un jeton kerberos depuis ce client.

kinit didier

Connexion locale (pam)

yum install pam_krb5
authconfig --enablekrb5 --update

Client SSH

Avant de le fixer dans le fichier /etc/ssh/ssh_config, on teste

  • On acquiert un jeton kerberos
    kinit didier
  • On se connecte par ssh en forçant l'option _GSSAPIAuthentication_
    ssh didier@kerbtest2.didier.dnsdynamic.net -o "GSSAPIAuthentication yes"
  • Si la connexion est un succès, on vérifie que le fichier /etc/ssh/ssh_config contient bien
    GSSAPIAuthentication yes

A noter que seul l'utilisateur didier peut se connecter avec kerberos (aucun autre utilisateur n'est connu de kerberos)

Authentification Apache

Installation d'apache, du module ssl et du module d'authentification kerberos pour apache

yum install httpd mod_ssl mod_auth_kerb

Ouverture du firewall pour http et https

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
  • Exemple de configuration apache
<Directory /var/www/html/kerb>
    SSLRequireSSL
    AuthType Kerberos
    AuthName "Kerberos Authntication"
    KrbAuthRealms DIDIER.DNSDYNAMIC.NET
    Krb5Keytab /etc/httpd/conf.d/krb5.keytab
    KrbMethodNegotiate Off
    KrbSaveCredentials Off
    KrbVerifyKDC Off
    Require valid-user
</Directory>

Fichier <path>/etc/httpd/conf.d/krb5.keytab</path>

HTTP/kerberos.didier.dnsdynamic.net@DIDIER.DNSDYNAMIC.NET

Récapitulatif des outils d'utilisation et d'administration

  • kinit: Acquiert un nouveau jeton kerberos pour l'utilisateur passé en argument.
  • kdestroy: Efface le jeton de l'utilisateur actif (le nom passé en argument à kinit)
  • klist: Affiche la liste des jetons pour l'utilisateur actif
  • kadmin: Commande d'administration de kerberos.

Références