¿Cómo otorgar acceso de lectura/escritura a través de la política SELinux a un volumen montado en enlace a través de podman play kube sin raíz?

¿Cómo otorgar acceso de lectura/escritura a través de la política SELinux a un volumen montado en enlace a través de podman play kube sin raíz?

Recientemente cambié de Docker aPodmany creó un compatible con Kubernetesdefinición de vainaarchivo yaml.
La definición se carga exitosamente usando rootlesspodman play kubecomando, entonces, declaró el inicio del Pod y del contenedor peroacceso de lectura denegadoal intentar enumerar el contenido derutadelhostVolumen ligado dentro del contenedor.

Cargando la definición y volcando registros de contenedor "frontales"

$ 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

Creo que la negación debe tener que ver conSELinuxpolítica de restricción ya que los derechos de control de acceso discrecional a archivos parecen lo suficientemente permisivos en el directorio del host...

$ 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

Entonces, ingenuamente apliqué lo mismo.SELinuxetiquetas del directorio de host al pod, pero aparentemente y como era de esperar, no resolvió nada.

Puede haber algo sobre el etiquetado privado segúnpodman jugar kubedocumentación:

Nota: tipos de volúmenes de HostPath creados porjugar kubese le dará unSELinuxetiqueta privada

Lo que creo que sólo significa queruta de hostLos volúmenes no se pueden compartir entre varios contenedores (podría estar equivocado aquí).

Archivo de definición de 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/mapeos de subuidos

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

Extracto de podman inspect frontsalida

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

Los registros relacionados journalctl -a -rno muestran nada relacionado con denegación de acceso ni acciones no autorizadas.

¿Alguna sugerencia sobre cómo depurar/resolver esta situación? Gracias.

Respuesta1

Tuve el mismo problema y encontré esta solución. En lugar de intentar aplicar las mismas etiquetas desde el host, simplemente deshabilite las etiquetas:

  securityContext:
    seLinuxOptions:
      type: spc_t

Deshabilita type: spc_tla etiqueta de SELinux. Sería el equivalente a ejecutar el comando podmancon el argumento --security-opt label=disable. Por ejemplo:

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

Encontré la solución aquí:https://github.com/containers/libpod/pull/5307#issuecomment-590830455

Espero que ayude.

información relacionada