Как предоставить детально настроенные привилегии не-root пользователям в Docker

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Docker - это мощная платформа контейнеризации, которая революционизировала способ разработки, развертывания и управления приложениями. Однако запуск контейнеров Docker от имени суперпользователя (root) может представлять угрозу безопасности. В этом руководстве вы узнаете, как предоставить детально настроенные привилегии не-root пользователям в Docker, чтобы они могли выполнять определенные задачи без ущерба общей безопасности системы.

Понимание привилегий пользователей Docker

По умолчанию контейнеры Docker запускаются от имени не привилегированных пользователей, что помогает повысить общую безопасность системы. Однако могут быть ситуации, когда вам нужно предоставить детально настроенные разрешения не-root пользователям внутри контейнера Docker для выполнения определенных задач.

Стандартные привилегии пользователей в Docker

По умолчанию контейнеры Docker запускаются от имени пользователя root, который имеет наивысший уровень привилегий внутри контейнера. Это может представлять угрозу безопасности, так как любые уязвимости или вредоносные действия внутри контейнера могут потенциально повлиять на хост-систему.

Для снижения этого риска Docker рекомендует запускать контейнеры от имени не-root пользователей. Вы можете сделать это, указав пользователя в Dockerfile или используя флаг --user при запуске контейнера.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## Run container as non-root user
docker run -it --user myuser ubuntu:22.04 bash

Понимание пространств имен пользователей

Docker использует пространства имен пользователей (user namespaces), чтобы обеспечить дополнительный уровень изоляции и безопасности для не-root пользователей внутри контейнера. Пространства имен пользователей позволяют сопоставить идентификаторы пользователя и группы из контейнера с разными идентификаторами на хост-системе, фактически создавая отдельное пользовательское пространство для контейнера.

graph TD A[Host System] --> B[Container] B[Container] --> C[Mapped User ID] B[Container] --> D[Mapped Group ID]

Это сопоставление гарантирует, что даже если не-root пользователь внутри контейнера имеет высокие привилегии, он не может повлиять на хост-систему или другие контейнеры, запущенные на том же хосте.

Проверка привилегий пользователя

Вы можете использовать команду id внутри контейнера, чтобы проверить идентификаторы пользователя и группы, с которыми сопоставлен текущий пользователь:

$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)

Этот вывод показывает, что пользователь myuser внутри контейнера сопоставлен с идентификатором пользователя 1000 и идентификатором группы 1000.

Предоставление детально настроенных разрешений не-root пользователям

Хотя запуск контейнеров от имени не-root пользователей является хорошей практикой с точки зрения безопасности, могут быть случаи, когда вам нужно предоставить этим пользователям определенные разрешения для выполнения определенных задач. Docker предоставляет несколько способов назначения детально настроенных разрешений не-root пользователям внутри контейнера.

Использование флагов --cap-add и --cap-drop

Docker поддерживает использование Linux-возможностей (capabilities), которые позволяют предоставлять или отзывать определенные привилегии пользователю или процессу. Вы можете использовать флаги --cap-add и --cap-drop при запуске контейнера, чтобы добавить или удалить возможности для не-root пользователя.

## Grant the "CAP_SYS_ADMIN" capability to the non-root user
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

## Remove the "CAP_CHOWN" capability from the non-root user
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash

Монтирование томов с определенными разрешениями

Вы также можете предоставить детально настроенные разрешения не-root пользователям, монтируя тома с определенным владельцем и разрешениями. Это позволяет вам контролировать права доступа не-root пользователя внутри контейнера.

## Mount a volume with specific permissions
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash

В этом примере смонтированный том доступен не-root пользователю с идентификатором пользователя 1000 и идентификатором группы 1000.

Использование флага --group-add

Если не-root пользователь должен выполнять задачи, требующие членства в определенных группах, вы можете использовать флаг --group-add, чтобы добавить пользователя в дополнительные группы внутри контейнера.

## Add the non-root user to the "docker" group
docker run -it --user myuser --group-add docker ubuntu:22.04 bash

Это позволяет не-root пользователю выполнять задачи, требующие членства в группе "docker", например, взаимодействовать с Docker-демоном.

Настройка Dockerfile

Вы также можете настроить Dockerfile, чтобы создать не-root пользователя с определенными разрешениями и членством в группах. Это гарантирует, что не-root пользователь имеет необходимые привилегии для выполнения своих задач внутри контейнера.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

В этом Dockerfile создается не-root пользователь с именем myuser и добавляется в группу "docker", что позволяет ему взаимодействовать с Docker-демоном.

Практические примеры использования

Предоставление детально настроенных разрешений не-root пользователям в Docker может быть полезно в различных сценариях. Вот несколько практических примеров использования:

Сценарий 1: Запуск веб-сервера

Предположим, у вас есть веб-приложение, запускаемое в контейнере Docker, и вы хотите, чтобы не-root пользователь имел необходимые разрешения для запуска и управления процессом веб-сервера.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]

В этом примере не-root пользователь myuser получает права владения директорией /var/www/html, которая является стандартным местом для веб-сервера Nginx. Это позволяет не-root пользователю запускать и управлять процессом Nginx внутри контейнера.

Сценарий 2: Доступ к конфиденциальным файлам

Если ваш контейнер должен иметь доступ к конфиденциальным файлам или директориям, вы можете предоставить не-root пользователю необходимые разрешения для чтения или записи в эти места.

## Run container with specific volume permissions
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash

В этом примере не-root пользователь с идентификатором пользователя 1000 и идентификатором группы 1000 получает права на чтение и запись в директорию /path/to/sensitive/files внутри контейнера.

Сценарий 3: Взаимодействие с Docker-демоном

Если ваш не-root пользователь должен взаимодействовать с Docker-демоном, вы можете добавить его в группу "docker" внутри контейнера.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

В этом Dockerfile создается не-root пользователь с именем myuser и добавляется в группу "docker", что позволяет ему выполнять задачи, связанные с Docker, такие как сборка и управление контейнерами.

Сценарий 4: Выполнение привилегированных команд

В некоторых случаях ваш не-root пользователь может потребовать выполнить привилегированные команды, которые требуют определенных возможностей (capabilities). Вы можете использовать флаг --cap-add, чтобы предоставить не-root пользователю необходимые возможности.

## Run container with specific capability
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

В этом примере не-root пользователю предоставляется возможность "CAP_SYS_ADMIN", которая позволяет выполнять задачи системного администрирования, требующие повышенных привилегий.

Понимая эти практические примеры использования, вы можете эффективно предоставить детально настроенные разрешения не-root пользователям в Docker, обеспечивая им необходимый доступ для выполнения своих задач при сохранении безопасной и изолированной среды.

Заключение

В этом обширном руководстве по Docker вы узнаете, как предоставлять детально настроенные разрешения не-root пользователям, чтобы они могли взаимодействовать с контейнерами и ресурсами Docker без повышения своих привилегий. Понимая принципы работы с привилегиями пользователей в Docker и исследуя практические примеры использования, вы сможете создать более безопасную и эффективную среду Docker, адаптированную к потребностям вашей организации.