将Linux上的本地用户权限限制到最低限度

猫咪 有一天,出现了以下任务:在Linux中创建本地用户,对文件夹和文件的访问受限,不仅包括编辑,查看,而且仅使用允许的实用程序。 仅提供本地访问,没有网络访问。

为了避免重蹈覆辙,我要做的第一件事就是开始挖掘互联网,结果发现了以下选择:

  • 通过网络服务ssh,sftp的访问限制(不适合)
  • linux操作系统本身对访问权限的区分(不合适,我想要一个通用的解决方案)
  • 使用chroot(不适合)
  • 使用第三方实用程序(例如SELinux)(不合适)会使系统复杂化)。

搜索的结果是,找到了一种在bash shell中限制用户功能的内置机制,称为Restricted Shell或rbash

它实现了以下限制:

  • 无法使用cd命令更改目录
  • 您不能重置或更改变量SHELL,PATH,ENV,BASH_ENV的值
  • 禁止指定包含/(斜杠)的命令
  • 禁止从主外壳导入功能
  • 禁止使用运算符>,<,|,<>,>&,&>,>>重定向输出
  • 禁止使用exec命令替换命令等。

这里有一个负号,这是安全性,因此必须在.bashrc shell的行为文件中的命令中添加别名(信息会更进一步)。

当然,rbash是开箱即用的,它不能解决所有问题,因此,作为示例,我们考虑创建一个用户并设置他的环境以完全解决问题。

此外,所有操作都是从超级用户(根)执行的。

1.创建一个有限的外壳

echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash 

2.创建一个用户

 adduser --home /home/zuser --shell /bin/zbash zuser 

3.更改目录权限

 chown root.zuser /home/zuser chmod 750 /home/zuser 

4.转到目录并清理它

 cd ~zuser ls -a rm .bash* rm .profile ls -a 

5.自定义外壳和权限

 echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc # alias   help echo "bind 'set disable-completion on'" >> .bashrc #    tab mkdir -p bin chmod 750 bin chown -R root.zuser /home/zuser chmod 640 .bash* 

.bashrc文件定义外壳程序的行为;可以将命令或其他选项的别名添加到此文件中。

为了确保安全,请运行以下命令:

 echo "alias echo=':'" >> .bashrc echo "alias cat=':'" >> .bashrc echo "alias bash=':'" >> .bashrc echo "alias sh=':'" >> .bashrc echo "alias ln=':'" >> .bashrc echo "alias set=':'" >> .bashrc echo "alias uset=':'" >> .bashrc echo "alias export=':'" >> .bashrc echo "alias typeset=':'" >> .bashrc echo "alias declare=':'" >> .bashrc echo "alias alias=':'" >> .bashrc echo "alias unalias=':'" >> .bashrc 

清单继续...

6.检查工作

 root@host: su zuser zuser@host: help access is limited zuser@host: pwd /home/zuser zuser@host: ls /tmp/ bash: ls:    zuser@host: /bin/ls bash: /bin/ls:         {/} zuser@host: echo $PATH :/home/zuser/bin zuser@host: PATH=/bin/ bash: PATH:     zuser@host: exit 

7.添加有效的命令

 ln -s /bin/ping /home/zuser/bin/ping 

重要的是,必须完全指定ln命令中的路径。

8.您可以使用包装器来限制命令的选项。

 mkdir /var/scripts echo "/usr/sbin/useradd -D" > /var/scripts/user-info chmod +x /var/scripts/user-info ln -s /var/scripts/user-info /home/zuser/bin/user-info 

9.您还可以创建用于处理文件和文件夹的包装器。
黑名单 (允许所有内容除外):
-创建一个文件

 nano /var/scripts/ls 

-文件内容

 blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $* 

黑名单-包含目录或文件黑名单的变量(以空格分隔)
-为用户zuser添加命令

 chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls 

该脚本允许您使用与黑名单不匹配的目录和文件的任何键执行ls命令

白名单 (禁止所有内容除外):
-创建一个文件

 nano /var/scripts/cat 

-文件内容

 whitelist="./ /tmp/" #   for var in $whitelist do if [[ $* == *$var* ]]; then /bin/cat $* #   cat    exit fi done echo 'Access is denied:' $* 

白名单-包含目录或文件白名单的变量(以空格分隔)
-为用户zuser添加命令

 chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat 

该脚本使您可以对白名单中的指定文件执行cat命令。

完成后 ,我们终于得到以下结果:

  • 我们使用rbash shell创建了一个zuser用户
  • 禁用了在控制台中使用自动完成功能的能力
  • zuser只能从目录/ home / zuser / bin中运行实用程序
  • 将ping命令添加到zuser
  • 向用户zuser添加了user-info命令
  • 通过包装程序限制zuser执行ls和cat命令


不幸的是,此方法不能保证100%的安全性,并且具有一定的知识和资格,用户可以离开此外壳。 感谢Jouretz arheops YaDr的评论,他们提供了规避外壳限制的示例。

此解决方案(Shell Escape)中存在以下漏洞,必须予以考虑:
路径能够更改PATH变量
通过scp复制文件能够上传脚本
通过ssh连接时,可以更改外壳
 ssh zuser@xxxx -t "/bin/bash" 
通过ssh连接时,您可以更改shell配置文件
 ssh zuser@xxxx -t "bash --noprofile" 
通过ssh连接时,可以使用ShellShock
 ssh zuser@xxxx -t "() { :; }; /bin/bash" 
通过实用程序vi,vim
 :!bash 
通过实用程序vi,vim
 :set shell=/bin/bash :shell 
通过公用事业公司,更多,更少
 !bash 
通过查找实用程序
 find . -maxdepth 0 -execdir /bin/bash \; 
通过awk实用程序
 awk 'BEGIN {system("/bin/bash")}' 
通过nmap实用程序
 nmap --interactive 
通过nmap实用程序
 echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse 
通过Perl
 perl -e 'exec "/bin/bash";' 
通过python
 python -c 'import pty; pty.spawn("/bin/bash")' 
通过红宝石
 ruby: exec "/bin/bash" 
通过LD_PRELOAD创建evil.c文件:
 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("echo work"); system("/bin/bash --noprofile"); } 

我们编译:
 gcc -fPIC -shared -o evil.so evil.c -nostartfiles 

我们在关闭控制台的情况下将生成的evil.so文件传输到计算机并运行:
 LD_PRELOAD=$PWD/evil.so ls 

作为参数,任何可用的命令

由于存在足够多的漏洞,因此该方法只能用于非关键系统上的本地用户;对于通过ssh通过网络进行访问,最好使用chroot或其他实用程序来限制用户功能。

希望这些信息对您有所帮助。

Source: https://habr.com/ru/post/zh-CN437710/


All Articles