如何限制 Linux 中的用户命令[关闭]
- 2024-11-08 09:04:00
- admin 原创
- 33
问题描述:
我有一个组中的用户:“demo”。
我想设置该用户只能运行 10个命令的策略,例如vim
,,,等等。nano
`cd`
或者,将策略设置为可以访问除ssh
和cat
命令之外的所有命令。
解决方案 1:
有很多不同的方法可以实现这一点。我将列出几种可能的解决方案。
我建议使用多个不同的保护层来防止用户运行他们不应被允许访问的命令。这里的所有指示都假设用户有自己的/home/[username]
目录,他们的 shell 是/bin/bash
,并且您希望他们在登录系统时使用 bash shell。
将用户的 bash 更改为受限 bash 模式,以便他们无法更改目录(如果您的系统上没有受限 bash 模式,此链接将提供帮助并为您提供更多信息)
chsh -s /bin/rbash [username]
更改目录权限,以便只有用户可以编辑其主目录的内容
chmod 755 /home/[username]
删除用户的
.bashrc
文件
rm /home/[username]/.bashrc
此站点有更多信息说明为什么在这种情况下删除可能是个好主意.bashrc
。
.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=$'
' GLOBIGNORE='*' command eval 'COMMANDS_ON_SYSTEM=($(cat ./commands_on_system.txt))'
IFS=$'
' 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
通过将 vi 命令别名为受限模式来禁用 vi 中的 shell 命令。
语法是alias vi="vi -Z"
,但请参阅此站点以获取更多信息。
将用户的所有权更改
.bash_profile
为 root
chown root:root /home/[username]/.bash_profile
最后,删除用户的写权限
.bash_profile
chmod 755 /home/[username/.bash_profile]
现在,当用户登录时,他们将无法更改目录,所有您不希望他们使用的命令都将输出相同的信息,就像用户按下[ENTER]
没有指定命令的键一样,并且您的/bin/bash
功能保持不变。
根据您选择或不选择使用这种方式的函数别名,用户可能仍然能够绕过您实施的一些控制。但是,由于我们实施了一些安全缓冲区,因此用户必须真正了解计算机系统才能进行任何危险的操作。
与此相关的是,您可能需要考虑的是,如果您将这些别名直接放入每个用户的文件中,.bash_profile
您将很难维护哪些功能应该和不应该使用别名,如果您需要更改任何内容的别名,则必须单独更改所有别名。此外,由于用户可以使用vim
或vi
查看文件,因此他们可以看到文件的内容.bash_profile
并了解他们有哪些限制和没有哪些限制。
为了解决这个问题,我建议。
将所有别名放在用户无法访问的目录中(将内容粘贴到
.bash_profile
这里)
/[path_to_file]/startup_functions_for_beginners.sh
将别名导入到他们的
.bash_profile
改进的 ./bash_profile 文件示例
if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
. /[path_to_file]/startup_functions_for_beginners.sh
fi
这应该可以让你顺利前行,但请记住,几乎总有办法可以规避限制。
另外,您可以随意混合此答案中的信息以满足您的需求。这些绝对可以与许多其他限制相结合。
问:我需要用户有权访问fg
和bg
,但我不希望他们能够访问aptitude
或bash
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
解决方案 2:
如果您只想禁用几个命令,那么@Dodzi Dzakuma 解决方案非常棒。
但是如果您只想允许用户运行几个命令,这里有一个更好的解决方案:
将用户 shell 更改为受限 bash
chsh -s /bin/rbash <username>
在用户主目录下创建bin目录
sudo mkdir /home/<username>/bin
sudo chmod 755 /home/<username>/bin
将用户默认的 PATH 改为 bin 目录
echo "PATH=$HOME/bin" >> /home/<username>/.bashrc
echo "export PATH >> /home/<username>/.bashrc
创建用户所需命令的符号链接
sudo ln -s /bin/<command> /home/<username>/bin/
限制用户修改~/.bashrc
chattr +i /home/<username>/.bashrc
如果您只想允许用户运行几个命令,那么这种方法会更好,因为您不需要设置要禁用的所有命令的别名,而只需设置您希望允许的命令的符号链接。
解决方案 3:
我有点惊讶,没有人在他们的答案中使用本机的 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)_______
(__) )/\n ||----w |
|| ||
解决方案 4:
我刚刚偶然发现了一种可以解决您的情况的方法。我有一个用户,我们称他为“test1”,需要限制某些命令,例如“su”,但其余命令应该可用。要应用此限制,我只需在命令本身后面的二进制文件上使用 ACL(假设您在 FS 上启用了 acl),如下所示:
setfacl -m u: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 或其他设备上尝试一下。
解决方案 5:
标准答案是使用受限 shell,使其成为该组用户密码文件中的最后一项。您可以从 vim 等程序运行外部命令: http: //web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html
如果您尝试创建受限环境,这似乎不是一个好主意。用户可以做的第一件事是使用上面链接中的命令来运行,/bin/bash
这样他就不在受限环境之内了。
一个更好的想法是将每个用户的登录信息放入 chroot jail 或轻量级容器中(这样,如果他们破坏了任何东西,那就是他们自己的容器)。看看 Docker - http://docker.io。
解决方案 6:
我在我的组织中遇到过类似的情况,我不得不限制人们只能访问某些命令。
到目前为止,我已经找到了两种不同的方法。
唯一的办法
拥有不同的 Shell,即rbash、lshell、dockersh
以下是我对此的看法。
如果您希望用户登录并执行某个命令,然后完全退出 shell,请采取唯一的方法。 最好将其与Rbash结合使用。
在这 3 个 shell 中,我觉得lshell是最容易实现的,特别是如果你使用的是 Ubuntu 及其衍生产品。你只需要通过 apt 安装一个包,然后编辑配置。它是最简单的。
rbash适用于执行诸如阻止重定向和 CLI 上的某些字符之类的基本操作,但要执行诸如将某些命令列入白名单之类的高级操作,您就需要付出额外的努力。
Dockersh是一种全新的、现代的限制 shell 的方法。在这里,您可以允许一切,但会将所有用户的操作限制在容器内。
在我的用例中,我必须将用户限制为单个命令,并关闭基于 shell 的重定向、管道等,因此我选择了lshell。配置几乎只花了 5 分钟。详情请见此处。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件