如何使 bash 脚本对用户可执行,但不可读

如何使 bash 脚本对用户可执行,但不可读

我试图在登录时运行一个脚本,该脚本将由普通用户执行,但该脚本或其他非 root 用户无法读取。

我尝试了各种方法,包括chmod/chown组合,以及visudo。在所有情况下,我既可以在登录时执行脚本但仍以用户身份读取它,也可以在登录时无法读取它但也无法执行它。

我也尝试过shc可以使用,但仍然留下一个可执行文件,可以复制/上传等并反编译。

chmod这是因为我对、chown和做错了什么吗visudo

答案1

首先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

答案2

我认为你不能阻止人们阅读该文件,因为他们需要能够阅读它才能执行它。

答案3

Bash 必须能够读取脚本的内容。

您可以在 bash 脚本前面放置一个 setuid 可执行文件,就像编译后的 c 包装器二进制文件/可执行文件一样,但它已经不是 bash 了。

答案4

运行 bash 脚本需要运行 bash 解释器(这将是一个进程),该解释器会读取文件,然后按照文件内的脚本执行。如果用户拥有的进程可以读取文件,那么用户自己也可以读取文件。

这样就只剩下允许用户生成 root 拥有的进程,并让该 root 拥有的进程读取您的脚本的唯一选项。这可以在一些发行版中使用 setuid 功能来实现,但一般认为这是一个坏主意,如果脚本有任何错误,可能会导致安全漏洞。

相关内容