Bonjour,

Je rencontre un petit point de blocage sur le montage d'un partage NFS4 sur des machines en Debian Squeeze qui utilise kerberos (M.I.T.). Ce sont des machines virtuelles sous VirtualBox 3.2.10.

Le réseau est correctement configuré et les machines peuvent dialoguer entre elles.

J'ai testé deux types de configuration, la première utilise gss/krb5 pour partager les dossiers, la seconde utilise sec=krb5.

Pourquoi vouloir utiliser le second type de configuration? Car dans la documentation man exports on retrouve la chose suivante :
Sécurité RPCSEC_GSS
Il est possible d'utiliser les chaînes spéciales « gss/krb5 », «gss/krb5i », ou « gss/krb5p » pour n'accepter que les clients qui utilisent la sécurité rpcsec_gss. Toutefois, cette syntaxe est obsolète, et sur les noyaux linux 2.6.23 et supérieurs, il faut plutôt utiliser l'option de partage « sec= ».

sec= : L'option sec=, suivie d'une liste (délimitée par des virgules) de niveaux de sécurité, limite le partage aux clients qui utilisent cette sécurité. Les niveaux de sécurité disponibles sont sys (pas de sécurité cryptographique, par défaut), krb5 (authentification seulement), krb5i (protection de l'intégrité) et krb5p (protection de confidentialité). En ce qui concerne la négociation des niveaux de sécurité, l'ordre est important, les niveaux préférés devant être listés les premiers. La position de l'option sec= par rapport aux autres options n'a pas d'influence, sauf si ces options s'appliquent différemment selon le niveau de sécurité.
Dans ce cas, il faudra utiliser de multiples options sec=, et les options qui suivent ne s'appliqueront alors qu'à ce niveau de sécurité. Les seules options utilisables dans ce cas de figure sont ro, rw, no_root_squash, root_squash, et all_squash.
Donc bête comme je suis, je me fie à la documentation qui, cela dit en passant se trompe car l'option sec= peut être suivi d'une liste non pas séparé par des virgules mais par des deux points ":".

Ce n'est pas si bête non plus car j'ai besoin d'utiliser plusieurs types d'authentifications suivant les partages.

1. Premier type de configuration : gss/krb5

Côté serveur

Le fichier /etc/exports
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
 
/export   gss/krb5(rw,fsid=0,insecure,no_subtree_check)
Puis la commande suivante pour recharger les partages et redémarrer le serveur nfs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
exportfs -ra && /etc/init.d/nfs-common restart && /etc/init.d/nfs-kernel-server restart
Côté client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mount -t nfs4 -o sec=krb5 nashome:/ /mnt/nfs4/ -vvv
> mount: fstab path: "/etc/fstab"
> mount: mtab path:  "/etc/mtab"
> mount: lock path:  "/etc/mtab~"
> mount: temp path:  "/etc/mtab.tmp"
> mount: UID:        0
> mount: eUID:       0
> mount: spec:  "nashome:/"
> mount: node:  "/mnt/nfs4/"
> mount: types: "nfs4"
> mount: opts:  "sec=krb5"
> mount: external mount: argv[0] = "/sbin/mount.nfs4"
> mount: external mount: argv[1] = "nashome:/"
> mount: external mount: argv[2] = "/mnt/nfs4/"
> mount: external mount: argv[3] = "-v"
> mount: external mount: argv[4] = "-o"
> mount: external mount: argv[5] = "rw,sec=krb5"
> mount.nfs4: timeout set for Thu Oct 21 14:33:09 2010
> mount.nfs4: trying text-based options 'sec=krb5,addr=192.168.10.5,clientaddr=10.1.2.10'
> nashome:/ on /mnt/nfs4 type nfs4 (rw,sec=krb5)
Le point de montage est correctement créé et uniquement les utilisateurs ayant un jeton peuvent parcourir le montage


2. Second type de configuration : sec=krb5

Côté serveur

Fichier /etc/exports :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
 
/export  *(sec=krb5,rw,fsid=0,insecure,no_subtree_check)
Puis la commande suivante pour recharger les partages et redémarrer le serveur nfs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
exportfs -ra && /etc/init.d/nfs-common restart && /etc/init.d/nfs-kernel-server restart
Côté client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mount -t nfs4 -o sec=krb5 nashome:/ /mnt/nfs4/ -vvv
> mount: fstab path: "/etc/fstab"
> mount: mtab path:  "/etc/mtab"
> mount: lock path:  "/etc/mtab~"
> mount: temp path:  "/etc/mtab.tmp"
> mount: UID:        0
> mount: eUID:       0
> mount: spec:  "nashome:/"
> mount: node:  "/mnt/nfs4/"
> mount: types: "nfs4"
> mount: opts:  "sec=krb5"
> mount: external mount: argv[0] = "/sbin/mount.nfs4"
> mount: external mount: argv[1] = "nashome:/"
> mount: external mount: argv[2] = "/mnt/nfs4/"
> mount: external mount: argv[3] = "-v"
> mount: external mount: argv[4] = "-o"
> mount: external mount: argv[5] = "rw,sec=krb5"
> mount.nfs4: timeout set for Thu Oct 21 14:55:00 2010
> mount.nfs4: trying text-based options 'sec=krb5,addr=192.168.10.5,clientaddr=10.1.2.10'
Et la commande freeze, je peux attendre des heures sans que ça change. Par contre, 3 minutes après, j'obtiens le message suivant dans syslog
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Oct 21 14:56:00 servicesext kernel: [27816.236611] nfs: server nashome not responding, still trying
Voici un extrait du syslog pour la tentative de montage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Oct 21 14:53:00 servicesext rpc.idmapd[1971]: New client: 32
Oct 21 14:53:00 servicesext rpc.idmapd[1971]: Opened /var/lib/nfs/rpc_pipefs/nfs/clnt32/idmap
Oct 21 14:53:00 servicesext rpc.gssd[1975]: handling gssd upcall (/var/lib/nfs/rpc_pipefs/nfs/clnt32)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: handle_gssd_upcall: 'mech=krb5 uid=0 '
Oct 21 14:53:00 servicesext rpc.gssd[1975]: handling krb5 upcall (/var/lib/nfs/rpc_pipefs/nfs/clnt32)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: process_krb5_upcall: service is '<null>'
Oct 21 14:53:00 servicesext rpc.idmapd[1971]: New client: 33
Oct 21 14:53:00 servicesext rpc.gssd[1975]: Full hostname for 'nashome.desmier.org' is 'nashome.desmier.org'
Oct 21 14:53:00 servicesext rpc.gssd[1975]: Full hostname for 'servicesext.desmier.org' is 'servicesext.desmier.org'
Oct 21 14:53:00 servicesext rpc.gssd[1975]: Key table entry not found while getting keytab entry for 'root/servicesext.desmier.org@DESMIER.ORG'
Oct 21 14:53:00 servicesext rpc.gssd[1975]: Success getting keytab entry for 'nfs/servicesext.desmier.org@DESMIER.ORG'
Oct 21 14:53:00 servicesext rpc.gssd[1975]: INFO: Credentials in CC 'FILE:/tmp/krb5cc_machine_DESMIER.ORG' are good until 1287698985
Oct 21 14:53:00 servicesext rpc.gssd[1975]: INFO: Credentials in CC 'FILE:/tmp/krb5cc_machine_DESMIER.ORG' are good until 1287698985
Oct 21 14:53:00 servicesext rpc.gssd[1975]: using FILE:/tmp/krb5cc_machine_DESMIER.ORG as credentials cache for machine creds
Oct 21 14:53:00 servicesext rpc.gssd[1975]: using environment variable to select krb5 ccache FILE:/tmp/krb5cc_machine_DESMIER.ORG
Oct 21 14:53:00 servicesext rpc.gssd[1975]: creating context using fsuid 0 (save_uid 0)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: creating tcp client for server nashome.desmier.org
Oct 21 14:53:00 servicesext rpc.gssd[1975]: DEBUG: port already set to 2049
Oct 21 14:53:00 servicesext rpc.gssd[1975]: creating context with server nfs@nashome.desmier.org
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_create_default()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_create()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: authgss_create: name is 0x89c8238
Oct 21 14:53:00 servicesext rpc.gssd[1975]: authgss_create: gd->name is 0x89cf678
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_refresh()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: struct rpc_gss_sec:
Oct 21 14:53:00 servicesext rpc.gssd[1975]:      mechanism_OID: { 1 2 134 72 134 247 18 1 2 2 }
Oct 21 14:53:00 servicesext rpc.gssd[1975]:      qop: 0
Oct 21 14:53:00 servicesext rpc.gssd[1975]:      service: 1
Oct 21 14:53:00 servicesext rpc.gssd[1975]:      cred: 0x89d06a0
Oct 21 14:53:00 servicesext rpc.gssd[1975]:      req_flags: 00000002
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_marshal()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_buf: encode success ((nil):0)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_cred: encode success (v 1, proc 1, seq 0, svc 1, ctx (nil):0)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_buf: encode success (0x89d8f88:586)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_init_args: encode success (token 0x89d8f88:586)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_validate()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_buf: decode success (0x89cbb00:4)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_buf: decode success (0x89d8b18:114)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: xdr_rpc_gss_init_res decode success (ctx 0x89cbb00:4, maj 0, min 0, win 128, token 0x89d8b18:114)
Oct 21 14:53:00 servicesext rpc.gssd[1975]: authgss_create_default: freeing name 0x89c8238
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_get_private_data()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: DEBUG: serialize_krb5_ctx: lucid version!
Oct 21 14:53:00 servicesext rpc.gssd[1975]: prepare_krb5_rfc1964_buffer: serializing keys with enctype 4 and length 8
Oct 21 14:53:00 servicesext rpc.gssd[1975]: doing downcall
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_free_private_data()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_destroy()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: in authgss_destroy_context()
Oct 21 14:53:00 servicesext rpc.gssd[1975]: authgss_destroy: freeing name 0x89cf678
Oct 21 14:56:00 servicesext kernel: [27816.236611] nfs: server nashome not responding, still trying