非 root ユーザーがファイルにアクセスできないのはなぜですか?
仮想プライベート・クラウド クラシック・インフラストラクチャー
コンソールまたは REST API を使用して、IBM Cloud Object Storage サービス・インスタンスにファイルをアップロードしました。 アプリ・デプロイメントで runAsUser
で定義した非 root ユーザーを使用してこれらのファイルにアクセスしようとすると、ファイルへのアクセスは拒否されます。
Linux では、ファイルまたはディレクトリーには Owner
、Group
、および Other
の 3 つのアクセス・グループがあります。 コンソールまたは REST API を使用してファイルを IBM Cloud Object Storage にアップロードする場合、Owner
、Group
、および Other
の権限が削除されます。
各ファイルの権限は、以下のようになります。
d--------- 1 root root 0 Jan 1 1970 <file_name>
IBM Cloud Object Storage プラグインを使用してファイルをアップロードすると、ファイルの権限が保持され、変更されません。
非 root ユーザーとしてファイルにアクセスするために、非 root ユーザーには、そのファイルに対する読み取り権限と書き込み権限が必要です。 ポッド・デプロイメントの一部としてファイルの許可を変更するには、書き込み操作が必要です。IBM Cloud Object Storage は、書き込みワークロード用に設計されていません。
ポッドのデプロイメント中に権限を更新すると、ポッドが Running
状態にならない場合があります。
この問題を解決するには、PVC をアプリ・ポッドにマウントする前に、別のポッドを作成して非 root ユーザーに正しい権限を設定します。
-
バケット内のファイルの許可を確認するには、
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>
-
test-permission
ポッドを作成します。kubectl apply -f test-permission.yaml
-
ポッドにログインします。
kubectl exec test-permission -it bash
-
マウント・パスにナビゲートし、ファイルのアクセス権をリストします。
cd test && ls -al
出力例
d--------- 1 root root 0 Jan 1 1970 <file_name>
-
ポッドを削除します。
kubectl delete pod test-permission
-
ファイルのアクセス権を修正するために使用するポッドの構成ファイルを作成し、
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>
-
fix-permission
ポッドを作成します。kubectl apply -f fix-permission.yaml
-
ポッドが
Completed
状態になるまで待機します。kubectl get pod fix-permission
-
fix-permission
ポッドを削除します。kubectl delete pod fix-permission
-
以前に使用した
test-permission
ポッドを再作成して、アクセス権を確認します。kubectl apply -f test-permission.yaml
ファイルの権限が更新されていることの確認
-
ポッドにログインします。
kubectl exec test-permission -it bash
-
マウント・パスにナビゲートし、ファイルのアクセス権をリストします。
cd test && ls -al
出力例
-rwxrwx--- 1 <nonroot_userID> root 6193 Aug 21 17:06 <file_name>
-
test-permission
ポッドを削除します。kubectl delete pod test-permission
-
非 root ユーザーとしてアプリに PVC をマウントします。
runAsUser
と fsGroup
を、デプロイメント YAML 内の同じ値に設定します。
IBM Cloud Object Storage サービス・インスタンスで正しいファイル許可を設定した後は、コンソールまたは REST API を使用してファイルをアップロードしないでください。 IBM Cloud Object Storage プラグインを使用して、サービス・インスタンスにファイルを追加します。