从零构建 Linux 服务器安全加固工程实践
date: 2025-11-07 excerpt: "从零构建 Linux 服务器安全加固工程实践:涵盖 SSH 防护、系统更新、用户权限、文件权限、防火墙配置等核心安全控制点,提供可复现的安全配置脚本和最佳实践。" category: "security"
从零构建 Linux 服务器安全加固工程实践
前言
在当今网络环境下,服务器安全不再是 "可选项",而是 "生死线"。一台暴露在公网的 Linux 服务器,可能在上线 5 分钟内就遭遇暴力破解、挖矿木马或勒索病毒。绝大多数安全事件源于基础配置不当和弱密码。据《2024 数据泄露调查报告》,83% 的云服务器入侵源于配置不当和弱密码。
本文将带你进行全面的 Linux 安全加固工程实践,涵盖 SSH 安全配置、防火墙策略、用户权限最小化、关键服务保护等核心内容,助你构建坚不可摧的生产环境防线。
一、安全加固核心原则
在动手之前,先牢记三大安全原则:
- 最小权限:用户和服务只拥有完成任务所需的最小权限
- 纵深防御:多层防护(网络层、系统层、应用层)
- 默认拒绝:未明确允许的即为禁止(尤其适用于防火墙)
提示:安全是持续过程,不是一次性任务。
二、SSH 安全加固:第一道防线
SSH 是远程管理的核心,也是攻击者的首要目标。90% 的入侵始于 SSH 暴力破解。
1. 禁用 root 直接登录(必做!)
# 备份配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 编辑配置文件
sudo vim /etc/ssh/sshd_config
修改以下配置:
PermitRootLogin no
重启后,必须通过普通用户sudo su -切换 root。
2. 禁用密码登录,启用密钥认证(推荐)
PasswordAuthentication no
PubkeyAuthentication yes
配置流程:
# 本地生成密钥
ssh-keygen -t rsa -b 4096 -C "admin@company.com"
# 上传公钥到服务器
ssh-copy-id user@server_ip
优势:几乎杜绝暴力破解。
3. 修改默认 SSH 端口(可选但推荐)
Port 2222
避免 22 端口被扫描器重点关照。需同步在防火墙放行新端口。
警告:修改后确保新端口能访问,避免被锁在服务器外!
4. 限制登录用户和来源 IP
AllowUsers alice bob@192.168.1.0/24
只允许 alice 和来自内网的 bob 登录。
5. 设置登录超时与失败锁定
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
结合 fail2ban 自动封禁暴力破解 IP:
# Debian/Ubuntu
sudo apt install fail2ban
# CentOS/RHEL
sudo yum install fail2ban
6. 重启 SSH 服务
sudo systemctl restart sshd # 或 sudo service ssh restart
三、防火墙配置:网络层防护
防火墙是网络层的 "守门人",必须配置为 "默认拒绝" 模式。
方案一:firewalld(CentOS/RHEL/Fedora 推荐)
# 查看状态
sudo systemctl status firewalld
sudo firewall-cmd --state
# 启动并开机自启
sudo systemctl enable firewalld --now
# 放行SSH(2222端口)
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-service=ssh
# 放行HTTP/HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重新加载
sudo firewall-cmd --reload
# 查看规则
firewall-cmd --list-all
方案二:ufw(Ubuntu 简化防火墙)
# 安装
sudo apt install ufw
# 基础配置
sudo ufw allow 2222/tcp # SSH端口
sudo ufw allow http
sudo ufw allow https
sudo ufw deny out to any # 默认拒绝出站连接
# 启用
sudo ufw status
sudo ufw enable
方案三:iptables(通用,Debian/Ubuntu 可用)
# 清空现有规则(谨慎!)
sudo iptables -F
sudo iptables -X
# 设置默认策略(默认拒绝)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放行SSH(2222端口)
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# 放行HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 保存规则(CentOS)
sudo service iptables save
四、用户与权限最小化
1. 删除或禁用无用账户
# 查看用户列表
cat /etc/passwd
cat /etc/group
# 删除不需要的系统用户
userdel sync
userdel shutdown
userdel halt
userdel uucp
userdel operator
userdel games
userdel gopher
# 删除不需要的组
groupdel adm
groupdel lp
groupdel games
groupdel dip
2. 创建并配置新用户
# 创建用户
adduser username
passwd username
# 赋予sudo权限
usermod -aG sudo username
# 或精细化sudo权限
sudo visudo
# 添加:username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
3. 强制使用强密码
编辑 PAM 配置文件启用密码策略:
# Ubuntu/Debian
sudo vim /etc/pam.d/common-password
# CentOS/RHEL
sudo vim /etc/pam.d/system-auth
# 添加密码策略
password required pam_cracklib.so retry=3 minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
4. 最小化 sudo 权限
# 查看当前sudo配置
sudo cat /etc/sudoers
sudo visudo
# 防止通过sudo su获取root shell
Defaults !shell_escape
# 记录sudo操作日志(默认在/var/log/auth.log或/var/log/secure)
五、关键文件与目录保护
1. 锁定关键配置文件
# 锁定系统文件防止修改
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow
# 查看文件属性
lsattr /etc/passwd
# 如需修改,先解锁
chattr -i /etc/passwd
使用chattr +i后,文件将无法被修改、删除或重命名,即使是 root 用户。
2. 设置文件权限
# 保护重要系统文件
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 644 /etc/group
chmod 600 /etc/ssh/sshd_config
# 设置SSH目录权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. 禁用不必要的服务
# 查看运行的服务
systemctl list-units --type=service --state=running
# 关闭不需要的服务
sudo systemctl stop service_name
sudo systemctl disable service_name
六、自动化安全检查脚本
创建一个自动化安全检查和加固脚本:
#!/bin/bash
# Linux服务器安全加固脚本
echo "=== Linux服务器安全加固开始 ==="
# 1. 更新系统
echo "1. 更新系统包..."
apt update && apt upgrade -y
# 2. 安装必要工具
echo "2. 安装安全工具..."
apt install -y fail2ban ufw logwatch
# 3. 备份SSH配置
echo "3. 备份SSH配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d)
# 4. SSH加固
echo "4. SSH安全加固..."
cat > /etc/ssh/sshd_config.d/99-security.conf <<EOF
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers admin_user
EOF
systemctl restart sshd
# 5. 配置防火墙
echo "5. 配置防火墙..."
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
# 6. 禁用不必要的用户
echo "6. 清理不必要的用户..."
for user in sync shutdown halt uucp operator games gopher; do
userdel $user 2>/dev/null || true
done
# 7. 锁定关键文件
echo "7. 锁定关键文件..."
chattr +i /etc/passwd 2>/dev/null || true
chattr +i /etc/shadow 2>/dev/null || true
chattr +i /etc/group 2>/dev/null || true
# 8. 配置fail2ban
echo "8. 配置fail2ban..."
cat > /etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 3
EOF
systemctl enable fail2ban
systemctl start fail2ban
# 9. 配置自动安全更新
echo "9. 配置自动更新..."
apt install -y unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades
echo "=== 安全加固完成 ==="
# 10. 生成安全报告
echo "10. 生成安全检查报告..."
cat > /root/security_report.txt <<EOF
Linux服务器安全加固报告
生成时间: $(date)
========================
SSH配置:
- 端口: 2222
- Root登录: 禁用
- 密码认证: 禁用
- 密钥认证: 启用
防火墙状态:
$(ufw status)
运行的服务:
$(systemctl list-units --type=service --state=running | grep -E '(active|loaded)')
安全工具状态:
- Fail2ban: $(systemctl is-active fail2ban)
- UFW: $(ufw status | head -1)
关键文件状态:
$(ls -la /etc/passwd /etc/shadow /etc/group)
EOF
echo "安全加固完成!报告保存在: /root/security_report.txt"
七、持续监控与维护
1. 日志监控
# 查看关键日志
sudo journalctl -u sshd
sudo tail -f /var/log/auth.log
sudo tail -f /var/log/syslog
# 配置logwatch发送日报
sudo logwatch --detail high --mailto your-email@example.com
2. 定期安全检查
创建定期检查脚本:
#!/bin/bash
# 每周安全检查脚本
echo "=== 每周安全检查 ===" > /var/log/security_weekly.log
date >> /var/log/security_weekly.log
# 检查失败的SSH登录
echo "=== SSH暴力破解尝试 ===" >> /var/log/security_weekly.log
grep "Failed password" /var/log/auth.log | tail -20 >> /var/log/security_weekly.log
# 检查异常的root登录
echo "=== Root登录记录 ===" >> /var/log/security_weekly.log
grep "Accepted password for root" /var/log/auth.log >> /var/log/security_weekly.log
# 检查新增用户
echo "=== 新增用户 ===" >> /var/log/security_weekly.log
lastlog | grep "Never" >> /var/log/security_weekly.log
# 检查磁盘使用
echo "=== 磁盘使用情况 ===" >> /var/log/security_weekly.log
df -h >> /var/log/security_weekly.log
# 检查系统更新
echo "=== 可用更新 ===" >> /var/log/security_weekly.log
apt list --upgradable >> /var/log/security_weekly.log
设置定时任务:
# 每天凌晨2点执行安全检查
0 2 * * * /path/to/security_check.sh
# 每周日凌晨3点执行完整安全扫描
0 3 * * 0 /path/to/weekly_security_scan.sh
八、最佳实践总结
1. 分层防护策略
- 网络层:防火墙配置、端口管理
- 系统层:用户权限、文件权限、服务管理
- 应用层:SSH 配置、数据库安全、Web 服务加固
- 监控层:日志分析、入侵检测、行为监控
2. 常用安全检查命令
# 检查登录失败记录
grep "Failed password" /var/log/auth.log
# 检查成功的root登录
grep "Accepted password for root" /var/log/auth.log
# 检查端口监听
netstat -tlnp
ss -tlnp
# 检查运行的服务
systemctl list-units --type=service --state=running
# 检查用户登录历史
last
lastlog
# 检查系统负载和进程
top
htop
ps aux --sort=-%cpu | head -10
3. 应急响应准备
- 定期备份重要配置文件
- 准备系统恢复脚本
- 建立事件响应流程
- 保持安全工具更新
结语
Linux 服务器安全加固是一个持续的过程,需要定期审查和更新安全配置。本文提供的加固方案涵盖了从基础配置到高级防护的各个方面,建议根据实际业务需求选择合适的安全控制措施。
记住:安全不是一次性的任务,而是需要持续关注和维护的系统工程。将本文的加固步骤脚本化并定期执行,可以大大提高服务器的安全防护能力。
参考资料:
- Linux 安全加固实战:从 SSH 配置、防火墙到用户权限最小化
- 企业级 Linux 安全指南:SSH、sudo 权限、防火墙、入侵检测
- Linux 服务器部署后的必备配置与优化指南
安全提示:在实际环境中应用这些配置时,建议先在测试环境中验证,确保不会影响业务服务的正常运行。