假设有一组 shell 命令 {ls、cat、kill}
我想让 A 组中的用户能够执行命令 {ls, cat} 并且让 B 组中的用户能够执行命令 {cat, kill}
如何做到这一点,最好的方法是什么?
我想到了一些解决方案,但它们似乎不是 100% 安全的。
答案1
限制执行命令的可能性的方法之一是受限外壳手册摘录
,其中提到以下内容是不允许或不能执行的:
Changing directories with the cd builtin.
Setting or unsetting the values of the SHELL, PATH, ENV, or BASH_ENV variables.
Specifying command names containing slashes.
Specifying a filename containing a slash as an argument to the . builtin command.
Specifying a filename containing a slash as an argument to the -p option to the hash builtin command.
Importing function definitions from the shell environment at startup.
Parsing the value of SHELLOPTS from the shell environment at startup.
Redirecting output using the ‘>’, ‘>|’, ‘<>’, ‘>&’, ‘&>’, and ‘>>’ redirection operators.
Using the exec builtin to replace the shell with another command.
Adding or deleting builtin commands with the -f and -d options to the enable builtin.
Using the enable builtin command to enable disabled shell builtins.
Specifying the -p option to the command builtin.
Turning off restricted mode with ‘set +r’ or ‘set +o restricted’.
之后,您可以添加您希望他们可以执行的命令的链接。
也许实现目标的另一条途径应该是指某东西的用途sudo
。
对于您的情况,您可以编辑sudoers
文件(使用visudo
)并获得类似以下内容:
User_Alias USERS_GROUP_A = joe, mike, cedric
User_Alias USERS_GROUP_B = jude, zoe, cedric
Cmnd_Alias COMMANDS_GROUP_A = /bin/ls, /bin/cat, /usr/bin/zip
Cmnd_Alias COMMANDS_GROUP_B = /bin/kill, /bin/cat, /usr/bin/zip
USERS_GROUP_A ALL= COMMANDS_GROUP_A
USERS_GROUP_B ALL= COMMANDS_GROUP_B
# users of the group USERS_GROUP_A may run /bin/ls, /bin/cat, and /usr/bin/zip
# from any machine (ALL).
# users of the group USERS_GROUP_B may run /bin/kill,/bin/cat and /usr/bin/zip
# from any machine (ALL).
笔记:
- 示例中的问题:通常
kill
是shell 内置命令(用 进行检查type kill
)。如果你允许用户使用,shell
恐怕你找不到办法避免他们使用kill
(除非你以适当的方式修改 shell 的源代码并重新编译它……)。 如果您想要为这些用户关闭的命令带有
read
且execution
属性设置为全部(例如ls -l /usr/bin/zip
)-rwxr-xr-x 1 root root 188296 Oct 21 2013 /usr/bin/zip
也许您可以使用一种解决方法,将
execution
属性限制为仅限所有者及其组sudo chattr o-x /usr/bin/zip
,-rwxr-xr-- 1 root root 188296 Oct 21 2013 /usr/bin/zip
添加新用户(例如酷用户) 到该组(可能用
/usr/sbin/nologin
asshell
),并写入以下两行代替上面的相应内容:USERS_GROUP_A ALL=(cooluser) NOPASSWD: COMMANDS_GROUP_A USERS_GROUP_B ALL=(cooluser) NOPASSWD: COMMANDS_GROUP_B # users of the USERS_GROUP_A may run /bin/ls, /bin/cat and /usr/bin/zip # as the user cooluser from any machine (ALL). # users of the USERS_GROUP_B may run /bin/kill,/bin/cat and /usr/bin/zip # as the user cooluser from any machine (ALL).
关键字
NOPASSWD:
是为了避免要求输入密码。
您的用户可以使用以下命令执行命令sudo -u cooluser /usr/bin/zip
副作用:其他用户将无法运行该命令,直到您不将他们纳入文件所有者的组中……如果是这样的话
root
应该不那么安全……
参考: