IBM Cloud Docs
非 root ユーザーがファイルにアクセスできないのはなぜですか?

非 root ユーザーがファイルにアクセスできないのはなぜですか?

仮想プライベート・クラウド クラシック・インフラストラクチャー

コンソールまたは REST API を使用して、IBM Cloud Object Storage サービス・インスタンスにファイルをアップロードしました。 アプリ・デプロイメントで runAsUser で定義した非 root ユーザーを使用してこれらのファイルにアクセスしようとすると、ファイルへのアクセスは拒否されます。

Linux では、ファイルまたはディレクトリーには OwnerGroup、および Other の 3 つのアクセス・グループがあります。 コンソールまたは REST API を使用してファイルを IBM Cloud Object Storage にアップロードする場合、OwnerGroup、および Other の権限が削除されます。 各ファイルの権限は、以下のようになります。

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

IBM Cloud Object Storage プラグインを使用してファイルをアップロードすると、ファイルの権限が保持され、変更されません。

非 root ユーザーとしてファイルにアクセスするために、非 root ユーザーには、そのファイルに対する読み取り権限と書き込み権限が必要です。 ポッド・デプロイメントの一部としてファイルの許可を変更するには、書き込み操作が必要です。IBM Cloud Object Storage は、書き込みワークロード用に設計されていません。

ポッドのデプロイメント中に権限を更新すると、ポッドが Running 状態にならない場合があります。

この問題を解決するには、PVC をアプリ・ポッドにマウントする前に、別のポッドを作成して非 root ユーザーに正しい権限を設定します。

  1. バケット内のファイルの許可を確認するには、test-permission ポッドの構成ファイルを作成し、そのファイルに 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 ポッドを作成します。

    kubectl apply -f test-permission.yaml
    
  3. ポッドにログインします。

    kubectl exec test-permission -it bash
    
  4. マウント・パスにナビゲートし、ファイルのアクセス権をリストします。

    cd test && ls -al
    

    出力例

    d--------- 1 root root 0 Jan 1 1970 <file_name>
    
  5. ポッドを削除します。

    kubectl delete pod test-permission
    
  6. ファイルのアクセス権を修正するために使用するポッドの構成ファイルを作成し、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 ポッドを作成します。

    kubectl apply -f fix-permission.yaml
    
  8. ポッドが Completed 状態になるまで待機します。

    kubectl get pod fix-permission
    
  9. fix-permission ポッドを削除します。

    kubectl delete pod fix-permission
    
  10. 以前に使用した test-permission ポッドを再作成して、アクセス権を確認します。

    kubectl apply -f test-permission.yaml
    

ファイルの権限が更新されていることの確認

  1. ポッドにログインします。

    kubectl 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 ポッドを削除します。

    kubectl delete pod test-permission
    
  4. 非 root ユーザーとしてアプリに PVC をマウントします。

runAsUserfsGroup を、デプロイメント YAML 内の同じ値に設定します。

IBM Cloud Object Storage サービス・インスタンスで正しいファイル許可を設定した後は、コンソールまたは REST API を使用してファイルをアップロードしないでください。 IBM Cloud Object Storage プラグインを使用して、サービス・インスタンスにファイルを追加します。