Wie gewähre ich über die SELinux-Richtlinie Lese-/Schreibzugriff auf ein bind-gemountetes Volume über das rootlose Podman Play Kube?

Wie gewähre ich über die SELinux-Richtlinie Lese-/Schreibzugriff auf ein bind-gemountetes Volume über das rootlose Podman Play Kube?

Ich bin vor kurzem von Docker zuPodmanund erstellte eine Kubernetes-kompatiblePod-Definitionyaml-Datei.
Die Definition wurde erfolgreich geladen mit rootlesspodman play kubeBefehl, dann deklariert Pod und Container starten aberLesezugriff wird verweigertbeim Versuch, Inhalte aufzulisten vonHostpfadgebundenes Volumen im Behälter.

Laden der Definition und Speichern der „vorderen“ Containerprotokolle

$ 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

Ich glaube, die Ablehnung muss damit zu tun haben,SELinuxEinschränkungsrichtlinie, da die Rechte zur diskretionären Zugriffskontrolle für Dateien im Hostverzeichnis freizügig genug erscheinen ...

$ 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

Also habe ich naiv dasselbe angewendetSELinuxLabels vom Host-Verzeichnis zum Pod, aber es hat anscheinend und wenig überraschend nichts gelöst.

Es könnte etwas mit der Eigenmarke zu tun haben,Podman spielt WürfelDokumentation:

Hinweis: HostPath-Volumetypen erstellt vonspiel kubeerhalten Sie eineSELinuxEigenmarke

Was meiner Meinung nach nur bedeutet, dassHostpfadVolumes können nicht von mehreren Containern gemeinsam genutzt werden (hier kann ich mich auch irren).

Podman-Pod-YAML-Definitionsdatei

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-Zuordnungen

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

Auszug der podman inspect frontAusgabe

{
  "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": [],
    ...
  }
  ...
}

In den zugehörigen journalctl -a -rDatensätzen wird nichts im Zusammenhang mit einer Zugriffsverweigerung oder einer nicht autorisierten Aktion angezeigt.

Irgendwelche Vorschläge zum Debuggen/Beheben dieser Situation? Danke.

Antwort1

Ich hatte das gleiche Problem und habe diese Lösung gefunden. Anstatt zu versuchen, dieselben Labels vom Host aus anzuwenden, deaktivieren Sie einfach die Labels:

  securityContext:
    seLinuxOptions:
      type: spc_t

Deaktivieren type: spc_tSie das SELinux-Label. Dies entspricht der Ausführung des Befehls podmanmit dem Argument --security-opt label=disable. Beispiel:

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

Ich habe hier die Lösung gefunden:https://github.com/containers/libpod/pull/5307#issuecomment-590830455

Ich hoffe, es hilft.

verwandte Informationen