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


27

如何阻止命令,让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二进制文件并将其重命名并使用它。那么如何实现呢?


7
您的示例将失败,因为用户可以自己编译mkdir并重命名它,甚至只是复制并重命名现有的二进制文件。此外,还有一个内置的Shell用于覆盖别名和函数。
奋斗

嗯,那是正确的,那还有吗?
拉胡尔·帕蒂尔

用户也不需要编译,他可以轻松地复制cp /bin/mkdir mkdir2然后使用它:(
Rahul Patil

创建目录是一项常见/基本的任务,有多种执行方法,几乎​​不可能全部阻止(除非不让用户创建文件;即,对所有目录进行写保护)。例如,cp -r /usr/local/lib ggg将创建一个名为ggg(包含的内容的副本/usr/local/lib,如果有的话,用户可以将其删除)的目录。您可以使用find / -type d -empty查找要复制的空目录。
G-Man说'恢复莫妮卡'

Answers:


21

我不知道如何使用bash进行操作,但是我知道另一个限制用户环境的shelllshell(受限的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

3
使用allowed = 'all' - ['mkdir'],您不能执行bash并再次不受限制吗?
dawud

3
抱歉,只是上学了,但是仍然有很多方法可以规避该列表所施加的限制,例如dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash。我认为问题在于缺少限制性的默认策略,即在这种情况下,默认情况下您将获得GRANT权限,然后是基于列表的DENY权限,而在其他情况下,则是:默认情况下是DENY,然后是基于策略的GRANT 。
dawud

1
@dawud:我同意维护允许的命令白名单比拥有黑名单更好,并且希望用户不会因为不喜欢管理员而绕开它。
rahmu 2013年

2
@Marco,请检查我的答案中提供的示例。我提供了允许的命令的白名单,在这种情况下,用户不能只是cp其PATH(用户root拥有的目录rx)的二进制文件,并且rbash阻止执行./executables。它能回答您的问题吗?
dawud 2013年

2
@dawud确实如此。我错过了只读的bin目录。
Marco Marco

15

我通常实施这种限制的方式需要满足多个条件,否则可以轻松地规避该限制:

  • 该用户不属于该wheel组,而是唯一一个有权使用的组su(通过PAM强制执行)。
  • 用户被给予适当的保护rbash具有只读路径指向一个私人~/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)执行,或者完全不执行。


4

添加一个虚拟组,将用户添加到该组,chown root:somegroup /bin/mkdirchmod g-x /bin/mkdir。请注意,这取决于用户无法修改其组。IIRC在GNU / Linux中是正确的,但在某些其他Unices中则不是。


2
在大多数文件系统上,您还可以使用扩展的ACL进行更细粒度的控制-所需的组数将随着用户数量的增加而呈指数增长(由于可能的组合),更不用说命名问题了。
彼得

2
再增加一个点,还删除其他用户的读取权限710,因此用户无法复制和重命名该二进制文件,不是吗?
拉胡尔·帕蒂尔

1
@RahulPatil是的,当然,您还需要限制它们对编译器的使用。
彼得

1

我测试过的最好的方法是使用Profile.d的最佳和最安全的方法

步骤#1(创建别名文件)

[root@newrbe ~]# vim /etc/customalias.sh

在下面添加行:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

保存并退出

步骤2(创建配置文件加载器)

/etc/profile.d/此位置包含用于bash完成的文件

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

在文件下方添加以下行,这些行将阻止以下用户使用上述命令

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

保存并退出

现在退出并重新登录

问候,-曼苏尔


/etc/profile.d/不是为了bash完成,而是使用类似POSIX的登录shell为用户放置登录会话自定义项的地方,因此通常不是bash别名自定义项(宁愿加入/etc/bash.bashrc)的地方,它应该具有POSIX shell语法(因此通常.改为的source=而不是的==)。
斯特凡Chazelas

-1

安装sudoers并尝试在那里配置其用户和命令。


4
欢迎来到SX。请在您的答案中添加详细信息;OP或其他将来阅读此问题的人可能不知道sudo
约瑟夫R.13年

这个答案是完全错误的
Kiltek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.