如何在Linux中限制用户命令

mor*_*ipo 17 linux bash command restriction

我在一个组中有一个用户:"demo".

我想设置这个用户可以运行10个命令的策略,如"vim","nano","cd"等.

或者,将策略设置为可以访问除"ssh"和"cat"命令之外的所有命令.

谢谢

Dod*_*uma 19

有很多不同的方法可以实现这一目标.我将列出几种可能的解决方案之一.

我建议使用几个不同的保护层来防止用户运行他们不应该被允许访问的命令.这里的所有指示都假定用户拥有自己的/home/[username]目录,他们的shell是/bin/bash你希望他们在登录系统时使用bash shell.

1)将用户的bash更改为受限制的bash模式,以便他们无法更改目录(如果您的系统上没有受限制的bash模式,此链接将提供帮助并为您提供更多信息)chsh -s/bin/rbash [用户名]

2)更改目录权限,以便只有用户可以编辑其主目录的内容

chsh -s /bin/rbash [username]

3)删除用户的chmod 755 /home/[username]文件

.bashrc 该网站提供了更多信息,说明为什么rm /home/[username]/.bashrc在这种情况下删除它可能是一个好主意.

4).bashrc为要禁用的所有命令创建并添加"安全"别名

./bash_profile文件示例

alias apt-get="printf ''"  
alias aptitude="printf ''"  
[...]  
alias vi="vi -Z" #this is vi's safe mode and shell commands won't be run from within vi
alias alias="printf ''"  
Run Code Online (Sandbox Code Playgroud)

请查看bash命令的完整列表以获取更多信息.您必须确保该.bash_profile命令是列表中的最后一个命令,否则您将失去对所有这些命令进行别名的能力.

5)通过将vi命令别名化为限制模式来禁用vi中的shell命令
语法是alias alias="printf ''",但请查看此站点以获取更多信息.

6)将用户的所有权更改[为root
test

7)最后,删除用户的写权限 alias vi="vi -Z"
.bash_profile

现在,当用户登录时,他们将无法更改目录,您不希望他们使用的所有命令将输出相同的信息,就像用户在chown root:root /home/[username]/.bash_profile 没有指定命令的情况下按下键一样,并且您的.bash_profile功能保持不变完整.

根据您选择或不使用别名的功能,用户可能仍然可以规避您实施的某些控件.但是,由于我们实现了一些安全缓冲区,用户真的必须知道计算机系统做任何危险.

在一个相关的注释和你可能想要考虑的事情,如果你直接将这些别名放在每个用户' chmod 755 /home/[username/.bash_profile]你将难以维护哪些功能应该和不应该别名,如果你需要更改任何东西的别名你必须单独改变所有这些.此外,由于用户可以使用[ENTER]/bin/bash查看文件,他们可以查看他们的内容.bash_profile并了解他们拥有和没有的限制.

为了解决这个问题,我建议.

1)将所有别名放在用户无法访问的目录中(粘贴vim此处的内容)

vi

2)将别名采购到他们的 .bash_profile

改进了./bash_profile文件示例

#search /bin and /usr/bin for any commands that exist on our system
ls /bin -1 > commands_on_system.txt && ls /usr/bin -1 >> commands_on_system.txt

#format and save this information to a bash variable
IFS=$'\n' GLOBIGNORE='*' command eval  'COMMANDS_ON_SYSTEM=($(cat ./commands_on_system.txt))'
IFS=$'\n' COMMANDS_ON_SYSTEM=($(sort <<<"${COMMANDS_ON_SYSTEM[*]}"))
unset IFS

#save these commands in aliased format for easy usage
for linux_command in "${COMMANDS_ON_SYSTEM[@]}"
do :
   #you can change how this works to automatically
   #setup the command file for you 
   echo "alias ${linux_command}=\"printf ''\"" >> ./startup_functions_for_beginners.sh
done
Run Code Online (Sandbox Code Playgroud)

这应该会让你走上正轨,但请记住,几乎总有办法绕过限制.

此外,您可以随意重新混合此答案中的信息以满足您的需求.这些也绝对可以与许多其他限制相结合.

问:我需要的用户能够访问.bash_profile/[path_to_file]/startup_functions_for_beginners.sh,但我不希望他们能够访问.bash_profilefg

if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
    . /[path_to_file]/startup_functions_for_beginners.sh
fi
Run Code Online (Sandbox Code Playgroud)

根据哈佛网站(非排外)的常用命令列表

应该谨慎对待编辑器,因为有些允许从程序中执行shell命令

alias apt-get="printf ''"  #the user won't be able to run this  
alias aptitude="printf ''"  #the user won't be able to run this  
alias bash="printf ''"  #the user won't be able to run this  
#alias fg="printf ''" #this will run as a bash built-in  
#alias bg="printf ''" #you actually don't need to include these in your script  
Run Code Online (Sandbox Code Playgroud)

其他一切

nano
emacs
pico
sed
vi
vim  
Run Code Online (Sandbox Code Playgroud)

  • 由于一系列原因,这是一个可怕的建议.首先,它在错误的网站上(应该在秒SE).其次,它不是白名单方法.第三,它将用户输入的所有内容传递给一个功能齐全的图灵完整且不受限制的解释器,它只是需要奇怪的机器,但第四(主要)因为它太容易被忽视. (11认同)
  • 这比没有任何安全更糟糕,因为它给人一种安全感; 它使OP感觉舒适和自满而不保护它们.这就像他们问你怎么打,而且你告诉他们"当你看到有人要打你的时候闭上你的眼睛,因为你没想到它,就像你不会被打在所有". (6认同)
  • 在我的脑海中,用户可以在输入密码后立即向客户端发送一堆"^ Z"或"^ C"字符,以完全缩减在bashrc中所做的任何工作.然后,当然,他们可以生成一个子shell,它不会定义别名.或者他们可以提供他们想要运行的可执行文件的完整路径.等等.我花了三十秒时间读出你的帖子,想出了这三个想法; 想象一下,如果有严肃的计算机安全知识的人有兴趣可以做些什么. (2认同)

