Рейтинг:7

Разрешить пользователям без полномочий root использовать один порт

флаг jp

У меня есть лабораторный сервер, на котором я являюсь пользователем root (и обычным пользователем).

Доменное имя — example.org, и я даю каждому участнику поддомен, например, bob.example.org для Боба и anna.example.org для пользователя Анны. Я думаю, вы получите сделку. :) Субдомены обратно проксируются с помощью nginx на определенный порт.

мой вопрос, есть ли способ, которым я могу дать разрешение пользователям без полномочий root запускать док-контейнеры в их определенном диапазоне портов. Например, Анне дан диапазон 1300-1350, где порт 1300 привязан к anna.example.org, а остальные находятся в резерве.

В системе работает Debian 11 Bullseye и последняя версия Docker.

Cyclic3 avatar
флаг br
Я был бы *очень* осторожен, предоставляя пользователям без полномочий root доступ к докеру.Это так же просто, как `docker run -v /:/pwn -it cycle3/pwn`, чтобы получить полный доступ r/w ко всей файловой системе, а добавление `--привилегированного` практически идентично тому, чтобы быть root на этой машине. . Я видел, как это шло не так много раз, в том числе в CTF, проводимом крупной киберкомпанией, где это было преднамеренно для одной задачи, но в конечном итоге выставило все машины, используемые для этой категории. Это можно сделать безопасно, но я думаю, очень важно подчеркнуть, насколько далеко это может зайти.
Oscar Andersson avatar
флаг jp
Потрясающий комментарий к анекдоту о CTF. Я сам иногда соревнуюсь в них. Звучит как веселое соревнование! :) В любом случае, я решил полностью изолировать пользователя, используя разные контейнеры без какого-либо доступа к хосту, кроме некоторых открытых портов. Спасибо за ваше время.
Рейтинг:9
флаг td
bob

AFAIK Linux имеет только концепцию привилегированных портов по сравнению с непривилегированными портами.

Параметр настройки ядра Linux net.ipv4.ip_uncitationd_port_start определяет, какие порты являются привилегированными. Все порты от 0 до net.ipv4.ip_непривилегированный_порт_старт являются привилегированными.

Привилегированные порты могут использоваться только процессами, запущенными либо пользователем root, либо с привилегиями root, либо процессами, которым назначены способность CAP_NET_BIND_SERVICE с например sudo setcap cap_net_bind_service=ep/path/bin/application

Все остальные порты являются непривилегированными и могут использоваться любым пользователем, если они еще не используются.

Я не знаю какого-либо альтернативного метода, позволяющего определенным пользователям использовать определенные порты.

Oscar Andersson avatar
флаг jp
Спасибо @bob! Я думаю дать каждому пользователю докер-контейнер с Debian 11, где они могут свободно перемещаться, затем я привязываю порты 80 и 22 к поддомену моего основного домена. Что ты об этом думаешь? Возможно, это добавляет уровень безопасности.
Рейтинг:6
флаг in

Прежде всего, только доверенные пользователи должны иметь право управлять вашим демоном Docker.

Демон docker по умолчанию запускается от имени пользователя root при установке Debian Bullseye. Добавление пользователя в докер group предоставляет этому пользователю псевдо-рут-доступ из-за того, что он контролирует демон docker, имеющий такой объем доступа. Каждый пользователь в группе докеров будет иметь полный контроль над хостом и другими контейнерами и может запускать контейнер, который --публиковатьлюбой порт.

Есть несколько вариантов обеспечения безопасности доступа пользователей к докеру.

  1. Докер без рута
  2. судо
  3. API

1. Докер без рута

А настройка докера без рута позволит каждому пользователю запускать демона докеров. Для портов ниже 1024 необходимо соблюдать информация о непривилегированных портах bob, поскольку каждый пользователь будет «владеть» своим демоном. Докер также предоставляет соответствующее руководство. Это не помешает Анне взять порт Боба.

2. судо

Самый простой способ позволить пользователям запускать команды docker — предоставить скрипт, управляемый root, через sudo, который либо статичен, либо управляет пользовательским вводом для необязательных аргументов:

#!/бин/баш
docker run --detach --publish 1300:1300 anna/app-image
анна ALL=(root) NOPASSWD: /usr/local/bin/start-anna-image

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

3. Плагин авторизации или API для Docker

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

Docker предоставляет встроенный плагин авторизации фреймворк для этого. Некоторые примеры opa-docker-authz и casbin-authz-плагин

Вы можете предоставить пользователям доступ к форме прокси-API, которая обеспечивает аутентификацию и авторизацию того, что передается в Docker REST API. Существуют библиотеки докеров для большинства языков программирования.Kubernetes+RBAC — это пример API, который находится перед демоном Docker и контролирует доступ (просто очень большой/сложный, который делает гораздо больше).

