Podman kube без привилегий quadlet с пользовательским соответствием

Вопрос или проблема

Я пытаюсь запустить podman quadlet, определённый с помощью файла YML Kubernetes.
Я хочу, чтобы он работал без прав суперпользователя в systemd под пользователем web на хосте: systemctl --user status pod-web.

Внутри контейнера процесс PHP работает под пользователем 33:33.
Я хочу, чтобы директория /home/web/data на хосте принадлежала пользователю web, но при этом была доступна для чтения и записи пользователю 33:33 внутри контейнера, где она смонтирована по пути /var/www/html.

В комментариях вы можете увидеть некоторые вещи, которые я пробовал.
К сожалению, я не понимаю пространства имен пользователей и subuid/subgid достаточно хорошо, чтобы заставить это работать с документацией, и Copilot продолжает заблуждаться, поэтому любая помощь от настоящих людей будет признательна.

Моя проблема аналогична этой, но я хочу использовать quadlet podman kube, определённый в файле YML.


Окружение:

  • AlmaLinux release 9.4 (Seafoam Ocelot)
  • podman version 4.9.4-rhel
  • systemd 252 (252-32.el9_4.7)
  • SELinux включен в режиме принуждения
  • chown -R web:web /home/web
  • usermod --add-subuids 100000-165535 --add-subgids 100000-165535 web

/home/web/pod-web.yml:

apiVersion: v1
kind: Pod
metadata:
  name: pod-web
#  annotations:
#    io.podman.annotations.userns: "keep-id"
spec:
  containers:
  - name: pod-web
    image: docker.io/library/php:8.3-apache
#    securityContext:
#      runAsUser: 33
#      runAsGroup: 33
#      supplementalGroups: [65536]
#    ports:
#    - containerPort: 80
#      hostPort: 8000
    volumeMounts:
    - mountPath: /var/www/html
      name: web-data
  volumes:
  - name: web-data
    hostPath:
      path: /home/web/data
  restartPolicy: Always

С runAsUser: 33 контейнер выдавал следующее:

(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80

С runAsUser: 0 контейнер, похоже, работает, но это плохая практика, так как это даёт слишком много привилегий, если я правильно понимаю.


/home/web/.config/containers/systemd/pod-web.kube:

[Unit]
Description=Podman Quadlet: %p

[Service]
# ExecStartPre=/usr/bin/podman unshare -- /bin/bash -c 'chown -R 33:33 /home/web/data'

[Kube]
Yaml=/home/web/%p.yml
LogDriver=journald
#UserNS=keep-id:uid=33,gid=33
#UserNS=auto

[Install]
WantedBy=multi-user.target default.target

Я думаю, что это работает с UserNS=auto, но я сделал так много различных изменений, что теперь не уверен.

Ответ или решение

Для решения вашей задачи по запуску контейнера Podman в режиме rootless с использование kubernetes YAML файла и с соответствующей настройкой прав доступа, выполним следующие шаги:

Подготовка окружения

  1. Настройка под пользователей и группы:
    Убедитесь, что у пользователя web есть доступ к подидентификаторам, соответствующим UID и GID, используемым внутри контейнера:

    usermod --add-subuids 100000-165535 --add-subgids 100000-165535 web
  2. Права на директорию:
    Помните, что директория /home/web/data должна быть доступна пользователю 33:33, который соответствует пользователю www-data (или аналогичному) внутри контейнера.
    Используйте следующую команду, чтобы установить правильные права:

    sudo chown -R web:web /home/web
    sudo chmod -R 770 /home/web/data

YAML файл конфигурации

Ваш файл /home/web/pod-web.yml должен выглядеть так:

apiVersion: v1
kind: Pod
metadata:
  name: pod-web
spec:
  containers:
  - name: pod-web
    image: docker.io/library/php:8.3-apache
    securityContext:
      runAsUser: 33                   # пользователь внутри контейнера
      runAsGroup: 33                  # группа внутри контейнера
      supplementalGroups: [65536]     # дополнительные группы
    volumeMounts:
    - mountPath: /var/www/html
      name: web-data
  volumes:
  - name: web-data
    hostPath:
      path: /home/web/data
  restartPolicy: Always

Настройка systemd Unit файла

Файл /home/web/.config/containers/systemd/pod-web.kube должен содержать следующее:

[Unit]
Description=Podman Quadlet: %p

[Service]
ExecStartPre=/usr/bin/podman unshare -- /bin/bash -c 'chown -R 33:33 /home/web/data'

[Kube]
Yaml=/home/web/%p.yml
LogDriver=journald
UserNS=auto                       # Проверит и автоматически настроит пространство имен пользователей

[Install]
WantedBy=multi-user.target default.target

Примечания к настройкам

  1. UserNS=auto: Это позволит Podman автоматически управлять пространством имен пользователей. С этой настройкой, необходимые сопоставления UID/GID будут применены, что позволит вам запускать контейнеры и сохранять права доступа.

  2. Используйте ExecStartPre: Эта команда выполняется перед запуском контейнера и позволяет вам установить правильные права на директорию, которая будет монтирована в контейнер. Убедитесь, что у вас есть необходимые права для выполнения этой команды.

  3. SELinux: Убедитесь, что SELinux не блокирует доступ, или попробуйте временно отключить его для диагностики (не рекомендуется в продуктивной среде).

Запуск и тестирование

После того как вы создали все необходимые файлы и конфигурации, запустите сервис:

systemctl --user daemon-reload
systemctl --user start pod-web
systemctl --user status pod-web

Убедитесь, что сервис запустился без ошибок. Если возникнут проблемы, проверьте логи:

journalctl --user -u pod-web

Заключение

Следуя этим шагам, вы должны быть в состоянии настроить Podman для работы в режиме rootless, при этом сохранить права доступа к файлам, соответствующие специфике вашего приложения PHP. В случае возникновения дальнейших трудностей, постарайтесь предоставить больше информации о предпринимаемых шагах и наблюдаемых ошибках.

Оцените материал
Добавить комментарий

Капча загружается...