Назад | Перейти на главную страницу

Как сделать bash-скрипт исполняемым для пользователя, но не читаемым

Я пытаюсь запустить сценарий при входе в систему, который будет выполняться для обычного пользователя, но не будет читаться этим или другими пользователями без полномочий 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, но обычно это считается плохой идеей и может привести к дырам в безопасности, если в сценарии есть какие-либо ошибки.