如何在 Linux 中限制用户命令



我有一个用户在组:"demo"。

我想设置此用户只能运行 10 个命令的策略,例如vimnanocd等。

或者,将策略设置为有权访问除sshcat命令之外的所有命令。

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

我建议使用几个不同的保护层来防止用户运行不应允许他们访问的命令。这里的所有方向都假设用户有自己的/home/[username]目录,他们的 shell 是/bin/bash,并且您希望他们在登录系统时使用 bash shell。

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

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

chmod 755 /home/[username]

  1. 删除用户的.bashrc文件

rm /home/[username]/.bashrc此站点提供了有关为什么在这种情况下删除.bashrc可能是个好主意的更多信息。

  1. 创建一个.bash_profile并为要禁用的所有命令添加"安全"别名

./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 ''"  

答:请查看 bash 命令的完整列表以获取更多信息。必须确保alias alias="printf ''"命令是列表中的最后一个命令,否则您将失去为所有这些命令设置别名的能力。

注意运行以下命令将搜索系统上几乎所有可用的命令,并输出一个现成的文件,几乎所有可用的命令都将预先锯齿。[命令是bash 中的test命令。因此,如果您在文件中看到它,则不是错误。

#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
  1. 通过将 vi 命令别名化为受限模式来禁用 vi 中的 shell 命令
    语法alias vi="vi -Z",但有关更多信息,请参阅此站点。

  2. 将用户.bash_profile的所有权更改为 root
    chown root:root /home/[username]/.bash_profile

  3. 最后,删除对用户的.bash_profile
    chmod 755 /home/[username/.bash_profile]的写入权限

现在,当用户登录时,他们将无法更改目录,您不希望他们使用的所有命令都将输出相同的信息,就像用户在未指定命令的情况下按下[ENTER]键一样,并且您的/bin/bash函数保持不变。

根据你选择或不使用这种方式别名的功能,用户可能仍然能够绕过你实现的某些控件。但是,由于我们实现了一些安全缓冲区,因此用户实际上必须了解计算机系统才能执行任何危险操作。

在相关的说明和您可能需要考虑的事情上,如果您直接将这些别名放入每个用户的.bash_profile中,您将难以维护哪些功能应该和不应该使用别名,如果您需要更改任何内容的别名,则必须单独更改所有这些。此外,由于用户可以使用vimvi来查看文件,因此他们可以看到其.bash_profile的内容,并了解他们有和没有的限制。

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

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

/[path_to_file]/startup_functions_for_beginners.sh

  1. 将别名获取到其.bash_profile

改进的 ./bash_profile 文件示例

if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
. /[path_to_file]/startup_functions_for_beginners.sh
fi

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

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

问:我需要用户有权访问fgbg,但我不希望他们能够访问aptitudebash

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  

根据此哈佛网站的常用命令列表(并非详尽无遗)

当您将程序安装到 Linux 时,您可以使用的内容会发生变化。我建议您运行上面在步骤 4 中列出的命令,以帮助在安装新命令后查找新命令。

编辑器应该小心谨慎,因为有些编辑器允许从程序内执行shell命令

nano
emacs
pico
sed
vi
vim  

一切

exit
logout
passwd
rlogin
ssh
slogin
yppasswd
mail
mesg
pine
talk
write
as
awk
bc
cc
csh
dbx
f77
gdb
gprof
kill
ld
lex
lint
make
maple
math
nice
nohup
pc
perl
prof
python
sh
yacc
xcalc
apropos
find
info
man
whatis
whereis
cd
chmod
chown
chgrp
cmp
comm
cp
crypt
diff
file
grep
gzip
ln
ls
lsof
mkdir
mv
pwd
quota
rm
rmdir
stat
sync
sort
tar
tee
tr
umask
uncompress
uniq
wc
cat
fold
head
lpq
lpr
lprm
more
less
page
pr
tail
zcat
xv
gv
xpdf
ftp
rsync
scp
alias
chquota
chsh
clear
echo
pbm
popd
pushd
script
setenv
stty
netstat
rsh
ssh
bg
fg
jobs
^y
^z
clock
date
df
du
env
finger
history
last
lpq
manpath
printenv
ps
pwd
set
spend
stty
time
top
uptime
w
who
whois
whoami
gimp
xfig
xv
xvscan
xpaint
kpaint
mplayer
realplay
timidity
xmms
abiword
addbib
col
diction
diffmk
dvips
explain
grap
hyphen
ispell
latex
pdfelatex
latex2html
lookbib
macref
ndx
neqn
nroff
pic
psdit
ptx
refer
roffbib
sortbib
spell
ispell
style
tbl
tex
tpic
wget
grabmode
import
xdpyinfo
xkill
xlock
xterm
xwininfo
html2ps
latex2html
lynx
netscape
sitecopy
weblint

如果您只有几个要禁用的命令,@Dodzi Dzakuma 解决方案非常有用。

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

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

    chsh -s /bin/rbash <username>
    
  2. 在用户主目录下创建 bin 目录

    sudo mkdir /home/<username>/bin
    sudo chmod 755 /home/<username>/bin
    
  3. 将用户的默认 PATH 更改为 bin 目录

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

    sudo ln -s /bin/<command> /home/<username>/bin/
    
  5. 限制用户修改 ~/.bashrc

    chattr +i /home/<username>/.bashrc
    

如果您只想允许用户运行多个命令,则这样做更好,因为您只设置您希望允许的命令的符号链接,而不是将 ALL 命令的别名设置为禁用。

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

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

command="only" ssh-rsa AAABBBCC....

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

唯一的命令是必须在具有 775 权限的/usr/bin/中安装的脚本。

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

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

command="only cal cowsay factor figlet fortune" ssh-rsa AAABBBCC....

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

----------------------
<   I'm restricted   >
----------------------
   ^__^ 
  (oo)_______
(__)       )/
||----w |
||     ||

我刚才偶然发现了针对您情况的解决方法。 我有一个用户,让我们称他为"test1",需要限制一些命令,例如"su",但其余的应该可用。 为了应用此限制,我只是在命令本身后面的二进制文件上使用 ACL(假设您在 FS 上启用了 acls),如下所示:

setfacl -m u:test1:r /bin/su

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

只需运行"哪个command_you_want_restricted"即可查看其背后的文件。

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

至于您的具体要求:

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

您可以在所需的命令二进制文件上对组"demo"的 ACL 执行相同的操作,但我尚未对组进行测试,我建议您事先在测试虚拟机或其他设备上尝试。

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

如果您尝试生成受限环境,这似乎不是一个好主意。用户可以做的第一件事是使用上面链接中的命令运行/bin/bash,他将在受限环境之外。

更好的主意是将每个用户的登录信息放入chroot监狱或轻量级容器中(因此,如果他们破坏了任何东西,那就是他们自己的容器)。看看 码头工人 - http://docker.io .

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

到目前为止,我已经找到了两种不同的方法。

  1. 唯一的方法
  2. 拥有一个完全不同的壳牌,即 rbash、lshell、dockersh

以下是我对此的看法。

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

  2. 在 3 个 shell 中,我觉得 lshell 是最容易实现的,特别是如果你使用的是 Ubuntu 及其衍生产品。您只需通过apt安装软件包,然后编辑配置即可。这是最简单的。

rbash 适用于基本的东西,比如阻止重定向和 cli 上的某些字符,但要做一些高级的东西,比如将某些命令列入白名单,你需要加倍努力。

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

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

相关内容

  • 没有找到相关文章

最新更新