Skip to main content
AI Data Engine
本繁體中文版使用機器翻譯,譯文僅供參考,若與英文版本牴觸,應以英文版本為準。

在多節點 AI Data Engine 部署上為 SMB/CIFS 共用區設定 Kerberos

貢獻者 netapp-dbagwell

使用 Kerberos 驗證掃描多節點 AI Data Engine (AIDE) 部署中的 SMB/CIFS 共用區,這樣資料來源中就不會儲存任何密碼。每個節點都使用相同的 Kerberos 組態,而且 AI Data Engine 會自動更新 Kerberos 票證。

開始之前

權限和存取
  • 您擁有 AI Data Engine 系統管理員 權限。

  • 您擁有所有節點和管理主機的 root 存取權。管理主機是您裝載 NFS 匯出並建立 keytab 的主機。它可以是其中一個節點。

  • 您可以 `kubectl`從管理主機以 cluster-admin 權限存取您的 Kubernetes 叢集。如果您使用 kubeconfig 檔案,請將 `KUBECONFIG`環境變數設定為其路徑。

網路和時間同步
  • 您已檢閱 "連網需求" 和 "Kerberos 和 Active Directory 的要求",包括時間同步和 DNS。

  • 您已驗證每個節點可透過 TCP 連接埠 2049 存取 NFS 伺服器,透過連接埠 88 存取 KDC,透過連接埠 445 存取檔案伺服器,並透過連接埠 53 存取 DNS 伺服器。

  • 您已驗證 NTP 在每個節點上都處於作用中,且每個時鐘都與您的網域控制器同步。若要檢查,請執行 timedatectl。

Active Directory
  • 您在 Active Directory 中擁有一個掃描服務帳戶,該帳戶對要掃描的 SMB/CIFS 共用區具有讀取存取權。該帳戶必須支援 AES256 加密。

需要收集的資訊
  • 您擁有以下資訊:

    項目 說明 範例

    KDC IP 位址

    充當 Kerberos 金鑰經銷中心(KDC)的網域控制器的 IP 位址

    10.0.1.50

    KDC FQDN

    同一網域控制器的完全符合資格的網域名稱 (FQDN)

    dc.corp.example.com

    網域

    Active Directory 網域,小寫

    corp.example.com

    領域

    Kerberos 領域,即大寫的網域

    CORP.EXAMPLE.COM

    掃描使用者

    具有共享讀取存取的服務帳戶

    svc-aide

    掃描密碼

    掃描使用者的密碼。僅在建立 keytab 時輸入。

    不適用

    檔案伺服器 FQDN

    託管共享的檔案伺服器的 FQDN。請勿使用 IP 位址。

    filer.corp.example.com

    共用名稱

    SMB/CIFS 共用區的名稱

    sharename

AI Data Engine 使用的 Kerberos 檔案

您需要在儲存 AI Data Engine 組態的 NFS 匯出中建立以下檔案。在下表中, <export> 是該匯出的根目錄。

檔案 匯出位置

Kerberos 組態

<export>/kerberos/krb5.conf

金鑰表

<export>/kerberos/kerberos_refresher/datasense.keytab

主要檔案

<export>/kerberos/kerberos_refresher/kerberos_creds.env

票證快取目錄

<export>/kerberos/kerberos_ccache

安裝所需的套件

在任何沒有 `cifs-utils`的節點上,對 SMB/CIFS 共用區的 Kerberos 掃描都會失敗。SMB/CIFS 裝載在 AI Data Engine 內部執行,但節點的作業系統會呼叫 `cifs-utils`元件來設定 Kerberos 工作階段。僅在管理主機上安裝套件是不夠的。

套件 管理主機 每個節點

krb5-user(Ubuntu 或 Debian)或 krb5-workstation(RHEL、CentOS 或 Rocky Linux)

必填

無需

cifs-utils

必填

必填

Kerberos 用戶端工具提供了 ktutil、 kinit 和 klist 命令,用於建立和測試 keytab。

