我试图在登录时运行一个脚本,该脚本将由普通用户执行,但该脚本或其他非 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 功能来实现,但一般认为这是一个坏主意,如果脚本有任何错误,可能会导致安全漏洞。