SQL注入攻击的核心是利用Web应用对用户输入的过滤缺陷,将恶意SQL语句注入到数据库查询中执行,从而获取或破坏数据库数据。在CentOS系统中,除了要求开发人员编写安全的代码外,还可以通过系统层面的配置进一步加固防护能力,降低攻击成功的概率。

配置系统防火墙限制数据库访问
默认情况下,数据库服务可能会监听所有网络接口的端口,这会让攻击者有机会直接连接数据库尝试注入。我们可以通过firewalld防火墙限制数据库端口的访问来源,只允许Web服务器本地或者指定的可信IP访问。
首先查看当前firewalld运行状态:
# 查看firewalld服务状态 systemctl status firewalld # 如果未运行则启动服务并设置开机自启 systemctl start firewalld systemctl enable firewalld
假设数据库使用默认的3306端口,仅允许本地回环地址访问,配置规则如下:
# 先移除默认的3306端口开放规则(如果存在) firewall-cmd --permanent --remove-port=3306/tcp # 添加只允许本地访问3306端口的规则 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="3306" accept' # 重新加载防火墙规则使配置生效 firewall-cmd --reload # 查看当前生效的规则 firewall-cmd --list-all
加固数据库服务安全配置
数据库自身的安全配置是防御SQL注入的重要一环,以MySQL为例,我们可以通过修改配置文件减少风险。
编辑MySQL的配置文件/etc/my.cnf,添加以下安全相关配置:
[mysqld] # 禁止本地文件导入导出,避免攻击者通过注入获取系统文件 local-infile=0 # 关闭符号链接支持,防止通过注入操作数据库文件路径 symbolic-links=0 # 设置SQL模式,启用严格模式和相关安全校验 sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
修改完成后重启MySQL服务:
systemctl restart mysqld
同时需要遵循最小权限原则,为Web应用分配独立的数据库用户,仅授予该用户对应业务所需的库表操作权限,不要使用root用户直接连接数据库:
-- 创建Web应用专用用户,仅允许本地连接 CREATE USER 'web_user'@'127.0.0.1' IDENTIFIED BY 'Strong_Password_123'; -- 仅授予该用户对app_db库的查询、插入、更新、删除权限 GRANT SELECT,INSERT,UPDATE,DELETE ON app_db.* TO 'web_user'@'127.0.0.1'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
配置Web服务输入过滤规则
如果Web服务使用Nginx作为反向代理,可以通过Nginx的配置过滤常见的SQL注入特征请求,在请求到达后端应用前就进行拦截。
在Nginx的配置文件中添加如下规则:
http {
# 定义SQL注入检测规则
map $request_uri $sql_inject {
default 0;
# 匹配常见的SQL注入关键词和符号
"~* (union|select|insert|update|delete|drop|alter|exec|;|--|'|"|/*|*/)" 1;
}
server {
listen 80;
server_name example.ipipp.com;
# 如果检测到SQL注入特征,返回403禁止访问
if ($sql_inject = 1) {
return 403;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
修改完成后测试Nginx配置并重新加载:
# 测试配置是否有语法错误 nginx -t # 重新加载Nginx配置 nginx -s reload
配置系统级入侵检测规则
我们可以安装fail2ban工具,监控Web服务和数据库的日志,当发现多次可疑的SQL注入尝试时,自动封禁攻击者的IP地址。
首先安装fail2ban:
yum install -y fail2ban
创建fail2ban的自定义规则配置文件/etc/fail2ban/jail.d/web-sql-inject.conf,内容如下:
[web-sql-inject] enabled = true # 监控Nginx的访问日志 logpath = /var/log/nginx/access.log # 匹配包含SQL注入特征的请求 filter = web-sql-inject # 如果在60秒内出现3次可疑请求,封禁IP 1小时 maxretry = 3 findtime = 60 bantime = 3600 # 使用firewalld作为封禁操作的后端 banaction = firewallcmd-rich-rules
然后创建对应的过滤规则文件/etc/fail2ban/filter.d/web-sql-inject.conf:
[Definition] failregex = ^<HOST> -.*"(GET|POST).*(union|select|insert|update|delete|drop|;|--|'|"|/*).*HTTP/.* ignoreregex =
启动fail2ban服务并设置开机自启:
systemctl start fail2ban systemctl enable fail2ban # 查看fail2ban的运行状态 fail2ban-client status web-sql-inject
定期更新系统和软件补丁
SQL注入相关的漏洞可能存在于系统组件、Web服务程序或者数据库程序中,定期更新补丁可以修复已知的安全缺陷。可以配置CentOS的自动更新功能,或者定期手动执行更新:
# 更新系统所有可更新的软件包 yum update -y # 可以设置定时任务每周日凌晨3点执行更新 crontab -e # 添加如下内容 0 3 * * 0 yum update -y
完成以上配置后,CentOS系统会从网络访问、数据库权限、请求过滤、入侵响应、漏洞修复多个层面形成防护体系,大幅降低Web应用遭受SQL注入攻击的风险。需要注意的是,系统配置防护不能替代代码层面的安全开发,两者结合才能最大程度保障Web应用的数据安全。