步驟
  1. 在管理主機上,安裝 Kerberos 用戶端工具與 cifs-utils。

    1. 在 Ubuntu 或 Debian 系統上,執行以下命令。

      apt-get update -qq
      apt-get install -y krb5-user cifs-utils
    2. 在 RHEL、CentOS 或 Rocky Linux 上,執行以下命令。

      dnf -y install krb5-workstation cifs-utils
  2. 在其他所有節點上安裝 cifs-utils。

    1. 在 Ubuntu 或 Debian 系統上,執行以下命令。

      apt-get update -qq
      apt-get install -y cifs-utils
    2. 在 RHEL、CentOS 或 Rocky Linux 上,執行以下命令。

      dnf -y install cifs-utils
  3. 在每個節點上,驗證安裝。

    which cifs.upcall

在管理主機上裝載 NFS 匯出

從管理主機存取共享的組態匯出,以便您可以建立每個節點都可以讀取的 Kerberos 檔案。

步驟
  1. 設定 AI Data Engine 運作所在的命名空間,並驗證組態 Volume 宣告是否已綁定。預設命名空間為 aide。

    export NAMESPACE="<namespace>"
    kubectl -n "${NAMESPACE}" get pvc aide-config-pvc

    狀態必須為 Bound。

  2. 取得 NFS 伺服器和組態 Volume 的匯出路徑。您在部署 AI Data Engine 時指定了這些值。

    kubectl get pv aide-config-pv -o jsonpath='NFS server: {.spec.nfs.server}{"\n"}Export path: {.spec.nfs.path}{"\n"}'
  3. 裝載匯出。將 <nfs_server> 和 <export_path> 替換為上一個步驟中的值。命令使用 /mnt/aide-config 作為安裝點。您可以使用任何空目錄。

    mkdir -p /mnt/aide-config
    mount -t nfs <nfs_server>:<export_path> /mnt/aide-config
  4. 建立 Kerberos 目錄。

    export AIDE_CONFIG_ROOT="/mnt/aide-config"
    mkdir -p "${AIDE_CONFIG_ROOT}/kerberos/kerberos_refresher"
    mkdir -p "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache"

建立 Kerberos 檔案

為 AI Data Engine 提供取得掃描服務帳戶 Kerberos 票證所需的組態和憑證。在管理主機上執行下列步驟。

