服务器安全架构实战:Fail2ban、防火墙与SELinux多层防护

一、服务器安全架构概述

1.1 多层安全防护体系

现代服务器安全需要构建多层防护体系,从外到内逐层过滤威胁:

安全防护层次

  • 防火墙层:网络包过滤、端口控制
  • 应用防护层:Fail2ban、速率限制、访问控制
  • 系统内核层:SELinux、AppArmor、权限控制
  • 应用层:应用自身安全、数据加密

1.2 常见安全威胁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
服务器安全威胁:
暴力破解攻击:
- SSH密码猜测
- FTP暴力破解
- MySQL暴力登录
- Web应用密码爆破

网络层攻击:
- DDoS攻击
- 端口扫描
- 恶意流量注入
- IP欺骗

应用层攻击:
- SQL注入
- XSS跨站脚本
- CSRF跨站请求伪造
- 文件上传漏洞

权限提升:
- 提权漏洞利用
- 配置错误导致
- 缓冲区溢出
- 服务漏洞

二、Fail2ban防暴力破解

2.1 Fail2ban简介

Fail2ban是一个入侵防护框架,通过监控日志文件来检测异常行为并自动封禁攻击者IP。

Fail2ban核心功能

  • 监控系统日志
  • 检测暴力破解行为
  • 自动封禁攻击者IP
  • 支持多种服务(SSH、FTP、HTTP等)

2.2 Fail2ban安装配置

安装Fail2ban

1
2
3
4
5
6
7
8
9
10
11
12
# CentOS/RHEL
sudo yum install epel-release
sudo yum install fail2ban

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install fail2ban

# 启动并设置开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo systemctl status fail2ban

Fail2ban配置文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置文件位置
/etc/fail2ban/

# 主要配置文件
/etc/fail2ban/jail.conf # 主配置文件(不要直接修改)
/etc/fail2ban/jail.local # 本地配置(覆盖主配置)

# 过滤器配置
/etc/fail2ban/filter.d/
/etc/fail2ban/filter.d/sshd.conf
/etc/fail2ban/filter.d/apache-botsearch.conf

# 动作配置
/etc/fail2ban/action.d/
/etc/fail2ban/action.d/iptables-multiport.conf

2.3 Fail2ban配置

基础jail.local配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# /etc/fail2ban/jail.local

[DEFAULT]
# 忽略IP地址(白名单)
ignoreip = 127.0.0.1/8 ::1

# 封禁时间(秒)
bantime = 3600

# 检测时间窗口(秒)
findtime = 600

# 最大失败次数
maxretry = 3

# 发送邮件通知(需要配置邮件)
# destemail = admin@example.com
# sender = fail2ban@example.com
# sendername = Fail2ban
# mta = sendmail

[DEFAULT-PORT]
# 默认端口配置
port = ssh

[sshd]
# SSH服务保护
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600

[sshd-ddos]
# SSH DDoS防护
enabled = false
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 10

