Как root может запустить процесс, который может завершить только root?

Как root может запустить процесс, который может завершить только root?

Процесс легко запустить в фоновом режиме или сделать его systemdслужбой.

Однако, если я хочу запустить процесс, который отслеживает действия на машине Linux, он становится целью атак. Если какой-либо пользователь захочет сделать что-то плохое, он сначала убьет этот процесс, даже если они всего лишь sudoers или wheelпользователи, просто выполнив killили systemctl stop.

Есть ли способ реализовать процесс, который rootможет только убить?


Ребята, просто думая, что даже rsyslogсервис может быть убит, вы должны признать, насколько уязвим Linux на самом деле. Это как пилот может отключить черный ящик. Разве какая-нибудь авиакомпания позволяет это делать? Или какая-нибудь дает пилоту список разрешений, чтобы помешать ему сделать что-либо, что он может сделать для спасения самолета? Конечно, пилот может разбить самолет, но черный ящик запишет это.

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

решение1

Имея неограниченные привилегии sudo/wheel, любой сможет отменить все, что вы сделали. Даже если вам удастся добиться этого, убрав возможность убить процесс напрямую, например, с помощью sudo kill, это все равно можно обойти с помощью других команд sudo, или вы также заблокируете себя от администрирования.

Спросите себя, почему ненадежные пользователи вообще имеют неограниченные привилегии sudo? Они не должны их иметь. Давайте такие привилегии только тем, кому вы полностью доверяете. Если есть некоторые привилегированные команды, которые все еще нужно выполнить, включите sudo только для этих команд:

+netmgr /usr/sbin/ifup, /usr/sbin/ifdown

(используйте visudo -f /etc/sudoers.d/netmgrдля помещения этого в файл дополнения sudoers).

Таким образом, вы можете разрешить пользователю запускать только sudo /usr/sbin/ifupи sudo /usr/sbin/ifdown, но не другие команды sudo. Множество других примеров, инструкций и соображений безопасности находятся в man sudoers. Прочтите это!

Аудит обычно делается другим способом. В частности, вы настраиваетедругоймашина, настройте ее syslog для приема журналов с удаленных станций. На рассматриваемой машине вы настроили ведение журнала так, чтобы он отправлял все журналы на машину ведения журнала, в дополнение к локальному хранению. Даже если кто-то отключит эту отправку журнала, само действие отключения будет зарегистрировано, так что вы, по крайней мере, будете знать, кто является виновником.

решение2

Вы не можете дать кому-то силу, а затем помешать ему использовать ее. Вы должны сузить силу, которую вы им даете, чтобы она включала только то, что вы хотите, чтобы они имели.

В комментарии вы написали:

Мне приходится разрешать им использовать killили, systemctl stopпотому что есть некоторые приложения, которым нужны эти привилегии для выполнения своей работы.

Это не значит, что тепользователинужен доступ к этим командам, только к нимПриложения. Пользователь имеет ограниченные права на запуск sudo ./someprogram, и как только эта программа запускается как root, она может использовать kill, и т. д. по мере необходимости. Однако у пользователя нет прямого доступа к этим внутренним командам.

По сути, пользователям не нужен доступ ккоманды, им нужен доступ кфункциональность. Если killэто слишком рискованно, заблокируйте доступ к нему и предоставьте другой, более безопасный способ достижения того же результата. Возможно, вы создаете небольшую утилиту, safekillкоторая действует как , killно отклоняет запросы на завершение определенных процессов. Дайте вашим пользователям доступ sudo к , safekillно не к настоящему kill. Если пользователи всегда используют эти команды для выполнения одного и того же действия, инкапсулируйте весь этот процесс в небольшую программу и заставьте их использовать ее вместо того, чтобы делать это вручную (например, они будут запускать sudo restart_webserversвместо того, чтобы завершать и перезапускать все различные серверные процессы по отдельности). Ваши пользователи по-прежнему будут иметь доступ к необходимым им функциям, но они не смогут напрямую использовать опасное оружие.

Есть еще один, более экстремальный механизм принудительного исполнения, который может быть доступен в зависимости от вашей конкретной настройки. Некоторые процессоры имеютсторожевые таймерыдоступно. Измените программу мониторинга активности, чтобы запустить сторожевой таймер и сбрасывать его каждые пару секунд. Если кому-то удастся отключить ваш монитор, таймер сторожевого таймера истечет, и система перезагрузится, перезапустив программу монитора при запуске. Это не будет строго предотвращать отключение монитора, но это запретит кому-либо делать что-либо значимое после его отключения. Это также создаст большие красные флажки в ваших системных журналах. Большинство систем со сторожевыми таймерами будут сообщать, когда сторожевой таймер инициирует определенную перезагрузку. Перезагрузка, инициированная сторожевым таймером, которая происходит, когда пользователь вошел в оболочку, должна рассматриваться какоченьподозрительный.

решение3

Linux noob здесь. Не могли бы вы рассмотреть возможность написания программ или скриптов, которые делают только то, что должны делать эти ребята, затем сделать их владельцем root и добавить им бит setuid? Конечно, одна большая проблема в том, что вы можете не захотеть, чтобы другие люди запускали эти команды. Я не уверен, сможете ли вы получить исходную информацию о пользователе. И, конечно, всегда необходима особая осторожность с setuid/setgid.

решение4

Я придумал «Начать!»

rootможно установить DEFAULT SHELL для пользователя следующим образом:

useradd [someuser] -s [a certain executable]

Тогда, если определенный исполняемый файл = скрипт цензора, который:

  1. Автоматически запрещает выполнение определенных команд. Нравится stopи rsyslogкомбинировано.

  2. запрещает команды, чтобы выйти из этой оболочки и использовать другую, даже оригинальнуюbash

  3. запрещает команды, чтобы помешать пользователю получить роль root, как это упомянул выше @user253751.

  4. Передайте остальные команды/bin/bash

Затем просто установите его r+xдля любого пользователя.

Любое предложение приветствуется в этом ответе. Особенно для 2 и 3, кажется, есть различные средства.


Bash сначала загрузит настройки в /etc/profileи /etc/bashrc. Я заметил, что последний имеет дело с PROMPT_COMMANDпеременной. Можно перехватить это в последней строке, чтобы добавить в скрипт цензуры, но для некоторых систем требуется имя пользователя исключения, поскольку по умолчанию ни у кого нет привилегий root, чтобы изменить его обратно.

Полная цензура, удовлетворяющая вышеуказанным 4+1, будет отмечена как законный ответ.

Я никогда не отмечу ответ «ты должен от него отказаться» как обоснованный.

сопутствующие вопросы:

Как мне регистрировать команды bash пользователей?

Как заставить bash регистрировать команды оболочки в syslog?

Вход без запуска bash_profile или bashrc

Связанный контент