步驟
  1. 設定以下命令使用的變數。將尖括號內的每個值替換為您的值,且不要包含尖括號。輸入大寫的 realm 和小寫的 domain。

    export KDC_IP="<kdc_ip>"
    export KDC_FQDN="<kdc_fqdn>"
    export AD_DOMAIN="<domain>"
    export REALM="<REALM>"
    export SCAN_USER="<scan_user>"
    export FILE_SERVER_FQDN="<file_server_fqdn>"
    export SHARE_NAME="<share_name>"
    export KRB5_CONF_SOURCE="${AIDE_CONFIG_ROOT}/kerberos/krb5.conf"
    export KRB5_KEYTAB="${AIDE_CONFIG_ROOT}/kerberos/kerberos_refresher/datasense.keytab"
    export KRB5_CREDS="${AIDE_CONFIG_ROOT}/kerberos/kerberos_refresher/kerberos_creds.env"
    1. 請確認變數已設定。

      echo "NAMESPACE=[${NAMESPACE}] AIDE_CONFIG_ROOT=[${AIDE_CONFIG_ROOT}] KDC_IP=[${KDC_IP}] REALM=[${REALM}] SCAN_USER=[${SCAN_USER}]"
      註 這些變數僅存在於目前 shell 工作階段中。如果開啟新的 shell,請重新設定它們。
  2. 在 NFS 匯出上建立 Kerberos 組態檔案。AI Data Engine 會從匯出讀取此檔案。請勿在節點上的 `/etc/krb5.conf`中建立它。

    tee "${KRB5_CONF_SOURCE}" >/dev/null <<EOF
    [libdefaults]
        default_realm = ${REALM}
        dns_lookup_realm = false
        dns_lookup_kdc = false
        rdns = false
        ticket_lifetime = 24h
        renew_lifetime = 7d
        forwardable = true
    
    [realms]
        ${REALM} = {
            kdc = ${KDC_IP}:88
            admin_server = ${KDC_IP}:749
        }
    
    [domain_realm]
        .${AD_DOMAIN} = ${REALM}
        ${AD_DOMAIN} = ${REALM}
    EOF
    chmod 644 "${KRB5_CONF_SOURCE}"

    該檔案使用 KDC IP 位址,因此 Kerberos 驗證不依賴 DNS。

  3. 為掃描服務帳戶建立金鑰表。

    1. 執行 ktutil。

    2. 在 ktutil 提示符號處,輸入以下命令。將 <scan_user> 和 <REALM> 替換為您的值。 ktutil 提示符號不會使用 shell 變數。

      addent -password -p <scan_user>@<REALM> -k 1 -e aes256-cts-hmac-sha1-96
    3. 當 ktutil 提示輸入密碼時,請輸入掃描使用者的密碼。

    4. 在 `ktutil`提示符號處,輸入以下命令。

      wkt /tmp/krb5.keytab
      quit
  4. 測試 keytab。該 KRB5_CONFIG 變數將 Kerberos 工具指向匯出上的檔案。

    export KRB5_CONFIG="${KRB5_CONF_SOURCE}"
    klist -kt /tmp/krb5.keytab
    kinit -kt /tmp/krb5.keytab "${SCAN_USER}@${REALM}"
    klist
    kdestroy

    第二個 `klist`命令必須顯示掃描使用者的有效票據。票據確認金鑰表和與金鑰分發中心(KDC)的連線正常。如果 `kinit`失敗,請參閱疑難排解 Kerberos 驗證。

  5. 安裝 keytab,然後刪除臨時複本。

    install -m 640 -g 4321 /tmp/krb5.keytab "${KRB5_KEYTAB}"
    rm -f /tmp/krb5.keytab
  6. 讓工單快取目錄可供工單重新整理程式寫入。

    chown root:4321 "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache"
    chmod 770 "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache"

    票據刷新程式以 root 使用者身分執行,群組 ID 為 4321。它必須能夠讀取 keytab 和 principal 檔案,並且必須能夠寫入票據快取目錄。

  7. 建立主檔案。該 KRB5_RENEW_INTERVAL_H 值是票證更新間隔(以小時為單位)。

    tee "${KRB5_CREDS}" >/dev/null <<EOF
    KRB5_USER=${SCAN_USER}
    KRB5_REALM=${REALM}
    KRB5_RENEW_INTERVAL_H=3
    EOF
    chmod 640 "${KRB5_CREDS}"
    chgrp 4321 "${KRB5_CREDS}"
  8. 請確認檔案已就位。

    ls -l "${KRB5_CONF_SOURCE}" "${KRB5_KEYTAB}" "${KRB5_CREDS}"

驗證名稱解析

AI Data Engine 透過每個節點的 DNS 設定來解析檔案伺服器和 KDC。首先驗證名稱解析,僅當名稱在節點上無法解析時才變更 DNS 設定。

步驟
  1. 在每個節點上,驗證檔案伺服器和 KDC 是否能透過 FQDN 解析。將值替換為您的檔案伺服器 FQDN 和 KDC FQDN。

    nslookup <file_server_fqdn>
    nslookup <kdc_fqdn>
  2. 查看結果。

    1. 如果兩個名稱在每個節點上都能解析為正確的 IP 位址,請繼續至 開始首次票證重新整理。

    2. 如果名稱在任何節點上都無法解析,請完成 修復名稱解析,然後返回此程序。

開始首次票證重新整理

AI Data Engine 每三小時重新整理一次掃描服務帳戶的 Kerberos 票證。請啟動首次重新整理,以便您可以立即掃描共享。

