Это может быть сделано с помощью libcap - он предоставляет модуль PAM pam_cap.so. Однако это не совсем что просто :)
Каждый процесс имеет три функциональные возможности набора:
- Эффективных (колпачки, что этот процесс действительно имеет)
- Разрешенные (колпачки, что этот процесс может возможно есть - надмножество Действует)
- Наследуемых (колпачки, что этот процесс может перейти в дочернем процесс)
Каждый файл имеет те же наборы возможностей. Когда новый двоичный Exec() «d, возможности изменения процесса в соответствии со следующими правилами, где:
(упрощенный из 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 во время входа в систему, который затем наследуется для всех процессов этого пользователя.
Резюмируя:
- Установка libcap
- Настройка модуля pam_cap (добавить линии
cap_net_admin sqweek
к /etc/security/capability.conf
Если файл не ранее существует, добавьте еще одну строку none *
для разумном по умолчанию
- .. Включите модуль PAM во время входа в систему (добавьте
auth required pam_cap.so
в /etc/pam.d/login
). Обязательно проверьте свой логин в отдельном терминале ПЕРЕД записью при изменении PAM, чтобы вы не блокировали себя!
- Добавить CAP_NET_ADMIN к эффективным и наследуемым наборам для OpenVPN (
setcap cap_net_admin+ie /usr/sbin/openvpn
)
openvpn
вызовов ip
изменить таблицу маршрутизации и такую, так что необходим такое же лечение (setcap cap_net_admin+ie /sbin/ip
)
Этого было достаточно для возможностей, которыми я был. –
Whuuut. К сожалению, OP выбрал это как принятый ответ, когда он не имеет ничего общего с возможностями. – rsaw
@rsaw: Я согласен! – claf