Linux 是否在ps o/p中错误显示EGID和RGID?
我有这个:Linux 是否在ps o/p中错误显示EGID和RGID?,linux,bash,Linux,Bash,我有这个: $ ls -l test1.sh -rwxr-sr-x 1 root root 24 2011-05-31 13:27 test1.sh # sgid root $ id uid=1001(abc) gid=1001(abc) groups=4(adm),6(disk),20(dialout),21(fax),24(cdrom),26(tape),29(audio),30(dip),44(video),46(plugdev),104( fuse),106(lpadmin),11
$ ls -l test1.sh
-rwxr-sr-x 1 root root 24 2011-05-31 13:27 test1.sh # sgid root
$ id
uid=1001(abc) gid=1001(abc) groups=4(adm),6(disk),20(dialout),21(fax),24(cdrom),26(tape),29(audio),30(dip),44(video),46(plugdev),104( fuse),106(lpadmin),112(netdev),121(admin),122(sambashare),1001(abc),1002(sbox)
但是,当我运行test1.sh时,我没有看到有效的组所有者是ps o/p中的root。。为什么?
$ ps -o pid,ppid,cmd,euid,euser,ruid,ruser,egid,egroup,rgid,rgroup,nice,tty,user
PID PPID CMD EUID EUSER RUID RUSER EGID EGROUP RGID RGROUP NI TT USER
8793 2349 bash 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
8865 8793 /bin/bash ./test1.sh 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
8866 8865 sleep 60 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
8868 8793 ps -o pid,ppid,cmd,euid,eus 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
ps输出为您提供了一个线索。您正在运行的是bash,将脚本作为参数。因为bash不是suid,所以它不能提升权限 Linux和大多数Unix都不允许使用suid shell脚本。它是作为exec()系统调用的一部分实现的,它们忽略通过#解释的任何内容的suid/sgid!机械装置(请参见
man execve
)。为了解决这个问题,您很可能希望使用sudo,并可能从shell脚本中调用它(无论如何这会更安全)
要使用sudo运行部分脚本,可以使用sudo的-u或-g选项启动脚本。因此,您需要在/etc/sudoers中制定一条规则(这超出了本答案的范围),允许您运行脚本。假设您的脚本是/tmp/script,您是abc。要以用户“sauer”的身份运行该命令而不提示输入密码,您需要将其添加到/etc/sudoers中:
abc ALL = (sauer) NOPASSWD: /tmp/script
并运行此命令
sudo -u sauer /tmp/script
sudo -g admin /tmp/script
要以管理员组成员的身份运行它,您需要添加以下行:
abc ALL = (%admin) NOPASSWD: /tmp/script
并运行此命令
sudo -u sauer /tmp/script
sudo -g admin /tmp/script
阅读sudoers手册页,在Google上搜索更多关于sudo的文档。将用户和组与括号表达式中的逗号组合(即,
(sauer,root,%admin)
)ps输出为您提供了线索。您正在运行的是bash,将脚本作为参数。因为bash不是suid,所以它不能提升权限
Linux和大多数Unix都不允许使用suid shell脚本。它是作为exec()系统调用的一部分实现的,它们忽略通过#解释的任何内容的suid/sgid!机械装置(请参见man execve
)。为了解决这个问题,您很可能希望使用sudo,并可能从shell脚本中调用它(无论如何这会更安全)
要使用sudo运行部分脚本,可以使用sudo的-u或-g选项启动脚本。因此,您需要在/etc/sudoers中制定一条规则(这超出了本答案的范围),允许您运行脚本。假设您的脚本是/tmp/script,您是abc。要以用户“sauer”的身份运行该命令而不提示输入密码,您需要将其添加到/etc/sudoers中:
abc ALL = (sauer) NOPASSWD: /tmp/script
并运行此命令
sudo -u sauer /tmp/script
sudo -g admin /tmp/script
要以管理员组成员的身份运行它,您需要添加以下行:
abc ALL = (%admin) NOPASSWD: /tmp/script
并运行此命令
sudo -u sauer /tmp/script
sudo -g admin /tmp/script
阅读sudoers手册页,在Google上搜索更多关于sudo的文档。在插入式表达式(即,
(sauer,root,%admin)
)中将用户和组与逗号组合起来。编写安全shell脚本非常困难。想想$PATH
,$IFS
。。。因此,Linux不尊重shell脚本的setuid/setgid位。编写安全的shell脚本真的很难。想想$PATH
,$IFS
。。。因此,Linux不支持shell脚本的setuid/setgid位。@danny谢谢!但我把/bin/bash改成了sgid。但是o/p与我上面描述的没有变化。@danny我不明白你在第二段回答中的意思。你能举个例子吗?首先,作为一名安全专业人士,我对在bash上更改权限以包含sgid的想法感到震惊。:)但无论如何。。。尝试运行/bin/bash/path/to/script,而不是直接运行脚本,看看这是否会改变行为。我认为“ignore setid”逻辑在exec中,由#触发!机制,所以您可能会发现运行sgid bash会直接改变行为。在第二段中,您是指“解释exec()的功能”还是“我将如何使用sudo实现此功能”@dannysauer:我希望bash script.sh
也会放弃特权,除非您将-p
开关传递给它。@danny谢谢!但我把/bin/bash改成了sgid。但是o/p与我上面描述的没有变化。@danny我不明白你在第二段回答中的意思。你能举个例子吗?首先,作为一名安全专业人士,我对在bash上更改权限以包含sgid的想法感到震惊。:)但无论如何。。。尝试运行/bin/bash/path/to/script,而不是直接运行脚本,看看这是否会改变行为。我认为“ignore setid”逻辑在exec中,由#触发!机制,因此您可能会发现运行sgid bash会直接改变行为。在第二段中,您是指“解释exec()的功能”还是“我将如何使用sudo实现此功能”@dannysauer:我希望bash script.sh
也会放弃特权,除非您将-p
开关传递给它。“Linux不尊重shell脚本的setuid/setgid位。”这条笼统的语句总是正确的吗?我正在运行Ubuntu 10.04。@abc:是的,请查看系统上execve()的手册页。您将看到“Linux忽略脚本上的SUID和SGID位。”在“注释:man execve”下,“Linux忽略脚本上的设置用户ID和设置组ID位”。“正确;只有以#开头的可执行文件才忽略位/path/to/解释器“Linux不尊重shell脚本的setuid/setgid位。”这条笼统的语句总是正确的吗?我正在运行Ubuntu10.04。@abc:是的,请查看您系统上execve()的手册页。您将看到“Linux忽略脚本上的SUID和SGID位。”在NOTES:man execve下,“Linux忽略脚本上的设置用户ID和设置组ID位。”正确;只有以#开头的可执行文件才忽略位/路径/到/解释器