关键资产ssh访问必须绑定可信ip,首选sshd_config的match address+allowusers白名单,次选防火墙层拦截,再辅以pam access.conf二次校验,三者叠加实现“非授权不放行”的精准控制。

关键核心资产的SSH访问必须做到“非授权不放行”,仅靠密码或密钥认证远远不够。真正安全的准入控制,是把身份验证和网络来源深度绑定——即:同一个用户,只允许从可信IP段登录;一旦来源IP变化,即使密钥正确也拒绝接入。这不是理想化要求,而是当前企业级运维已落地的实战标准。
一、服务端IP段白名单(sshd_config + Match Address)
这是最直接、最轻量的准入层控制,由OpenSSH原生支持,无需额外组件。
- 编辑 /etc/ssh/sshd_config,在文件末尾添加:
AllowUsers admin audit-user
Match Address 172.16.100.0/24
AllowUsers dev-user
每条 Match Address 块只对匹配的源IP生效,块内 AllowUsers 指定该网段可登录的用户,其他用户即使存在也无法通过此路径登录。
- 务必在所有 Match 块外加一句兜底规则:DenyUsers *,防止未匹配网段的任意用户尝试登录;
- 修改后执行 sudo systemctl restart sshd 生效;
- 注意:该策略不兼容 PasswordAuthentication yes 的弱口令场景,建议同步关闭密码登录。
二、防火墙层动态拦截(iptables/firewalld)
网络层拦截优先级高于SSH服务本身,能彻底阻断非法连接请求,避免认证压力和日志污染。
- 以 firewalld 为例(openEuler/CentOS 8+ 默认):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.20.30.0/24" port port="22" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.100.0/24" port port="22" protocol="tcp" accept'
firewall-cmd --reload
- 若用 iptables,推荐使用带状态跟踪的规则链:
- iptables -A INPUT -p tcp --dport 22 -s 10.20.30.0/24 -m state --state NEW -j ACCEPT
- 最后加一条默认丢弃:iptables -A INPUT -p tcp --dport 22 -j DROP;
- 务必用 iptables-save > /etc/sysconfig/iptables(CentOS)或 netfilter-persistent save(Debian)固化规则,防止重启丢失。
三、PAM层细粒度联动(/etc/security/access.conf)
作为第三道防线,PAM 可在SSH会话建立后、用户shell启动前再次校验来源IP,支持更复杂的逻辑(如时间、用户组、主机名组合判断)。
- 编辑 /etc/security/access.conf,添加:
+ : dev-user : 172.16.100.0/24
- : ALL : ALL
- 确保 /etc/ssh/sshd_config 中启用了 PAM:UsePAM yes(openEuler等系统强制启用);
- 该配置生效无需重启sshd,但需注意:它在用户认证成功后才触发,不能替代网络层拦截;
- 适合做“二次确认”或与LDAP/AD联动时的补充策略。
四、自动化验证与防锁死机制
任何准入策略上线前,都必须规避“改完登不上”的生产事故。
- 操作前保留一个带外会话(云平台VNC、iDRAC、串口终端),并确认其IP不在限制范围内;
- 新规则写入后,立即用允许IP的新终端测试登录,再用禁止IP测试是否被拒;
- 写一个简易健康检查脚本,定时扫描 sshd_config 和 iptables -L -n 输出,比对是否符合预期策略;
- 对核心资产,建议将上述三类配置(Match、firewalld、access.conf)打包为Ansible Role,实现版本化、可回滚部署。