註 請勿在主機 crontab 中新增 kinit 項目。AI Data Engine 會自動重新整理工單。
步驟
  1. 在管理主機上,啟動重新整理作業,等待完成,並顯示其日誌。

    JOB="kerberos-refresh-$(date +%s)"
    kubectl -n "${NAMESPACE}" create job "${JOB}" --from=cronjob/ds-krb5-ticket-refresher
    kubectl -n "${NAMESPACE}" wait --for=condition=complete "job/${JOB}" --timeout=120s
    kubectl -n "${NAMESPACE}" logs "job/${JOB}"
  2. 確認共享的票證快取存在且時間戳記較新。

    ls -l "${AIDE_CONFIG_ROOT}/kerberos/kerberos_ccache/krb5cc_shared"
結果

作業日誌顯示已為掃描使用者取得票證。

驗證 Kerberos 組態

在新增共享之前,請先驗證 AI Data Engine 是否可以使用 Kerberos 檔案並解析名稱。由於裝載服務可以在多個節點上執行,因此請在每個節點上對 Pod 重複檢查。如果您開啟了新的 shell,請重新設定 NAMESPACE、 FILE_SERVER_FQDN 和 SHARE_NAME 變數。

步驟
  1. 列出裝載服務 pod 及其運作所在的節點。

    kubectl -n "${NAMESPACE}" get pods -l app.kubernetes.io/name=ds-mount-server -o wide
  2. 對每個 pod 執行以下命令。將 `<pod_name>`替換為 pod 的名稱。

    POD=<pod_name>
    kubectl -n "${NAMESPACE}" exec "${POD}" -- nslookup "${FILE_SERVER_FQDN}"
    kubectl -n "${NAMESPACE}" exec "${POD}" -- klist
    kubectl -n "${NAMESPACE}" exec "${POD}" -- cat /etc/krb5.conf
  3. (選用)使用 Kerberos 測試共享的裝載。

    kubectl -n "${NAMESPACE}" exec "${POD}" -- sh -c "mount -t cifs -o sec=krb5,multiuser //${FILE_SERVER_FQDN}/${SHARE_NAME} /mnt && ls -l /mnt && umount /mnt"
結果

在每個節點上,檔案伺服器會解析為正確的 IP 位址, klist 顯示掃描使用者的票證,而 /etc/krb5.conf 顯示 Kerberos 組態檔案的內容。

新增使用 Kerberos 的 SMB/CIFS 資料來源

將該共享新增為資料來源並開始掃描,以便 AI Data Engine 可以開始分析其資料。

步驟
  1. 在 AI Data Engine 使用者介面中,選擇 組態。

  2. 在 已掃描系統 標籤上,選擇 新增系統。

  3. 選取 檔案共享群組。

  4. 請輸入群組名稱。

  5. 請以 `<file_server_fqdn>/<share_name>`格式輸入共享路徑。請將預留位置替換為您的值。請勿使用 IP 位址。

  6. 身分驗證方法請選擇 Kerberos。將使用者名稱和密碼欄位留空。

  7. 檢閱您的選擇,然後選擇 確認。

  8. 為新系統選擇 啟用掃描。

如需連接資料來源的詳細資訊,請參閱 "將資料來源連接到 AI Data Engine"。

修復名稱解析

僅當檔案伺服器或 KDC 在節點上無法透過 FQDN 解析時才執行此程序。它會將您的 Active Directory DNS 伺服器設定為每個節點上的唯一名稱伺服器。

