Ubuntu 22.04 SSH服务完全配置指南:从基础到安全加固

引言
在服务器管理中,SSH(Secure Shell)是远程访问Linux系统的标准工具。Ubuntu 22.04 LTS作为长期支持版本,其SSH配置对于系统安全至关重要。本文将全面介绍如何配置和加固Ubuntu 22.04的SSH服务,特别深入解析PermitRootLogin prohibit-password等关键安全选项。
第一部分:SSH服务安装与基本配置
1.1 安装SSH服务
在全新安装的Ubuntu 22.04上,SSH服务可能未预装。安装步骤如下:
sudoapt update sudoaptinstall openssh-server -y 安装完成后,服务会自动启动。通过以下命令验证安装状态:
sudo systemctl status ssh1.2 基本配置文件结构
SSH服务的主配置文件位于/etc/ssh/sshd_config。在修改前,建议备份原文件:
sudocp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup 使用文本编辑器(如nano或vim)打开配置文件:
sudonano /etc/ssh/sshd_config 1.3 常用配置参数
以下是推荐的基本配置选项:
# 修改默认端口(降低自动化攻击风险) Port 2222# 建议使用1024-65535之间的端口# 限制监听地址(如果有多网卡)# ListenAddress 192.168.1.100# 协议版本(禁用已不安全的SSHv1) Protocol 2# 登录超时设置 LoginGraceTime 60 MaxAuthTries 3# 连接保持选项 ClientAliveInterval 300 ClientAliveCountMax 2# 禁用不安全的认证方式 ChallengeResponseAuthentication no UsePAM yes# 日志级别 LogLevel VERBOSE 1.4 应用配置变更
修改配置后,必须重启服务才能使更改生效:
# 测试配置文件语法sudo sshd -t # 重启SSH服务sudo systemctl restart ssh# 设置开机自启sudo systemctl enablessh第二部分:深入理解PermitRootLogin选项
2.1 PermitRootLogin详解
PermitRootLogin是SSH安全配置中最关键的选项之一。它控制root用户的登录方式,有以下几种可能值:
- yes:允许root用户使用密码或密钥登录
- no:完全禁止root用户登录
- prohibit-password/without-password:允许root使用密钥登录,禁止密码登录
- forced-commands-only:仅允许执行预定义的命令
2.2 prohibit-password的安全优势
PermitRootLogin prohibit-password提供了最佳的安全性与可用性平衡:
- 防御暴力破解:禁用密码登录完全消除了针对root的密码猜测攻击
- 保留管理访问:通过密钥认证仍可获取root权限进行必要维护
- 增强可追溯性:密钥登录提供更好的审计追踪能力
- 支持自动化:允许脚本和自动化工具以root权限运行
2.3 配置示例
# 启用密钥认证,禁用密码登录 PermitRootLogin prohibit-password PubkeyAuthentication yes PasswordAuthentication no # 确保root用户的.ssh目录权限正确sudochmod700 /root/.ssh sudochmod600 /root/.ssh/authorized_keys 2.4 密钥管理最佳实践
- 多密钥管理:为不同用途(开发、运维、自动化)使用不同的密钥对
安全传输公钥:
# 方法1:使用ssh-copy-id ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server -p 2222# 方法2:手动复制(当ssh-copy-id不可用时)cat ~/.ssh/id_ed25519.pub |\ssh -p 2222 user@server "mkdir -p ~/.ssh && \ cat >> ~/.ssh/authorized_keys && \ chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"生成强密钥:
ssh-keygen -t ed25519 -a 100# 最推荐的算法# 或使用RSA ssh-keygen -t rsa -b 4096 -o -a 100第三部分:高级安全配置
3.1 用户访问控制
# 允许特定用户登录(白名单) AllowUsers alice bob charlie # 允许特定用户组登录 AllowGroups ssh-users admin # 拒绝特定用户(黑名单) DenyUsers mallory eve # 允许来自特定主机的用户 Match Address 192.168.1.0/24 AllowUsers alice bob 3.2 加密算法加固
禁用弱加密算法和协议:
# 禁用不安全的MAC算法 MACs [email protected],[email protected] # 禁用不安全的加密算法 Ciphers [email protected],[email protected],[email protected] # 禁用不安全的密钥交换算法 KexAlgorithms curve25519-sha256,[email protected] 3.3 会话限制
# 限制并发会话数 MaxSessions 10# 限制每个IP的连接数 MaxStartups 10:30:100 # 禁用端口转发(根据需求) AllowTcpForwarding no AllowStreamLocalForwarding no 第四部分:完整安全配置示例
以下是一个生产环境级别的SSH配置示例:
# /etc/ssh/sshd_config# 基本设置 Port 2222 ListenAddress 0.0.0.0 Protocol 2# 用户认证 PermitRootLogin prohibit-password PubkeyAuthentication yes PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM yes# 密钥算法 HostKey /etc/ssh/ssh_host_ed25519_key HostKey /etc/ssh/ssh_host_rsa_key # 加密配置 KexAlgorithms [email protected] Ciphers [email protected],[email protected],[email protected] MACs [email protected],[email protected] # 会话管理 ClientAliveInterval 300 ClientAliveCountMax 2 MaxAuthTries 3 MaxSessions 10 LoginGraceTime 60# 访问控制 AllowUsers alice bob charlie AllowGroups ssh-users # 功能限制 X11Forwarding no AllowTcpForwarding no PermitTunnel no AllowAgentForwarding no PrintMotd no PrintLastLog yes# 日志配置 LogLevel VERBOSE SyslogFacility AUTH 第五部分:防火墙与额外安全措施
5.1 UFW防火墙配置
# 安装UFW(如果未安装)sudoaptinstall ufw -y # 允许SSH端口sudo ufw allow 2222/tcp # 限制特定IP访问(可选)sudo ufw allow from 192.168.1.0/24 to any port 2222# 启用防火墙sudo ufw enable# 查看状态sudo ufw status verbose 5.2 Fail2Ban防暴力破解
# 安装Fail2Bansudoaptinstall fail2ban -y # 创建自定义SSH配置sudonano /etc/fail2ban/jail.local 添加以下内容:
[sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600 重启Fail2Ban:
sudo systemctl restart fail2ban sudo systemctl enable fail2ban 5.3 定期更新与监控
# 设置自动安全更新sudoaptinstall unattended-upgrades -y sudo dpkg-reconfigure --priority=low unattended-upgrades # 监控SSH登录尝试sudoaptinstall acct -y # 安装账户监控工具 last # 查看登录历史sudo lastb # 查看失败登录尝试# 设置日志轮转sudonano /etc/logrotate.d/ssh 第六部分:故障排除与维护
6.1 常见问题解决
问题1:配置错误导致无法连接
# 检查配置语法sudo sshd -t # 查看详细错误信息sudo journalctl -u ssh -f --no-pager 问题2:密钥认证失败
# 检查权限ls -la ~/.ssh/ # 正确权限应为:# drwx------ .ssh# -rw------- authorized_keys# 检查SELinux/AppArmorsudo aa-status # Ubuntu使用AppArmor问题3:端口被占用
# 查看端口占用情况sudo ss -tlnp |grep :2222 sudonetstat -tlnp |grep :2222 6.2 连接测试命令
# 测试连接(详细模式)ssh -vvv -p 2222 user@server_ip # 测试特定密钥ssh -i ~/.ssh/id_ed25519 -p 2222 user@server_ip # 测试端口转发ssh -L 8080:localhost:80 -p 2222 user@server_ip 6.3 定期维护任务
# 每月检查一次# 1. 审查授权密钥sudonano /root/.ssh/authorized_keys # 2. 检查登录日志sudogrep"Accepted" /var/log/auth.log # 3. 更新SSH软件包sudoapt update &&sudoapt upgrade openssh-server # 4. 轮换主机密钥(每年一次)sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""sudo ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""第七部分:备份与灾难恢复
7.1 配置文件备份策略
# 创建备份目录sudomkdir -p /backup/ssh # 完整备份SSH配置sudotar -czf /backup/ssh/sshd_config_backup_$(date +%Y%m%d).tar.gz \ /etc/ssh/ \ /root/.ssh/ \ /home/*/.ssh/ 2>/dev/null # 创建恢复脚本cat> /backup/ssh/restore_ssh.sh <<'EOF' #!/bin/bash # 恢复SSH配置 tar -xzf sshd_config_backup.tar.gz -C / systemctl restart ssh echo "SSH配置已恢复" EOFchmod +x /backup/ssh/restore_ssh.sh 7.2 紧急访问预案
即使配置了严格的安全策略,也应保留紧急访问通道:
- 控制台访问:确保物理或IPMI/KVM访问可用
- 备用端口:在防火墙中保留一个备用端口
- 管理网络:通过专用管理网络接口访问
- 跳板机:设置专用的跳板服务器
结论
在Ubuntu 22.04上正确配置SSH服务是服务器安全的基础。通过合理设置PermitRootLogin prohibit-password等选项,结合防火墙、Fail2Ban等工具,可以构建坚固的远程访问安全体系。关键点总结:
- 禁用密码认证,强制使用密钥登录
- 限制root直接登录,通过
prohibit-password平衡安全与便利 - 更改默认端口,减少自动化攻击
- 实施最小权限原则,严格限制用户访问
- 建立监控和审计,及时发现异常行为
安全配置不是一次性的任务,而是一个持续的过程。定期审查和更新安全策略,保持系统和软件的更新,才能真正保护服务器免受威胁。
附录:快速检查清单
- SSH端口已从22更改为其他端口
PermitRootLogin设置为prohibit-password- 密码认证已禁用
- 防火墙已配置并启用
- Fail2Ban已安装并配置
- 使用Ed25519或RSA 4096位密钥
- 定期备份SSH配置和密钥
- 建立紧急访问预案
- 设置日志监控和告警
通过遵循本指南,您将在Ubuntu 22.04上建立一个既安全又实用的SSH访问环境,为服务器管理打下坚实的基础。