web-dev-qa-db-ja.com

Kubernetes、セキュリティコンテキスト、fsGroupフィールド、コンテナを実行しているデフォルトのユーザーのグループID

私は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 1000fsGroupフィールドは、グループ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を使用しています)?

ドキュメントを誤解しましたか?

ありがとう!

9
Sylmarch

残念ながら、現在プライマリグループIDの設定はKubernetesではサポートされておらず、デフォルトでgid=0

これを実装するための未解決の問題があります: https://github.com/kubernetes/features/issues/21

4
AlexBrand