如何阻止命令,比如说mkdir
特定用户?
我所做的只是创建只读函数并存储在用户配置文件中~/.bashrc
/bin/mkdir() {
echo "mkdir command not allow for you"
}
mkdir() {
echo "mkdir command not allow for you"
}
./mkdir() {
echo "mkdir command not allow for you"
}
readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir
测试:
rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you
所以我的问题是实现这一目标的方式应该是什么?有什么工具可以做到这一点吗?
更新 1 # 但如果用户很聪明,他可以复制 mkdir 二进制文件并重命名并使用它。那么如何实现这一点呢?
答案1
我不知道如何用 bash 做到这一点,但我知道另一个限制用户环境的 shell:lshell(有限 shell)。
配置快速概览
Lshell 通过 INI 文件进行配置。默认情况下,它保存允许命令的白名单,但可以轻松配置它以禁止用户使用特定命令。
此配置(默认conf /etc/lshell.conf
)禁止用户foo
使用mkdir
:
[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']
为了将用户帐户配置为默认使用 lshell,您必须:
chsh -s /usr/bin/lshell foo
Lshell 可以做更多的事情,例如:
- 3 个粒度级别:用户、组、全部。
- 可以限制对系统中某些路径的访问。
- 可以限制某些字符的使用(例如
|
)。 - 可以限制仅通过 SSH 使用某些命令。
和更多。
更新1#添加测试结果:
rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir
答案2
我通常实现这种限制的方式需要满足几个条件,否则该限制很容易被绕过:
- 用户不属于
wheel
唯一有权使用的组su
(通过 PAM 强制执行)。 用户获得了一个
rbash
指向 private 的只读 PATH 的正确保护~/bin
,该~/bin/
目录包含指向简单实用程序的链接:$ ll ~/bin total 0 lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear* lrwxrwxrwx. 1 root dawud 7 Sep 17 08:58 df -> /bin/df* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep* lrwxrwxrwx. 1 root dawud 8 Sep 17 08:58 env -> /bin/env* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep* lrwxrwxrwx. 1 root dawud 9 Sep 17 08:58 grep -> /bin/grep* lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo* lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit* lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail* lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
用户被给予一个受限的、只读的环境(想想诸如
LESSSECURE
、TMOUT
、HISTFILE
变量之类的东西)。- 该用户被映射到 SELinux 用户
staff_u
,并被授予根据需要以其他用户身份执行命令的权限sudo
。 用户的
/home
,/tmp
并且可能/var/tmp
通过以下方式进行多实例化/etc/security/namespace.conf
:/tmp /tmp/.inst/tmp.inst-$USER- tmpdir:create root /var/tmp /tmp/.inst/var-tmp.inst-$USER- tmpdir:create root $HOME $HOME/$USER.inst/ tmpdir:create root
此外,
/etc/security/namespace.init
使所有骨架文件对用户只读并由root
.
通过这种方式,您可以选择是否$USER
可以mkdir
代表他/她自己执行(通过私有目录中的链接~/bin
,通过 提供/etc/skel
,如上所述)、代表其他用户(通过sudo
)或根本不执行。
答案3
添加一个虚拟组,将用户添加到该组中,chown root:somegroup /bin/mkdir
, chmod g-x /bin/mkdir
。请注意,这依赖于用户无法修改其组。 IIRC 这在 GNU/Linux 中是正确的,但在其他一些 Unice 中则不然。
答案4
安装 sudoers 并尝试配置其用户和命令。