如何限制用户的shell允许执行shell程序

是否有可能阻止任何用户不使用可能损害系统的命令,如ls,rm和其他系统命令。 但是用户应该能够执行shell程序。

你的问题应该是:

我不相信我的用户。 愚蠢的人看到互联网上的东西,试试看,不知道它是什么。 那些狡猾的人喜欢窥探其他人的档案,窃取他们的想法。 懒惰的,不要让我开始懒惰的。

如何保护我的系统和用户免受我的用户的侵害?


首先,Unix有非常全面的文件系统权限系统。 这似乎是unix文件系统权限的一个体面的教程 。 其要点是可以设置目录,使用户可以进入一个目录,并可以从该目录运行程序,但不能查看该目录的内容。 如果你这样做,例如,在/ home上,如果用户在/ home上运行ls,他们会得到一个权限被拒绝的错误。

如果你真的害怕你的用户,并想把它们放在一个supermaxtypes的受限环境中,可以使用诸如freebsd的监狱或solaris的区域 – 每个用户都有自己定制的环境。 为了增加点数,可以使用ZFS,这样您可以在login时拍摄环境快照,所以如果删除文件,您可以将它们从快照中提取出来。

有三件事情需要到位,以完全做你的要求:

  1. 缺less您感兴趣的命令的自定义shell程序 。 这是一件很难得到的事情,但是如果你真的不希望用户能够访问某些shell基元,这是删除它们的唯一方法。
  2. 正确设置文件权限 。 不希望用户损坏系统? 设置权限,以便即使拥有合适的工具,也不会损坏系统。 在这三个步骤中,这是最简单的一步。
  3. 使用像AppArmor这样的强制访问控制技术 。 像AppArmor和SELinux这样的MAC在内核中embedded权限。 这些阻止用户运行正确的工具,即使他们发现他们(和文件权限一样,阻止他们在限制框外使用它们)。

皮带,吊带,和一个主要的枪为好的措施。 那里很难出错。

AppArmor是有趣的,因为一个特定的可执行文件的MAC被它的所有孩子inheritance。 将用户的login设置为/bin/bash-bob ,为该特定的二进制权限设置AppArmorconfiguration文件,并且他们从该权限监狱离开的唯一方法是通过内核漏洞攻击。 如果一些懒惰的安装脚本由于一些愚蠢的原因而使/var/opt/vendor/tmp全局可写,那么使用/bin/bash-bob作为它们的shell的用户将无法在那里写入 。 设置bash-bobconfiguration文件只允许写入他们的主目录和/tmp ,这样的权限错误不能被利用。 即使它们以某种方式find了root密码,即使在su和它所产生的bash过程是/bin/bash-bob孩子之后,它们仍然适用于/bin/bash-bob

最难的部分是构buildAppArmorconfiguration文件。

  1. 为/ bin / bash-bob创buildAppArmorconfiguration文件并将其设置为审核模式
  2. 将Bob的loginshell设置为/ bin / bash-bob
  3. 以Bob身份login。 做你希望鲍勃能够做的一切。
  4. 使用审计日志来构buildAppArmorconfiguration文件(SUSE有这个工具,不知道其他Linux发行版)。 这是非常乏味的,但是如果你需要这样的安全性,就需要发生。
    1. 你会做这样的事情:
      • 批准对大部分系统库的读取权限
      • 批准对选定的几个允许的系统命令的读取和执行权限
      • 批准对临时空间的写入权限
      • 批准套接字创build,如果需要的话
  5. 设置要执行的策略。
  6. 以Bob身份login,执行操作。
  7. 进行调整。

在我看来,你只需要步骤2和步骤3,因为它们组合在一起,既防止在这两个步骤中设置的精心构造的盒子外面做任何有害的事情。

那么,你可以将用户的shell设置为你写的程序,只让它们运行某些shell脚本。

当然,这只和程序和shell脚本一样安全。 在实践中,这种受限制的shell通常对于一个聪明的攻击者是不安全的。

不要尝试限制命令,限制文件权限。 你实际上不能限制人们对系统调用的访问,所以所有人需要做的是提供你自己不想执行的任何“危险”命令的副本,并且你被塞满了。

如果您希望用户只能执行某些脚本/二进制文件,则可以使用受限制的shell 。 这(正如维基百科文章所提到的)并不完全安全,但是如果你可以保证没有允许运行的应用程序能够执行一个新的shell,那么这是一个很好的select。

要设置一个用户受限制的shell,设置/bin/rbash (或者类似的,大多数shell在二进制名为r *** name *时进入受限模式)作为用户shell。 然后,编辑** .bashrc (或等价物)并将$PATH设置$PATH存储所有允许的二进制文件/脚本的目录。

是的,这是可能的,但在实践中需要大量的工作和计划​​。 您可以创build脚本并将其作为特权使用来运行,然后删除相关用户的所有权限。 或者,您可以将用户的shell设置为自己制作的内容,只允许他们执行您明确允许的操作。

但是,在Linux中的标准权限使普通用户几乎不可能“伤害系统”。 你想防止什么样的伤害? 防止用户安装软件或在主目录之外运行程序是很简单的,您可以使用chroot进一步locking系统。

你可能想尝试[lshell] [1](有限的shell)。

lshell是一个用Python编写的shell,它可以让用户的环境受到限制,可以通过SSH(例如SCP,SFTP,rsync等)启用/禁用任何命令,logging用户命令,实现时间限制,和更多。

[1]: http ://lshell.ghantoos.org/Overview lshell

我通常实施这种限制的方式要求满足几个条件,否则限制可以很容易地被规避:

  • 用户不属于wheel组,只有一个被授权使用su (通过PAM强制执行)。
  • 用户被赋予一个安全的 rbash ,只读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* 
  • 给用户一个受限的,只读的环境(想想像LESSSECURETMOUTHISTFILEvariables)。

  • 用户被映射到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拥有。

这样,您可以select是否$USER可以代表自己执行任何命令(通过私人~/bin目录中的链接,通过/etc/skel ,如上所述),代表其他用户(通过sudo )或根本没有。

是的,只需更改这些命令的权限。

通过编写一个符合您的要求的shell命令,您可能会有更好的战斗机会。

什么不适合Linux上的普通用户的默认权限?