Рейтинг:4

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

флаг vn

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

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

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


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

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

флаг cn
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/129511/discussion-on-question-by-george-y-how-can-root-start-a-process-that- только-корень-c).
Рейтинг:30
флаг za

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

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

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

(использовать visudo -f /etc/sudoers.d/netmgr чтобы поместить это в файл надстройки sudoers).

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

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

George Y avatar
флаг vn
К сожалению, я должен разрешить им использовать `kill` или `systemctl stop`, потому что некоторым приложениям нужны эти привилегии для выполнения своей работы. Мне просто нужна определенная программа-монитор, запрещающая их стоп-сигнал.
George Y avatar
флаг vn
Другой пример: я добавляю триггер в параметр `/etc/bashrc` — я хочу, чтобы он был защищен, но я не могу запретить запуск редактора, такого как `vim` или `nano`.
Michael Hampton avatar
флаг cz
@GeorgeY Если кто-то может получить root-доступ, он может убить ваш процесс. Если кто-то _фактически_ этим занимается и не остановится, то решение не техническое: нужно привлечь к этому руководство.
Nikita Kipriyanov avatar
флаг za
@GeorgeY, вы не можете сделать процесс неубиваемым с помощью root. Root - это бог, вы не можете отключить его, делая что-то. А sudo позволяет эффективно получить root-права. Единственные жизнеспособные решения, как я вижу, это не давать привилегии root. Я предложил использовать встроенные возможности sudo; если этого недостаточно, вы должны изобрести свой собственный sudo. Напишите прокси-приложение для kill или systemctl stop, которое будет отфильтровывать вещи, которые запрещено убивать, или, что еще лучше, которые разрешают убивать только определенные вещи и так далее. Вы должны обернуть *все* вещи, которые вы хотите вызывать пользователями без полномочий root.
Matthew Ife avatar
флаг jo
Если у вас есть root, вы можете сделать еще один шаг и заменить указанный процесс на тот, который сообщает, что все в порядке, но позволяет вам продолжать свои гнусные действия.
George Y avatar
флаг vn
@Nikita Киприянов Конечно, я не дам им `root` доступ, на самом деле я даю им права `wheel`, но они все равно могут убить любой процесс безразлично. Я хочу, чтобы они не могли уничтожать процессы определенного типа, скажем, инициированные пользователем root или файлом в `/root`.
Nikita Kipriyanov avatar
флаг za
«root» и «wheel» — это одна и та же богоподобная привилегия. Потерпите это. Если не хотите давать им рут, не давайте колесо. Период.
флаг sa
@GeorgeY, так что мешает им просто запустить `sudo bash`, а затем стать пользователем root?
raj avatar
флаг ye
raj
@GeorgeY Если вы хотите, чтобы пользователь **который фактически является root**, мог убить любой процесс, кроме определенного, или отредактировать любой файл, кроме определенного, вам нужно разработать собственное ядро, которое имеет такие возможности :). Linux так не работает, и точка.
George Y avatar
флаг vn
@raj Так вот как Linux проложил путь к внутренним преступлениям, таким как утечка данных? :)
флаг mt
@GeorgeY, который троллит: такая же проблема с привилегиями существует в Windows, с немного разными деталями для ADMINISTRATOR/LOCALSYSTEM и администратора домена, и утечки данных часто происходят без повышения привилегий вообще за счет компрометации веб-приложения, которое имеет доступ к данным.
флаг mt
(иметь администратора домена еще веселее, потому что вы можете запускать любую программу на любом компьютере в организации!)
флаг mt
.. возможно, решение, которое вы хотите, находится в другом направлении? Если вы хотите, чтобы пользователь мог убивать только определенные процессы, определить эти процессы и заставить *их* работать как не-root? Или запустить их в контейнере или виртуальной машине?
Nikita Kipriyanov avatar
флаг za
@pjc50 самое смешное, что автор вопроса упорно отказывается так поступать, несмотря на то, что ему все это советуют. Вместо того, чтобы следовать пути Linux, чтобы делать что-то в Linux, он думает, что это вина Linux, что он не работает так, как он предполагал, что он должен работать.
Рейтинг:18
флаг in
bta

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

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

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

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

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

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

