解決非 root 使用者存取 中的檔案所產生的問題 IBM Cloud

在應用程式部署中使用 runAsUser 時,解決非 root 使用者存取上傳至 IBM Cloud 的檔案所產生的問題,包括權限相關問題。

虛擬私有雲 經典基礎架構

您已使用主控台或 REST API,將檔案上傳至 IBM Cloud Object Storage 服務實例。 當您嘗試在應用程式部署中以使用 runAsUser 所定義的非 root 使用者身分存取這些檔案時,會拒絕對檔案的存取。

在 Linux 中,檔案或目錄有三個存取群組:OwnerGroupOther。 當您使用主控台或 REST API 將檔案上傳至 IBM Cloud Object Storage 時,會移除 OwnerGroupOther 的許可權。 每個檔案的許可權都如下所示:

d--------- 1 root root 0 Jan 1 1970 <file_name>

當您使用 IBM Cloud Object Storage 外掛程式上傳檔案時,會保留檔案的許可權而且不會變更。

若要使用非 root 使用者身分存取檔案,非 root 使用者必須具有該檔案的讀取及寫入權。 作為 Pod 部署的一部分,變更檔案的權限需要進行寫入作業。IBM Cloud Object Storage 並非為寫入工作負載而設計。

在 Pod 部署期間更新許可權可能會讓您的 Pod 無法進入 Running 狀態。

若要解決此問題,在將 PVC 裝載至應用程式 Pod 之前,請建立另一個 Pod 以設定非 root 使用者的正確許可權。

  1. 若要檢查儲存區中檔案的許可權,請建立 test-permission Pod 的配置檔,並將檔案命名為 test-permission.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-permission
    spec:
      containers:
      - name: test-permission
         image: nginx
         volumeMounts:
         - name: cos-vol
         mountPath: /test
      volumes:
      - name: cos-vol
         persistentVolumeClaim:
         claimName: <pvc_name>
    
  2. 建立 test-permission Pod。

    oc apply -f test-permission.yaml
    
  3. 登入 Pod。

    oc exec test-permission -it bash
    
  4. 導覽至您的裝載路徑,並列出檔案的許可權。

    cd test && ls -al
    

    輸出範例

    d--------- 1 root root 0 Jan 1 1970 <file_name>
    
  5. 刪除 Pod。

    oc delete pod test-permission
    
  6. 建立您用來更正檔案許可權之 Pod 的配置檔,並將它命名為 fix-permission.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: fix-permission
      namespace: <namespace>
    spec:
      containers:
      - name: fix-permission
        image: busybox
        command: ['sh', '-c']
        args: ['chown -R <nonroot_userID> <mount_path>/*; find <mount_path>/ -type d -print -exec chmod u=+rwx,g=+rx {} \;']
        volumeMounts:
        - mountPath: "<mount_path>"
          name: cos-volume
      volumes:
      - name: cos-volume
        persistentVolumeClaim:
          claimName: <pvc_name>
    
  7. 建立 fix-permission Pod。

    oc apply -f fix-permission.yaml
    
  8. 等待 Pod 進入 Completed 狀態。

    oc get pod fix-permission
    
  9. 刪除 fix-permission Pod。

    oc delete pod fix-permission
    
  10. 重建您稍早用來檢查許可權的 test-permission Pod。

    oc apply -f test-permission.yaml
    

確認檔案的權限是否已更新

  1. 登入 Pod。

    oc exec test-permission -it bash
    
  2. 導覽至您的裝載路徑,並列出檔案的許可權。

    cd test && ls -al
    

    輸出範例

    -rwxrwx--- 1 <nonroot_userID> root 6193 Aug 21 17:06 <file_name>
    
  3. 刪除 test-permission Pod。

    oc delete pod test-permission
    
  4. 使用非 root 使用者身分,將 PVC 裝載至應用程式。

在部署 YAML 中,將 runAsUserfsGroup 設為相同的值。

在您的 IBM Cloud Object Storage 服務實例中設定正確的檔案權限後,請勿透過控制台或 REST API 上傳檔案。 請使用 IBM Cloud Object Storage 外掛程式,將檔案新增至服務實例。