私はKubernetesを初めて使い、いくつかのセキュリティについて理解しようとしています。
私の質問は、コンテナーを実行しているユーザーのグループID(= gid)についてです。
この公式の例を使用してポッドを作成します: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: gcr.io/google-samples/node-hello:1.0
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
ドキュメントでは、彼らは言う:
構成ファイルのrunAsUserフィールドは、ポッド内のすべてのコンテナについて、最初のプロセスがユーザーで実行されることを指定しますID 1000。 fsGroupフィールドは、グループID 2000がallポッド内のコンテナ。グループID 2000は、/ data/demoにマウントされたボリュームと、そのボリュームで作成されたファイルにも関連付けられています。
だから、私はコンテナに入ります:
kubectl exec -it security-context-demo -- sh
最初のプロセス(つまり、PID 1を使用)がユーザー1000 => OKで実行されているのがわかります。これが期待どおりの動作です。
$ ps -f -p 1
UID PID PPID C STIME TTY TIME CMD
1000 1 0 0 13:06 ? 00:00:00 /bin/sh -c node server.js
次に、フォルダー/ data/demoにファイル「testfile」を作成します。/data/demoにグループ権限の「s」フラグがあるため、このファイルはグループ「2000」に属しています。
$ ls -ld /data/demo
drwxrwsrwx 3 root 2000 39 Dec 29 13:26 /data/demo
$ echo hello > /data/demo/testfile
$ ls -l /data/demo/testfile
-rw-r--r-- 1 1000 2000 6 Dec 29 13:29 /data/demo/testfile
次に、サブフォルダー「my-folder」を作成し、グループ権限の「s」フラグを削除します。このフォルダに「my-file」というファイルを作成します。
$ mkdir /data/demo/my-folder
$ ls -ld /data/demo/my-folder
drwxr-sr-x 2 1000 2000 6 Dec 29 13:26 /data/demo/my-folder
$ chmod g-s /data/demo/my-folder
$ ls -ld /data/demo/my-folder
drwxr-xr-x 2 1000 2000 6 Dec 29 13:26 /data/demo/my-folder
$ touch /data/demo/my-folder/my-file
$ ls -l /data/demo/my-folder/my-file
-rw-r--r-- 1 1000 root 0 Dec 29 13:27 /data/demo/my-folder/my-file
このファイルがグループ「root」、つまりGID 0のグループに属していることに驚いています。ドキュメントの次の文によると、このファイルはグループ「2000」に属しているはずです。
FsGroupフィールドは、グループID 2000がポッド内のすべてのコンテナに関連付けられていることを指定します
次のコマンドを使用すると、コンテナー内のUID "1000"のユーザーが2000ではなくプライマリUnixグループ "0"を持っていることがわかります。
$ id
uid=1000 gid=0(root) groups=0(root),2000
$ cat /proc/1/status
...
Pid: 1
...
Uid: 1000 1000 1000 1000
Gid: 0 0 0 0
...
Groups: 2000
...
誰か説明がありますか?
ユーザーのGIDがポッドのセキュリティコンテキストの「fsGroup」フィールドの値に設定されていないのはなぜですか?
ユーザーのGIDが0 = rootに設定されているのはなぜですか?
Kubernetesのバグですか(v1.8.0を使用しています)?
ドキュメントを誤解しましたか?
ありがとう!
残念ながら、現在プライマリグループIDの設定はKubernetesではサポートされておらず、デフォルトでgid=0
。
これを実装するための未解決の問題があります: https://github.com/kubernetes/features/issues/21