如何限制 Linux 中的用户命令[关闭]

2024-11-08 09:04:00
admin
原创
32
摘要:问题描述:我有一个组中的用户:“demo”。我想设置该用户只能运行 10个命令的策略,例如vim,,,等等。nano`cd`或者,将策略设置为可以访问除ssh和cat命令之外的所有命令。解决方案 1:有很多不同的方法可以实现这一点。我将列出几种可能的解决方案。我建议使用多个不同的保护层来防止用户运行他们不应被...

问题描述:

我有一个组中的用户:“demo”。

我想设置该用户只能运行 10个命令的策略,例如vim,,,等等。nano`cd`

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


解决方案 1:

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

我建议使用多个不同的保护层来防止用户运行他们不应被允许访问的命令。这里的所有指示都假设用户有自己的/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=$'
' 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
  1. 通过将 vi 命令别名为受限模式来禁用 vi 中的 shell 命令。

语法是alias vi="vi -Z",但请参阅此站点以获取更多信息。

  1. 将用户的所有权更改.bash_profile为 root

chown root:root /home/[username]/.bash_profile

  1. 最后,删除用户的写权限.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

解决方案 2:

如果您只想禁用几个命令,那么@Dodzi Dzakuma 解决方案非常棒。

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

  1. 将用户 shell 更改为受限 bash

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

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

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

sudo ln -s /bin/<command> /home/<username>/bin/
  1. 限制用户修改~/.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:

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

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

  1. 唯一的办法

  2. 拥有不同的 Shell,即rbash、lshell、dockersh

以下是我对此的看法。

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

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

rbash适用于执行诸如阻止重定向和 CLI 上的某些字符之类的基本操作,但要执行诸如将某些命令列入白名单之类的高级操作,您就需要付出额外的努力。

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

在我的用例中,我必须将用户限制为单个命令,并关闭基于 shell 的重定向、管道等,因此我选择了lshell。配置几乎只花了 5 分钟。详情请见此处。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用