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

练习(动手任务)#

  1. opsuser 配置密钥登录并禁用口令,验证登录与日志记录。
  2. 使用 AllowUsers 限制仅 opsuser 可登录,验证其他用户被拒绝。
  3. opsuser 仅授权 systemctljournalctl,验证 sudo bash 被拒绝并记录日志。
  4. 模拟 MaxAuthTries 超限登录,观察 /var/log/secure 中的拒绝记录。

通过合理配置 SSH 与 sudo,可在不影响运维效率的前提下显著提升系统安全性与可追溯性。