Any*_*ine 12

我知道我迟到了,事实上已经迟到了两年,但我刚才为你的情况偶然找到了解决办法.我有一个用户,让我们称他为"test1",需要限制一些命令,比如"su",但其余的应该可用.为了应用这个限制,我只是在命令本身后面的二进制文件中使用ACL(假设你的FS上已经启用了acls),如下所示:

setfacl -mu:test1:r/bin/su

上面的命令更改了该特定二进制文件的权限,实际上是"su"命令,以授予用户"test1"仅对该文件的读访问权限.因此,当用户"test1"尝试"执行""su"命令时,他无法在其后面运行脚本并获得"权限被拒绝".

只需运行"which command_you_want_restricted"即可查看其背后的文件.

我在Red Hat 6.5和7上测试了这个方法,它只影响用户"test1",所有其他用户可以随意继续运行"su".

至于你的具体要求:

"或者,将策略设置为可以访问除"ssh"和"cat"命令之外的所有命令."

你可以在你想要的命令二进制文件上为"demo"组做ACL的同样的事情,但是我没有用组测试它,我建议你先在测试VM上试一试.

问候,


Rob*_*ert 9

我有点惊讶还没有人在他们的回答中使用本机 SSH 功能......我知道我晚了 4 年,但它仍然很方便:)

使用 SSH 时,您应该使用密钥登录;当我们谈论保护服务器时,禁用密码登录应该是您应该做的第一件事。因此,当您使用密钥时,您现在可以通过在 authorized_keys 文件中添加以下内容来允许每个密钥只执行一个命令:

command="only" ssh-rsa AAABBBCC....
Run Code Online (Sandbox Code Playgroud)

only命令是一个白名单功能,允许用户仅运行这些命令。您不必通过更改默认的二进制权限(这是管理员地狱..)来在您的系统上设置例外。确保将authorized_keys文件设置为用户不可写。

唯一的命令是必须/usr/bin/以 775 权限安装的脚本。

阅读所有相关信息:SSH 强制命令唯一方法

现在您了解了它的工作原理,您可以简单地将允许用户执行的任何命令列入白名单:

command="only cal cowsay factor figlet fortune" ssh-rsa AAABBBCC....
Run Code Online (Sandbox Code Playgroud)

或者使用.onlyrules具有正确语法的文件,注意不要使用任何贪婪的正则表达式。

command="only" ssh-rsa AAABBBCC....
Run Code Online (Sandbox Code Playgroud)


Vic*_*ong 7

如果您只希望禁用一些命令,则@Dodzi Dzakuma解决方案非常有用。

但是,如果只希望允许用户运行多个命令,这是一个更好的解决方案:

  1. 将用户外壳更改为受限bash

    chsh -s /bin/rbash <username>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在用户主目录下创建一个bin目录

    sudo mkdir /home/<username>/bin
    sudo chmod 755 /home/<username>/bin
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将用户的默认PATH更改为bin目录

    echo "PATH=$HOME/bin" >> /home/<username>/.bashrc
    echo "export PATH >> /home/<username>/.bashrc
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建用户所需命令的符号链接

    sudo ln -s /bin/<command> /home/<username>/bin/
    
    Run Code Online (Sandbox Code Playgroud)
  5. 限制用户修改〜/ .bashrc

    chattr +i /home/<username>/.bashrc
    
    Run Code Online (Sandbox Code Playgroud)

如果您只希望允许用户运行多个命令,这会更好,因为您无需设置要禁用的所有命令的别名,而只需设置希望允许的命令的符号链接即可。


abl*_*igh 5

标准答案是使用受限制的shell,使其成为该组中用户的密码文件中的最后一个条目.因为你可以从vim这样的东西运行外部命令:http://web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html

如果你想要创造一个受限制的环境,这似乎不是一个好主意.用户可以做的第一件事是使用上面链接中的命令来运行,/bin/bash并且他将在受限制的环境之外.

更好的想法是将每个用户的登录信息放入chroot jail或者轻量级容器中(因此如果它们破坏了任何东西,那么它就是自己的容器).看看Docker - http://docker.io.


Sha*_*laj 5

我在我的组织中遇到过类似的情况,我不得不限制人们只能访问某些命令。

到目前为止,我已经找到了 2 种不同的方法来做到这一点。

  1. 唯一途径
  2. 完全有一个不同的 Shell,即。rbash , lshell , dockersh

以下是我对此的看法。

  1. 如果您希望用户登录并执行某个命令,然后完全退出 shell,请采用唯一的方法。最好将它与Rbash 结合使用

  2. 在 3 个 shell 中,我觉得lshell是最容易实现的,尤其是如果您使用的是 Ubuntu 及其衍生版本。你只需要通过 apt 安装一个包,然后编辑配置。这是最简单的。

rbash是好基本的东西像上阻塞CLI重定向和某些字符但要做到像白名单某些命令先进的东西,你就需要多走一英里。

Dockersh是一种全新且现代的限制 shell 的方法。在这里,您允许所有内容,但将所有用户的操作限制在一个容器中。

在我的用例中,我不得不将我的用户限制为一个命令,并关闭基于 shell 的重定向、管道等,因此我选择了lshell。花了不到 5 分钟的时间进行配置。在此处查找详细信息。