George Y avatar
флаг vn
Я думаю, что ваше предложение состоит в том, чтобы определить «Белый список» того, что МОГУТ делать пользователи, кроме `root`, а не мое первоначальное требование того, что они НЕ МОГУТ делать. Это действительно прогулка, но это слишком облегчило бы их обязанности.
флаг in
«Нельзя дать кому-то власть, а затем помешать им ею воспользоваться» — звучит как британская королевская семья. Королева имеет право приказывать казнить всех, кто ей не нравится, но если она действительно воспользуется этой властью, она, вероятно, будет свергнута до того, как произойдет настоящая казнь.
флаг in
bta
@GeorgeY Большинство администраторов используют белые списки, да. Вы также можете эффективно занести определенные команды в черный список. Что-то вроде `baduser localhost = (baduser) /bin/kill` позволит пользователю 'baduser' запускать kill только под своей учетной записью (а не как root). В `man sudoers` есть гораздо больше информации и расширенных опций.
ilkkachu avatar
флаг us
@hanshenrik, не так ли? У вас есть источник по этому поводу?
флаг cn
@ilkkachu: Ну, когда в Великобритании все еще существовала смертная казнь, технически любая казнь должна была проводиться от ее имени (поскольку она всегда является истцом в уголовном деле в Великобритании). Но это, наверное, не считается.
ilkkachu avatar
флаг us
@ Кевин, да, конечно, ссылки на короля / королеву или корону существуют как формализмы. Но у меня сложилось впечатление, что в Великобритании и других странах Содружества к настоящему времени действует законодательство, запрещающее внесудебные наказания. (А в случае с Англией концепция обычно идет со ссылками на Великую хартию вольностей, около 800 лет назад...) И хотя у них есть что-то вроде теоретической власти королевы воздерживаться от подписания законопроектов в качестве закона, это все еще немного отличается от Королевы, просто идущей по законам, уже одобренным королем / королевой. (Парламентский суверенитет и все такое.)
George Y avatar
флаг vn
@hanshenrik Так ты имеешь в виду, что солдаты, отвечающие за ядерные ракеты, могут стрелять по своей воле? Мой вопрос равнозначен - пилот может делать в самолете все что угодно, кроме остановки или взлома черного ящика.
флаг mt
«определить «белый список» того, что пользователи, кроме root, МОГУТ делать, а не мои первоначальные потребности, которые они НЕ МОГУТ делать» - это, к сожалению, обязательно для безопасности, потому что в противном случае люди продолжают находить способы использовать функциональные возможности, которые у них есть, чтобы делать вещи ты не хочешь. Что касается британских ядерных боеголовок, то да, они (предположительно) способны к независимому запуску — и действительно, для этого они и предназначены, чтобы быть запущенными в случае, если вся вышестоящая иерархия уже мертва.
raj avatar
флаг ye
raj
@GeorgeY, но большинство операционных систем (не только Linux) спроектированы так, что у них нет какого-либо «черного ящика». Я бы решительно возражал против идеи иметь какой-то «черный ящик», которым я не могу управлять на своем компьютере.
timuzhti avatar
флаг eg
@raj, может быть, большинство операционных систем не могут иметь черный ящик, но в наши дни у большинства аппаратных средств есть. Intel и AMD имеют немного дополнительный процессор, и ваш контроль над ним зависит от того, какие функции управления включены.
Lodinn avatar
флаг in
@GeorgeY Пилот МОЖЕТ остановить самолет настолько, насколько это позволяет физика. Это (и ваша первоначальная проблема) носит скорее социальный, чем технический характер. Спросите себя: почему, имея техническую возможность сделать что-то плохое, скажем, пилот практически никогда не придет, чтобы сделать это; почему ваши пользователи отличаются? Если нет, то это не проблема, если да, то у вас есть проблема, которая имеет мало общего с компьютерами и во многом связана с людьми. Не давайте доступ к вещам, которые вы не доверяете пользователям, особенно если подозреваете злой умысел.
raj avatar
флаг ye
raj
@timuzhti И это то, что беспокоит многих людей, вы можете увидеть статьи, выражающие беспокойство по этому поводу, по всему Интернету, потому что люди определенно не хотят этого.
Рейтинг:10
флаг tn

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

флаг sa
Программа *может* получить исходную информацию о пользователе. getuid() по-прежнему возвращает исходного пользователя, по-видимому. Пользователь setuid — это geteuid() ("эффективный UID").
Nikita Kipriyanov avatar
флаг za
На самом деле *это* обычный способ. *Так* работает сам `sudo`.
флаг do
JoL
"или скрипты" -- Setuid не работает со скриптами. Они должны быть двоичными исполняемыми файлами.
Рейтинг:2
флаг cn

Если вы дадите пользователю полную свободу действий как root, то он сможет убить почти что угодно. Для более подробного обсуждения и возможных обходных путей см.: обсуждение стека unix sigkill.

Также интересно решение сторожевого таймера, упомянутое @bta. На самом деле доступен программный сторожевой пакет, который можно настроить для отслеживания изменения файлов или выполнения пользовательского сценария. Однако на большинстве стандартных ядер этот сторожевой таймер может быть остановлен пользователем root, или вы можете изменить его конфигурацию. Но другие пользователи должны были бы знать об этом, чтобы избежать этого. Видеть: https://linux.die.net/man/8/watchdog

Но если вам не нужно разрешать полный root-доступ, но вы можете управлять их доступом с помощью механизма sudo, то вы можете установить некоторые команды с явными аргументами для их выполнения и не разрешать ничего, кроме их прав пользователя по умолчанию.

Например, вы можете поставить /бен/убить в /etc/sudoers файл, но разрешать только определенные аргументы.

bob ALL=(root) /bin/kill -sigTERM [1-9][0-9][0-9][0-9]