[apache-auth]
# Apache认证保护
enabled = false
port = http,https
filter = apache-auth
logpath = /var/log/apache2/*error.log
maxretry = 3

[apache-badbots]
# 恶意机器人防护
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/*access.log
maxretry = 2

[apache-noscript]
# 禁用脚本执行保护
enabled = true
port = http,https
filter = apache-noscript
logpath = /var/log/apache2/*error.log
maxretry = 6

[mysql-auth]
# MySQL认证保护
enabled = false
port = 3306
filter = mysql-auth
logpath = /var/log/mysql/mysql_error.log
maxretry = 5

[nginx-limit-req]
# Nginx速率限制
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
findtime = 600
bantime = 600
maxretry = 50

[nginx-botsearch]
# Nginx恶意请求
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/*access.log
maxretry = 2

2.4 Fail2ban自定义规则

自定义SSH防护规则

1
2
3
4
5
6
7
8
9
10
# /etc/fail2ban/jail.local

[sshd-custom]
enabled = true
port = ssh
filter = sshd-custom
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400 # 封禁24小时
findtime = 600
1
2
3
4
5
6
7
8
9
# /etc/fail2ban/filter.d/sshd-custom.conf

[Definition]
# 失败登录的正则表达式
failregex = ^%(__prefix_line)sFailed password for .* from <HOST> port \d+ ssh2$
^%(__prefix_line)sInvalid user .* from <HOST> port \d+$
^%(__prefix_line)sConnection closed by authenticating user .* <HOST> port \d+ \[preauth\]$
^%(__prefix_line)sDisconnecting authenticating.* from <HOST> port \d+: Too many authentication failures$
ignoreregex =

自定义Web应用防护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# /etc/fail2ban/jail.local

[nginx-phpmyadmin]
enabled = true
port = http,https
filter = nginx-phpmyadmin
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 86400

[nginx-wordpress]
enabled = true
port = http,https
filter = nginx-wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 43200
1
2
3
4
5
6
# /etc/fail2ban/filter.d/nginx-phpmyadmin.conf

[Definition]
failregex = ^<HOST>.*"(GET|POST).*phpmyadmin.*" 404.*$
^<HOST>.*"(GET|POST).*phpmyadmin.*" 403.*$
ignoreregex =

2.5 Fail2ban管理命令

常用管理命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看Fail2ban状态
sudo fail2ban-client status

# 查看特定jail状态
sudo fail2ban-client status sshd

# 查看被封禁的IP
sudo fail2ban-client status sshd | grep "Banned IP list"

# 手动封禁IP
sudo fail2ban-client set sshd banip 192.168.1.100

# 手动解封IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

# 查看系统日志
sudo tail -f /var/log/fail2ban.log

# 重新加载配置
sudo fail2ban-client reload

# 重启服务
sudo systemctl restart fail2ban

2.6 Fail2ban邮件通知

配置邮件通知

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/fail2ban/jail.local

[DEFAULT]
# 邮件通知配置
destemail = admin@example.com
sender = fail2ban@example.com
sendername = Fail2Ban-Alert
mta = sendmail
action = %(action_mwl)s

# action_mwl: 邮件+记录日志
# %(action_)s: 仅记录日志

邮件通知动作配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# /etc/fail2ban/action.d/sendmail-buffered.conf (示例)

[Definition]
actionstart = printf %%b "Subject: <fq-hostname>: <name> started
From: <sender>
To: <dest>\n\n<fq-hostname>: <name> jail started\n" | <sendmailcmd>
actionstop = printf %%b "Subject: <fq-hostname>: <name> stopped
From: <sender>
To: <dest>\n\n<fq-hostname>: <name> jail stopped\n" | <sendmailcmd>
actionban = printf %%b "Subject: <fq-hostname>: IP <ip> banned from <name>
From: <sender>
To: <dest>\n\n<fq-hostname>: failed login from <ip>
Look below for more information.\n`grep <ip> <logpath>`\n" | <sendmailcmd>
actionunban = printf %%b "Subject: <fq-hostname>: IP <ip> unbanned from <name>
From: <sender>
To: <dest>\n\n<fq-hostname>: IP <ip> has been unbanned\n" | <sendmailcmd>

三、firewalld防火墙

3.1 firewalld基础

firewalld是CentOS/RHEL 7+的默认防火墙管理工具,提供动态防火墙管理。

firewalld特点

  • 运行时动态管理
  • 配置文件持久化
  • 支持zone(区域)概念
  • 更友好的命令行界面

firewalld安装与启动

1
2
3
4
5
6
7
8
9
10
11
12
# 检查firewalld状态
sudo systemctl status firewalld

# 安装firewalld
sudo yum install firewalld firewall-config

# 启动firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 查看状态
sudo firewall-cmd --state

3.2 firewalld区域管理

区域概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
firewalld区域:
drop (丢弃):
- 最低信任度
- 流入流量全部丢弃
- 仅允许流出流量

block (阻止):
- 传入连接被拒绝
- 返回icmp-host-prohibited消息

public (公共):
- 不相信同一网络中的其他计算机
- 仅允许选定的传入连接

external (外部):
- 伪装传出流量
- 仅允许选定的传入连接

internal (内部):
- 相信网络中的其他计算机
- 仅允许选定的传入连接

dmz (非军事化):
- 公共可访问
- 限制对内部网络的访问

work (工作):
- 相信网络中的大多数计算机
- 仅允许选定的传入连接

home (家庭):
- 相信网络中的大多数计算机
- 仅允许选定的传入连接

trusted (信任):
- 信任所有网络连接

区域配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看当前默认区域
sudo firewall-cmd --get-default-zone

# 设置默认区域
sudo firewall-cmd --set-default-zone=public

# 查看所有可用区域
sudo firewall-cmd --get-zones

# 查看活跃区域
sudo firewall-cmd --get-active-zones

# 查看区域配置
sudo firewall-cmd --zone=public --list-all

3.3 firewalld规则配置

端口管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 临时开放端口
sudo firewall-cmd --add-port=8080/tcp

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

# 移除端口
sudo firewall-cmd --remove-port=8080/tcp --permanent

# 查看开放的端口
sudo firewall-cmd --list-ports

# 批量开放端口
sudo firewall-cmd --add-port=80/tcp --add-port=443/tcp --permanent

服务管理

1
2
3
4
5
6
7
8
9
10
11
# 添加服务
sudo firewall-cmd --add-service=http --permanent

# 移除服务
sudo firewall-cmd --remove-service=http --permanent

# 查看允许的服务
sudo firewall-cmd --list-services

# 重载配置
sudo firewall-cmd --reload

富规则配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 允许特定IP访问SSH
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'

# 拒绝特定IP访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.10" reject'

# 限制SSH连接速率
sudo firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value=5/m accept'

# 端口转发
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" forward-port port="8080" protocol="tcp" to-port="80"'

# 查看富规则
sudo firewall-cmd --list-rich-rules

3.4 firewalld完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Web服务器防火墙配置

# 1. 设置默认区域为public
sudo firewall-cmd --set-default-zone=public

# 2. 允许HTTP和HTTPS
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent

# 3. 允许SSH
sudo firewall-cmd --add-service=ssh --permanent

# 4. 限制SSH只允许特定IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
sudo firewall-cmd --permanent --remove-service=ssh

# 5. 允许MySQL远程访问(仅特定IP)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'

# 6. 开放应用程序端口
sudo firewall-cmd --permanent --add-port=8080/tcp

# 7. 禁止ping(可选)
sudo firewall-cmd --permanent --add-icmp-block=echo-request

# 8. 启用日志记录
sudo firewall-cmd --set-log-denied=all

# 9. 重载配置
sudo firewall-cmd --reload

# 10. 查看完整配置
sudo firewall-cmd --list-all

四、iptables防火墙

4.1 iptables基础

iptables是Linux内核的包过滤系统,功能强大但配置复杂。

iptables核心概念

  • 表(Tables):filter、nat、mangle、raw
  • 链(Chains):INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
  • 规则(Rules):定义如何处理数据包
  • 动作(Targets):ACCEPT、DROP、REJECT、LOG、SNAT、DNAT

4.2 iptables规则配置

基础iptables配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 清空所有规则
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X

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

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

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

端口管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 允许SSH(端口22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

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

# 允许MySQL(仅特定网络)
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT

# 允许Redis(仅特定IP)
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 6379 -j ACCEPT

# 允许ICMP(ping)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

高级iptables配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 限制连接数
sudo iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

# 限制SSH连接速率
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 阻止特定IP
sudo iptables -A INPUT -s 192.168.1.100 -j DROP

# 日志记录
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH: "
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

4.3 iptables持久化

保存iptables规则

1
2
3
4
5
6
7
8
9
10
11
12
13
# 保存当前规则
sudo iptables-save > /etc/iptables/rules.v4

# 自动保存(Ubuntu/Debian)
sudo apt-get install iptables-persistent
sudo netfilter-persistent save

# 手动保存(CentOS/RHEL)
sudo service iptables save # CentOS 6
sudo iptables-save > /etc/sysconfig/iptables # CentOS 7

# 开机自动加载
sudo iptables-restore < /etc/iptables/rules.v4

五、SELinux强制访问控制

5.1 SELinux简介

SELinux(Security-Enhanced Linux)是Linux内核的安全模块,提供强制访问控制(MAC)。

SELinux工作原理

  • 为所有对象分配安全上下文
  • 根据策略规则控制访问
  • 即使root权限也会被拦截
  • 提供细粒度的权限控制

SELinux状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看SELinux状态
getenforce
# 输出: Enforcing / Permissive / Disabled

# 查看详细状态
sestatus

# 临时改变模式(无需重启)
sudo setenforce 0 # Permissive
sudo setenforce 1 # Enforcing

# 永久改变模式
sudo vi /etc/selinux/config
# SELINUX=enforcing|permissive|disabled

5.2 SELinux上下文

安全上下文格式

1
2
3
4
5
6
7
8
9
10
# 查看文件上下文
ls -Z /var/www/html

# 输出示例:
# drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 index.html

# 格式: user:role:type:level
# system_u:object_r:httpd_sys_content_t:s0
# ↑ ↑ ↑ ↑
# user role type level

上下文修改

1
2
3
4
5
6
7
8
# 修改文件上下文
sudo chcon -t httpd_sys_content_t /var/www/html/index.html

# 恢复文件上下文
sudo restorecon -R /var/www/html

# 使用参考文件设置上下文
sudo chcon --reference /var/www/html /opt/html

5.3 SELinux策略配置

布尔值(Boolean)配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看布尔值
getsebool -a | grep httpd

# 设置布尔值
sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_can_network_connect_db on
sudo setsebool -P httpd_can_sendmail on

# 常用HTTP服务布尔值
sudo setsebool -P httpd_can_network_connect on # 允许网络连接
sudo setsebool -P httpd_execmem on # 允许执行内存
sudo setsebool -P httpd_graceful_shutdown on # 优雅关闭
sudo setsebool -P httpd_tty_comm on # 终端通信

SELinux策略规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看模块
semodule -l

# 查看特定模块规则
sesearch -A -s httpd_t -t httpd_log_t

# 生成策略模块
sudo audit2allow -M mymodule

# 安装策略模块
sudo semodule -i mymodule.pp

# 删除策略模块
sudo semodule -r mymodule

5.4 SELinux故障排查

查看SELinux日志

1
2
3
4
5
6
7
8
9
10
11
# 查看AUDIT日志
sudo ausearch -m avc -i

# 查看最近被拒绝的访问
sudo ausearch -ts recent -m avc -i

# 分析并生成策略
sudo ausearch -m avc -ts recent | audit2allow

# 查看特定文件的所有访问
sudo ausearch -m avc -i | grep /var/www

SELinux故障诊断脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
# selinux_troubleshoot.sh - SELinux故障排查

echo "=== SELinux状态检查 ==="
echo ""
echo "1. SELinux状态:"
getenforce
echo ""

echo "2. SELinux模式配置:"
grep "^SELINUX=" /etc/selinux/config
echo ""

echo "3. 最近的SELinux拒绝日志:"
if ausearch -m avc -ts recent --start recent 2>/dev/null | grep -q "type=AVC"; then
echo "发现SELinux拒绝事件:"
ausearch -m avc -ts recent --start recent 2>/dev/null | tail -20
else
echo "无最近的SELinux拒绝事件"
fi
echo ""

echo "4. HTTP相关的布尔值:"
getsebool -a | grep httpd | grep -v "^$"
echo ""

echo "5. 建议的修复命令:"
echo "如果发现SELinux拒绝,可以尝试:"
echo " setenforce 0 # 临时禁用SELinux"
echo " setsebool -P httpd_can_network_connect on # 设置布尔值"
echo " audit2allow -M <module> # 生成策略模块"

六、综合安全配置

6.1 完整安全配置脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/bin/bash
# server_security_hardening.sh - 服务器安全加固脚本

echo "=========================================="
echo "服务器安全加固配置"
echo "=========================================="
echo ""

# 1. SSH安全加固
echo "=== 1. SSH安全加固 ==="
sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
echo " ✓ SSH配置更新"
echo ""

# 2. Fail2ban配置
echo "=== 2. Fail2ban配置 ==="
if ! systemctl is-active --quiet fail2ban; then
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
fi
echo " ✓ Fail2ban已启用"
echo ""

# 3. Firewall配置
echo "=== 3. Firewall配置 ==="
# firewalld
if command -v firewall-cmd &> /dev/null; then
sudo firewall-cmd --set-default-zone=public
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
echo " ✓ Firewalld配置完成"
fi
echo ""

# 4. SELinux配置
echo "=== 4. SELinux配置 ==="
CURRENT_MODE=$(getenforce)
if [ "$CURRENT_MODE" != "Enforcing" ]; then
echo " 当前SELinux模式: $CURRENT_MODE"
echo " 建议设置为Enforcing"
read -p " 是否将SELinux设置为Enforcing? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
sudo sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config
echo " ✓ SELinux将设置为Enforcing(需要重启)"
fi
else
echo " ✓ SELinux已处于Enforcing模式"
fi
echo ""

# 5. 禁用不需要的服务
echo "=== 5. 禁用不需要的服务 ==="
for service in telnet ftp rsh; do
if systemctl is-enabled --quiet "$service" 2>/dev/null; then
sudo systemctl disable "$service"
echo " ✓ 已禁用 $service"
fi
done
echo ""

# 6. 配置自动更新
echo "=== 6. 配置自动更新 ==="
if command -v apt-get &> /dev/null; then
sudo apt-get install -y unattended-upgrades
echo " ✓ 已安装unattended-upgrades"
elif command -v yum &> /dev/null; then
sudo yum install -y yum-cron
sudo systemctl enable yum-cron
sudo systemctl start yum-cron
echo " ✓ 已启用yum-cron"
fi
echo ""

echo "=========================================="
echo "安全加固完成"
echo "=========================================="
echo ""
echo "建议下一步:"
echo "1. 重启服务器使配置生效"
echo "2. 测试SSH新端口连接"
echo "3. 验证防火墙规则"
echo "4. 监控fail2ban日志"

6.2 安全监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash
# security_monitor.sh - 安全监控脚本

echo "=== 服务器安全状态监控 ==="
echo ""

# 1. 检查失败的登录尝试
echo "1. 失败的登录尝试:"
grep "Failed password" /var/log/auth.log 2>/dev/null | tail -10 | wc -l | awk '{print " 最近失败次数: " $1}'
echo ""

# 2. 检查被ban的IP
if command -v fail2ban-client &> /dev/null; then
echo "2. Fail2ban状态:"
BANNED_COUNT=$(sudo fail2ban-client status sshd 2>/dev/null | grep "Banned IP list" | grep -oP '\d+\.\d+\.\d+\.\d+' | wc -l)
echo " 被封禁的IP数量: $BANNED_COUNT"
echo ""
fi

# 3. 检查防火墙状态
echo "3. 防火墙状态:"
if command -v firewall-cmd &> /dev/null; then
if systemctl is-active --quiet firewalld; then
echo " ✓ Firewalld运行中"
OPEN_PORTS=$(sudo firewall-cmd --list-ports)
if [ -n "$OPEN_PORTS" ]; then
echo " 开放的端口: $OPEN_PORTS"
fi
else
echo " ✗ Firewalld未运行"
fi
elif command -v iptables &> /dev/null; then
if iptables -L -n | grep -q "ACCEPT"; then
echo " ✓ Iptables已配置"
else
echo " ✗ Iptables未配置"
fi
fi
echo ""

# 4. 检查SELinux
echo "4. SELinux状态:"
getenforce
echo ""

# 5. 检查最近的安全事件
echo "5. 最近的安全事件:"
journalctl -p warning --since "1 hour ago" 2>/dev/null | grep -i "fail\|deny\|block" | tail -10

echo ""
echo "监控完成"

七、实战安全配置

7.1 Web服务器安全配置

Nginx + Fail2ban + firewalld配置

1
2
3
4
5
6
7
8
# 1. Firewalld配置
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

# 2. Fail2ban配置Nginx jail
sudo vi /etc/fail2ban/jail.local
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 20
findtime = 60
bantime = 3600

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 86400
1
2
3
4
5
6
# 3. SELinux配置
sudo setsebool -P httpd_can_network_connect on
sudo setsebool -P httpd_can_sendmail on

# 4. 重启Fail2ban
sudo systemctl restart fail2ban

7.2 数据库服务器安全

MySQL安全配置

1
2
3
4
5
# 1. Firewalld只允许应用服务器访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'

# 2. Fail2ban配置MySQL
sudo vi /etc/fail2ban/jail.local
1
2
3
4
5
6
7
[mysql]
enabled = true
port = 3306
filter = mysql
logpath = /var/log/mysql/mysql_error.log
maxretry = 3
bantime = 7200

7.3 SSH安全加固

SSH强化配置

1
2
# 编辑SSH配置
sudo vi /etc/ssh/sshd_config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 允许的配置项
Port 2222 # 修改SSH端口
PermitRootLogin no # 禁止root登录
PasswordAuthentication yes # 允许密码认证
PubkeyAuthentication yes # 允许密钥认证
AllowUsers user1 user2 # 只允许特定用户
AllowGroups developers # 只允许特定组
MaxAuthTries 3 # 最大认证尝试次数
ClientAliveInterval 300 # 客户端保活间隔
ClientAliveCountMax 2 # 最大保活次数

# 限制SSH连接
MaxStartups 10:30:60 # 最大同时连接数

# 禁用不安全协议
Protocol 2 # 只使用SSH2
1
2
3
# 重启SSH服务
sudo systemctl restart sshd
sudo systemctl restart fail2ban # 更新Fail2ban配置

八、总结

服务器安全需要多层防护体系。本文涵盖:

核心要点

  1. Fail2ban防暴力破解:监控日志、自动封禁、邮件通知
  2. Firewalld防火墙:区域管理、端口控制、富规则
  3. iptables高级配置:连接限制、速率限制、日志记录
  4. SELinux强制访问控制:安全上下文、布尔值、策略规则

技术栈

  • 应用防护:Fail2ban
  • 网络防护:firewalld、iptables
  • 内核防护:SELinux
  • 监控运维:日志分析、自动化脚本

实践建议

  1. 采用多层防护(防火墙、Fail2ban、SELinux)
  2. 仅开放必要端口
  3. 定期检查并分析安全日志
  4. 制定安全加固与应急响应流程
  5. 定期演练与测试

通过多层安全防护,可提高服务器安全性,防范常见攻击。