ルートレスPodman Play kube Bindを介してマウントされたボリュームにSELinuxポリシーを介した読み取り/書き込みアクセス権を付与する方法は?

ルートレスPodman Play kube Bindを介してマウントされたボリュームにSELinuxポリシーを介した読み取り/書き込みアクセス権を付与する方法は?

最近DockerからDockerに切り替えました。ボードマンKubernetes互換製品を作成しました。ポッドの定義yamlファイル。
rootlessを使用して定義を正常にロードしました。podman play kubeその後、命令はポッドとコンテナが起動したと宣言しますが、読み取りアクセスが拒否されました。何かをリストしようとするとホストパスコンテナ内のバインドされたボリューム。

定義のロードと「フロントエンド」コンテナログダンプ

$ podman play kube ./my-pod.yaml ; sleep 1 ; podman logs front
/var/www  # pwd
0 0       # echo `id -u` `id -g`
total 0   # ls -lha   
ls: cannot open '.': Permission denied

私は拒否が以下に関連していると思います。SELinuxファイルランダムアクセス制御は、ホストディレクトリに対して十分に許可されているように見えるため、制限されたポリシーです。

$ pwd ; ls -lhaZ
/home/stph/my-project
drwxrwxr-x.  9 stph stph unconfined_u:object_r:user_home_t:s0 4.0K Apr 15 22:30 .
drwxrwxr-x.  4 stph stph unconfined_u:object_r:user_home_t:s0 4.0K Apr 15 22:30 ..
drwxr-xr-x.  5 stph stph unconfined_u:object_r:user_home_t:s0 4.0K Apr  3 14:11 ui

だから素朴に同じことを適用しました。SELinuxホストディレクトリからポッドにラベルを付けましたが、当然ながら何も解決しませんでした。

によると、個人のラベリングに関する内容があるかもしれません。PodmanがKubeを演じる。文書:

注:HostPathボリュームタイプジェネレータキューブをプレイする与えられるSELinux個人商標

私はこれがただ意味すると信じていますホストパスボリュームは複数のコンテナで共有できません(ここでは私が間違っている可能性があります)。

Podman Pod yaml 定義ファイル

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  hostname: my-pod-host
  volumes:
  - name: projdir
    hostPath:
      path: /home/stph/my-project
      type: Directory
  securityContext:
    seLinuxOptions:
      level: s0
      role: object_r
      type: user_home_t
      user: unconfined_u
  containers:
  - name: front
    image: node:lts-alpine
    workingDir: /var/www
    env:
      - name: API_ENTRYPOINT
        value: "http://localhost:80/api"
    ports:
      - containerPort: 5000
        hostIP: 127.0.0.1
        hostPort: 5000
        protocol: TCP
    volumeMounts:
    - name: projdir
      mountPath: /var/www
      subPath: ui
    command: ['/bin/sh', '-c', 'pwd ; echo `id -u` `id -g` ; ls -lha']

/etc/subuid マッピング

cat /etc/subuid
stph:1000:1
stph:100000:65536

podman inspect front出力抜粋

{
  "Id": "c93a3d6...",
  "Created": "2020-04-15T19:01:14.034867742+02:00",
  "Path": "docker-entrypoint.sh",
  "Args": [
    "/bin/sh",
    "-c",
    "pwd ; echo `id -u` `id -g` ; ls -lha"
  ],
  "State": {
    "OciVersion": "1.0.1-dev",
    "Status": "exited",
    ...
  },
  "Image": "f77abbe...",
  "ImageName": "node:lts-alpine",
  "Rootfs": "",
  "Pod": "26bd784...",
  "ResolvConfPath": "/run/user/1000/containers/overlay-containers/93c4707.../userdata/resolv.conf",
  "HostnamePath": "/run/user/1000/containers/overlay-containers/c93a3d.../userdata/hostname",
  "HostsPath": "/run/user/1000/containers/overlay-containers/93c4707.../userdata/hosts",
  "StaticDir": ".../containers/storage/overlay-containers/c93a3d.../userdata",
  "OCIConfigPath": ".../containers/storage/overlay-containers/c93a3d.../userdata/config.json",
  "OCIRuntime": "crun",
  "LogPath": ".../containers/storage/overlay-containers/c93a3d.../userdata/ctr.log",
  "LogTag": "",
  "ConmonPidFile": "/run/user/1000/containers/overlay-containers/c93a3d.../userdata/conmon.pid",
  "Name": "front",
  "RestartCount": 0,
  "Driver": "overlay",
  "MountLabel": "system_u:object_r:container_file_t:s0:c57,c80",
  "ProcessLabel": "system_u:system_r:container_t:s0:c57,c80",
  "Mounts": [
    {
      "Type": "bind",
      "Name": "",
      "Source": "/home/stph/my-project",
      "Destination": "/var/www",
      "Driver": "",
      "Mode": "",
      "Options": [
          "rbind"
      ],
      "RW": true,
      "Propagation": "rprivate"
    }
  ],
  "Namespace": "",
  "IsInfra": false,
  "Config": {
    "Hostname": "ski-pod-host",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
      "TERM=xterm",
      "NODE_VERSION=12.16.1",
      "YARN_VERSION=1.22.0",
      "API_ENTRYPOINT=http://localhost:80",
      "HOSTNAME=ski-pod-host",
      "HOME=/root",
      "container=libpod"
    ],
    "Cmd": [
      "docker-entrypoint.sh", "/bin/sh", "-c", "pwd ; echo `id -u` `id -g` ; ls -lha"
    ],
    "Image": "node:lts-alpine",
    "Volumes": null,
    "WorkingDir": "/var/www",
    "Entrypoint": "",
    "StopSignal": 15
    ...
  },
  "HostConfig": {
    "Binds": [
      "/home/stph/my-project:/var/www:rw,rprivate,rbind"
    ],
    "NetworkMode": "container:93c4707...",
    "RestartPolicy": {
      "Name": "",
      "MaximumRetryCount": 0
    },
    "AutoRemove": false,
    "VolumeDriver": "",
    "VolumesFrom": null,
    "IpcMode": "container:93c4707...",
    "Cgroup": "",
    "Cgroups": "default",
    "Privileged": false,
    "ReadonlyRootfs": false,
    "SecurityOpt": [],
    ...
  }
  ...
}

関連journalctl -a -r履歴には、アクセス拒否や不正操作に関する内容は表示されません。

この状況をデバッグ/解決する方法に関する提案はありますか?ありがとうございます。

ベストアンサー1

私は同じ問題があり、この解決策を見つけました。ホストで同じタグを適用する必要はなく、タグを無効にするだけです。

  securityContext:
    seLinuxOptions:
      type: spc_t

SELinuxタグを無効にしますtype: spc_t。これはpodman、引数を使用してコマンドを実行するのと同じです--security-opt label=disable。たとえば、

podman run -it --security-opt label=disable -v .:/foo alpine

ここで解決策を見つけました。https://github.com/containers/libpod/pull/5307#issuecomment-590830455

参考になれば幸いです。

おすすめ記事