Rah*_*til 27 linux security account-restrictions restricted-shell
如何阻止命令,比如说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
Run Code Online (Sandbox Code Playgroud)
测试:
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
Run Code Online (Sandbox Code Playgroud)
所以我的问题是实现这一目标的方法是什么?有什么工具可以做到这一点吗?
更新 1 # 但如果用户很聪明,他可以复制 mkdir 二进制文件并重命名并使用它。那么如何实现呢?
rah*_*hmu 21
我不知道如何用 bash 做到这一点,但我知道另一个限制用户环境的shell:lshell (limited shell)。
配置的快速概览
Lshell 是通过 INI 文件配置的。默认情况下,它包含允许命令的白名单,但可以轻松配置它以禁止用户使用特定命令。
此配置(默认 conf /etc/lshell.conf
)禁止用户foo
使用mkdir
:
[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']
Run Code Online (Sandbox Code Playgroud)
为了将用户帐户配置为默认使用 lshell,您必须:
chsh -s /usr/bin/lshell foo
Run Code Online (Sandbox Code Playgroud)
Lshell 可以做更多的事情,比如:
|
)。和更多。
更新 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
Run Code Online (Sandbox Code Playgroud)
daw*_*wud 15
我通常实施这种限制的方式需要满足几个条件,否则很容易绕过限制:
wheel
组,唯一被授权使用的用户su
(通过 PAM 强制执行)。为用户提供了一个正确保护rbash
的只读 PATH 指向 private ~/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*
Run Code Online (Sandbox Code Playgroud)给用户一个受限的只读环境(想想诸如LESSSECURE
, TMOUT
,HISTFILE
变量之类的东西)。
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
Run Code Online (Sandbox Code Playgroud)
此外,/etc/security/namespace.init
使所有骨架文件对用户只读并归root
.
通过这种方式,您可以选择是否$USER
可以mkdir
代表他/她自己执行(通过私有~/bin
目录中的链接,通过 提供/etc/skel
,如上所述),代表其他用户(通过sudo
)或根本不执行。