Я пытаюсь запустить сценарий при входе в систему, который будет выполняться для обычного пользователя, но не будет читаться этим или другими пользователями без полномочий root.
Я пробовал разные вещи, включая chmod
/chown
комбинации, а также visudo
. Во всех случаях я могу либо выполнить сценарий при входе в систему, но по-прежнему читать его как пользователь, либо не иметь возможности прочитать его, но также не могу выполнить его при входе в систему.
Также пробовали shc
который я могу использовать, но при этом остается файл, который, хотя и исполняемый, может быть скопирован / загружен и т.д. и декомпилирован.
Это из-за того, что я делаю что-то не так с chmod
, chown
, и visudo
?
Прежде всего, 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, но обычно это считается плохой идеей и может привести к дырам в безопасности, если в сценарии есть какие-либо ошибки.