核心是通过authorized_keys中command=指令强制执行唯一ssh跳转命令,并禁用pty等所有扩展功能,配合受限shell、专用path和bin目录隔离,实现彻底单命令限制。

要实现“只允许执行某一条命令”,比如仅能 ssh 跳转、不能 ls、不能 bash、不能 cat,甚至不能退出到交互式 shell,核心不是靠防火墙或用户组,而是靠 authorized_keys 文件中每行公钥前的 command= 限制项,配合受限 shell 和路径隔离。它本质是 SSH 协议层的强制拦截,比系统级权限控制更底层、更可靠。
一、准备专用密钥对并上传公钥
避免复用已有密钥,单独为该受限用途生成密钥:
- 运行
ssh-keygen -t ed25519 -f ~/.ssh/id_jump -C "jump-only",不设 passphrase(若需更高安全,可设,但会失去完全自动化) - 将生成的公钥(
~/.ssh/id_jump.pub)上传至目标主机对应用户的~/.ssh/authorized_keys,但不要直接追加整行,而是手动编辑,添加限制前缀
二、在 authorized_keys 中写死 command= 并禁用所有扩展权限
打开目标用户(如 jumpuser)的 ~/.ssh/authorized_keys,在该公钥行最前面插入完整限制语句:
command="/usr/bin/ssh -o StrictHostKeyChecking=no %u@internal-server",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA... jump-only
-
command="...":指定用户登录后唯一允许执行的命令;%u自动替换为登录用户名,internal-server替换为目标跳转地址 -
no-pty:禁止分配伪终端,用户连bash -i都无法启动,彻底杜绝交互式 shell -
no-port-forwarding等:关闭所有可能被滥用的通道,防止绕过命令限制 - 整行必须无换行、无多余空格,且以
ssh-rsa或ssh-ed25519开头
三、确保环境干净:禁用 profile、锁定 PATH、隔离 bin 目录
即使 command= 指向了 /usr/bin/ssh,攻击者仍可能通过环境变量或 shell 启动过程逃逸。需同步加固:
- 在
~/.ssh/authorized_keys的command=中改用受限 shell 封装:command="env -i HOME=$HOME PATH=/home/jumpuser/bin /bin/bash --restricted -c '/usr/bin/ssh -o StrictHostKeyChecking=no $USER@internal-server'" - 创建专用 bin 目录:
mkdir -p /home/jumpuser/bin,并仅放入软链接:ln -sf /usr/bin/ssh /home/jumpuser/bin/ssh - 确保
/home/jumpuser/bin是该用户PATH中唯一有效路径,且目录权限为755,文件权限为755 - 删除或重命名
~/.bashrc、~/.profile,防止自动加载干扰
四、关键权限与验证要点
OpenSSH 对权限极其敏感,一处出错即静默失败:
-
~/.ssh目录必须为700:chmod 700 ~/.ssh -
~/.ssh/authorized_keys必须为600:chmod 600 ~/.ssh/authorized_keys - 私钥文件(本地)也必须是
600,否则 ssh 客户端拒绝使用 - 测试时用
ssh -i ~/.ssh/id_jump -v jumpuser@target查看 debug 输出,确认是否进入 command 执行阶段 - 登录后尝试输入任何其他命令(如
ls、pwd),应立即返回bash: ls: command not found或直接断开











