在 Linux 中为特定用户阻止特定命令

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 做到这一点,但我知道另一个限制用户环境的shelllshell (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 可以做更多的事情,比如:

  • 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
Run Code Online (Sandbox Code Playgroud)

  • 使用 `allowed = 'all' - ['mkdir']`,你不能只执行 `bash` 并再次不受限制吗? (3认同)
  • 只是迂腐,抱歉,但仍有很多方法可以规避该列表强加的限制,例如`dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash`。我认为问题在于缺乏限制性的默认策略,即,在这种情况下,默认情况下您授予权限,然后基于列表拒绝权限,而应该相反:默认情况下拒绝,然后基于策略授予权限. (3认同)
  • @Marco,检查我的答案中提供的示例。我提供了一个允许命令的白名单,在这种情况下,用户不能只是`cp`一个二进制文件到他/她的路径(`root`拥有的目录,用户的`rx`),并且`rbash`阻止执行` ./可执行文件`。它回答你的问题吗? (2认同)
  • @dawud 确实如此。我错过了只读 bin 目录。 (2认同)

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变量之类的东西)。

  • 用户被映射到 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
    
    Run Code Online (Sandbox Code Playgroud)

    此外,/etc/security/namespace.init使所有骨架文件对用户只读并归root.

通过这种方式,您可以选择是否$USER可以mkdir代表他/她自己执行(通过私有~/bin目录中的链接,通过 提供/etc/skel,如上所述),代表其他用户(通过sudo)或根本不执行。