Configuration NFSv4 Benjamin Barras 24 mars 2010 / révision du 6 mars 2013 & RHEL 1 5.x/6.x, Fedora, Ubuntu 10.x,12.x 1 Introduction Je me suis beaucoup investi dans ce projet, qui n a pas été de toute simplicité, mais qui devient beaucoup plus simple après lecture du présent document. Ce document peut contenir des erreurs (errare humanum est), mais vous pouvez contribuer à son amélioration avec vos remarques constructives. Il a fallu trouver plusieurs parades dont la première consiste à identifier plusieurs personnes sur plusieurs serveurs Kerberos et dont on ne sait pas à l avance sur quel serveur se trouve cette personne. Les autres astuces sont essentiellement des problèmes de configuration mais qui cumulés, compliquent passablement les choses. La configuration va se faire en deux parties, l authentification en première partie et qui sera totalement indépendante du montage NFSv4. La deuxième partie concernera le montage NFSv4 lui-même avec différentes manières de le faire. Pour la suite, il est important de faire toutes les étapes, chacune à son importance! Benjamin Barras Notes 1 Concerne également les distributions basées sur les sources de Red Hat tel que CentOS, Scientific Linux,... 1
2 Packages Vérifier bien que les packages suivants sont bien installés : Pour RHEL & Co 2 : nfs-utils portmap krb5-libs krb5-workstation krb5-auth-dialog pam_krb5 libgssapi nfs4-acl-tools yum -y install nfs-utils portmap krb5-libs krb5-workstation pam_krb5 \ krb5-auth-dialog libgssapi nfs4-acl-tools pam_ldap nss-pam-ldapd Pour Ubuntu : ntp tcsh ldap-utils libnss-ldap libpam-krb5 krb5-user nfs-common autofs5 autofs5-ldap apt-get install ntp apt-get install ksh apt-get install tcsh apt-get install ldap-utils apt-get install libnss-ldap apt-get install libpam-krb5 apt-get install krb5-user apt-get install nfs-common apt-get install autofs5 apt-get install autofs5-ldap Notes 2 Co = RHEL & distributions basées sur ses sources (CentOS,...) + Fedora 2
Première partie Authentification 3 Synchronisation du temps Vous pouvez faire une copie des fichiers de configuration qui seront modifiés : /etc/ntp.conf /etc/ntp/step-tickers /etc/ntp.conf Interface graphique On mettra l adresse IP de son routeur comme serveur de temps : 128.178.x.1 où x est son subnet. Pour les ordinateurs nomades, vous pouvez mettre ntp.metas.ch qui est le serveur de temps de l Office fédérale de métrologie. Fichiers de configuration On ajoutera les deux lignes suivantes, une ligne pour Ubuntu, dans le fichier /etc/ntp.conf : # x = subnet server 128.178.x.1 restrict 128.178.x.1 mask 255.255.255.255 nomodify notrap noquery # x = subnet server 128.178.x.1 et une ligne pour RHEL & Co dans le fichier /etc/ntp/step-tickers si vous voulez synchroniser le temps avant le démarrage du service : # x = subnet 128.178.x.1 3
4 LDAP & Kerberos Il s agit de faire une identification LDAP (uid, gid,...) et une authentification Kerberos (ticket). Faites une copie des fichiers de configuration qui seront modifiés ou ajoutés : /etc/ldap.conf /etc/krb5.conf /etc/nsswitch.conf /etc/pam.d/system-auth-ac A partir de la version 6 de RHEL, vous pouvez utiliser la commande suivante : # Sauver les fichiers de configuration authconfig --savebackup=orig # Restaurer les fichiers de configuration authconfig --restorebackup=orig /etc/ldap.conf /etc/krb5.conf /etc/nsswitch.conf /etc/pam.d/common-auth Configuration On doit avoir au moins ces deux lignes présentent dans le fichier /etc/ldap.conf ou /etc/openldap/ldap.conf : base o=epfl,c=ch uri ldap://ldap.epfl.ch Pour Ubuntu, désactiver l authentification LDAP (LDAP Authentication) avec la commande : pam-auth-update On ajoutera (toujours pour Ubuntu) ldap dans le fichier /etc/nsswitch.conf : passwd: compat ldap group: compat ldap shadow: compat ldap Pour Kerberos, il faut mettre INTRANET.EPFL.CH en MAJUSCULE comme realm, et intranet.epfl.ch en minuscule comme KDC. Vous pouvez toujours changer le realm par défaut dans le fichier krb5.conf. Vous avez le fichier krb5.conf complet en annexe ainsi que la liste des realms. Le tout en une ligne de commande pour RHEL & Co authconfig --kickstart --enableshadow --enablemd5 \ --enableldap --ldapserver=ldap.epfl.ch --ldapbasedn=o=epfl,c=ch \ --enablekrb5 --krb5realm=intranet.epfl.ch --krb5kdc=intranet.epfl.ch \ --enablekrb5kdcdns --enablekrb5realmdns Vous pouvez comparer votre fichier /etc/krb5.conf avec celui qui se trouve en annexe. Pour Ubuntu, il faut juste remplacer le fichier existant par celui en annexe. 4
Pour RHEL & Co, Ubuntu Ne pas oublier de rajouter la ligne suivante dans le fichier /etc/ldap.conf : nss_initgroups backlink sinon l identification sera beaucoup trop lente 3. Quelques remarques Cette configuration n est valable que pour un utilisateur ou plusieurs utilisateurs MAIS s identifiant sur le même contrôleur de domaine. Il n y a pas besoin de sécuriser LDAP (TLS & certificat) puisque l on ne fait pas d authentification avec LDAP. Vous pouvez tester votre configuration en faisant par exemple : id username Utilisateurs dans des domaines différents Si vous devez authentifier des utilisateurs qui se trouvent dans des domaines différents, vous devez modifier votre configuration PAM 4 de la manière suivantes. Pour RHEL & Co, fichier /etc/pam.d/system-auth-ac et pour Fedora il y a encore le fichier /etc/pam.d/password-auth : # RHEL # Cette ligne doit déjà être présente auth sufficient pam_krb5.so use_first_pass # Fedora # Cette ligne doit déjà être présente, vous pouvez la laisser ou la commenter #auth sufficient pam_sss.so use_first_pass # Les lignes suivantes doivent êtrent ajoutées juste après celle ci-dessus auth sufficient pam_krb5.so use_first_pass realm=students.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=enac.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=sb.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=sti.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=sv.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=ic.intranet.epfl.ch Pour Ubuntu, fichier /etc/pam.d/common-auth : # Cette ligne doit déjà être présente, il faut la commenter #auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 # Les lignes suivantes doivent êtrent ajoutées juste après celle ci-dessus auth sufficient pam_krb5.so use_first_pass auth sufficient pam_krb5.so use_first_pass realm=students.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=enac.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=sb.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=sti.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=sv.intranet.epfl.ch auth sufficient pam_krb5.so use_first_pass realm=ic.intranet.epfl.ch 5
Une autre solution, toujours pour Ubuntu et fournie par Samuel Bancal (ENAC) : # ENACIT SB # auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 auth required pam_group.so use_first_pass auth [success=8 default=ignore] pam_krb5.so use_first_pass auth [success=7 default=ignore] pam_krb5.so use_first_pass realm=students.intranet.epfl.ch auth [success=6 default=ignore] pam_krb5.so use_first_pass realm=enac.intranet.epfl.ch auth [success=5 default=ignore] pam_krb5.so use_first_pass realm=sb.intranet.epfl.ch auth [success=4 default=ignore] pam_krb5.so use_first_pass realm=sti.intranet.epfl.ch auth [success=3 default=ignore] pam_krb5.so use_first_pass realm=sv.intranet.epfl.ch auth [success=2 default=ignore] pam_krb5.so use_first_pass realm=ic.intranet.epfl.ch # /ENACIT SB auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass # here s the fallback if no module succeeds auth requisite pam_deny.so # prime the stack with a positive return value if there isn t one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around auth required pam_permit.so # and here are more per-package modules (the "Additional" block) # end of pam-auth-update config # ENACIT SB auth optional pam_exec.so expose_authtok quiet log=/var/log/epfl_keep_cred.log /usr/lo # /ENACIT SB La première entrée (pam_group.so) n est pas nécessaire. Elle permet d attribuer des groupes locaux à la volée aux utilisateurs kerberos selon le fichier /etc/security/group.conf. La dernière entrée illustre la possibilité de mettre d autres instructions pam qui sont exécutées lors d une authentification kerberos ou locale réussie. Tester votre configuration Pour tester l authentification, vous pouvez faire simplement la commande suivante : kinit username@domain.epfl.ch La casse 5 est importante, par exemple : kinit barras@intranet.epfl.ch Password for barras@intranet.epfl.ch: ************ Et ensuite, utiliser klist pour voir votre ticket, et kdestroy pour le détruire. Maintenant vous pouvez tester le login, mais avant vous devez avoir votre Home directory. Le plus simple est d en créer 6 un. Par exemple, pour le mien 7 : /bin/mkdir /home/barras /bin/chown 1216:10072 /home/barras Vous pouvez tester une connection via ssh ou un login à la console 8 avec, bien sûr, votre username/password AD. 6
Sécurité Si vous devez limiter vos accès sur une de vos machine, vous pouvez utiliser le module pam_access.so, pour cela ajouter la ligne suivante : account required pam_access.so dans le fichier /etc/pam.d/system-auth-ac pour RHEL & Co et /etc/pam.d/login pour Ubuntu. Ensuite, ajouter une ligne dans le fichier /etc/security/access.conf du style : - : ALL EXCEPT Logiciels-Libres root :.epfl.ch où Logiciels-Libres est le groupe memberof de LDAP que j autorise ainsi que le user root, dans l exemple ci-dessus, et l accès est autorisé uniquement depuis le domaine epfl.ch. On peut utiliser le pam_filter dans ldap.conf pour limiter également ses accès, mais il se trouve qu on peut très facilement le contourner. De plus, si vous utilisez l authentification Kerberos cela ne servira à rien. Il existe un autre module pam_listfile.so, qui se place au même endroit que le précédent, associé avec un fichier /etc/login.group.allowed qui permet de travailler par groupe uniquement. Notes 3 This option directs the nss_ldap implementation of initgroups(3) to determine a user s group membership by reading the memberof attribute of their directory entry (and of any nested groups), rather than querying on uniquemember. This may provide increased performance with certain directory servers that have peculiar indexing configurations. If RFC2307bis support is disabled, then this option is ignored 4 Pluggable Authentication Modules 5 Case sensitive 6 Ou utiliser le module PAM : pam_mkhomedir.so 7 Que l on trouve dans l annuaire de l école : uid=1216(barras), gid=10072(dit-sb) 8 Il faut malheureusement redémarrer le serveur X «ctrl-alt-backspace», ou bien init 3 ; init 5 pour RHEL & Co si la commande précédente ne marche pas, afin qu il recommence son processus d authentification 7
Deuxième partie Montage NFSv4 Faites une copie des fichiers de configuration qui seront modifiés : /etc/hosts /etc/krb5.keytab /etc/sysconfig/nfs /etc/idmapd.conf /etc/hosts /etc/krb5.keytab /etc/default/nfs-common /etc/idmapd.conf 5 Configuration Vous devez identifier votre serveur, numéro de votre serveur : Numéro de votre serveur = SCIPER modulo 10 Soit, le dernier chiffre de votre numéro SCIPER. Pour mon numéro SCIPER qui est 100216, je serai donc sur le serveur numéro 6 (files6). Ajouter le nom du/des serveur/s dans le fichier /etc/hosts : /bin/cat <<EOF>> /etc/hosts 128.178.102.88 files6.intranet.epfl.ch files6.epfl.ch files6 EOF Cette parade, aussi surprenante soit-elle est recommandée dans la documentation même de Kerberos : Kerberos V5 System Administrator s Guide Vérifier le fichier /etc/resolv.conf : nameserver 128.178.15.8 nameserver 128.178.15.7 search epfl.ch Pour RHEL & Co, éditer le fichier /etc/sysconfig/nfs : SECURE_NFS="yes" # Mode debug #RPCGSSDARGS="-vvv" Pour Ubuntu, éditer le fichier /etc/default/nfs-common : NEED_IDMAPD=yes NEED_GSSD=yes # Mode debug #RPCGSSDARGS="-vvv" 8
ensuite le fichier /etc/idmapd.conf, et remplacer le nom de domaine par epfl.ch : Domain = epfl.ch # Mode debug #Verbosity = 10 # Mode normal Verbosity = 0 Afin de valider ces dernières modifications, démarrer ou redémarrer les services : /etc/init.d/rpcgssd stop /etc/init.d/rpcgssd start /etc/init.d/rpcidmapd stop /etc/init.d/rpcidmapd start service idmapd start service gssd start Génération des clefs Kerberos Copier la clef nfsv4-st-indiv.keytab (http ://mynas.epfl.ch/index.php?p=down), quelque part sur votre disque, par exemple sur /tmp et taper les commandes suivantes : ktutil ktutil: rkt /tmp/nfsv4-st-indiv.keytab ktutil: wkt /etc/krb5.keytab ktutil: l slot KVNO Principal ---- ---- --------------------------------------------------------------------- 1 5 nfs/emc-nfsv4@intranet.epfl.ch ktutil: q Vous pouvez ensuite copier le fichier /etc/krb5.keytab et l utiliser directement pour les autres configurations à faire. Test du montage NFSv4 : mkdir /mnt/barras mount -t nfs4 -o proto=tcp,sec=krb5,port=2049 \ files6.epfl.ch:/dit-files6-t1/data/barras /mnt/barras Où files6 est le serveur identifié ci-dessus (page 8). Ensuite il faut vous identifier avec votre username, su - barras kinit barras@intranet.epfl.ch # INTRANET est le domaine sur lequel se trouve mon compte AD et regarder si vous pouvez accéder à votre dossier /mnt/barras. 9
6 Mise en place de l automount Faites une copie des fichiers de configuration qui seront modifiés : /etc/auto.master /etc/auto.master /etc/ldap/ldap.conf 6.1 Configuration Comme il y a plusieurs méthodes différentes, je décris ces diverses méthodes ensemble. Ajouter les lignes suivantes dans le fichier /etc/auto.master : /home_script /home_list /home_ldap /home_ldapbis /etc/auto.home_script /etc/auto.home_list /etc/auto.home_ldap ldap:ldap.epfl.ch:ou=auto.home,ou=automaps,o=epfl,o=epfl,c=ch où auto.home_script est un script d auto-montage indépendant d un annuaire, auto.home_list contiendra une liste restreinte d utilisateurs, auto.home_ldap va chercher la string d auto-montage dans l annuaire LDAP et la dernière ligne fait la même chose que la précédente mais sans utiliser les fichiers ldap.conf et nsswitch.conf. Si vous ne voulez pas vous retrouvez avec votre home_dir directement monté par NFS, commenter la ligne +auto.master dans ce même fichier : #+auto.master Si vous voulez vraiment votre home_dir monté par NFS. Vous pouvez, ce que je vous conseille de faire, choisir un des /home_* ci-dessus et vous le nommez simplement /home. Créer les fichiers ci-dessus : /etc/auto.home_script #!/bin/bash # key="$1" id= id -u $1 let n=${id}%10 data="files${n}.epfl.ch:/dit-files${n}-t1/data/${key}" echo "-fstype=nfs4,proto=tcp,port=2049,sec=krb5 ${data}" Avec une commande supplémentaire pour le script d auto-montage : chmod +x /etc/auto.home_script /etc/auto.home_list barras -fstype=nfs4,proto=tcp,port=2049,sec=krb5 files6.epfl.ch:/dit-files6-t1/data/barras username -fstype=nfs4,proto=tcp,port=2049,sec=krb5 filesx.epfl.ch:/dit-filesx-t1/data/username Où X est le dernier chiffre du numéro SCIPER correspondant au username. /etc/auto.home_ldap +auto.home 10
Pour Ubuntu, éditer le fichier /etc/ldap/ldap.conf : uri ldap://ldap.epfl.ch base o=epfl,c=ch Toujours pour Ubuntu, ajouter la ligne suivante dans le fichier /etc/nsswitch.conf : automount: files ldap Démarrer ou redémarrer le service autofs : # RHEL \& Fedora /etc/init.d/autofs stop /etc/init.d/autofs start service autofs stop service autofs start Vous pouvez maintenant utiliser votre compte, par exemple : ls -al /home_list/barras ls -al /home_script/barras ls -al /home_ldap/barras ls -al /home_ldapbis/barras Pour RHEL & Fedora, essayer les commandes nfs4_getfacl & nfs4_setfacl. 7 Automount multi-utilisateurs Ajouter les noms de tous les serveurs dans le fichier /etc/hosts : 128.178.102.82 files0.intranet.epfl.ch files0.epfl.ch files0 128.178.102.83 files1.intranet.epfl.ch files1.epfl.ch files1 128.178.102.84 files2.intranet.epfl.ch files2.epfl.ch files2 128.178.102.85 files3.intranet.epfl.ch files3.epfl.ch files3 128.178.102.86 files4.intranet.epfl.ch files4.epfl.ch files4 128.178.102.87 files5.intranet.epfl.ch files5.epfl.ch files5 128.178.102.88 files6.intranet.epfl.ch files6.epfl.ch files6 128.178.102.89 files7.intranet.epfl.ch files7.epfl.ch files7 128.178.102.90 files8.intranet.epfl.ch files8.epfl.ch files8 128.178.102.91 files9.intranet.epfl.ch files9.epfl.ch files9 11
8 Annexes A krb5.conf Download krb5.conf [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = INTRANET.EPFL.CH dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h forwardable = yes allow_weak_crypto = true [realms] INTRANET.EPFL.CH = { kdc = intranet.epfl.ch } [domain_realm] intranet.epfl.ch = INTRANET.EPFL.CH.intranet.epfl.ch = INTRANET.EPFL.CH [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false } 12
B Realm list INTRANET.EPFL.CH SCX.INTRANET.EPFL.CH IC.INTRANET.EPFL.CH ENAC.INTRANET.EPFL.CH SB.INTRANET.EPFL.CH STI.INTRANET.EPFL.CH STUDENTS.INTRANET.EPFL.CH SV.INTRANET.EPFL.CH C auto.home_script Download auto.home_script #!/bin/bash # key="$1" id= id -u $1 let n=${id}%10 data="files${n}.epfl.ch:/dit-files${n}-t1/data/${key}" echo "-fstype=nfs4,proto=tcp,port=2049,sec=krb5 ${data}" 13