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

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

如何阻止命令,比如说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*
    
  • 用户被给予一个受限的、只读的环境(想想诸如LESSSECURETMOUTHISTFILE变量之类的东西)。

  • 该用户被映射到 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 并尝试配置其用户和命令。

相关内容