警告 將您的 Active Directory DNS 伺服器設為每個節點上唯一的名稱伺服器。叢集會隨機選擇一個已列出的名稱伺服器,因此無法解析 Active Directory 名稱的名稱伺服器會導致間歇性故障。
步驟
  1. 請確認您的 Active Directory DNS 伺服器也能解析外部名稱。

    1. 執行下列命令。將 `<external_fqdn>`取代為 AI Data Engine 必須存取的網域外名稱。例如,使用"傳出網際網路存取"中列出的端點。

      nslookup <external_fqdn> "${KDC_IP}"
    2. 如果命令失敗,請您的 Active Directory 系統管理員啟用 DNS 轉發,然後重複此步驟。

  2. 在每個節點上,備份 /etc/resolv.conf,並將您的 Active Directory DNS 伺服器設定為唯一的名稱伺服器。如果您在節點上開啟新的 shell,請再次設定 `KDC_IP`變數。

    export KDC_IP="<kdc_ip>"
    cp /etc/resolv.conf /etc/resolv.conf.bak
    ORIG_SEARCH=$(grep '^search' /etc/resolv.conf.bak | head -1 | cut -d' ' -f2-)
    printf 'search %s\nnameserver %s\n' "${ORIG_SEARCH}" "${KDC_IP}" > /etc/resolv.conf
  3. 在每個節點上,防止網路管理程式在重新啟動後覆寫 DNS 設定。

    1. 在具有 NetworkManager 的 RHEL 上,執行下列命令。

      mkdir -p /etc/NetworkManager/conf.d
      printf '[main]\ndns=none\n' > /etc/NetworkManager/conf.d/90-dns-none.conf
      systemctl reload NetworkManager
    2. 在安裝了 systemd-resolved 的 Ubuntu 系統上,執行以下命令。將 `<domain>`替換為您的網域。

      export AD_DOMAIN="<domain>"
      mkdir -p /etc/systemd/resolved.conf.d
      printf '[Resolve]\nDNS=%s\nDomains=%s\n' "${KDC_IP}" "${AD_DOMAIN}" > /etc/systemd/resolved.conf.d/ad-dns.conf
      systemctl restart systemd-resolved
  4. 從管理主機重新啟動 CoreDNS,以便 AI Data Engine 使用新的 DNS 設定。您只需對叢集執行一次此步驟。CoreDNS 會將叢集外部的名稱查詢轉送至節點的 /etc/resolv.conf 檔案中的名稱伺服器,因此必須重新啟動才能套用變更。

    1. 找到 CoreDNS 部署。

      kubectl -n kube-system get deployments | grep -i coredns
    2. 重新啟動部署。將 `<coredns_deployment>`替換為上一個命令中的名稱。

      kubectl -n kube-system rollout restart deployment <coredns_deployment>
      kubectl -n kube-system rollout status deployment <coredns_deployment> --timeout=120s
  5. 再次驗證名稱解析。請參閱驗證名稱解析。

更新 Kerberos 組態檔案

如果您在設定後取代 NFS 匯出上的 krb5.conf(例如,透過複製新檔案覆蓋它),AI Data Engine 會繼續使用先前的檔案,直到您重新啟動受影響的服務。

步驟
  1. 在管理主機上,重新啟動裝載服務,並刪除先前的票證重新整理作業。

    kubectl -n "${NAMESPACE}" rollout restart daemonset ds-mount-server
    kubectl -n "${NAMESPACE}" delete job -l app.kubernetes.io/name=ds-krb5-ticket-refresher --ignore-not-found
  2. 開始新的票證重新整理。請參閱 開始首次票證重新整理。

疑難排解 Kerberos 驗證

找出 Kerberos 故障的原因,並還原對 SMB/CIFS 共用區的掃描。

症狀 可能的原因 解決方案

新增共享時出現錯誤 IP 不允許與 Kerberos 一起使用。

共享路徑使用 IP 位址。

以 FQDN 輸入共享路徑。

kinit 測試 keytab 時失敗,或未發出票據。

密碼或網域不正確,網域不是大寫,掃描帳戶不支援 AES256 加密,管理主機或節點無法透過連接埠 88 存取 KDC,或節點上的時鐘與 KDC 的時鐘偏差超過了允許的偏差。

驗證密碼和網域,並確認該帳戶支援 AES256 加密。開啟通往 KDC 的連接埠 88,並確認每個節點上的 NTP 已作用中。然後再次建立 keytab。

票證重新整理作業失敗,或未建立票證快取。

keytab、主體檔案或 krb5.conf 遺失或空白,或是群組擁有權與權限不正確。

