
引言
在服务器管理中,SSH(Secure Shell)是远程访问Linux系统的标准工具。Ubuntu 22.04 LTS作为长期支持版本,其SSH配置对于系统安全至关重要。本文将全面介绍如何配置和加固Ubuntu 22.04的SSH服务,特别深入解析PermitRootLogin prohibit-password等关键安全选项。
第一部分:SSH服务安装与基本配置
1.1 安装SSH服务
在全新安装的Ubuntu 22.04上,SSH服务可能未预装。安装步骤如下:
bash
sudo apt update
sudo apt install openssh-server -y
安装完成后,服务会自动启动。通过以下命令验证安装状态:
bash
sudo systemctl status ssh
1.2 基本配置文件结构
SSH服务的主配置文件位于/etc/ssh/sshd_config。在修改前,建议备份原文件:
bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
使用文本编辑器(如nano或vim)打开配置文件:
bash
sudo nano /etc/ssh/sshd_config
1.3 常用配置参数
以下是推荐的基本配置选项:
bash
# 修改默认端口(降低自动化攻击风险)
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 应用配置变更
修改配置后,必须重启服务才能使更改生效:
bash
# 测试配置文件语法
sudo sshd -t
# 重启SSH服务
sudo systemctl restart ssh
# 设置开机自启
sudo systemctl enable ssh
第二部分:深入理解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 配置示例
bash
# 启用密钥认证,禁用密码登录
PermitRootLogin prohibit-password
PubkeyAuthentication yes
PasswordAuthentication no
# 确保root用户的.ssh目录权限正确
sudo chmod 700 /root/.ssh
sudo chmod 600 /root/.ssh/authorized_keys
2.4 密钥管理最佳实践
-
生成强密钥:
bashssh-keygen -t ed25519 -a 100 # 最推荐的算法 # 或使用RSA ssh-keygen -t rsa -b 4096 -o -a 100 -
安全传输公钥:
bash# 方法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" -
多密钥管理:为不同用途(开发、运维、自动化)使用不同的密钥对
第三部分:高级安全配置
3.1 用户访问控制
bash
# 允许特定用户登录(白名单)
AllowUsers alice bob charlie
# 允许特定用户组登录
AllowGroups ssh-users admin
# 拒绝特定用户(黑名单)
DenyUsers mallory eve
# 允许来自特定主机的用户
Match Address 192.168.1.0/24
AllowUsers alice bob
3.2 加密算法加固
禁用弱加密算法和协议:
bash
# 禁用不安全的MAC算法
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# 禁用不安全的加密算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
# 禁用不安全的密钥交换算法
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
3.3 会话限制
bash
# 限制并发会话数
MaxSessions 10
# 限制每个IP的连接数
MaxStartups 10:30:100
# 禁用端口转发(根据需求)
AllowTcpForwarding no
AllowStreamLocalForwarding no
第四部分:完整安全配置示例
以下是一个生产环境级别的SSH配置示例:
bash
# /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 curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# 会话管理
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防火墙配置
bash
# 安装UFW(如果未安装)
sudo apt install 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防暴力破解
bash
# 安装Fail2Ban
sudo apt install fail2ban -y
# 创建自定义SSH配置
sudo nano /etc/fail2ban/jail.local
添加以下内容:
ini
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
重启Fail2Ban:
bash
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
5.3 定期更新与监控
bash
# 设置自动安全更新
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
# 监控SSH登录尝试
sudo apt install acct -y # 安装账户监控工具
last # 查看登录历史
sudo lastb # 查看失败登录尝试
# 设置日志轮转
sudo nano /etc/logrotate.d/ssh
第六部分:故障排除与维护
6.1 常见问题解决
问题1:配置错误导致无法连接
bash
# 检查配置语法
sudo sshd -t
# 查看详细错误信息
sudo journalctl -u ssh -f --no-pager
问题2:密钥认证失败
bash
# 检查权限
ls -la ~/.ssh/
# 正确权限应为:
# drwx------ .ssh
# -rw------- authorized_keys
# 检查SELinux/AppArmor
sudo aa-status # Ubuntu使用AppArmor
问题3:端口被占用
bash
# 查看端口占用情况
sudo ss -tlnp | grep :2222
sudo netstat -tlnp | grep :2222
6.2 连接测试命令
bash
# 测试连接(详细模式)
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 定期维护任务
bash
# 每月检查一次
# 1. 审查授权密钥
sudo nano /root/.ssh/authorized_keys
# 2. 检查登录日志
sudo grep "Accepted" /var/log/auth.log
# 3. 更新SSH软件包
sudo apt update && sudo apt 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 配置文件备份策略
bash
# 创建备份目录
sudo mkdir -p /backup/ssh
# 完整备份SSH配置
sudo tar -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配置已恢复"
EOF
chmod +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访问环境,为服务器管理打下坚实的基础。