Я хочу заблокировать набор команд, как только они введены пользователем на терминале.

Как я могу это сделать?

1 ответ1

4

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

Например, если вы разрешите им доступ к echo , chmod и base64 , то они могут взять двоичный файл в своей системе, base64 , вставить его в свою оболочку с помощью echo 'long_base64_data' | base64 -d > bin.bin затем chmod +x bin.bin а затем ./bin.bin - и он может делать все, что позволяют glibc и syscalls в системе.

Точно так же, если любой интерпретатор разрешен, будь то perl , python , ruby или даже (возможно) bash , они должны иметь возможность использовать это для того, чтобы в конечном итоге перейти к выполнению произвольного кода - опять же, всего, что позволяют системные вызовы ядра.

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

Чтобы ответить на реальный вопрос, который вы задали, наивно: вы, очевидно, можете делать что-то вроде chmod o-x /bin/rm если считаете, что это на самом деле остановит удаление файлов пользователем (в этом случае только владелец команды rm сможет выполнить его (обычно это root); но если это все, что вы делаете, то они могут использовать busybox или любой из вышеупомянутых языков сценариев для удаления файла. Или они могут отобразить исполняемый код в файл, сделать его исполняемым и запустить его. И я уверен, что я опускаю даже более хитрые способы для выполнения произвольного кода с помощью оболочки, такие как внедрение команды оболочки в команду, которая на первый взгляд кажется невинной и явно не допускает произвольных команд. На самом деле, я могу думать о команде, которая была установлена на Ubuntu и содержала в себе комментарий вроде «нам действительно следует подумать о лучшем способе сделать это, потому что это допускает произвольное внедрение кода оболочки». Это все еще не исправлено.

Оболочка в значительной степени предполагает, что оператору доверяют. Даже обычная пользовательская оболочка (не root) предполагает большое доверие. Если ваша причина нежелания пользователя выполнять команды каким-либо образом связана с тем, что он не полностью доверяет ему, я бы нашел другой способ сделать то, что вы пытаетесь сделать, вообще не предоставляя ему доступ к оболочке.

Кстати, цель несколько сниженных привилегий пользовательской оболочки - защитить (предположительно доверенного) пользователя от себя, а также защитить пользователя от вредоносных программ. Защита пользователя от себя и защита пользователя от вредоносных программ - это совершенно другая проблема, чем защита операционной системы от ненадежного пользователя. Снаряды просто не могут сделать это очень хорошо по своей природе.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .