服务器安全加固:从防火墙到入侵检测

· 阅读约需33分钟

一、为什么服务器安全加固如此重要?

在互联网时代,服务器是企业和个人数据的核心载体。然而,随着网络攻击手段的不断升级,未加固的服务器面临着巨大的安全风险。根据 Verizon 数据泄露调查报告显示,85% 的数据泄露都涉及人为因素,而 74% 的攻击利用了系统漏洞或配置错误

服务器安全加固的重要性体现在:

  • 降低攻击面:关闭不必要的服务和端口,减少攻击者可利用的入口
  • 提升攻击成本:多层防护措施让攻击者望而却步
  • 满足合规要求:等保2.0、GDPR 等法规都有明确的安全要求
  • 保障业务连续性:避免因安全事件导致的服务中断
  • 保护数据安全:防止敏感数据被窃取或篡改

本文将从防火墙配置、SSH 加固、权限管理、入侵检测等多个维度,详细介绍服务器安全加固的完整方案。

二、防火墙配置

防火墙是服务器安全的第一道防线,它通过控制进出网络的流量来保护服务器。

2.1 iptables 基础

iptables 是 Linux 系统中最常用的防火墙工具,它通过规则链来过滤网络数据包。

查看当前规则:

iptables -L -n -v

基本配置策略:

# 清空现有规则
iptables -F
iptables -X
iptables -Z

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH(建议修改默认端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 HTTP 和 HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许 ICMP(可选,建议限制速率)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

保存规则:

# CentOS/RHEL
service iptables save

# Ubuntu/Debian
iptables-save > /etc/iptables/rules.v4

2.2 UFW 简化配置

UFW(Uncomplicated Firewall)是 Ubuntu 系统中更易用的防火墙配置工具。

基本使用:

# 启用 UFW
ufw enable

# 设置默认策略
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH
ufw allow ssh
# 或指定端口
ufw allow 22/tcp

# 允许 HTTP/HTTPS
ufw allow 80/tcp
ufw allow 443/tcp

# 允许特定 IP 访问
ufw allow from 192.168.1.100
ufw allow from 192.168.1.0/24 to any port 22

# 查看状态
ufw status verbose

2.3 firewalld 配置

firewalld 是 CentOS 7+ 系统默认的防火墙管理工具,支持区域(zone)概念。

基本使用:

# 启动并设置开机自启
systemctl start firewalld
systemctl enable firewalld

# 查看默认区域
firewall-cmd --get-default-zone

# 查看当前区域规则
firewall-cmd --list-all

# 开放服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh

# 开放端口
firewall-cmd --permanent --add-port=8080/tcp

# 重新加载配置
firewall-cmd --reload

2.4 防火墙最佳实践

  1. 最小化原则:只开放必要的端口和服务
  2. 限制访问源:对管理端口(如 SSH)限制 IP 范围
  3. 速率限制:对可能被暴力破解的端口设置速率限制
  4. 日志记录:开启防火墙日志,便于审计和排查
  5. 定期审计:定期检查防火墙规则,清理不必要的规则

三、SSH 安全加固

SSH 是服务器管理的主要入口,也是攻击者最常针对的目标。

3.1 修改默认端口

修改 SSH 默认端口可以减少自动化扫描的攻击尝试。

# 编辑 SSH 配置文件
vim /etc/ssh/sshd_config

# 修改端口
Port 2222

# 重启 SSH 服务
systemctl restart sshd

注意:修改端口前,确保防火墙已开放新端口,避免自己被关在外面。

3.2 禁用 root 登录

禁止 root 用户直接登录,使用普通用户 + sudo 的方式管理服务器。

# 编辑配置文件
vim /etc/ssh/sshd_config

# 禁用 root 登录
PermitRootLogin no

# 重启服务
systemctl restart sshd

3.3 使用密钥登录

使用 SSH 密钥对替代密码登录,大幅提升安全性。

生成密钥对:

# 在本地生成密钥
ssh-keygen -t ed25519 -C "your_email@example.com"

# 或使用 RSA(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

将公钥上传到服务器:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip

禁用密码登录:

vim /etc/ssh/sshd_config

# 禁用密码认证
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

# 启用公钥认证
PubkeyAuthentication yes

# 重启服务
systemctl restart sshd

3.4 其他 SSH 加固措施

# 限制登录尝试次数
MaxAuthTries 3

# 登录超时时间
LoginGraceTime 30

# 禁用空密码
PermitEmptyPasswords no

# 限制可登录的用户
AllowUsers user1 user2
# 或限制用户组
AllowGroups sshusers

# 禁用 X11 转发
X11Forwarding no

# 禁用 TCP 转发(如不需要)
AllowTcpForwarding no

# 设置空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2

3.5 fail2ban 防暴力破解

fail2ban 可以监控日志,对多次失败的登录尝试自动封禁 IP。

安装 fail2ban:

# Ubuntu/Debian
apt install fail2ban

# CentOS/RHEL
yum install fail2ban

配置 SSH 防护:

# 创建本地配置文件
vim /etc/fail2ban/jail.local

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 3600

启动服务:

systemctl start fail2ban
systemctl enable fail2ban

# 查看封禁状态
fail2ban-client status sshd

四、用户权限管理

合理的用户权限管理是服务器安全的基础。

4.1 最小权限原则

遵循最小权限原则,只给用户分配完成工作所需的最少权限。

创建普通用户:

# 创建用户
useradd -m username

# 设置密码
passwd username

# 添加到 sudo 组(如需管理员权限)
usermod -aG sudo username  # Ubuntu
usermod -aG wheel username  # CentOS

4.2 sudo 配置

合理配置 sudo,限制用户可执行的命令。

编辑 sudo 配置:

visudo

配置示例:

# 允许用户执行特定命令
username ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx

# 允许用户组执行所有命令(无需密码)
%admin ALL=(ALL) NOPASSWD: ALL

# 限制用户只能在特定主机上执行命令
username hostname=(ALL) ALL

4.3 定期清理用户

定期检查系统用户,删除不必要的账号。

# 查看所有用户
cat /etc/passwd

# 查看可登录的用户
grep -E '/bin/(bash|zsh|sh)' /etc/passwd

# 删除用户
userdel -r username

4.4 文件权限管理

合理设置文件和目录权限,防止未授权访问。

# 常见权限设置
# 配置文件:只有所有者可读写
chmod 600 /etc/ssh/sshd_config

# 可执行文件:所有者可读写执行,其他只读执行
chmod 755 /usr/bin/command

# 网站根目录:所有者可读写,其他只读
chmod -R 755 /var/www/html

# 敏感数据目录:只有所有者可访问
chmod 700 /data/secret

# 更改文件所有者
chown -R www-data:www-data /var/www/html

特殊权限位:

# SUID:以文件所有者身份执行(慎用)
chmod u+s /path/to/file

# SGID:以文件所属组身份执行,目录中新建文件继承组
chmod g+s /path/to/directory

# Sticky Bit:只有文件所有者才能删除(常用于 /tmp)
chmod +t /tmp

五、系统更新与补丁管理

及时更新系统和软件是修复安全漏洞的关键。

5.1 系统更新

Ubuntu/Debian:

# 更新软件包列表
apt update

# 升级已安装的软件包
apt upgrade -y

# 发行版升级(谨慎使用)
apt dist-upgrade -y

# 自动安全更新
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

CentOS/RHEL:

# 更新所有软件包
yum update -y

# 只更新安全补丁
yum update --security -y

# 自动安全更新
yum install yum-cron
systemctl start yum-cron
systemctl enable yum-cron

5.2 内核更新

内核漏洞可能导致严重的安全问题,应及时更新。

# 查看当前内核版本
uname -r

# 更新内核
# Ubuntu
apt install linux-generic

# CentOS
yum update kernel

# 重启生效
reboot

5.3 漏洞扫描

定期使用漏洞扫描工具检查系统安全状况。

安装并使用 Lynis:

# 下载 Lynis
git clone https://github.com/CISOfy/lynis.git
cd lynis

# 运行系统审计
./lynis audit system

# 查看报告
cat /var/log/lynis-report.dat

六、入侵检测系统

入侵检测系统(IDS)可以监控系统和网络活动,及时发现攻击行为。

6.1 OSSEC HIDS

OSSEC 是一款开源的主机入侵检测系统,支持日志分析、文件完整性检查等功能。

安装 OSSEC:

# 下载安装包
wget https://github.com/ossec/ossec-hids/archive/refs/tags/3.7.0.tar.gz
tar -xzf 3.7.0.tar.gz
cd ossec-hids-3.7.0

# 安装依赖
apt install build-essential libssl-dev zlib1g-dev

# 运行安装脚本
./install.sh

主要功能:

  • 日志分析与告警
  • 文件完整性检查(FIM)
  • Rootkit 检测
  • 主动响应

6.2 AIDE 文件完整性检查

AIDE(Advanced Intrusion Detection Environment)用于监控文件系统的变化。

安装和配置:

# 安装 AIDE
apt install aide

# 初始化数据库
aideinit

# 更新数据库
aide --update

# 运行检查
aide --check

配置示例(/etc/aide/aide.conf):

# 监控系统重要目录
/etc p+i+u+g+sha256
/bin p+i+u+g+sha256
/sbin p+i+u+g+sha256
/usr/bin p+i+u+g+sha256
/usr/sbin p+i+u+g+sha256

# 排除日志等经常变化的文件
!/var/log
!/var/tmp
!/tmp

6.3 rkhunter Rootkit 检测

rkhunter 用于检测系统中的 Rootkit、后门和漏洞。

安装和使用:

# 安装
apt install rkhunter

# 更新数据库
rkhunter --update

# 运行检测
rkhunter --check

# 查看报告
cat /var/log/rkhunter.log

七、日志审计

完整的日志记录是安全审计和事件溯源的基础。

7.1 系统日志配置

Linux 系统日志通常由 rsyslog 或 syslog-ng 管理。

rsyslog 配置示例:

# 编辑配置
vim /etc/rsyslog.conf

# 记录认证日志
auth,authpriv.*                 /var/log/auth.log

# 记录所有日志到远程服务器
*.* @@remote-log-server:514

# 按级别过滤
*.info;mail.none;authpriv.none;cron.none   /var/log/messages

7.2 日志轮转

使用 logrotate 管理日志文件,防止日志占满磁盘。

配置示例(/etc/logrotate.d/nginx):

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

7.3 集中式日志管理

对于多服务器环境,建议使用集中式日志管理方案,如 ELK Stack(Elasticsearch + Logstash + Kibana)或 Graylog。

ELK 架构优势:

  • 统一收集和存储所有服务器日志
  • 强大的搜索和分析能力
  • 可视化仪表盘
  • 告警功能

八、其他安全加固措施

8.1 禁用不必要的服务

关闭不需要的服务,减少攻击面。

# 查看所有运行的服务
systemctl list-units --type=service --state=running

# 禁用不需要的服务
systemctl disable --now service_name

# 常见可禁用的服务(根据实际情况)
systemctl disable --now avahi-daemon  # 零配置网络
systemctl disable --now cups  # 打印服务
systemctl disable --now bluetooth  # 蓝牙

8.2 内核参数加固

通过 sysctl 调整内核参数,提升网络安全性。

配置示例(/etc/sysctl.conf):

# 防止 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# SYN Flood 防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# 禁用 IPv6(如不需要)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# 增大文件描述符限制
fs.file-max = 65535

应用配置:

sysctl -p

8.3 定期备份

数据备份是安全的最后一道防线。

备份策略建议:

  • 3-2-1 原则:3 份备份,2 种介质,1 份异地
  • 定期测试备份的可恢复性
  • 加密敏感备份数据

简单备份脚本示例:

#!/bin/bash
# backup.sh - 简单备份脚本

BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
SOURCE_DIRS="/etc /home /var/www"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz $SOURCE_DIRS

# 删除 30 天前的备份
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +30 -delete

echo "备份完成: backup_$DATE.tar.gz"

九、安全加固检查清单

9.1 基础安全检查

  • 系统已更新到最新版本
  • 防火墙已配置并启用
  • SSH 已加固(密钥登录、禁用 root、修改端口)
  • 已安装 fail2ban 或类似防暴力破解工具
  • 不必要的服务已禁用
  • 定期备份已配置

9.2 权限与访问控制

  • 遵循最小权限原则
  • root 账号禁止直接登录
  • sudo 权限已合理分配
  • 文件权限设置正确
  • 空密码账号已禁用

9.3 监控与审计

  • 系统日志已配置
  • 日志轮转已设置
  • 入侵检测系统已部署
  • 文件完整性检查已配置
  • 定期安全扫描已安排

十、总结

服务器安全加固是一个持续的过程,而不是一次性的工作。安全防护需要从多个层面入手,构建纵深防御体系。

核心要点回顾:

  1. 防火墙是第一道防线:合理配置防火墙规则,只开放必要端口
  2. SSH 安全是重中之重:使用密钥登录、禁用 root、防暴力破解
  3. 最小权限原则:用户、进程、文件都遵循最小权限
  4. 及时更新补丁:漏洞修复要及时,自动化更新是好帮手
  5. 监控与检测:及时发现异常,才能快速响应
  6. 备份是最后防线:定期备份并测试恢复能力

安全没有银弹,只有通过持续的关注和改进,才能不断提升服务器的安全水平。希望本文的加固方案能帮助你搭建更安全的服务器环境。

记住,最好的安全防护是在系统设计和部署阶段就考虑安全,而不是事后补救。