1.9.3 认证与访问控制(SSH与sudo)
认证与访问控制(SSH与sudo)#
本节聚焦服务器登录认证与权限提升的安全控制,目标是降低暴力破解、横向移动与误操作风险,同时保证运维可追溯。
原理草图:SSH 与 sudo 的访问控制路径#
关键命令与配置示例(含说明与预期效果)#
1) 生成与部署密钥(客户端)#
# 1. 生成 ed25519 密钥(推荐)
ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519_ops -C "opsuser@jumpserver"
# 2. 将公钥推送到服务器(需要先能口令登录)
ssh-copy-id -i ~/.ssh/id_ed25519_ops.pub opsuser@192.168.10.10
# 3. 验证无口令登录(预期:无需输入系统口令)
ssh -i ~/.ssh/id_ed25519_ops opsuser@192.168.10.10
2) SSH 安全配置(服务器端)#
文件路径:/etc/ssh/sshd_config
# 禁止 root 直接登录
PermitRootLogin no
# 启用密钥认证,禁用口令认证
PubkeyAuthentication yes
PasswordAuthentication no
# 限制可登录用户与认证重试
AllowUsers opsuser
MaxAuthTries 3
LoginGraceTime 30
# 会话超时控制
ClientAliveInterval 300
ClientAliveCountMax 2
# 可选:变更端口(需同步防火墙放行)
# Port 2222
应用配置并验证:
# 1. 语法检查并重启服务
sshd -t && systemctl restart sshd
# 2. 验证监听端口(预期:22 或自定义端口)
ss -lntp | grep sshd
3) sudo 最小化授权(服务器端)#
编辑方式:visudo(避免语法错误导致锁定)
# 安全默认
Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults logfile="/var/log/sudo.log"
# 只允许 opsuser 运行有限命令
opsuser ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl
验证与预期效果:
# 1. 查看授权列表(预期:只显示白名单命令)
sudo -l
# 2. 允许的命令可执行
sudo systemctl status sshd
# 3. 非授权命令将被拒绝
sudo bash
# 预期:被拒绝并记录在 /var/log/sudo.log
排错与诊断(常见问题)#
# 1) 无法登录:检查 sshd 配置是否正确
sshd -t
# 2) 查看 SSH 认证失败日志
tail -n 50 /var/log/secure
# 3) 口令禁用后仍无法密钥登录:检查权限与属主
ls -ld /home/opsuser /home/opsuser/.ssh
ls -l /home/opsuser/.ssh/authorized_keys
# 预期权限:
# /home/opsuser 755 或 750
# /home/opsuser/.ssh 700
# authorized_keys 600
# 4) sudo 授权无效:检查 sudoers 语法
visudo -c
安全检查清单(可执行)#
# 1) SSH 是否禁用 root 登录与口令
grep -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config
# 2) 是否限制用户
grep -E "^AllowUsers" /etc/ssh/sshd_config
# 3) sudo 是否存在过度授权
sudo -l
# 4) 是否启用审计日志
ls -l /var/log/secure /var/log/sudo.log
练习(动手任务)#
- 为
opsuser配置密钥登录并禁用口令,验证登录与日志记录。 - 使用
AllowUsers限制仅opsuser可登录,验证其他用户被拒绝。 - 为
opsuser仅授权systemctl与journalctl,验证sudo bash被拒绝并记录日志。 - 模拟
MaxAuthTries超限登录,观察/var/log/secure中的拒绝记录。
通过合理配置 SSH 与 sudo,可在不影响运维效率的前提下显著提升系统安全性与可追溯性。