2009-12-24 2 views
22

В Linux-ядре поддерживается поддержка fine-grained capabilities, что позволяет предоставлять привилегии процессу делать такие вещи, как, например, открытие исходных сокетов или повышение приоритета потока без предоставления привилегий root-процесса.Можно ли настроить возможности Linux для каждого пользователя?

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

ответ

-3

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

Заканчивать man limits.conf

+0

Этого было достаточно для возможностей, которыми я был. –

+11

Whuuut. К сожалению, OP выбрал это как принятый ответ, когда он не имеет ничего общего с возможностями. – rsaw

+1

@rsaw: Я согласен! – claf

6

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

http://www.lurking-grue.org/writingselinuxpolicyHOWTO.html#userpol5.1

+0

+1 для SELinux. Это хорошо решает эту проблему. – mrduclaw

+0

Спасибо, я это рассмотрю, однако переход на SELinux может быть довольно обременительным для существующей инфраструктуры. –

9

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

На странице capabilities(7) людей:

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


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

+5

Да, я знаю, что вы можете установить возможности для исполняемого файла. Мой вопрос, однако, заключается в том, что вы можете установить возможности * для каждого пользователя *, то есть все исполняемые программы, выполняемые под пользователем, получают определенные возможности. –

+0

Ahh - см. Обновление. – caf

3

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

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

37

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

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

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

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

  • ИЭТ/РР начальные наследуемые/Разрешенные возможности процесса по
  • ИЭТ»/РР»/рЕ»являются новыми Наследственными/Разрешенными/Эффективными возможностями процесса в
  • ¯Fi/FPA/ЭФ являются наследуемыми/Разрешенными/Эффективными возможностями самого файла
  • & представляет собой пересечение
  • | представляет профсоюз

    pI' = pI 
    pP' = fP | (pI & fI) 
    pE' = fE & pP'

(упрощенный из http://www.friedhoff.org/posixfilecaps.html)

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

Вот конкретный пример поможет понять здесь ... Мне надоело «су» запускать 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 в допустимый набор файлов, либо добавим его в набор Inheritable файла и убедитесь, что он находится в наборе Inheritable процесса.

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

Обратите внимание на первое правило, pI' = pI.Функция Inheritable процесса не влияет на 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)
+0

_Still, это не очень полезно для нас, поэтому давайте посмотрим на другой вариант. Почему это не так много? В многопользовательской системе я мог видеть ограничение, что он предоставляет возможности всем пользователям, поэтому, если вы хотите сделать это для каждого пользователя, это не очень полезно. Но большинство Linux-машин сегодня де-факто являются однопользовательскими машинами, поэтому я не вижу проблемы. (Ну, может быть, некоторые службы работают как разные пользователи.) –

+0

Я не совсем уверен, что сказать, так как вы ответили на свой вопрос. OP спрашивал, как установить возможности * для пользователя *, и добавление кепки к разрешенному набору файлов контролирует их на основе * на двоичный * (что, если быть ясным, по-прежнему полезной функциональностью). Я согласен, что это спорный вопрос во многих системах, но даже объяснение того, как устанавливать возможности для конкретного двоичного файла, не отвечает на заданный вопрос. – sqweek

+0

Вы, конечно, правы. Я уже забыл оригинальный вопрос, изучая ваш ответ. Теперь я уточнил аргументы, давайте посмотрим, одобрено ли мое редактирование. –

 Смежные вопросы

  • Нет связанных вопросов^_^