restrict是openssh 6.8+引入的前置限制总开关,等价于同时启用no-port-forwarding、no-user-rc、no-x11-forwarding、no-agent-forwarding和no-pty,默认禁用所有扩展功能,仅配合command、pty等显式选项才能精准放行最小必要能力。

要对非 root 用户的 SSH 公钥实施最严格的行为约束,核心是用好 restrict 选项——它本身不做事,但能一键关闭所有默认扩展能力,再配合显式放开的最小必要项,实现“只做一件事、别的全禁”的硬隔离效果。
restrict 的本质:默认全关,只开白名单
restrict 不是独立限制项,而是快捷开关,等价于同时启用:
- no-port-forwarding(禁端口转发)
- no-user-rc(跳过 ~/.bashrc 等初始化脚本)
- no-X11-forwarding(禁图形转发)
- no-agent-forwarding(禁 agent 转发)
- no-pty(禁分配交互式终端)
注意:它不禁止命令执行本身。用户仍可通过 ssh user@host ls 运行单条命令,除非你额外加 command=... 或 no-command。
非 root 场景下的三类最强约束组合
针对普通用户(如 deploy、backup、git、monitor),推荐以下经验证的最小权限配置:
① 只允许运行指定命令(如 Git Shell)
适用于代码仓库账号、CI/CD 凭据
restrict,command="/usr/bin/git-shell -c \"$(SSH_ORIGINAL_COMMAND)\"",no-port-forwarding,no-X11-forwarding ssh-ed25519 AAAA... git@server
- 用户无法获得 shell,连
ssh git@server都会直接退出 - 仅接受
git-upload-pack、git-receive-pack等白名单子命令 - 即使攻击者拿到私钥,也无法执行任意命令或提权
② 仅开放交互式终端,其余全禁
适用于专用运维账号(如 backup、logview)
restrict,pty ssh-ed25519 AAAA... backup@server
- 用户可登录并使用
bash或zsh,但无法转发端口、无法传代理、无法启图形、无法加载用户环境 - ~/.bashrc 不执行 → 避免 PATH 污染或自动 alias 注入
- 适合需要手动操作但不允许横向移动的受限管理角色
③ 完全禁止任何命令执行(仅连接验证)
适用于健康检查、证书绑定、自动化心跳探测
restrict,command="/bin/false",no-command ssh-ed25519 AAAA... health@server
- 无论是否加命令参数(
ssh health@server date),都会立即退出 - SSH 连接能建立、密钥能校验成功,但 shell 和命令通道彻底切断
- 常用于 Prometheus probe、Ansible ping、或 API 认证网关前置校验
生效前提:权限与配置必须严丝合缝
以上所有 restrict 组合,只有满足以下三项才真正起作用:
-
文件权限合规:~/.ssh 目录必须是
700,authorized_keys 必须是600,且全部属主为该非 root 用户(不能是 root 或其他用户) -
sshd_config 支持:确保
PubkeyAuthentication yes已启用,且未设置PermitUserEnvironment no(它会干扰 command= 解析) - StrictModes 启用:默认开启,强制校验家目录、.ssh、authorized_keys 的所有权和权限;若临时关闭后约束生效,说明权限配置出错
不复杂但容易忽略:restrict 的力量不在“加什么”,而在“先砍掉所有默认能力,再一一手动放行”。对非 root 用户而言,这是把密钥从“万能钥匙”变成“单功能工卡”的最可靠方式。










