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服务可能未预装。安装步骤如下:

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提供了最佳的安全性与可用性平衡:

  1. 防御暴力破解:禁用密码登录完全消除了针对root的密码猜测攻击
  2. 保留管理访问:通过密钥认证仍可获取root权限进行必要维护
  3. 增强可追溯性:密钥登录提供更好的审计追踪能力
  4. 支持自动化:允许脚本和自动化工具以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 密钥管理最佳实践

  1. 生成强密钥

    bash 复制代码
    ssh-keygen -t ed25519 -a 100  # 最推荐的算法
    # 或使用RSA
    ssh-keygen -t rsa -b 4096 -o -a 100
  2. 安全传输公钥

    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. 多密钥管理:为不同用途(开发、运维、自动化)使用不同的密钥对

第三部分:高级安全配置

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 紧急访问预案

即使配置了严格的安全策略,也应保留紧急访问通道:

  1. 控制台访问:确保物理或IPMI/KVM访问可用
  2. 备用端口:在防火墙中保留一个备用端口
  3. 管理网络:通过专用管理网络接口访问
  4. 跳板机:设置专用的跳板服务器

结论

在Ubuntu 22.04上正确配置SSH服务是服务器安全的基础。通过合理设置PermitRootLogin prohibit-password等选项,结合防火墙、Fail2Ban等工具,可以构建坚固的远程访问安全体系。关键点总结:

  1. 禁用密码认证,强制使用密钥登录
  2. 限制root直接登录 ,通过prohibit-password平衡安全与便利
  3. 更改默认端口,减少自动化攻击
  4. 实施最小权限原则,严格限制用户访问
  5. 建立监控和审计,及时发现异常行为

安全配置不是一次性的任务,而是一个持续的过程。定期审查和更新安全策略,保持系统和软件的更新,才能真正保护服务器免受威胁。


附录:快速检查清单

  • SSH端口已从22更改为其他端口
  • PermitRootLogin设置为prohibit-password
  • 密码认证已禁用
  • 防火墙已配置并启用
  • Fail2Ban已安装并配置
  • 使用Ed25519或RSA 4096位密钥
  • 定期备份SSH配置和密钥
  • 建立紧急访问预案
  • 设置日志监控和告警

通过遵循本指南,您将在Ubuntu 22.04上建立一个既安全又实用的SSH访问环境,为服务器管理打下坚实的基础。

相关推荐
埃博拉酱2 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
欧云服务器3 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
智渊AI3 天前
Ubuntu 20.04/22.04 下通过 NVM 安装 Node.js 22(LTS 稳定版)
ubuntu·node.js·vim
zhangfeng11333 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh
The️3 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
再战300年3 天前
Samba在ubuntu上安装部署
linux·运维·ubuntu
qwfys2003 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
木尧大兄弟3 天前
Ubuntu 系统安装 OpenClaw 并接入飞书记录
linux·ubuntu·飞书·openclaw
小虾爬滑丫爬3 天前
ubuntu上设置Tomcat 开机启动
ubuntu·tomcat·开机启动
老师用之于民3 天前
【DAY25】线程与进程通信:共享内存、同步机制及实现方案
linux·c语言·ubuntu·visual studio code