跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Linux怎么限制普通用户权限 Linux下Restricted Shell详解

rbash启动后cd报错是因为其受限模式直接拦截cd内置命令调用,仅允许不带斜杠的命令名且依赖PATH中预置的可执行文件,本质是初始化时通过$0 basename触发的轻量级限制机制。 rbash 启动后为什么 cd 报错? 因为
rbash
默认禁止所有目录切换操作,哪怕你当前在
/home/user
,执行
cd ..
或
cd /tmp
都会返回
bash: cd: restricted
。这不是权限问题,是 shell 自身限制机制触发的——它直接拦截了
cd
内置命令的调用路径。 真正起作用的是启动方式:
bash -r
或以
rbash
名字调用(如
/bin/rbash
),两者等价。系统通过
$0
的 basename 判断是否进入受限模式,所以软链接必须叫
rbash
,不能叫
mybash
。 验证当前 shell 是否受限:运行
shopt restricted_shell
,输出
restricted_shell on
表示生效 不要试图在用户登录后手动执行
set -r
—— 这无效,受限模式只能在 shell 初始化时启用
cd
被禁,但
pwd
、
ls
仍可用,前提是这些命令在
$PATH
中且路径不含
/
用户能运行哪些命令由什么决定? 不是靠白名单配置文件,而是靠
$PATH
和命令调用方式。受限 shell 禁止执行含
/
的路径,所以
/bin/ls
、
./script.sh
全部失败;唯一允许的是不带斜杠的命令名,比如
ls
,但前提是该命令在
$PATH
搜索路径中存在可执行文件。 典型做法是为用户创建专属 bin 目录(如
/home/user/.bin
),只放软链接到允许的命令,并把
$PATH
改成仅包含这个目录:
export PATH="/home/user/.bin"
必须用
root
创建软链接:
sudo ln -s /bin/ls /home/user/.bin/ls
用户自己的
.profile
或
.bash_profile
必须由
root
设置所有权和权限:
chown root:root .profile && chmod 755 .profile
,否则用户可篡改
PATH
不能依赖
~/.bashrc
—— rbash 默认不读取它,除非你在
.profile
里显式
source
为什么用户还能逃出 rbash?常见绕过点在哪? rbash 不是沙箱,只是轻量级限制层。只要用户能执行某个程序,而该程序又支持交互式 shell 调用,就可能逃逸。最典型的是
vim
、
less
、
man
、
ftp
、
gdb
等工具内置的
!
命令: 例如用户能运行
vim
,那在 vim 里输入
:!sh
或
:!/bin/bash
就直接获得非受限 shell。 Docker Desktop(linux) 当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。 下载 检查用户能用哪些命令:
echo $PATH
后挨个
ls -l
看有哪些二进制文件 测试重定向是否真被禁:
echo test > file
—— 如果成功,说明限制未生效或被绕过 检查是否有
python
、
perl
、
awk
等解释器:
python -c "import os; os.system('/bin/sh')"
是高危信号 注意
sudo -l
输出 —— 若用户对某些命令有免密 sudo 权限,
sudo /bin/bash
一步到位 rbash 适合什么场景?不适合什么? 适合短期、低信任度的临时账户,比如外包人员查日志、学生做实验、CI 构建账号。它成本低、无需额外服务、开箱即用。 不适合生产环境核心权限隔离。它的限制太容易被已有工具链绕过,且无法阻止进程间通信、内存读取、ptrace 注入等深层行为。 真正需要强隔离时,应转向
systemd --scope
、
cgroups v2
、
firejail
或容器方案。rbash 只是一个“礼貌性围栏”,不是防火墙。 最容易被忽略的一点:rbash 用户的
$HOME
目录本身必须严格设权 —— 如果用户能写
/home/user/.bash_profile
,他就能覆盖
PATH
或注入任意命令;如果能写
/home/user/.ssh/authorized_keys
,就可能通过 SSH 密钥登录并绕过 shell 限制。

相关文章