Oscar Andersson avatar
флаг jp
Спасибо @matt, правда! Вы упомянули несколько хороших моментов, теперь я попробовал альтернативы 1 и 2. Мне кажется, что докер без рута слишком сложен для меня, а наборы правил sudo требуют для меня слишком много времени. Что вы думаете о предоставлении каждому пользователю своего собственного контейнера, в который они просто подключаются по SSH. Область пользователей даже не распространяется на хост. Каковы преимущества безопасности этого на ваш взгляд? Спасибо.
Рейтинг:5
флаг cn

Пока порты непривилегированные, пользователи без полномочий root могут подключаться к любому порту (более 1024). Они могут запускать контейнеры с помощью:

docker run --expose 1300-1350 <image-name>

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

Для привилегированных портов (менее 1024) вам нужны права root или CAP_NET_BIND_SERVICE. Видеть способности человека для деталей.

Oscar Andersson avatar
флаг jp
Спасибо Микея! Могу ли я добавить пользователя без полномочий root в группу пользователей Docker и не позволять ему вмешиваться в привилегированные порты и другие контейнеры? Чтобы Анна не могла просматривать, редактировать или удалять контейнеры Боба.
флаг cn
Контейнеры, запущенные одним пользователем, будут управляться только этим пользователем. Вы можете ограничить диапазоны портов, к которым контейнеры (или любое приложение) могут привязываться через SELinux или AppArmor: https://serverfault.com/a/388334/30946.
Matt avatar
флаг in
Если демон docker работает как `root`, то не имеет значения, какой пользователь запускает команды `docker`. По сути, пользователи имеют root-доступ через демон, который выполняет всю работу.
Matt avatar
флаг in
@OscarAndersson Нет, любой пользователь в группе «docker», пока демон docker работает от имени root, имеет root-доступ к машине и может управлять другими контейнерами.
Nonny Moose avatar
флаг gb
Также обратите внимание, что вы можете перенаправить порт докера на привилегированный порт.
Oscar Andersson avatar
флаг jp
Спасибо @NonnyMoose, я так и делаю. :)
Oscar Andersson avatar
флаг jp
Спасибо @MirceaVutcovici, звучит интересно, я посмотрю. :)
Oscar Andersson avatar
флаг jp
Да, @Matt, это действительно хороший момент.Я не слишком беспокоюсь о том, что мои пользователи преднамеренно взламывают систему, скорее, некоторые из них не имеют опыта работы с системами Linux и могут открыть дыры в безопасности для хакеров. Я приму во внимание ваши комментарии.
Рейтинг:3
флаг in

Субдомены проксируются с помощью nginx на определенный порт.

Вы можете проксировать поддомены на сокеты Unix.

    proxy_pass http://unix:/var/run/anna.sock:/;

При необходимости повторите для каждого поддомена и установите разрешения для сокетов Unix, чтобы только те пользователи, которых вы хотите, могли слушать там.

Также обратите внимание, что пользователь, который может запускать контейнеры Docker, может монтировать /etc/passwd в них и получить root права, так что от этого нужно защищаться отдельно.

Matt avatar
флаг in
Хорошая идея, но аналогично вашему второму пункту, докер также может монтировать любой сокет, если вы не добавите какую-либо другую форму контроля над тем, что пользователь может запускать через докер.
Oscar Andersson avatar
флаг jp
Koterpillar и @matt, могу ли я связать/опубликовать сокет unix через докер или мне следует использовать для этого порты? Прочитайте что-нибудь о том, что он еще не полностью поддерживается докером.
Oscar Andersson avatar
флаг jp
Спасибо Koterpillar за упоминание о последствиях для безопасности предоставления пользователям доступа к докеру.
флаг in
Поскольку сокет UNIX — это файл, попробуйте смонтировать его в контейнер.
Рейтинг:1
флаг pk

Просто хотел добавить еще одну точку зрения... конечно, больше работы! Но интересно...

Рассмотрите возможность запуска оркестратора контейнеров, такие как кубернет. Проверить ТИП (Kubernetes-in-Docker) за интересный способ запуска кластера Kubernetes на одном узле только с Docker.

Затем вы могли бы, например, сделать что-то вроде

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

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

Oscar Andersson avatar
флаг jp
Спасибо, Будрис, ваш пост действительно вдохновляющий и немного экспериментальный, если можно так выразиться. Я считаю, что это слишком сложно для меня, хотя. Спасибо.
Mr.Budris avatar
флаг pk
да, что-то вроде kubernetes, вероятно, излишне для вашей среды, но имейте в виду такие системы, если ваша лаборатория будет расти — это может сэкономить вам много времени (и стать интересным опытом обучения) в будущем. Ваше здоровье!
Oscar Andersson avatar
флаг jp
Спасибо, я определенно в для опыта обучения. :) (Кстати, решил мою проблему с докером без рута, зависшим systemd на уровне пользователя и обычными пользователями без полномочий root на хосте)

Ответить или комментировать

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