
Я хотел бы предоставить пользователю, не являющемуся root ( nicollet
), возможность обнаруживать и отправлять сигнал процессам, запущенным Apache2 (эти процессы являются скриптами FastCGI, и сигнал сообщает им о необходимости очистить кэш). Процессы принадлежат веб-пользователю ( www-data
), и я работаю на Debian stable.
Я не могу найти способа, чтобы nicollet
пользователь видел эти процессы.
Процессы запущены и видны обоим root
и www-data
:
root@linux-01:~# ps -Af | grep baryton
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:12 baryton --bot
root 18701 18700 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~#
Однако запуск той же команды от имени моего nicollet
пользователя ничего не возвращает:
nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
Я попытался создать исполняемый файл, который запускает указанный выше запрос с помощью system()
. Он принадлежит www-data
и имеет установленный бит setuid:
root@linux-01:~# which setuid-update
/usr/local/bin/setuid-update
root@linux-01:~# ls -l /usr/local/bin/setuid-update
-rwsr-xr-x 1 www-data www-data 11046 Nov 2 10:27 /usr/local/bin/setuid-update
root@linux-01:~#
Однако я наблюдаю ту же самую ситуацию: процессы видны root
и , www-data
но не nicollet
:
root@linux-01:~# setuid-update
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:13 baryton --bot
www-data 18712 18711 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18714 18712 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~# su nicollet
nicollet@linux-01:~$ setuid-update
www-data 18716 18715 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18717 18716 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
Самое удивительное, что grep
процесс действительно выполняется www-data
(потому что он запущен из исполняемого файла setuid) и виден, но сам baryton
процесс — нет.
Что здесь происходит? Почему ps
run by может www-data
показывать эти процессы, а ps
run by исполняемый файл setuid, работающий как, www-data
не может, когда он запущен nicollet
?
решение1
В течение многих лет можно было ограничить на уровне ядра обычные учетные записи пользователей, чтобы они видели только свои собственные процессы. Это ограничение было возможно с grsecurity, SELinux и другими фреймворками безопасности, но обычно не используется по умолчанию дистрибутивами.
Я не пробовал Debian в нестабильную ветку некоторое время (был Lenny), но, возможно, они недавно включили этот переключатель в конфигурации ядра. Это вызвало бы точно такой же эффект, который вы наблюдаете — даже с исполняемым файлом setuid исходный uid (nicollet) все еще известен, и меняется только EUID (эффективный uid).