第321集服务器安全架构实战:Fail2ban、防火墙与SELinux多层防护的企业级安全解决方案 | 字数总计: 5.1k | 阅读时长: 23分钟 | 阅读量:
服务器安全架构实战: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 sudo yum install epel-release sudo yum install fail2ban 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 [DEFAULT] ignoreip = 127.0 .0.1 /8 ::1 bantime = 3600 findtime = 600 maxretry = 3 [DEFAULT-PORT] port = ssh[sshd] enabled = true port = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3 bantime = 3600 findtime = 600 [sshd-ddos] enabled = false port = sshfilter = sshd-ddoslogpath = /var/log/auth.logmaxretry = 10 [apache-auth] enabled = false port = http,httpsfilter = apache-authlogpath = /var/log/apache2/*error.logmaxretry = 3 [apache-badbots] enabled = true port = http,httpsfilter = apache-badbotslogpath = /var/log/apache2/*access.logmaxretry = 2 [apache-noscript] enabled = true port = http,httpsfilter = apache-noscriptlogpath = /var/log/apache2/*error.logmaxretry = 6 [mysql-auth] enabled = false port = 3306 filter = mysql-authlogpath = /var/log/mysql/mysql_error.logmaxretry = 5 [nginx-limit-req] enabled = true port = http,httpsfilter = nginx-limit-reqlogpath = /var/log/nginx/error.logfindtime = 600 bantime = 600 maxretry = 50 [nginx-botsearch] enabled = true port = http,httpsfilter = nginx-botsearchlogpath = /var/log/nginx/*access.logmaxretry = 2
2.4 Fail2ban自定义规则 自定义SSH防护规则 1 2 3 4 5 6 7 8 9 10 [sshd-custom] enabled = true port = sshfilter = sshd-customlogpath = /var/log/auth.logmaxretry = 3 bantime = 86400 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 [nginx-phpmyadmin] enabled = true port = http,httpsfilter = nginx-phpmyadminlogpath = /var/log/nginx/access.logmaxretry = 3 bantime = 86400 [nginx-wordpress] enabled = true port = http,httpsfilter = nginx-wordpresslogpath = /var/log/nginx/access.logmaxretry = 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 sudo fail2ban-client status sudo fail2ban-client status sshd sudo fail2ban-client status sshd | grep "Banned IP list" sudo fail2ban-client set sshd banip 192.168.1.100 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 [DEFAULT] destemail = admin@example.comsender = fail2ban@example.comsendername = Fail2Ban-Alertmta = sendmailaction = %(action_mwl)s
邮件通知动作配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [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 sudo systemctl status firewalld sudo yum install firewalld firewall-config 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 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept' sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.10" reject' 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 sudo firewall-cmd --set-default-zone=public sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --add-service=ssh --permanent 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 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --permanent --add-icmp-block=echo-request sudo firewall-cmd --set-log-denied=all sudo firewall-cmd --reload 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 sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 6379 -j ACCEPT 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 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 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 sudo apt-get install iptables-persistent sudo netfilter-persistent save sudo service iptables save sudo iptables-save > /etc/sysconfig/iptables 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 getenforce sestatus sudo setenforce 0 sudo setenforce 1 sudo vi /etc/selinux/config
5.2 SELinux上下文 安全上下文格式 1 2 3 4 5 6 7 8 9 10 ls -Z /var/www/html
上下文修改 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 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 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 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 echo "==========================================" echo "服务器安全加固配置" echo "==========================================" echo "" 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 "" echo "=== 2. Fail2ban配置 ===" if ! systemctl is-active --quiet fail2ban; then sudo systemctl start fail2ban sudo systemctl enable fail2ban fi echo " ✓ Fail2ban已启用" echo "" echo "=== 3. Firewall配置 ===" 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 "" 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 "" 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 "" 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 echo "=== 服务器安全状态监控 ===" echo "" echo "1. 失败的登录尝试:" grep "Failed password" /var/log/auth.log 2>/dev/null | tail -10 | wc -l | awk '{print " 最近失败次数: " $1}' echo "" 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 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 "" echo "4. SELinux状态:" getenforce echo "" 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 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 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,httpsfilter = nginx-limit-reqlogpath = /var/log/nginx/error.logmaxretry = 20 findtime = 60 bantime = 3600 [nginx-botsearch] enabled = true port = http,httpsfilter = nginx-botsearchlogpath = /var/log/nginx/access.logmaxretry = 3 bantime = 86400
1 2 3 4 5 6 sudo setsebool -P httpd_can_network_connect on sudo setsebool -P httpd_can_sendmail on sudo systemctl restart fail2ban
7.2 数据库服务器安全 MySQL安全配置 1 2 3 4 5 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' sudo vi /etc/fail2ban/jail.local
1 2 3 4 5 6 7 [mysql] enabled = true port = 3306 filter = mysqllogpath = /var/log/mysql/mysql_error.logmaxretry = 3 bantime = 7200
7.3 SSH安全加固 SSH强化配置 1 2 sudo vi /etc/ssh/sshd_config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Port 2222 PermitRootLogin no PasswordAuthentication yes PubkeyAuthentication yes AllowUsers user1 user2 AllowGroups developers MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 MaxStartups 10:30:60 Protocol 2
1 2 3 sudo systemctl restart sshd sudo systemctl restart fail2ban
八、总结 服务器安全需要多层防护体系。本文涵盖:
核心要点
Fail2ban防暴力破解 :监控日志、自动封禁、邮件通知
Firewalld防火墙 :区域管理、端口控制、富规则
iptables高级配置 :连接限制、速率限制、日志记录
SELinux强制访问控制 :安全上下文、布尔值、策略规则
技术栈
应用防护 :Fail2ban
网络防护 :firewalld、iptables
内核防护 :SELinux
监控运维 :日志分析、自动化脚本
实践建议
采用多层防护(防火墙、Fail2ban、SELinux)
仅开放必要端口
定期检查并分析安全日志
制定安全加固与应急响应流程
定期演练与测试
通过多层安全防护,可提高服务器安全性,防范常见攻击。