1. 前言
在Linux系统中,为了增强安全性,避免不适当的使用,有时需要限制特定用户或用户组的命令行访问。
常用的限制方法包括 profile限制、authorized_keys限制、rbash限制,本文我们就来学习一下这些方法。
参考文档:
2. profile限制
当一个shell登录时,它将读取 /etc/profile
文件中的全部环境变量,然后再执行 /etc/profile.d/
目录中的所有 .sh
结尾的脚本。
因此,我们可以定义一个 /etc/profile.d/login.sh
脚本,用来限制用户的PATH,以此限制用户命令。
下面是一个 login.sh 示例,限制用户只能使用 ssh 命令。
1 |
|
但是,这种方法只能限制用户登录后的命令,如果用户远程执行命令,就限制不住了。
比如:
1 | ssh -t work@192.168.55.100 "bash" |
更多关于登录session和非登录session的内容,可以参考《bash_profile和bashrc的区别》
3. authorized_keys限制
想要限制非登录session,一种可选的方案是使用 authorized_keys 。
1、authorized_keys 中配置 public key
1 | command="/usr/bin/ssh $SSH_ORIGINAL_COMMAND@tiger.voidking.com -p 2222" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9... |
2、用户使用ssh
1 | ssh -t work@192.168.55.100 "haojin" |
详情参考:《shell命令之ssh》
4. rbash限制
4.1. rbash简介
rbash(restricted bash)是 bash 的一个版本,实际上 rbash 是 bash 的一个软连接,能够限制用户的命令。
具体限制包括:
- 不能执行 cd 命令。只能在当前目录下工作,其它目录都无法进入。
- 不能修改 PATH、ENV、HOME、SHELL等环境变量的值。
- 不能执行包含
/
字符的程序。例如,我们无法执行 /usr/bin/uname 或 ./uname 命令或程序。但是,我们依然可以运行 uname 命令。也就是说,当前目录以外的程序或命令是无法被执行的。 - 不能使用
>
和>>
等重定向运算符进行重定向输出。 - 不能在脚本中或其它方式关闭 Restricted Shell 模式。
- 不能使用 set+r 或 set+o restricted 等方式退出 Restricted Shell 模式。
4.2. rbash限制只能执行ssh
1、创建一个用户
1 | # ls -s /bin/bash /bin/rbash |
2、限制用户只能执行ssh
1 | echo "export PATH=/home/ruser/bin" >> /home/ruser/.bash_profile |
但是,rbash有很多逃逸方法,比如一个简单的bash
命令就可以逃逸,无论是session登录还是非session登录。
1 | ssh -t work@192.168.55.100 "bash" |
5. 限制用户命令实战
5.1. 需求描述
- jumpserver只能内网使用,但是有少量外网用户也需要使用jumpserver。
- 为避免增加了风险,jumpserver不能放通到外网。
5.2. 解决方案
外网可以访问的主机A放通一个ssh命令用于登录,主机A可以连通到jumpserver主机。
5.3. Step1:制作并运行ssh镜像
1、准备一个限制登录脚本 ssh.sh
1 |
|
1 | chmod a+x ssh.sh |
2、定义 Dockerfile
1 | # Using debian as base |
3、打包镜像
1 | docker build -t voidking/ssh:debian-bookworm-slim . |
4、运行镜像
1 | docker run -d --name ssh \ |
5.4. Step2:配置public key
配置外部用户的 public key 到ssh容器中 work用户的authorized_keys,以使得外部用户有权限执行 command 中指定的 ssh.sh 脚本。
1 | docker exec -it ssh /bin/bash |
5.5. Step3:测试登录
1 | ssh -t work@192.168.55.100 -p 10022 "haojin" |