
Recientemente cambié de Docker aPodmany creó un compatible con Kubernetesdefinición de vainaarchivo yaml.
La definición se carga exitosamente usando rootlesspodman play kube
comando, 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 front
salida
{
"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 -r
no 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_t
la etiqueta de SELinux. Sería el equivalente a ejecutar el comando podman
con 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.