Как сделать bash-скрипт исполняемым для пользователя, но не читаемым
Я пытаюсь запустить скрипт при входе в систему, который будет выполняться для обычного пользователя, но недоступен для чтения тем или другим пользователям без полномочий root.
Я пробовал разные вещи, в том числе chmod
/chown
комбинации, а также visudo
, Во всех случаях я могу либо выполнить скрипт при входе в систему, но по-прежнему читать его как пользователь, либо не иметь возможности читать его, но также не могу выполнить его при входе в систему.
Также пробовал shc
который я могу использовать, но при этом остается файл, который, будучи исполняемым, может быть скопирован / загружен и т. д. и декомпилирован.
Это из-за того, что я делаю что-то не так с chmod
, chown
, а также visudo
?
4 ответа
Прежде всего, visudo(8)
это просто рекомендуемый редактор для /etc/sudoers
файл. Ничего больше. Это так, потому что он выполняет некоторую проверку синтаксиса и парсинг основных правил, чтобы предупредить вас, если вы только собираетесь выстрелить себе в ногу. Это не идеально, но оказалось очень полезным.
Тем не менее, в следующих строках показано, как предоставить разрешения на выполнение для нечитаемого файла без использования трюков SETUID. я использовал root
а также /root/bin/
, но это верно для любого другого сценария, где пользователь, которому предоставлены разрешения на выполнение, не имеет доступа для чтения к файлу.
#
Символ, как обычно, означает, что команды выполняются root
, $
символом отмечены строки, запущенные непривилегированным пользователем:
# adduser foo
...
# id foo
uid=1002(foo) gid=1002(foo) groups=1002(foo)
# grep foo /etc/sudoers
Defaults:foo secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin"
foo ALL = (root) /root/bin/bar
# ls -lrt /root/bin/bar
-rwx------. 1 root root 38 Oct 4 20:22 /root/bin/bar
# cat /root/bin/bar
printf "Welcome to the Terrordome!\n"
# su - foo
$ id
uid=1002(foo) gid=1002(foo) groups=1002(foo)
$ sudo bar
Welcome to the Terrordome!
$ cat /root/bin/bar
cat: /root/bin/bar: Permission denied
Я не думаю, что вы можете остановить людей, читающих файл, поскольку они должны иметь возможность прочитать его, чтобы выполнить его.
Bash должен уметь читать содержимое скрипта.
Вы можете поместить исполняемый файл setuid перед bash-скриптом, как скомпилированный двоичный / исполняемый файл оболочки c, но тогда это уже не bash.
Запуск сценария bash включает в себя запуск интерпретатора bash (который будет процессом), и этот интерпретатор читает файл, а затем следует сценарию внутри файла. Если процесс, принадлежащий пользователю, может прочитать файл, то пользователь сам может прочитать файл.
Это оставляет единственную возможность, позволяющую пользователю порождать процесс, принадлежащий root, и заставить этот процесс, принадлежащий root, читать ваш скрипт. Это может быть достигнуто в некоторых дистрибутивах с использованием функциональности setuid, но обычно это считается плохой идеей и может привести к дырам в безопасности, если в скрипте есть какие-либо ошибки.