Aller au contenu
NFS : rien, sauf Kerberos ou un certificat

NFS — rien, sauf Kerberos ou un certificat

NFSv3 n'authentifie personne à lui seul ; comment Kerberos ou des certificats clients lui permettent de servir des partages restreints, et ce qu'apporte TLS.

serve "nfs" { addr = "0.0.0.0:2049" }

NFSv3 à lui seul n’authentifie personne

AUTH_UNIX est une affirmation : le client dit « uid 501 » et le réseau ne peut pas le contredire. Il n’y a pas non plus de chiffrement.

Donc un partage qui nomme qui peut l’utiliser n’est pas exporté en NFS. Le refus est affiché au démarrage et dans check, avec sa raison :

nfs    on 0.0.0.0:2049 — scratch
       photos is not served over nfs: it is restricted to alice and bob, and
       NFSv3 on its own has no authentication: AUTH_UNIX is a claim the client
       makes about itself and the wire cannot disagree with it. A kerberos
       block lifts this: sec=krb5 carries a principal a ticket proves; so
       does identity = "certificate" on the nfs serve block: RPC-over-TLS
       with a client certificate naming the person

Un partage sans allow ni writers — quiconque se connecte, en lecture-écriture — est exporté en NFS, car il n’y a là aucune règle que le protocole pourrait manquer d’honorer.

Le refus qui était autrefois définitif

Un bloc kerberos permet à NFS de distinguer les personnes, et un partage restreint est alors servi par ce biais comme partout ailleurs :

kerberos {
  realm  = "EXAMPLE.ORG"
  keytab = "/etc/fileshare/krb5.keytab"
}

sec=krb5 transporte un principal qu’un ticket prouve, plutôt qu’un uid que le client affirme.

Le royaume est comparé, pas seulement le nom avant le @

Deux royaumes peuvent avoir chacun une alice, et un seul d’entre eux est le vôtre.

Sur TLS : la machine, pas la personne

serve "nfs" {
  tls            = true
  client_ca_file = "/etc/fileshare/tls/clients.pem"
}

Depuis la v0.9.0, NFS est servi en RPC-with-TLS (RFC 9289) avec tls = true et un bloc tls. Il chiffre ; avec client_ca_file, il oblige un client à présenter un certificat de cette autorité — c’est-à-dire quel hôte monte. L’uid à l’intérieur reste celui qu’affirme AUTH_SYS : un partage restreint est donc toujours refusé par ce biais. TLS est proposé, pas exigé : un client qui ne le demande jamais se voit toujours servir les partages ouverts.

Une personne, d’après son certificat

Depuis la v0.12.0, un certificat peut nommer une personne — tel que go-authn/bridge en émet un après une connexion auprès d’un fournisseur d’identité — et un partage qui nomme des personnes est alors servi en NFS sans kerberos :

serve "nfs" {
  tls            = true
  client_ca_file = "/etc/fileshare/bridge-x509-ca.pem"
  identity       = "certificate"
  crl_url        = "https://bridge.example.org/x509/crl"   # or crl_file: one is required
}

Le certificat d’un client Linux appartient à un montage

Chaque utilisateur de ce montage agit en tant que la personne que nomme le certificat. Juste sur un poste de travail utilisé par une seule personne ; faux sur une machine où plusieurs personnes se connectent — utilisez sec=krb5 dans ce cas.

Ce que transporte le certificat, la CRL exigée, et ce qui a été mesuré avec un vrai client Linux (MNT en clair, les pièges de tlshd) se trouvent dans NFS, avec des identités issues de certificats.

Créée le par tannevaled

Modifiée le par tannevaled