NFS über TLS konfigurieren
- ONTAP-Voraussetzungen
- Schritt 1: Erstellen einer Stammzertifizierungsstelle auf ONTAP
- Schritt 2: Das Serverzertifikat für die Daten-LIF generieren
- Schritt 3: NFS über TLS auf dem Daten-LIF aktivieren
- Schritt 4: Installation des CA-Zertifikats auf dem Linux-Client
- Schritt 5: LIF-FQDN auf dem Client auflösen
- Schritt 6: Einbinden mit NFS über TLS
- Schritt 7: Die TLS-Verbindung überprüfen
- Optional: TLS für bestimmte Clients erzwingen (Exportregel-Durchsetzung)
- Optional: Gegenseitiges TLS (Client-Authentifizierung)
- Wichtige Standardeinstellungen
- REST-Endpunkte
NFS over TLS wird pro LIF mithilfe der vserver nfs tls interface Befehlsfamilie, der /api/protocols/nfs/tls/interfaces REST-Endpunkte oder der NFS-Einstellungen von System Manager konfiguriert.
Exportregel erhalten ein zusätzliches Feld, das die Durchsetzung von ausschließlich TLS-basiertem Zugriff für passende Clients ermöglicht. Befehlsreferenzen finden sich unter "docs.netapp.com". Die REST-API kann interaktiv über die integrierte Swagger-Dokumentation erkundet werden, indem der Browser auf https://<cluster-mgmt-ip>/api/docs zeigt.
ONTAP-Voraussetzungen
Das nachfolgend beschriebene Verfahren setzt voraus, dass die folgenden Voraussetzungen erfüllt sind:
-
ONTAP 9.19.1 oder höher
-
Eine SVM mit aktiviertem NFS-Protokoll
-
Mindestens eine für den grundlegenden NFS-Zugriff konfigurierte Daten-LIF
Schritt 1: Erstellen einer Stammzertifizierungsstelle auf ONTAP
|
|
Option „Externe Zertifizierungsstelle“. Wenn Ihre Organisation eine externe Zertifizierungsstelle verwendet, kann dieser Schritt übersprungen werden. Die CSRs aus Schritt 2 und Schritt 5 werden an die externe Zertifizierungsstelle übermittelt und die resultierenden signierten Zertifikate auf ONTAP installiert. Der restliche Ablauf bleibt unverändert. |
ONTAP kann als interne Zertifizierungsstelle (CA) für Labor- und interne Bereitstellungen fungieren. In diesem Schritt wird auf der SVM eine selbstsignierte Stamm-CA erstellt, die zum Signieren des Serverzertifikats (und optional von Client-Zertifikaten für gegenseitiges TLS) verwendet wird.
ontap9::> security certificate create -vserver <svm> -common-name <ca-name> -type root-ca -size 2048 -hash-function SHA256 -expire-days 3652 -country US -state <state> -locality <city> -organization <org> -unit <unit>
Nach Abschluss des Befehls die CA-Seriennummer abrufen und notieren. Sie wird in Schritt 2 und, bei Verwendung von mutual TLS, in Schritt 5 benötigt.
ontap9::> security certificate show -vserver <svm> -common-name <ca-name> -type root-ca -fields serial
Notieren Sie die Seriennummer: Diese wird <ca-serial> in späteren Schritten benötigt.
Schritt 2: Das Serverzertifikat für die Daten-LIF generieren
ONTAP präsentiert dieses Zertifikat den NFS-Clients während des TLS-Handschlags. Der Common Name (CN) und der Subject Alternative Name (SAN) des Zertifikats müssen mit dem FQDN und der IP-Adresse des LIF übereinstimmen, da tlshd auf dem Client die Serveridentität anhand beider validiert.
|
|
IP-SAN-Anforderung. Wenn geplant ist, NFSv4.1 Session Trunking mit NFS über TLS zu konfigurieren oder wenn ein Mount-Befehl eine rohe IP-Adresse anstelle eines Hostnamens verwendet, muss das Zertifikat einen IP-SAN-Eintrag für jede LIF-IP enthalten, zu der Clients eine Verbindung herstellen. Ohne diesen schlägt der TLS-Handschlag für IP-adressierte Pfade mit „Certificate owner unexpected“ fehl. |
Der ONTAP CSR-Generator (security certificate generate-csr) unterstützt IP-SANs direkt über -ipaddr, der eine durch Kommas getrennte Liste von IP-Adressen akzeptiert.
2a. CSR und privaten Schlüssel generieren.
Fügen Sie `-ipaddr`eine durch Kommas getrennte Liste aller LIF-IP-Adressen hinzu, die NFS over TLS-Datenverkehr übertragen. Fügen Sie `-dns-name`die Hostnamen hinzu, die in Mount-Befehlen verwendet werden.
ontap9::> security certificate generate-csr -common-name <lif-fqdn> -security-strength 128 -hash-function SHA256 -extended-key-usage serverAuth -dns-name <lif-fqdn> -ipaddr <lif-ip>[,<lif-ip-2>,...] -country US -state <state> -locality <city> -organization <org> -unit <unit>
Beispiel für ein einzelnes LIF:
ontap9::> security certificate generate-csr -common-name nfs.example.com -security-strength 128 -hash-function SHA256 -extended-key-usage serverAuth -dns-name nfs.example.com -ipaddr 192.0.2.130 -country US -state CA -locality SanJose -organization "MyOrg" -unit "Storage"
Für Session-Trunking über zwei LIF-IPs beide in einer durch Kommas getrennten Liste angeben:
ontap9::> security certificate generate-csr -common-name nfs.example.com -security-strength 128 -hash-function SHA256 -extended-key-usage serverAuth -dns-name nfs.example.com -ipaddr 192.0.2.130,192.0.2.131 -country US -state CA -locality SanJose -organization "MyOrg" -unit "Storage"
Der Befehl erzeugt einen PEM-Block für die Zertifikatsignierungsanforderung (CSR) und einen PEM-Block für den privaten Schlüssel. Beide sollten kopiert und gespeichert werden, da der private Schlüssel nur einmal angezeigt wird.
Um zu überprüfen, ob die CSR die erwarteten SANs enthält, bevor sie signiert wird, kann auf einem beliebigen Client mit OpenSSL folgender Befehl ausgeführt werden:
echo <paste CSR PEM> | openssl req -noout -text | grep -A3 "Subject Alternative"
Erwartete Ausgabe:
X509v3 Subject Alternative Name: critical
DNS:nfs.example.com, IP Address:192.0.2.130
2b. Den CSR mit der ONTAP CA signieren.
ontap9::> security certificate sign -vserver <svm> -ca <ca-name> -ca-serial <ca-serial> -expire-days 365 -hash-function SHA256
Fügen Sie den CSR-PEM-Block ein, wenn Sie dazu aufgefordert werden. Kopieren Sie das signierte Zertifikat-PEM aus der Ausgabe.
2c. Installieren des signierten Serverzertifikats.
ontap9::> security certificate install -vserver <svm> -type server -cert-name <cert-name>
Bei entsprechender Aufforderung:
-
Fügen Sie das signierte Zertifikat-PEM ein.
-
Den privaten Schlüssel im PEM-Format einfügen.
-
Wenn nach Zwischen- oder Stammzertifikaten gefragt wird, die CA-Zertifikat-PEM einfügen und die Eingabetaste drücken, dann mit n antworten, um das Hinzufügen weiterer Zertifikate zu beenden.
2d. Das installierte Zertifikat überprüfen.
ontap9::> security certificate show -vserver <svm> -type server -common-name <cert-name>
Das Ablaufdatum und das Vorhandensein des Eintrags werden bestätigt.
Schritt 3: NFS über TLS auf dem Daten-LIF aktivieren
Nachdem das Serverzertifikat installiert ist, wird NFS über TLS auf dem Ziel-LIF aktiviert.
ontap9::> vserver nfs tls interface enable -vserver <svm> -lif <lif> -certificate-name <cert-name>
Es wird überprüft, ob die LIF TLS-fähig ist.
ontap9::> vserver nfs tls interface show -vserver <svm>
Erwartete Ausgabe:
Vserver: <svm> Logical Interface: <lif> IP Address: <lif-ip> TLS Status: enabled TLS Certificate Name: <cert-name> Enforce Host Authentication: false
TLS Status: enabled bestätigt, dass ONTAP für diese LIF TLS auf Port 2049 aushandelt. Clients, die xprtsec=tls oder xprtsec=mtls verwenden, erhalten nun eine TLS-geschützte Verbindung. Clients, die kein TLS anfordern, verbinden sich weiterhin im Klartext, sofern in Schritt 7 keine Erzwingung hinzugefügt wird.
Schritt 4: Installation des CA-Zertifikats auf dem Linux-Client
Der Linux-Client muss der Zertifizierungsstelle vertrauen, die das Serverzertifikat von ONTAP signiert hat. Ohne dies tlshd lehnt den TLS-Handschlag ab, da das Serverzertifikat nicht als vertrauenswürdig gilt.
Wenn Sie die ONTAP CA verwendet haben (Schritt 1)
Das CA-Zertifikat aus ONTAP exportieren:
ontap9::> security certificate show -vserver <svm> -common-name <ca-name> -type root-ca -fields cert
Kopieren Sie das Zertifikat-PEM aus der Ausgabe und speichern Sie es in einer Datei (zum Beispiel nfs-ca.crt). Diese Datei auf den Linux-Client übertragen.
Wenn Sie eine externe Zertifizierungsstelle verwendet haben
Das CA-Zertifikat im PEM-Format aus Ihrer externen CA-Infrastruktur beziehen und in einer Datei speichern (zum Beispiel nfs-ca.crt). Diese Datei auf den Linux-Client übertragen.
Das CA-Zertifikat im System-Truststore installieren
sudo cp nfs-ca.crt /etc/pki/ca-trust/source/anchors/nfs-tls-ca.crt sudo update-ca-trust
sudo cp nfs-ca.crt /usr/local/share/ca-certificates/nfs-tls-ca.crt sudo update-ca-certificates
tlshd so konfigurieren, dass diese Zertifizierungsstelle als Vertrauensspeicher verwendet wird
Bearbeiten /etc/tlshd.conf:
[debug] loglevel=1 tls=1 nl=0 [authenticate] [authenticate.client] x509.truststore=/etc/pki/ca-trust/source/anchors/nfs-tls-ca.crt
Den `x509.truststore`Pfad so anpassen, dass er dem Speicherort des CA-Zertifikats entspricht.
tlshd wird neu gestartet, damit die Konfiguration übernommen wird:
sudo systemctl restart tlshd
Es wird überprüft, ob tlshd ordnungsgemäß gestartet wurde:
journalctl -u tlshd -n 20 --no-pager
Die Ausgabe sollte keine Fehlerzeilen enthalten.
Schritt 5: LIF-FQDN auf dem Client auflösen
tlshd validiert das Serverzertifikat anhand des im Mount-Befehl verwendeten Hostnamens. Es sollte bestätigt werden, dass <lif-fqdn> auf <lif-ip> dem Client vor dem Mounten aufgelöst wird.
getent hosts <lif-fqdn>
Wenn der Hostname nicht über DNS aufgelöst wird, einen statischen Eintrag hinzufügen:
echo <lif-ip> <lif-fqdn> | sudo tee -a /etc/hosts
Schritt 6: Einbinden mit NFS über TLS
Das Kernel-TLS-Modul laden, falls es noch nicht geladen ist:
sudo modprobe tls
Erstellen Sie den Einhängepunkt und führen Sie die Einbindung durch:
sudo mkdir -p <mountpoint> sudo mount -t nfs \ -o vers=4.1,xprtsec=tls \ <lif-fqdn>:<export-path> <mountpoint>
Schritt 7: Die TLS-Verbindung überprüfen
Client-Seite
Bestätigen Sie, dass die Einbindung aktiv ist und xprtsec=tls anzeigt:
mount | grep nfs
Erwartete Ausgabe (Zeile mit dem Mount):
<lif-fqdn>:<export-path> on <mountpoint> type nfs4 (rw,...,xprtsec=tls,...)
Bestätigt wird, dass `tlshd`ein erfolgreicher TLS-Handschlag abgeschlossen wurde:
journalctl -u tlshd -n 10 --no-pager
Suchen Sie nach einer Zeile, die Folgendes enthält:
Handshake with '<lif-fqdn>' (...) was successful
ONTAP Seite
Bestätigen Sie, dass die Verbindung als TLS/nfs aufgeführt ist (zunächst eine geringe Menge an E/A erzeugen, falls die Verbindung gerade erst hergestellt wurde):
ontap9::> network connections active show -vserver <svm>
Erwarteter Eintrag:
<lif>:2049 <client-fqdn>:<port> TLS/nfs
Es sollte überprüft werden, dass keine TLS-Handschlagfehler aufgetreten sind:
ontap9::> event log show -severity error -message-name Nblade.TLSHandshakeFailed
Keine neuen Einträge seit dem Mount-Versuch bedeuten, dass der Handschlag erfolgreich war.
Optional: TLS für bestimmte Clients erzwingen (Exportregel-Durchsetzung)
Standardmäßig ist NFS über TLS optional: Clients, die kein TLS anfordern, können sich weiterhin unverschlüsselt über eine TLS-fähige LIF verbinden. Um TLS für eine bestimmte Exportregel zu erzwingen, -allow-nfs-tls-only true festlegen.
ontap9::> vserver export-policy rule modify -vserver <svm> -policyname <policy-name> -ruleindex <rule-index> -allow-nfs-tls-only true
Nach dieser Konfiguration wird jeder NFS-Client, der durch diese Regel erfasst wird und kein TLS verwendet, beim Auswertungspunkt der Exportregel abgewiesen. Bestehende TLS-Verbindungen sind davon nicht betroffen.
Überprüfung:
ontap9::> vserver export-policy rule show -vserver <svm> -policyname <policy-name> -fields allow-nfs-tls-only
Optional: Gegenseitiges TLS (Client-Authentifizierung)
Standardmäßiges NFS über TLS authentifiziert den Server gegenüber dem Client (nur serverseitiges TLS). Mutual TLS (xprtsec=mtls erfordert zusätzlich, dass der Client ein Zertifikat vorlegt, das von ONTAP validiert wird. Dies bietet eine kryptografische Host-Authentifizierung auf beiden Seiten.
|
|
Anforderung an das Client-Betriebssystem. Mutual TLS erfordert ktls-utils 0.12 oder höher. Die mit RHEL 9.7 (ktls-utils 0.11 ausgelieferte Version funktioniert nicht, sie sendet unabhängig von der Konfiguration kein Client-Zertifikat. RHEL 10.1 (ktls-utils 1.2.1 ist validiert. Die ktls-utils Version sollte vor dem Fortfahren überprüft werden.
|
|
|
Mount-Option. Verwendung von xprtsec=mtls, nicht xprtsec=tls. Mit xprtsec=tls sendet der Kernel den Authentifizierungsmodus HANDSHAKE_AUTH_UNAUTH an tlshd, was dem anonymen Handschlag-Pfad folgt und kein Client-Zertifikat präsentiert, selbst wenn eines konfiguriert ist.
|
Schritt 1: Erstellen einer Zertifizierungsstelle für Client-Zertifikate (ONTAP)
Dies kann dieselbe Zertifizierungsstelle wie in Schritt 1 oder eine separate sein. Für den Produktivbetrieb wird die Verwendung einer separaten Zertifizierungsstelle empfohlen, damit die Zertifikatsketten von Server und Client voneinander getrennt sind.
ontap9::> security certificate create -vserver <svm> -common-name "NFS-mTLS-CA" -type root-ca -expire-days 3652 -hash-function SHA256
Die Seriennummer ist als <mtls-ca-serial> zu notieren.
Schritt 2: Die Zertifizierungsstelle als Client-CA-Vertrauensanker (ONTAP) installieren
Das CA-Zertifikat exportieren:
ontap9::> security certificate show -vserver <svm> -common-name "NFS-mTLS-CA" -type root-ca -fields cert
Als Typ client-ca installieren:
ontap9::> security certificate install -vserver <svm> -type client-ca
Fügen Sie das CA-Zertifikat im PEM-Format ein, wenn Sie dazu aufgefordert werden. Überprüfen:
ontap9::> security certificate show -vserver <svm> -type client-ca
Schritt 3: enforce-host-auth auf dem LIF (ONTAP) aktivieren
ontap9::> vserver nfs tls interface modify -vserver <svm> -lif <lif> -enforce-host-auth true
Überprüfung:
ontap9::> vserver nfs tls interface show -vserver <svm> -instance
Bestätigen: Enforce Host Authentication: true.
Schritt 4: Client-Schlüssel und CSR generieren (Linux-Client)
sudo mkdir -p /etc/nfs sudo openssl genrsa -out /etc/nfs/client.key 2048 sudo chmod 600 /etc/nfs/client.key sudo openssl req -new \ -key /etc/nfs/client.key \ -subj "/CN=<client-fqdn>/C=US" \ -addext "subjectAltName=DNS:<client-fqdn>,IP:<client-ip>" \ -out /tmp/client.csr cat /tmp/client.csr
Schritt 5: Den Client-CSR mit der ONTAP CA signieren
Auf dem ONTAP Cluster:
ontap9::> security certificate sign -vserver <svm> -ca "NFS-mTLS-CA" -ca-serial <mtls-ca-serial> -expire-days 365 -hash-function SHA256
Fügen Sie den Inhalt von /tmp/client.csr ein, wenn Sie dazu aufgefordert werden. Die signierte Zertifikat-PEM aus der Ausgabe kopieren.
Schritt 6: Erstellen der Clientzertifikatskettendatei (Linux-Client)
Das signierte Zertifikat unter /tmp/client-signed.crt speichern. Auch das CA-Zertifikat PEM (nfs-mtls-ca.crt erhalten. Beide zu einer Ketten-Datei zusammenfügen:
sudo bash -c "cat /tmp/client-signed.crt /path/to/nfs-mtls-ca.crt \ > /etc/nfs/client-chain.crt" sudo chmod 600 /etc/nfs/client-chain.crt
|
|
Warum eine Zertifikatskettendatei? tlshd 1.2.1 verwendet gnutls_pcert_list_import_x509_raw und benötigt die vollständige Zertifikatskette (Leaf-Zertifikat gefolgt von der Zertifizierungsstelle), damit GnuTLS den Aussteller während des find_x509_client_cert-Callbacks korrekt auflösen kann. Eine Datei, die nur das Leaf-Zertifikat enthält, führt zu einem Fehler bei der GnuTLS-Assertion.
|
Schritt 7: /etc/tlshd.conf mit dem Clientzertifikat (Linux-Client) aktualisieren
[debug] loglevel=1 tls=1 nl=0 [authenticate] [authenticate.client] x509.truststore=/etc/pki/ca-trust/source/anchors/nfs-tls-ca.crt x509.certificate=/etc/nfs/client-chain.crt x509.private_key=/etc/nfs/client.key
tlshd neu starten:
sudo systemctl restart tlshd
Schritt 8: Mount mit xprtsec=mtls
sudo mount -t nfs \ -o vers=4.1,xprtsec=mtls \ <lif-fqdn>:<export-path> <mountpoint>
Schritt 9: Gegenseitige TLS-Verbindung verifizieren
Client:
mount | grep nfs # Confirm: xprtsec=mtls in mount options journalctl -u tlshd -n 5 --no-pager # Confirm: "Handshake with '<lif-fqdn>' (...) was successful"
ONTAP:
ontap9::> network connections active show -vserver <svm> # Confirm: <lif>:2049 <client-fqdn>:<port> TLS/nfs ontap9::> event log show -severity error -message-name Nblade.TLSHandshakeFailed # No new entries = success
Wichtige Standardeinstellungen
-
-enforce-host-auth = false`NFS über TLS erzwingt standardmäßig keine hostbasierte Authentifizierung. Dies ist die weniger restriktive Vorgehensweise. Wenn diese Option auf `truegesetzt ist, werden TLS-Verbindungen abgelehnt, deren Zertifikatsidentität nicht mit der Host-Identität des LIF übereinstimmt. -
-skip-san-validation = false`Die SAN-Prüfung wird standardmäßig durchgeführt. Wenn diese Option auf `truegesetzt wird, wird die Bindung der Zertifikat- zu LIF-Identität gelockert. Dieser Parameter ist nur schreibbar: NachfolgendeshowoderGETgeben den Wert nicht zurück, sodass Administratoren nachträglich nicht feststellen können, ob die SAN-Validierung beim Aktivieren oder Ändern übersprungen wurde. -
`-allow-nfs-tls-only = false`Eine Exportrichtlinienregel erfordert TLS nicht standardmäßig. Die Aktivierung von NFS über TLS auf einem LIF lehnt unverschlüsseltes NFS nicht von selbst ab. Für eine ausschließlich TLS-basierte Haltung ist pro Regel die Option zu wählen, und es muss sichergestellt sein, dass TLS auf allen Daten-LIFs, die diese Clients bedienen, aktiviert ist, da sonst der Zugriff verweigert wird.
Die vserver export-policy rule create und vserver export-policy rule modify Befehle erhalten ein neues Feld, -allow-nfs-tls-only, das die übereinstimmenden Clients auf NFS-over-TLS-Verbindungen beschränkt.
REST-Endpunkte
Die REST-API lässt sich interaktiv über die integrierten Swagger-Dokumente erkunden, indem im Browser https://<cluster-mgmt-ip>/api/docs aufgerufen wird. Die NFS over TLS-Endpunkte befinden sich unter dem /api/protocols/nfs/tls/interfaces Pfad für die LIF-Konfiguration und unter /api/protocols/nfs/export-policies/{policy.id}/rules für das Feld der Export-Policy-Regel.