- 🏗️ 第一部分:用户账户安全管理
- 1.1 为什么不能使用Root用户直接登录?
- 1.2 创建新的管理用户
- 🔒 第二部分:SSH安全配置
- 2.1 SSH安全概述
- 2.2 配置防火墙(UFW)
- 2.3 更改SSH默认端口
- 2.4 测试新配置
- 🛡️ 第三部分:双因素认证(2FA)
- 3.1 什么是双因素认证?
- 3.2 安装配置Google Authenticator
- 🚫 第四部分:入侵防御与攻击防护
- 4.1 安装配置Fail2ban
- 4.2 禁用ICMP响应(防止Ping探测)
- 🔑 第五部分:SSH密钥认证(进阶安全)
- 5.1 为什么使用SSH密钥?
- 5.2 生成和配置SSH密钥
- 📁 第六部分:服务器文件管理基础命令
- 6.1 使用SCP命令进行文件传输
- 6.2 删除目录和文件
- 📋 第七部分:安全检查清单
- 🎓 本章总结
- 📚 参考资源
在当今网络环境中,服务器安全是每一位WordPress网站管理员必须重视的核心技能。无论您是运营个人博客还是企业级电商网站,一台未经安全加固的Linux服务器就如同一扇敞开的大门,随时可能遭受恶意攻击。本章将系统性地指导您完成服务器安全加固的全过程,从基础的用户权限管理到高级的双因素认证,层层递进,构建起坚固的安全防线。
🎯 学习目标:
- 理解Linux服务器安全加固的核心原则
- 掌握SSH安全配置的最佳实践
- 学会配置防火墙和入侵防御系统
- 实现双因素认证提升登录安全性
- 掌握服务器日常运维中的安全命令
🏗️ 第一部分:用户账户安全管理
1.1 为什么不能使用Root用户直接登录?
Root用户是Linux系统中权限最高的超级管理员账户,拥有对系统的完全控制权。直接使用Root登录存在以下严重风险:
| 风险类型 | 具体说明 |
|---|---|
| 暴力破解目标 | 攻击者知道Root用户名是固定的,只需猜测密码 |
| 误操作风险 | Root权限下的任何错误命令都可能导致系统崩溃 |
| 审计困难 | 无法区分是谁执行了特定的管理操作 |
| 权限滥用 | 所有操作都以最高权限执行,违反最小权限原则 |
1.2 创建新的管理用户
💡 最佳实践:创建一个具有sudo权限的普通用户来执行日常管理任务,仅在必要时通过sudo提升权限。
第一步:创建新用户
sudo adduser example
其中 example 是您的新用户名。系统会提示您设置密码和填写用户信息。
⚠️ 密码安全要求(重要):
- 长度至少16个字符以上
- 混合使用大小写字母、数字和特殊符号
- 避免使用字典单词、生日、电话号码等可预测信息
- 建议使用密码管理器(如Bitwarden、1Password)生成和存储强密码
第二步:将新用户加入sudo组
sudo adduser example sudo
📝 技术说明:sudo组是Debian/Ubuntu系统中预定义的管理员组。加入该组的用户可以使用sudo命令临时获取Root权限执行管理任务。这种设计既保证了必要的管理能力,又通过密码验证增加了一层安全保护。
第三步:测试新用户
sudo su - example
验证要点:
- 确认可以成功切换到新用户
- 执行
sudo whoami确认返回root,验证sudo权限正常 - 执行
exit返回原用户
🔒 第二部分:SSH安全配置
2.1 SSH安全概述
SSH(Secure Shell)是远程管理Linux服务器的标准协议。默认配置虽然可用,但存在多个安全隐患需要加固:
| 默认配置 | 安全风险 | 加固措施 |
|---|---|---|
| 端口22 | 众所周知的默认端口,是自动化攻击的首要目标 | 更改为非标准端口 |
| 允许Root登录 | 攻击者只需猜测一个密码 | 禁止Root远程登录 |
| 仅密码认证 | 可被暴力破解 | 启用双因素认证/密钥认证 |
2.2 配置防火墙(UFW)
🚨 关键警告:在修改SSH端口之前,必须先配置防火墙规则!否则您可能会将自己锁在服务器外面!
UFW(Uncomplicated Firewall)是Ubuntu/Debian系统中简化iptables管理的工具,非常适合初学者使用。
第一步:检查防火墙状态
sudo ufw status
第二步:允许当前SSH端口(默认22)
sudo ufw allow proto tcp from any to any port 22
📝 命令解析:
proto tcp:指定TCP协议from any:允许来自任何IP地址的连接to any:到达任何本地地址port 22:目标端口22
第三步:启用防火墙
sudo ufw enable
系统会提示此操作可能中断现有SSH连接,确认后输入 y 继续。
第四步:验证防火墙状态
sudo ufw status verbose
您应该看到类似以下输出:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
2.3 更改SSH默认端口
更改SSH默认端口是一种"安全隐蔽"(Security through Obscurity)策略。虽然不能从根本上阻止针对性攻击,但可以有效过滤绝大多数自动化扫描和暴力破解尝试。据统计,使用非标准端口可以减少约95%的恶意登录尝试。
第一步:编辑SSH配置文件
sudo nano /etc/ssh/sshd_config
第二步:找到并修改端口配置
找到以下行:
#Port 22
删除开头的 # 号(取消注释)并将22改为您选择的端口:
Port 2222
🎯 端口选择建议:
- 使用1024-65535之间的端口(非特权端口)
- 避免使用常见服务端口(如3306、8080、443等)
- 建议使用10000以上的高位端口,如:22222、33333、12580等
- 记录好您选择的端口号!
第三步:禁止Root用户SSH登录
在同一配置文件中,找到:
PermitRootLogin yes
修改为:
PermitRootLogin no
💡 扩展配置(可选但推荐):
# 限制密码尝试次数
MaxAuthTries 3
# 限制同时连接数
MaxSessions 2
# 设置登录超时时间(秒)
LoginGraceTime 60
# 禁用空密码登录
PermitEmptyPasswords no
# 指定允许登录的用户(更严格的控制)
AllowUsers example
第四步:保存文件
按 Ctrl+X,然后按 Y,最后按 Enter 确认保存。
第五步:为新端口添加防火墙规则
sudo ufw allow proto tcp from any to any port 2222
(请将2222替换为您实际选择的端口号)
第六步:重启SSH服务
sudo systemctl restart ssh
sudo systemctl status ssh
验证输出中显示 listening on 0.0.0.0 port 2222(您的新端口)
2.4 测试新配置
🚨 重要提醒:不要关闭当前的终端连接!先用新窗口测试!
打开一个新的终端窗口,使用以下命令测试连接:
# 使用新端口和新用户连接
ssh -p 2222 example@your_server_ip
# 测试Root登录是否被禁止(应该失败)
ssh -p 2222 root@your_server_ip
✅ 预期结果:
- 使用新用户和新端口可以成功连接
- 使用Root用户会收到
Permission denied错误 - 使用旧端口22会连接超时或被拒绝
确认新配置正常工作后,可以删除旧的22端口防火墙规则:
sudo ufw delete allow 22/tcp
sudo ufw status
🛡️ 第三部分:双因素认证(2FA)
3.1 什么是双因素认证?
双因素认证(Two-Factor Authentication,简称2FA)是一种增强的身份验证机制。它要求用户提供两种不同类型的认证因素才能完成登录:
| 认证因素 | 类型 | 示例 |
|---|---|---|
| 第一因素 | 你知道的东西 | 密码、PIN码 |
| 第二因素 | 你拥有的东西 | 手机、硬件令牌 |
| 第三因素 | 你本身的特征 | 指纹、面部识别 |
即使攻击者获取了您的密码,没有第二因素(如您的手机)也无法登录,大大提高了账户安全性。
3.2 安装配置Google Authenticator
第一步:在手机上安装验证器App
在继续之前,请在您的手机上安装以下任一验证器应用:
- Google Authenticator(iOS/Android)
- Microsoft Authenticator(iOS/Android)
- Authy(iOS/Android,支持云端备份)
- 1Password(如果您已使用该密码管理器)
第二步:在服务器上安装PAM模块
sudo apt update
sudo apt install libpam-google-authenticator
📝 技术说明:PAM(Pluggable Authentication Modules)是Linux系统的可插拔认证模块框架,允许系统管理员灵活配置不同的认证方式。Google Authenticator PAM模块将基于时间的一次性密码(TOTP)认证集成到系统中。
第三步:为当前用户配置Google Authenticator
google-authenticator
系统将显示一个二维码和一系列问题。您需要:
- 用手机上的验证器App扫描二维码
- 🚨 务必备份显示的紧急恢复代码! 这5个一次性代码是您唯一的后备方案
- 按以下方式回答问题:
| 问题 | 推荐答案 | 说明 |
|---|---|---|
| Do you want authentication tokens to be time-based? | y | 使用基于时间的令牌 |
| Do you want me to update your "~/.google_authenticator" file? | y | 保存配置 |
| Do you want to disallow multiple uses of the same token? | y | 防止重放攻击 |
| Do you want to increase the time skew window? | n | 保持默认30秒窗口 |
| Do you want to enable rate-limiting? | y | 限制登录尝试频率 |
⚠️ 备份提醒:
- 将紧急恢复代码保存在安全的地方(密码管理器、加密文档、物理保险箱)
- 不要只保存在同一台服务器上!
- 考虑使用Authy等支持云端备份的验证器App
第四步:配置SSH启用双因素认证
编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config
找到以下行并修改:
# 将 ChallengeResponseAuthentication 改为 yes
# 注意:在较新的系统中,该选项可能叫 KbdInteractiveAuthentication
ChallengeResponseAuthentication yes
# 或者(Ubuntu 22.04及更新版本)
KbdInteractiveAuthentication yes
保存并退出(Ctrl+X,Y,Enter)
第五步:配置PAM
编辑PAM配置文件:
sudo nano /etc/pam.d/sshd
在文件末尾添加以下行:
# One-time authentication via Google Authenticator
auth required pam_google_authenticator.so
💡 高级配置选项:
# 如果您希望在没有配置2FA的用户也能登录(不推荐用于生产环境)
auth required pam_google_authenticator.so nullok
# 如果您使用SSH密钥认证并且希望同时要求2FA
auth required pam_google_authenticator.so
第六步:重启SSH服务
sudo systemctl restart ssh
第七步:测试双因素认证
打开新的终端窗口测试连接:
ssh -p 2222 example@your_server_ip
您应该看到以下登录流程:
- 输入密码
- 系统提示
Verification code: - 打开手机验证器App,输入当前显示的6位数字
- 成功登录
🚫 第四部分:入侵防御与攻击防护
4.1 安装配置Fail2ban
Fail2ban是一个日志分析和入侵防御工具。它监控系统日志,检测可疑的登录失败模式,并自动将攻击者的IP地址添加到防火墙黑名单中。
第一步:安装Fail2ban
sudo apt update
sudo apt install fail2ban
第二步:检查服务状态
sudo systemctl status fail2ban
应该显示 active (running) 状态。
第三步:创建自定义配置文件
📝 重要说明:不要直接修改 /etc/fail2ban/jail.conf,因为系统升级时会被覆盖。应该创建 /etc/fail2ban/jail.local 文件存放自定义配置。
sudo nano /etc/fail2ban/jail.local
添加以下配置:
[DEFAULT]
# 封禁时间(秒),这里设置为1小时
bantime = 3600
# 检测时间窗口(秒),这里设置为10分钟
findtime = 600
# 在findtime内允许的最大失败次数
maxretry = 5
# 封禁动作
banaction = ufw
# 邮件通知(可选,需要配置邮件服务)
# destemail = your@email.com
# sendername = Fail2Ban
# action = %(action_mwl)s
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
⚠️ 注意:将 port = 2222 改为您实际使用的SSH端口。
第四步:重启Fail2ban
sudo systemctl restart fail2ban
第五步:查看当前状态和被封禁的IP
# 查看Fail2ban状态
sudo fail2ban-client status
# 查看SSH jail的详细状态
sudo fail2ban-client status sshd
# 手动解封某个IP(如果误封)
sudo fail2ban-client set sshd unbanip 192.168.1.100
4.2 禁用ICMP响应(防止Ping探测)
ICMP(Internet Control Message Protocol)主要用于网络诊断,其中ping命令使用的echo请求/响应是最常见的应用。禁用ICMP响应可以:
- 降低服务器被发现的概率
- 防止ICMP洪水攻击
- 减少网络侦察信息泄露
配置方法:
sudo nano /etc/ufw/before.rules
在文件中找到 # ok icmp codes for INPUT 部分,在其之前添加:
# Block ICMP echo requests (ping)
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP
保存并重新加载防火墙:
sudo ufw reload
验证配置:
- 从另一台机器ping您的服务器,应该没有响应
- 这不会影响您从服务器向外ping其他主机
⚠️ 注意事项:禁用ICMP可能会影响某些网络诊断功能和CDN服务的健康检查。在生产环境中使用前请评估影响。
🔑 第五部分:SSH密钥认证(进阶安全)
5.1 为什么使用SSH密钥?
SSH密钥认证比密码认证更安全,原因如下:
| 对比项 | 密码认证 | 密钥认证 |
|---|---|---|
| 暴力破解 | 可能被穷举破解 | 几乎不可能(2048位密钥有2^2048种可能) |
| 中间人攻击 | 密码可能被截获 | 私钥从不在网络上传输 |
| 便利性 | 每次需要输入密码 | 可以免密码登录 |
| 管理性 | 多服务器需记住多个密码 | 一个密钥可用于多个服务器 |
5.2 生成和配置SSH密钥
第一步:在本地计算机生成密钥对
# 在您的本地电脑(不是服务器)执行
ssh-keygen -t ed25519 -C "your_email@example.com"
📝 技术说明:
-t ed25519:使用Ed25519算法,比RSA更安全、更快速-C:添加注释,通常使用邮箱便于识别- 系统会提示设置密钥密码(passphrase),强烈建议设置!
如果您的系统不支持Ed25519,可以使用RSA:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
第二步:将公钥上传到服务器
# 方法一:使用ssh-copy-id(推荐)
ssh-copy-id -p 2222 example@your_server_ip
# 方法二:手动复制
cat ~/.ssh/id_ed25519.pub | ssh -p 2222 example@your_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
第三步:测试密钥登录
ssh -p 2222 example@your_server_ip
如果设置了密钥密码,系统会提示输入密钥密码(非服务器密码)。
第四步(可选但推荐):禁用密码登录
⚠️ 警告:确保密钥登录正常工作后再执行此步骤!否则可能无法登录服务器!
编辑SSH配置:
sudo nano /etc/ssh/sshd_config
修改以下配置:
PasswordAuthentication no
PubkeyAuthentication yes
重启SSH:
sudo systemctl restart ssh
📁 第六部分:服务器文件管理基础命令
6.1 使用SCP命令进行文件传输
SCP(Secure Copy)是基于SSH协议的安全文件传输工具,可以在本地和远程服务器之间安全地传输文件。
📥 从服务器下载文件到本地:
scp -P <端口号> <用户名>@<服务器IP>:<远程文件路径> <本地目标路径>
示例:
# 下载单个文件
scp -P 2222 example@192.168.1.100:/var/log/auth.log ~/Downloads/
# 下载整个目录(使用 -r 参数)
scp -P 2222 -r example@192.168.1.100:/var/www/html ~/Backup/
📤 从本地上传文件到服务器:
scp -P <端口号> <本地文件路径> <用户名>@<服务器IP>:<远程目标路径>
示例:
# 上传单个文件
scp -P 2222 ~/Documents/config.php example@192.168.1.100:/var/www/html/
# 上传整个目录
scp -P 2222 -r ~/Project/ example@192.168.1.100:/home/example/
💡 常用参数:
| 参数 | 说明 |
|---|---|
-P | 指定SSH端口(注意是大写P) |
-r | 递归复制目录 |
-v | 显示详细传输过程 |
-C | 启用压缩传输 |
-p | 保留文件原始属性(时间戳、权限等) |
6.2 删除目录和文件
🚨 危险命令警告:rm -rf 是Linux中最危险的命令之一,删除操作不可逆!
删除目录及其所有内容:
rm -rf <目录路径>
参数说明:
-r(recursive):递归删除目录及其内容-f(force):强制删除,不提示确认
安全使用建议:
# 1. 首先确认要删除的内容
ls -la /path/to/directory
# 2. 使用交互模式(会逐个确认)
rm -ri /path/to/directory
# 3. 如果确定要删除,才使用 -rf
rm -rf /path/to/directory
⚠️ 绝对禁止的危险命令:
# 永远不要执行以下命令!!!
rm -rf / # 删除整个系统
rm -rf /* # 同上
rm -rf ~ # 删除当前用户所有文件
📋 第七部分:安全检查清单
完成本章学习后,请确认您已完成以下安全配置:
| 序号 | 检查项 | 状态 |
|---|---|---|
| 1 | ✅ 创建了非Root的管理员用户 | ☐ |
| 2 | ✅ 新用户已加入sudo组 | ☐ |
| 3 | ✅ SSH端口已从22更改为其他端口 | ☐ |
| 4 | ✅ 已禁止Root用户SSH登录 | ☐ |
| 5 | ✅ UFW防火墙已启用并正确配置 | ☐ |
| 6 | ✅ Google Authenticator双因素认证已配置 | ☐ |
| 7 | ✅ 紧急恢复代码已安全备份 | ☐ |
| 8 | ✅ Fail2ban已安装并运行 | ☐ |
| 9 | ✅ ICMP响应已禁用(可选) | ☐ |
| 10 | ✅ SSH密钥认证已配置(推荐) | ☐ |
🎓 本章总结
通过本章的学习,您已经掌握了Linux服务器安全加固的核心技能。让我们回顾一下安全加固的层次架构:
🏰 服务器安全防护体系
┌─────────────────────────────────────────────┐
│ 第一层:访问控制 │
│ └── 非Root用户 + 强密码 + sudo权限管理 │
├─────────────────────────────────────────────┤
│ 第二层:网络防护 │
│ └── 防火墙(UFW) + 非标准SSH端口 + ICMP过滤 │
├─────────────────────────────────────────────┤
│ 第三层:身份认证 │
│ └── 双因素认证(2FA) + SSH密钥认证 │
├─────────────────────────────────────────────┤
│ 第四层:入侵防御 │
│ └── Fail2ban自动封禁 + 日志监控 │
└─────────────────────────────────────────────┘📚 参考资源
- Ubuntu官方安全指南:https://ubuntu.com/security
- Fail2ban官方文档:https://www.fail2ban.org/wiki/index.php/Main_Page
- SSH安全最佳实践:https://www.ssh.com/academy/ssh/security
- Google Authenticator PAM模块:https://github.com/google/google-authenticator-libpam
回复