Это позволит пользователю боб выполнить /бен/убить, но уничтожайте только процессы с PID от 1000 до 9999. Если вы запустите свой монитор достаточно рано, у него будет низкий PID, и его нельзя будет убить таким образом. Пользователь боб конечно, вы все еще можете связываться с вами, убивая ваши собственные пользовательские процессы ...., и что с оберткой PID, это все равно может быть не слишком полезно.

Из полного набора можно вычесть определенные опции. Например, убить все неотрицательные PID, но не разрешать сигнализировать PID, содержащий 1337, и не разрешать уничтожение -1.

bob ALL=(root) /bin/kill -sigTERM *,!/bin/kill *1337*,!bin/kill *-1*

Но это было бы немного неудобно, и вы были бы уверены, что программа не переносит свои целые числа. Насколько я понимаю, Procps kill не работает, но в этом примере все равно можно было бы убить процесс с pid 1337, если бы он был частью группы процессов, в которой он не был лидером. Итак, это показывает, насколько сложно работать с негативами или черными списками.

Лучший вариант, разрешить убивать только определенные процессы по имени

bob ALL=(root) /usr/bin/pkill -sigTERM -f namedprocess

Или только перезапустить конкретную службу

bob ALL=(root) /bin/systemctl перезапустить службу

Пользователь может просмотреть доступные команды sudo с помощью судо -л

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

Nikita Kipriyanov avatar
флаг za
Ограничение pid бесполезно. Система, которая работает достаточно долго, будет иметь упакованные идентификаторы, поэтому в ней будут как пользовательские, так и системные процессы с любыми идентификаторами без видимого распределения. Определенно не будет никакого способа выразить набор pids, который должен быть неубиваемым.
George Y avatar
флаг vn
Точно, циклы pid в пределах 0 ~ 2 ^ 16-1 = 65535.
Nikita Kipriyanov avatar
флаг za
PID_MAX по умолчанию равен 32767, но его можно увеличить до 2²²²-1, см. http://web.archive.org/web/20111209081734/http://research.cs.wisc.edu/condor/condorg/linux_scalability. HTML . Размер по умолчанию настолько мал, что не ломает старое программное обеспечение.
Рейтинг:0
флаг vn

Я придумал Старт!

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

useradd [someuser] -s [определенный исполняемый файл]

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

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

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

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

  4. Передайте остальные команды /бин/баш

Тогда просто установите его г+х для любого пользователя.

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


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

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

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

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

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

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

Войти без запуска bash_profile или bashrc

флаг mt
Сценарий цензуры — хорошая идея; вы также можете сделать это через sudo, чтобы у пользователей был обычный bash, когда они непривилегированы, но для его запуска запустите «sudo censorscript». Проблема в том, чтобы убедиться, что вы поймали абсолютно все способы, которыми люди могут проникнуть в него. Например, вы не можете позволить им запускать emacs или vi, потому что они могут запускать оболочки. Следовательно, легче внести в белый список.
Gerrit avatar
флаг cn
Единственным жизнеспособным исполняемым файлом цензора, работающим от имени пользователя root, будет меню, подобное белому списку действий. Нажмите 1, чтобы остановить службу A, нажмите 2, чтобы остановить службу B. Любой другой подход всегда будет предлагать способы улизнуть. И даже тогда его придется компилировать статически и принимать всевозможные меры предосторожности для изоляции по отношению к среде, в которой он запускается. Лучше не изобретать велосипед и использовать такие утилиты, как sudo, у которых за плечами большой опыт в этой области. действия.
Nikita Kipriyanov avatar
флаг za
Вы должны следить за многими вещами, такими как побеги снарядов и так далее. И «цензурный сценарий» на самом деле не мог быть сценарием. Linux позволяет устанавливать setuid/setgid только для двоичных файлов, а не для скриптов, поэтому ваш скрипт не может быть запущен с привилегиями непривилегированным пользователем.И, я бы перефразировал @Gerrit, лучше составить список разрешенных полных команд (без заполнителей), и это будет вашей защитой, потому что это будет невозможно обойти.
Nikita Kipriyanov avatar
флаг za
Также обратите внимание, что в итоге вы получите специальную версию `sudo`. Так что лучше прочтите руководство по sudo и настройте его конфигурацию, чем изобретать свой собственный sudo.
George Y avatar
флаг vn
@ pjc50 Спасибо за указание на средства побочной атаки через `vi` и `vim` . Но я сомневаюсь, что они могут сломать тюрьму оболочки, поскольку `vi` и `vim` могут отправлять только строку команд в текущую оболочку, то же самое с `htop` и другими приложениями.
флаг ca
Просто имейте в виду, что этот метод разваливается, как только вы разрешаете любую запись в произвольные файлы с правами root (достаточно даже простого перенаправления ввода). Пользователь может просто переписать произвольный исполняемый файл и запустить что угодно. (все, кроме белого списка команд, будет иметь аналогичные проблемы)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.