SSH 安全加固是保护服务器免受未授权访问的重要措施。通过合理配置和最佳实践,可以显著提高 SSH 服务器的安全性。
基础安全配置
1. 修改默认端口
bash# /etc/ssh/sshd_config Port 2222
修改默认端口可以减少自动化扫描和暴力破解攻击。
2. 禁用密码认证
bash# /etc/ssh/sshd_config PasswordAuthentication no PubkeyAuthentication yes
仅允许密钥认证,大大提高安全性。
3. 禁止 root 登录
bash# /etc/ssh/sshd_config PermitRootLogin no
禁止 root 用户直接登录,需要先登录普通用户再提权。
4. 限制登录用户
bash# /etc/ssh/sshd_config AllowUsers admin deploy DenyUsers test guest AllowGroups ssh-users
只允许特定用户或组登录。
高级安全配置
1. 限制认证尝试次数
bash# /etc/ssh/sshd_config MaxAuthTries 3 MaxStartups 10:30:100 LoginGraceTime 60
限制认证尝试次数,防止暴力破解。
2. 配置登录超时
bash# /etc/ssh/sshd_config ClientAliveInterval 300 ClientAliveCountMax 2
空闲连接超时自动断开。
3. 禁用不安全功能
bash# /etc/ssh/sshd_config X11Forwarding no AllowTcpForwarding yes GatewayPorts no PermitTunnel no
禁用不需要的功能,减少攻击面。
4. 使用强加密算法
bash# /etc/ssh/sshd_config # 密钥交换算法 KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 # 加密算法 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com # MAC 算法 MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
使用现代、安全的加密算法。
网络层安全
1. 使用防火墙限制访问
bash# iptables 示例 iptables -A INPUT -p tcp --dport 2222 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -j DROP # ufw 示例 ufw allow from 192.168.1.0/24 to any port 2222 ufw enable
只允许特定 IP 访问 SSH 端口。
2. 使用 TCP Wrappers
bash# /etc/hosts.allow sshd: 192.168.1.0/24 : ALLOW # /etc/hosts.deny sshd: ALL : DENY
额外的访问控制层。
3. 使用 fail2ban 防止暴力破解
bash# /etc/fail2ban/jail.local [sshd] enabled = true port = 2222 maxretry = 3 bantime = 3600 findtime = 600
自动封禁暴力破解 IP。
密钥管理最佳实践
1. 使用强密钥类型
bash# 生成 ED25519 密钥(推荐) ssh-keygen -t ed25519 -b 4096 # 生成 RSA 4096 位密钥 ssh-keygen -t rsa -b 4096
2. 为私钥设置密码短语
bashssh-keygen -t ed25519 -C "user@example.com" # 提示时输入强密码短语
3. 定期轮换密钥
bash# 生成新密钥 ssh-keygen -t ed25519 -f ~/.ssh/new_key # 将新公钥添加到服务器 ssh-copy-id -i ~/.ssh/new_key.pub user@server # 删除旧密钥 rm ~/.ssh/old_key
4. 限制密钥使用
bash# ~/.ssh/authorized_keys # 限制只能执行特定命令 command="/usr/local/bin/backup-script" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... # 限制来源 IP from="192.168.1.0/24" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... # 禁用端口转发 no-port-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
监控和审计
1. 启用详细日志
bash# /etc/ssh/sshd_config LogLevel VERBOSE SyslogFacility AUTHPRIV
记录详细的登录信息。
2. 监控登录活动
bash# 查看最近的登录 last -n 20 # 查看失败的登录尝试 lastb -n 20 # 实时监控 SSH 日志 tail -f /var/log/auth.log | grep sshd
3. 设置登录通知
bash# ~/.bashrc 或 /etc/profile echo "SSH login: $(date) $(whoami) from $(echo $SSH_CLIENT | awk '{print $1}')" | mail -s "SSH Login Alert" admin@example.com
收到登录通知邮件。
多因素认证
1. 使用 Google Authenticator
bash# 安装 apt-get install libpam-google-authenticator # 配置 google-authenticator # /etc/pam.d/sshd auth required pam_google_authenticator.so # /etc/ssh/sshd_config ChallengeResponseAuthentication yes
2. 使用 SSH 证书
bash# 生成 CA 密钥 ssh-keygen -t ed25519 -f ~/.ssh/ca_key # 签发用户证书 ssh-keygen -s ~/.ssh/ca_key -I user_id -n username -V +52w ~/.ssh/user_key.pub # 服务器配置 # /etc/ssh/sshd_config TrustedUserCAKeys /etc/ssh/ca_key.pub
定期维护
1. 更新 SSH 软件
bash# 定期检查更新 apt-get update apt-get upgrade openssh-server # 或使用自动更新 apt-get install unattended-upgrades
2. 审查配置
bash# 检查配置语法 sshd -t # 查看有效配置 sshd -T | grep -i password
3. 清理旧密钥
bash# 删除不再使用的密钥 rm ~/.ssh/old_key* # 清理 authorized_keys vim ~/.ssh/authorized_keys
安全检查清单
- 修改默认端口
- 禁用密码认证
- 禁止 root 登录
- 限制登录用户
- 配置防火墙规则
- 启用 fail2ban
- 使用强加密算法
- 定期更新 SSH 软件
- 启用详细日志
- 实施多因素认证
- 定期审计访问日志
- 备份配置文件
应急响应
1. 发现入侵迹象
bash# 检查异常登录 last -n 100 | grep -v "reboot" # 检查进程 ps aux | grep ssh # 检查网络连接 netstat -tuln | grep :2222
2. 立即响应
bash# 停止 SSH 服务 systemctl stop sshd # 修改配置加强安全 vim /etc/ssh/sshd_config # 重启服务 systemctl start sshd
3. 事后分析
- 分析日志文件
- 识别攻击来源
- 修复安全漏洞
- 更新安全策略