08 - SSH 服务配置与安全优化
前提条件
- 已完成 Debian 12 Bookworm 基础安装、用户创建(ops 用户已加入 sudo 组)、网络配置
- 当前 SSH 默认监听 22 端口,能通过 VMware Workstation Pro 控制台或 22 端口 SSH 登录
- 以 root 身份登录,或 ops 用户执行
sudo -i切换至 root 环境 - 全局约定:主机名
linuxdc,IP192.168.1.100/24,本章完成后 SSH 端口改为 2222
操作顺序非常重要
修改 SSH 端口并重启服务前,必须先完成公钥配置,并用新端口在另一个终端测试连接成功后,再关闭原 22 端口访问。操作顺序错误将导致无法远程登录,需从 VMware 控制台恢复。
详细步骤
1. 备份原始 SSH 配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak-$(date +%F)
2. 配置 ops 用户公钥认证(先于修改端口完成)
在本地电脑(宿主机)上生成密钥对(若已有可跳过):
# 在本地电脑终端执行(非虚拟机内)
ssh-keygen -t ed25519 -C "ops@linuxdc"
# 默认保存到 ~/.ssh/id_ed25519,直接回车
将公钥复制到虚拟机:
# 在本地电脑终端执行(当前 SSH 端口仍为 22)
ssh-copy-id -p 22 ops@192.168.1.100
或手动复制(在虚拟机内 ops 用户下):
# 切换到 ops 用户
su - ops
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
# 粘贴本地 ~/.ssh/id_ed25519.pub 的内容
chmod 600 ~/.ssh/authorized_keys
检查点
在本地电脑执行 ssh -p 22 ops@192.168.1.100,无需输入密码即可登录,则公钥配置成功。确认后再进行下一步。
3. 修改 SSH 主要安全参数
以 root 身份编辑配置文件:
vim /etc/ssh/sshd_config
查找并修改以下关键参数(去掉行首 # 注释并修改值):
Port 2222 # 改为非标准端口 2222
PermitRootLogin no # 完全禁止 root 通过 SSH 登录
PasswordAuthentication no # 禁止密码登录,只允许密钥认证
PubkeyAuthentication yes # 启用公钥认证
PermitEmptyPasswords no # 禁止空密码
ChallengeResponseAuthentication no
UsePAM yes
# 限制只允许 ops 用户 SSH 登录
AllowUsers ops
# 限制登录尝试次数
MaxAuthTries 3
LoginGraceTime 30
加强加密算法(可选,安全敏感环境推荐):
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
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
4. 检查配置语法
sshd -t
检查点
sshd -t 无任何输出(静默)表示配置语法正确。若有错误提示,必须修正后再重启服务。
5. 重启 SSH 服务并测试新端口
systemctl restart ssh
systemctl status ssh
在另一个终端窗口(不要关闭当前会话)测试新端口:
# 在本地电脑新终端执行
ssh -p 2222 ops@192.168.1.100
检查点
使用新端口 2222 成功登录后,再进行下一步。若无法登录,立即在原有连接中排查问题,不要断开原连接。
6. 配置防火墙允许新端口(预备,第 9 章详细配置)
# 安装 ufw(若未安装)
apt install -y ufw
# 允许 SSH 新端口
ufw allow 2222/tcp comment 'SSH custom port'
# 启用防火墙(会自动拒绝其他未授权端口)
ufw --force enable
# 验证规则
ufw status verbose
检查点
ss -tuln | grep 2222 输出 LISTEN 0 ... 0.0.0.0:2222,ufw status 显示 2222/tcp ALLOW IN Anywhere。
7. 验证安全配置
# 确认 root 登录已禁用
grep PermitRootLogin /etc/ssh/sshd_config
# 确认密码登录已禁用
grep PasswordAuthentication /etc/ssh/sshd_config
# 确认监听端口
ss -tuln | grep 2222
# 测试 root 密码登录是否被拒绝
ssh -p 2222 root@192.168.1.100
# 应返回 Permission denied (publickey) 或 Connection refused
实践任务
- 生成本地密钥对,将公钥添加到虚拟机 ops 用户的
authorized_keys,测试免密登录 - 将 SSH 端口改为 2222,禁止 root 登录,禁用密码认证
- 用
sshd -t验证配置语法,重启服务,用新端口 2222 + 密钥从宿主机登录虚拟机 - 用
ss -tuln | grep 2222验证 SSH 只监听 2222 端口
自测问题
1. 为什么生产环境强烈建议将 SSH 端口从 22 改为非标准端口?
默认 22 端口是互联网上各类自动化扫描工具和僵尸网络的首要攻击目标,每分钟都会有大量暴力破解尝试。改为非标准端口(如 2222)可以使绝大多数随机扫描工具直接跳过(它们通常只扫描常见端口),将实际登录尝试日志量减少 99% 以上,大幅降低服务器噪音和 fail2ban 的处理压力。这不是真正的安全措施(端口扫描可以发现任意端口),但是极有效的"减少骚扰"手段,配合公钥认证和 fail2ban 形成多层防御。
2. PermitRootLogin no 和 PasswordAuthentication no 组合后的主要安全提升是什么?
两者各自解决不同的攻击面:PermitRootLogin no 消除了直接破解 root 密码的可能性(攻击者即使知道密码也无法直接登录 root),迫使攻击者必须先突破普通用户再提权;PasswordAuthentication no 完全消除了密码暴力破解攻击的意义(没有密码输入机会),只有拥有私钥文件才能登录。两者组合后,SSH 入侵需要同时获取:正确的用户名 + 私钥文件 + 私钥密码(若有),攻击难度指数级提升。
3. 如果忘记把公钥添加到 authorized_keys 就设置了 PasswordAuthentication no,如何恢复访问?
需要通过 VMware Workstation Pro 的控制台(Console)直接登录虚拟机(此方式不受 SSH 配置影响),然后以 root 身份重新配置:
# 在控制台登录后
mkdir -p /home/ops/.ssh
echo "你的公钥内容" >> /home/ops/.ssh/authorized_keys
chmod 700 /home/ops/.ssh
chmod 600 /home/ops/.ssh/authorized_keys
chown -R ops:ops /home/ops/.ssh
或者临时将 PasswordAuthentication 改回 yes,SSH 登录后补充公钥,再改回 no。
4. 如何确认 SSH 服务是否正在使用新端口 2222 而不是 22?
ss -tuln | grep ssh # 查看 ssh 相关监听
ss -tuln | grep 2222 # 直接查看 2222 端口
systemctl status ssh # 查看服务状态,含启动命令
journalctl -u ssh -n 20 # 查看 SSH 启动日志,含绑定端口信息
ss -tuln | grep 2222 有输出即确认 SSH 正在监听 2222 端口。
总结
完成了 SSH 的核心安全加固:端口变更(22 → 2222)→ 禁止 root 登录 → 禁用密码认证 → 启用公钥认证。这是 Linux 服务器的第一道远程访问防线。后续第 9 章的 fail2ban 将进一步封堵暴力破解尝试,形成完整 SSH 防护体系。