Стоит задача: необходимо все программы запущенные через ‘su’ определить в собственные cgroups. Это можно сделать за три простые шага.
- инициализируем нужную цгруппу, для этого нам нужна именованная группа, чтобы исключить пересечение с системными группами: (данный шаг желательно делегировать системе инициализации дистрибутива)
localhost qnikst # mkdir /sys/fs/cgroup/su-log
localhost qnikst # mount -n -t cgroup -o none,nodev,noexec,nosuid,name=test test /sys/fs/cgroup/su-log
- Пишем простой баш скрипт: в этом сприпте мы создаём каталог для пользователя (если его нет и помещаем туда родительскую задачу (ту, пользуется средствами pam)
localhost qnikst # cat /usr/local/bin/pam_exec_test.sh
#!/bin/sh
p=/sys/fs/cgroup/su-log/${PAM_RUSER}
[ ! -d "${p}" ] && \
mkdir ${p}
echo ${PPID} > "${p}"/tasks
- пишем правило для pam.d (логи опциональны)
session optional pam_exec.so log=/var/log/pam_test_su.log seteuid /usr/local/bin/pam_exec_test.sh
- наслаждаемся результатом.
В данном решении есть проблема: будучи суперпользователем пользователь может перемещать свои задачи по cgroup-ам, для решения этой проблемы нужно писать политику selinux запрещающую переносить задачи выше, чем cgroup породившего их процесса.
comments powered by Disqus