Оболочка входа Podmansh#

Podmansh позволяет запускать пользовательскую оболочку внутри контейнера, когда пользователь входит в систему, и заменяет стандартную оболочку, например, /usr/bin/bash на /usr/bin/podmansh.

Контейнер, внутри которого будет запущена оболочка, определяется с помощью юнит-файла Quadlet. Данный файл может быть создан в каталогах:

  • /usr/share/containers/systemd/ или /etc/containers/systemd/ - systemd запустит юнит-файл для всех пользователей при входе в систему;

  • /etc/containers/systemd/users/${UID} - systemd запустит юнит-файл для конкретного пользователя.

В качестве примера приведен сценарий создания юнит-файла Quadlet, когда создаваемый контейнер Podmansh не имеет доступа к операционной системе и все операции выполняются исключительно внутри контейнера.

Для создания юнит-файла Quadlet, когда создаваемый контейнер Podmansh не имеет доступа к операционной системе и все операции выполняются исключительно внутри контейнера, выполните следующий сценарий:

  1. Запустите сеанс входа пользователя с помощью команд:

    useradd -s /usr/bin/podmansh lockedu
    grep lockedu /etc/passwd
    lockedu:x:4008:4008::/home/lockedu:/usr/bin/podmansh
    
  2. Создайте юнит-файл Quadlet podmansh.container в /etc/containers/systemd/users/${USER_ID}, используя команды:

    USER_ID=$(id -u lockedu)
    mkdir -p /etc/containers/systemd/users/${USER_ID}
    cat > /etc/containers/systemd/users/${USER_ID}/podmansh.container
    

    Содержимое юнит-файла podmansh.container:

    [Unit]
    Description=The podmansh container
    After=local-fs.target
    
    [Container]
    Image=localhost/container-name:latest
    ContainerName=podmansh
    RemapUsers=keep-id
    RunInit=yes
    DropCapability=all
    NoNewPrivileges=true
    Exec=sleep infinity
    
    [Install]
    RequiredBy=default.target
    

    Обратите внимание на поля в разделе [Container]:

    • Image - путь к контейнеру, который будет запускаться в формате юнит-файла;

    • ContainerName - имя контейнера должно быть указано как podmansh, так как /usr/bin/podmansh выполняет команду podman exec в контейнер podmansh;

    • RemapUsers - отображение USER_ID пользователя внутри контейнера;

    • RunInit - Podman запустит процесс инициализации внутри контейнера, который очистит все бездействующие процессы;

    • DropCapability - Podman предотвращает получение контейнерным процессом каких-либо возможностей и прав в системе;

    • NoNewPrivileges - Podman не позволяет контейнеру получать какие-либо новые привилегии в дополнение к существующим;

    • Exec - команда, которая будет выполняться внутри контейнера.

  3. Создайте podmansh.service на основе podmansh.container:

    systemctl daemon-reload
    
  4. Запустите podmansh.service:

    systemctl start podmansh.service