На этой неделе я возился с PowerShell и обнаружил, что вы обязаны подписывать свои скрипты, чтобы их можно было запускать. Есть ли в Linux аналогичные безопасные функции, связанные с предотвращением запуска скриптов bash?
Единственная функциональность, похожая на эту, о которой я знаю, - это то, что SSH требует определенного ключа.
noexec
в разделе, доступном только для чтения, на блочном устройстве со знаком dm-verity.Ответы:
Если вы блокируете возможность пользователей запускать сценарии через,
sudo
вы можете использовать этуdigest
функциональность.Вы можете указать хеш скрипта / исполняемого файла,
sudoers
который будет проверенsudo
перед выполнением. Таким образом, хотя это не то же самое, что подпись, это дает вам основную гарантию того, что скрипт по крайней мере не был изменен без изменений sudoers.http://www.sudo.ws/man/1.8.13/sudoers.man.html
источник
Да и нет.
Распределение программного обеспечения Linux работает несколько иначе, чем распространение программного обеспечения Windows. В мире (не встроенного) Linux основным методом распространения программного обеспечения является дистрибутив (Ubuntu, Debian, RHEL, Fedora, Arch и т. Д.). Все основные дистрибутивы систематически подписывают свои пакеты уже около десяти лет.
Когда программное обеспечение распространяется независимо, поставщик должен решить, как он будет поставлять свое программное обеспечение. Хорошие поставщики предоставляют источники пакетов, которые совместимы с основными дистрибутивами (нет единого механизма распространения для всех Linux: распространение программного обеспечения является одной из основных точек различия между дистрибутивами) и которые подписаны ключом поставщика. Дистрибутивы Linux редко выступают в роли подписывающего органа для сторонних поставщиков (Canonical делает это с партнерами по Ubuntu, но охватывает очень мало поставщиков), и я думаю, что все основные дистрибутивы используют сеть доверия PGP, а не инфраструктуру открытых ключей TLS, поэтому пользователь должен выяснить, хотят ли они доверять ключу.
Не существует специального механизма, который бы выделял пакеты программ, состоящие из одного скрипта, из пакетов программ, которые состоят из собственного исполняемого файла, файла данных или нескольких файлов. Ни одна проверка подписи не встроена в какой-либо общий интерпретатор сценариев, потому что проверка программного пакета является абсолютно ортогональной задачей при запуске сценария.
Я думаю, что Windows аннотирует файлы с их происхождением и требует подтверждения пользователя для запуска файла, источник которого «загружен», а не «локальный». У Linux действительно нет похожего механизма. Наиболее близким является разрешение на выполнение: загруженный файл не имеет разрешения на выполнение, пользователь должен явно включить его (
chmod +x
в командной строке или аналогичное действие в файловом менеджере).источник
Linux не предоставляет возможности ограничивать выполнение сценариев bash на основе цифровых подписей.
Существует некоторая работа по аутентификации бинарных исполняемых файлов. Смотрите https://lwn.net/Articles/488906/ для информации.
источник
Одним словом "нет".
Linux на самом деле не делает различий между исполняемыми файлами и скриптами;
#!
в начале это способ сообщить ядру , что программа для запуска , чтобы оценить вклад , но это не единственный способ , сценарий может быть выполнен.Так, например, если у меня есть скрипт
Тогда я могу запустить это с командой
Это заставит ядро попытаться выполнить его, определить
#!
и затем эффективно запустить/bin/sh x
вместо него.Однако я мог бы также запустить любой из этих вариантов:
или даже
Таким образом, даже если ядро попыталось навязать подпись на
exec
уровне, мы можем обойти это, только запустив интерпретатор со сценарием в качестве параметра.Это означает, что код подписи должен быть в самом интерпретаторе. И что помешает пользователю скомпилировать собственную копию оболочки без кода принудительного подписания?
Стандартным решением этого является не использование подписи, а использование обязательного контроля доступа (MAC), такого как
SELinux
. С системами MAC вы можете точно указать, что каждому пользователю разрешено запускать и переходить слои. Так, например, вы можете сказать, что «обычные пользователи могут запускать что угодно, но веб-сервер и процессы CGI могут получать доступ только к материалам из/var/httpd
каталога; все остальное отклоняется».источник
This means that signing code would have to be in the interpreter itself. And what would stop a user from compiling their own copy of a shell without the signing enforcement code?
Запрет на выполнение любых неподписанных исполняемых файлов сделает это, если у пользователя нет ключа подписи. Для этого уже существуют различные проекты * nix.В дистрибутивах Linux обычно есть gnupg . Мне кажется, что все, что вам нужно, это простая оболочка bash, которая проверяет отдельную подпись gpg на скрипте аргументов и запускает скрипт только в случае успешной проверки:
источник
Встречный вопрос, который сразу приходит на ум: «Почему вы хотите запретить пользователям запускать программы, которые они написали? » Существует несколько возможностей:
* Это, вероятно, становится все менее и менее верным, так как все больше людей начинают использовать Linux
источник
Причина, по которой системы развиваются по-разному, заключается в том, что в Linux есть атрибут файла «exec», а Windows использует расширения файлов для определения исполняемости.
Таким образом, в Windows легко заставить пользователя загрузить файл с расширением «.exe», «.bat», «.scr», который по умолчанию будет скрыт . Двойной щелчок по этому файлу даст вам выполнение произвольного кода. Следовательно, большой механизм отслеживания происхождения и подписывания исполняемого файла / скрипта был создан для снижения этого риска.
В Linux вы можете получить файл для пользователя, но вы не можете легко заставить бит exec быть установленным. Кроме того, можно сделать целые файловые системы noexec.
В любом случае вы можете явно запустить скрипт, вызвав интерпретатор. Вы даже можете создавать сценарии оболочки во время выполнения и передавать их в «sh» или запускать «sh -c».
источник
По умолчанию многие программы архивации не сохраняют бит выполнения для содержащихся файлов. Это делает невозможным запуск произвольных исполняемых файлов. Ну, почти.
Дело в том, что то, что было описано в другом ответе, что отсутствие бита выполнения не мешает вам передавать такой скрипт напрямую
bash
. Хотя можно утверждать, что большинство таких сценариев являютсяbash
сценариями, shebang может указывать любую программу в качестве интерпретатора. Это означает, что пользователь должен запустить соответствующий интерпретатор, если он решит игнорировать исполняемую семантику.Хотя это не так много, это в значительной степени охватывает предотвращение запуска ненадежных исполняемых файлов на * nixes только с ядром и оболочкой .
Как я упоминал в одном из комментариев, существует еще один уровень защиты,
SeLinux
который отслеживает происхождение файлов на основе набора правил. Например, установкаSeLinux
не позволит root запускать исполняемый файл с набором исполняемых битов, который был загружен из Интернета, даже если вы копируете и перемещаете файл. Можно добавить правило, что такие файлы можно запускать только через другой двоичный файл, который будет проверять подпись, в отличие от того, что вы упомянули в своем вопросе.Итак, в конце концов, это вопрос настройки обычно предустановленных инструментов, и ответ - да .
источник
tar
, сохраняет бит выполнения.tar -p
источник-p, --preserve-permissions, --same-permissions
означает извлекать информацию о правах доступа к файлам (по умолчанию для суперпользователя)touch permtest; chmod +x permtest; tar cf permtest.tar.gz permtest; rm permtest; tar xf permtest.tar.gz; ls -l permtest
- это исполняемый файл здесь, и я не root.