Можно ли настроить возможности Linux для каждого пользователя?

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

Однако, что я хотел бы знать, если есть способ предоставить возможности для каждого пользователя. То есть, разрешить некорневым процессам и процессам не-suid приобретать эти возможности.

5 ответов

Решение

Там есть limit.conf, есть возможность ограничить некоторые ресурсы для пользователя или группы через него.

Проверять, выписываться man limits.conf

Это можно сделать с помощью libcap - он предоставляет модуль PAM pam_cap.so. Однако не все так просто:)

Каждый процесс имеет три набора возможностей:

  • Эффективный (ограничения, которые этот процесс фактически имеет)
  • Разрешено (ограничения, которые этот процесс может иметь - расширенный набор Эффективных)
  • Наследуемое (ограничения, которые этот процесс может передать дочернему процессу)

Каждый файл имеет одинаковые наборы возможностей. Когда exec()'d выполняет новый двоичный файл, возможности процесса изменяются в соответствии со следующими правилами, где:

  • pI / pP - начальные наследуемые / разрешенные возможности процесса
  • pI'/pP'/pE'- это новые наследуемые / разрешенные / эффективные возможности процесса
  • fI/fP/fE - это наследуемые / разрешенные / эффективные возможности файла
  • & представляет пересечение
  • | представляет союз

    pI' = pI
    pP' = fP | (пи и фи)
    pE '= fE & pP'

(упрощено с http://www.friedhoff.org/posixfilecaps.html)

В большинстве сценариев pE '- единственный результат, который нас волнует. Программы, связанные с libcap, могут вызывать setcap(), чтобы изменить свои эффективные ограничения (если только те ограничения, которые они пытаются запросить, находятся в наборе разрешенных), но подавляющее большинство программ явно не затрагивают их ограничения, поэтому мы должны договориться, чтобы ограничение было эффективным после exec().

Конкретный пример поможет понять здесь... Мне надоело 'su' для запуска openvpn, поэтому я хотел предоставить себе возможность CAP_NET_ADMIN, чтобы разрешить установку маршрутов и тому подобное.

Смотря на последнее правило (pE' = fE & pP') ясно, что для CAP_NET_ADMIN в эффективном наборе процесса CAP_NET_ADMIN должен быть в эффективном наборе файла. Таким образом, система возможностей не позволяет нам просто сказать "предоставить CAP_NET_ADMIN пользователю sqweek" - возможности программы всегда важны.

Нахождение в эффективном наборе файла недостаточно, однако, ограничение также должно быть в новом разрешенном наборе процесса. Давайте посмотрим на это правило: pP' = fP | (pI & fI), Таким образом, есть два способа получить pP'либо мы добавляем CAP_NET_ADMIN в набор разрешенных файлов, либо добавляем его в набор наследуемых файлов и проверяем, что он находится в наборе наследуемых процессов.

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

Обратите внимание на первое правило, pI' = pI, Унаследованные возможности процесса не зависят от exec(). Это означает, что все, что нам нужно, - это одна программа, поддерживающая libcap, для установки CAP_NET_ADMIN в качестве наследуемого ограничения, и у каждого процесса, порожденного оттуда, также будет CAP_NET_ADMIN Inheritable. Это роль, которую играет модуль pam - он изменяет набор Inheritable во время входа в систему, который затем наследуется для всех процессов этого пользователя.

Чтобы подвести итог:

  1. Установите libcap
  2. Настройте модуль pam_cap (добавьте строку cap_net_admin sqweek в /etc/security/capability.conf, Если файл ранее не существовал, добавьте еще одну строку none * для разумного дефолта.
  3. Включить модуль PAM во время входа в систему (добавить auth required pam_cap.so в /etc/pam.d/login). Обязательно проверьте свой логин в отдельном терминале ПЕРЕД выходом из системы при внесении изменений в PAM, чтобы не блокировать себя!
  4. Добавьте CAP_NET_ADMIN в эффективные и наследуемые наборы для openvpn (setcap cap_net_admin+ie /usr/sbin/openvpn)
  5. openvpn звонки ip поменять таблицу маршрутизации и тому подобное, так что нужно одинаковое обращение (setcap cap_net_admin+ie /sbin/ip)

Обратите внимание, что /etc/pam.d/login управляет только локальными логинами - вы можете указать, например. /etc/pam.d/sshd аналогичное лечение. Кроме того, любые возможности, которые вы добавляете через setcap будет взорван, когда ваш менеджер пакетов установит новую версию целевого бинарного файла, так что вам придется их повторно добавлять.

Да, вы можете использовать setcap указать набор возможностей для исполняемого файла, который может предоставлять определенные возможности при запуске этого исполняемого файла.

Из возможностей (7) man page:

Возможности файла Начиная с ядра 2.6.24, ядро ​​поддерживает связывание наборов возможностей с исполняемым файлом с использованием setcap(8). Наборы возможностей файла хранятся в расширенном атрибуте (см. Setxattr(2)) с именем security.capability. Запись в этот расширенный атрибут требует возможности CAP_SETFCAP. Наборы возможностей файла в сочетании с наборами возможностей потока определяют возможности потока после выполнения execve(2).


Способ предоставления возможностей для пользователя (или даже для группы) будет с помощью модуля PAM. Ответ sqweek показывает, как это сделать, используя pam_cap,

Я не подтвердил, но я думаю, что этот аспект SELinux может быть вашим ответом:

http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html

Посмотрите на CapOver - он должен делать то, что вы хотите.

Примечание: я не использовал это, поскольку он (еще?) Не был портирован в API ядра 2.6.30.

Другие вопросы по тегам