restrict是OpenSSH 6.8+引入的授权密钥前置限制开关,等价于同时启用no-port-forwarding、no-user-rc、no-X11-forwarding、no-agent-forwarding和no-pty,但必须配合command、pty等显式选项才能生效,实现默认禁用所有扩展功能、仅开放明确授权能力的安全策略。

SSH 的 restrict 选项是 authorized_keys 文件中一个关键的安全控制机制,它本身不单独起作用,而是作为一组前置限制的“总开关”,必须配合其他显式启用项(如 pty、command、no-port-forwarding 等)才能实现精准的行为约束。它的核心价值在于:**默认关闭所有扩展能力,只允许你明确授权的功能运行**。
restrict 是什么,为什么不能单独用
restrict 是 OpenSSH 6.8+ 引入的便捷选项,等价于同时设置:no-port-forwarding,no-user-rc,no-X11-forwarding,no-agent-forwarding,no-pty
也就是说,一旦某行公钥前加了 restrict,该密钥登录后:
• 无法分配交互式终端(TTY)
• 无法转发端口(本地/远程/Dynamic)
• 无法启动 X11 图形程序
• 无法使用 SSH agent 转发
• 不会执行 ~/.bashrc 或 ~/.profile 等用户初始化脚本
但注意:它不会禁用命令执行本身——你仍可通过 ssh user@host cmd 运行单条命令,除非你额外加上 no-command 或用 command=... 锁定。
组合 restrict 实现典型场景约束
真正安全的约束靠“restrict + 显式放开”:
-
仅允许执行固定命令(如 Git 操作)
restrict,command="/usr/bin/git-shell -c \"$(SSH_ORIGINAL_COMMAND)\"",no-port-forwarding,no-X11-forwarding ssh-ed25519 AAAA... user@git
此配置下,用户只能运行git相关子命令(如git-receive-pack),且无法获得 shell。 -
允许交互式终端但禁用所有转发
restrict,pty ssh-ed25519 AAAA... admin@backuppty显式重开 TTY 分配,但其余转发能力仍被restrict关闭,适合只做备份管理的专用账户。 -
完全禁止任何命令执行(只做连接验证)
restrict,command="/bin/false",no-command ssh-ed25519 AAAA... monitor@health
即使用户尝试ssh user@host ls,也会直接退出;常用于健康检查或证书绑定类服务。
权限与部署要点
要让这些限制生效,必须满足三个硬性前提:
-
文件权限严格:
~/.ssh/authorized_keys必须是600,~/.ssh目录必须是700,且属主为该用户(不能是 root) -
服务端配置支持:确保
/etc/ssh/sshd_config中PubkeyAuthentication yes已启用,且未全局禁用PermitUserEnvironment等影响选项解析的设置 - 密钥格式正确:每行限制选项必须紧贴公钥开头,中间无空格;选项间用英文逗号分隔;注释(# 开头)必须独占一行,不能跟在密钥后面
进阶:用 authorized_keys 配合环境变量精细控制
OpenSSH 允许在 command=... 中引用环境变量,例如:
restrict,command="if [ \"$SSH_ORIGINAL_COMMAND\" = \"rsync --server\" ]; then exec /usr/bin/rsync --server \"$@\"; else exit 1; fi",no-port-forwarding,pty ssh-ed25519 AAAA...这种写法可对传入命令做白名单校验,比单纯依赖 git-shell 更灵活,适合自建同步服务或审计网关。

