確認檔案存在於 AI Data Engine 使用的 Kerberos 檔案 所列的位置。確認 keytab 和主體檔案的模式為 640 且群組為 4321。確認票據快取目錄的擁有者為 root:4321,且模式為 770。

名稱間歇性無法解析,或在節點上可以解析,但在 AI Data Engine 中無法解析。

一個節點列出多個名稱伺服器,且其中一個無法解析 Active Directory 名稱,或者在您變更 `/etc/resolv.conf`後未重新啟動 CoreDNS。

在每個節點上移除除了 Active Directory DNS 伺服器以外的所有名稱伺服器,然後重新啟動 CoreDNS。請參閱修復名稱解析。

設定 Active Directory DNS 伺服器後,外部名稱無法在 AI Data Engine 中解析。

Active Directory DNS 伺服器不會轉送外部查詢。

驗證 `nslookup <external_fqdn> "${KDC_IP}"`是否回傳結果。如果沒有,請您的 Active Directory 系統管理員啟用 DNS 轉發。

Kerberos 掃描在一個節點上可正常運作,但在其他節點上失敗。出現錯誤 裝載 error(2),並且 `dmesg`在節點上顯示 無法使用 Kerberos 建立新的 SMB 工作階段。

cifs-utils 未安裝在每個節點上。

在每個節點上安裝 cifs-utils。若要驗證安裝,請執行 which cifs.upcall。

出現錯誤 mount error(126)。

AI Data Engine 無法從 NFS 匯出讀取 krb5.conf。

驗證 `<export>/kerberos/krb5.conf`是否存在,且 `kubectl -n "${NAMESPACE}" exec <pod_name> -- cat /etc/krb5.conf`顯示其內容。

對 `krb5.conf`的變更不會生效。

設定後檔案被替換,且 AI Data Engine 仍然使用先前的檔案。

請參閱 更新 Kerberos 組態檔案。

找不到 ktutil、 kinit 或 klist 命令。

管理主機上未安裝 Kerberos 用戶端工具。

安裝 Kerberos 用戶端工具。請參閱 安裝所需的套件。

節點上的 /etc/resolv.conf 檔案在重新啟動後會恢復為先前的設定。

網路管理程式覆寫了該檔案。

防止網路管理程式覆寫 DNS 設定。請參閱 修復名稱解析。

移除 Kerberos 組態

如果您不再使用 Kerberos 掃描 SMB/CIFS 共享,請移除資料來源和 Kerberos 檔案。

步驟
  1. 從 AI Data Engine UI 刪除使用 Kerberos 的 SMB/CIFS 資料來源。

  2. 在管理主機上,將 NFS 匯出裝載於 /mnt/aide-config,刪除 Kerberos 檔案。

    rm -f /mnt/aide-config/kerberos/kerberos_refresher/datasense.keytab
    rm -f /mnt/aide-config/kerberos/kerberos_refresher/kerberos_creds.env
    rm -f /mnt/aide-config/kerberos/krb5.conf
    rm -f /mnt/aide-config/kerberos/kerberos_ccache/krb5cc_shared
    umount /mnt/aide-config
  3. 如果您變更了 DNS 設定,請還原原始設定。

    1. 在每個節點上,還原 `/etc/resolv.conf`的備份。

      cp /etc/resolv.conf.bak /etc/resolv.conf
    2. 在已新增 NetworkManager 組態的 RHEL 節點上,將其移除。

      rm -f /etc/NetworkManager/conf.d/90-dns-none.conf
      systemctl reload NetworkManager
    3. 在新增了 systemd-resolved 組態的 Ubuntu 節點上,將其移除。

      rm -f /etc/systemd/resolved.conf.d/ad-dns.conf
      systemctl restart systemd-resolved
    4. 從管理主機重新啟動 CoreDNS。將 `<coredns_deployment>`替換為 CoreDNS 部署的名稱。

      kubectl -n kube-system rollout restart deployment <coredns_deployment>