背景:
安全中心扫描数据库服务器,扫描出大量MySQL数据库安全漏洞:
针对扫描的安全漏洞,有三种解决方案。
方案一:
根据漏扫报告提供的解决方案,去Oracle官网下载相应补丁进行处理,打补丁解决漏洞。
在实际操作过程中发现下载补丁时如下图提示,也就是没有购买Oracle服务的话无法下载补丁。
方案二:
升级数据库来修复漏洞,目前数据库版本为5.7.22,将数据库升级到8版本以后,大部分漏洞可以修复;升级过程考虑到数据问题未采用该方案。
mysql数据库版本及系统服务器版本如下:
[root@localhost ~]# cat /proc/version
Linux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@localhost ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper
[root@city-auto-monet-01 ~]#
方案三:(实战)
安装iptables防火墙,通过防火墙安全策略,限定指定的IP地址才可以访问数据库,以该方式屏蔽漏洞。
由于我的Linux版本为7.6,系统默认自带的防火墙为firewalld,需要进行如下几步工作:
1.停止并禁止firewalld开启启动,彻底关停firewalld服务。
2.安装iptables(linux 7版本的系统一般带了),安装iptables -service服务(不安装这个的话无法启动iptables)。
3.配置防火墙安全策略。
1.关闭firewalld服务
# 停止 friewalld 服务systemctl stop firewalld? 并查看firewalld 状态systemctl status firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: dead since Tue 2022-05-17 02:41:16 PDT; 1h 49min ago
Docs: man:firewalld(1)
Main PID: 30311 (code=exited, status=0/SUCCESS)
May 17 02:39:46 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
May 17 02:39:46 localhost.localdomain firewalld[30311]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure con...t now.
May 17 02:41:16 localhost.localdomain systemd[1]: firewalld.service start operation timed out. Terminating.
May 17 02:41:16 localhost.localdomain systemd[1]: Failed to start firewalld - dynamic firewall daemon.
May 17 02:41:16 localhost.localdomain systemd[1]: Unit firewalld.service entered failed state.
May 17 02:41:16 localhost.localdomain systemd[1]: firewalld.service failed.
Hint: Some lines were ellipsized, use -l t
# 禁止开机启动systemctl disable firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
2.下载安装iptables
有两种安装方式,如果服务器可以联网的话,可以采用在线安装方式,如果服务器没有联网的话,可以采用离线安装方式,将rpm包放到服务器上,然后进行安装。
2.1离线安装
查看是否已经安装iptables软件:rpm -qa |grep iptables
linux7自带了 iptables-1.4.21-35.el7.x86_64,我们需要安装35版本的iptables-services服务。
注:iptables 和 iptables-service要安装同一个版本的。
[root@localhost ~]# rpm -qa |grep iptables
iptables-1.4.21-35.el7.x86_64
[root@localhost ~]#
1.上传rpm包到服务器上
下图中多个版本的,因为我系统自带的第二行35版本的ptables,所以我需要安装35版本的iptables-service
[root@localhost~]# ll
总用量 972
-rw-r--r-- 1 root root 442656 5月 12 17:00 iptables-1.4.21-35.el7.x86_64.rpm
-rw-r--r-- 1 root root 53128 5月 12 17:11 iptables-services-1.4.21-28.el7.x86_64.rpm
-rw-r--r-- 1 root root 53704 5月 12 17:09 iptables-services-1.4.21-35.el7.x86_64.rpm
安装iptables-services-1.4.21-35.el7.x86_64?? rpm -ivh iptables-services-1.4.21-35.el7.x86_64
如果系统没有iptables的话,也是相同的办法安装即可。
[root@localhost ~]# rpm -ivh iptables-services-1.4.21-35.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:iptables-services-1.4.21-35.el7 ################################# [100%]
[root@localhost ~]#
如果要卸载的话可以使用以下指令:
卸载iptables指令:rpm -e iptables-services-1.4.21-35.el7.x86_64
[root@localhost ~]# rpm -e iptables-1.4.21-35.el7.x86_64
error: Failed dependencies:
iptables = 1.4.21-35.el7 is needed by (installed) iptables-services-1.4.21-35.el7.x86_64
libxtables.so.10()(64bit) is needed by (installed) iproute-4.11.0-30.el7.x86_64
[root@localhost ~]#
如果有依赖关系卸载不掉的话(如上图):
rpm -e --nodeps iptables-services-1.4.21-35.el7.x86_64
[root@localhost ~]# rpm -e --nodeps iptables-1.4.21-35.el7.x86_64
warning: /etc/sysconfig/iptables-config saved as /etc/sysconfig/iptables-config.rpmsave
[root@localhost ~]# rpm -e --nodeps iptables-services-1.4.21-35.el7.x86_64
warning: /etc/sysconfig/iptables saved as /etc/sysconfig/iptables.rpmsave
[root@localhost ~]#
2.2在线安装
# 检查系统中是否已经安装了 iptables rpm -qa |grep iptables(下图是安装了)
[root@localhost ~]# rpm -qa |grep iptables
iptables-1.4.21-35.el7.x86_64
iptables-services-1.4.21-35.el7.x86_64
或者systemctl status iptables.service 查看iptables状态;如下图也是安装了
[root@localhost ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
Active: inactive (dead) since Tue 2022-05-17 02:39:47 PDT; 2h 6min ago
Main PID: 5364 (code=exited, status=0/SUCCESS)
May 13 18:59:22 localhost.localdomain systemd[1]: Stopped IPv4 firewall with iptables.
May 13 18:59:22 localhost.localdomain systemd[1]: Starting IPv4 firewall with iptables...
May 13 18:59:22 localhost.localdomain iptables.init[5364]: iptables: Applying firewall rules: [ OK ]
May 13 18:59:22 localhost.localdomain systemd[1]: Started IPv4 firewall with iptables.
May 17 02:39:46 localhost.localdomain systemd[1]: Stopping IPv4 firewall with iptables...
May 17 02:39:46 localhost.localdomain iptables.init[30312]: iptables: Setting chains to policy ACCEPT: security raw mangle nat fil...OK ]
May 17 02:39:47 localhost.localdomain iptables.init[30312]: iptables: Flushing firewall rules: [ OK ]
May 17 02:39:47 localhost.localdomain systemd[1]: Stopped IPv4 firewall with iptables.
Hint: Some lines were ellipsized, use -l to show in full.
# 安装 iptables
yum install -y iptables
[root@localhost ~]# yum -y install iptables
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package iptables.x86_64 0:1.4.21-35.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================
Installing:
iptables x86_64 1.4.21-35.el7 base 432 k
Transaction Summary
==========================================================================================================================================
Install 1 Package
Total download size: 432 k
Installed size: 1.5 M
Downloading packages:
iptables-1.4.21-35.el7.x86_64.rpm | 432 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
** Found 6 pre-existing rpmdb problem(s), 'yum check' output follows:
firewalld-0.6.3-13.el7_9.noarch has missing requires of iptables
iproute-4.11.0-30.el7.x86_64 has missing requires of libxtables.so.10()(64bit)
libvirt-daemon-driver-network-4.5.0-36.el7.x86_64 has missing requires of iptables
libvirt-daemon-driver-nwfilter-4.5.0-36.el7.x86_64 has missing requires of iptables
2:postfix-2.10.1-9.el7.x86_64 has missing requires of libmysqlclient.so.18()(64bit)
2:postfix-2.10.1-9.el7.x86_64 has missing requires of libmysqlclient.so.18(libmysqlclient_18)(64bit)
Installing : iptables-1.4.21-35.el7.x86_64 1/1
Verifying : iptables-1.4.21-35.el7.x86_64 1/1
Installed:
iptables.x86_64 0:1.4.21-35.el7
Complete!
# 升级 iptables????????
yum update iptables 我这个是最新的了,无需更新
[root@localhost ~]# yum update iptables
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
No packages marked for update
[root@localhost ~]#
# 安装 iptables-services?
yum install iptables-services 我已经用离线方式安装过了,所以提示已经存在。
[root@localhost ~]# yum install iptables-services
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package iptables-services-1.4.21-35.el7.x86_64 already installed and latest version
Nothing to do
[root@localhost ~]#
3.安全策略配置
iptables安全策略有两种配置方式。
方式一:在Linux命令行模式直接输入命令,该方式命令加载在内存中,防火墙规则会立即生效,但是如果不保存的话防火墙安全策略会在重启防火墙后丢失。切记:使用该方式务必进行保存。
方式二:直接配置/etc/sysconfig/iptables文件,配置完成后重启防火墙生效。
iptables默认配置(安装防火墙后自带配置,文件目录/etc/sysconfig/iptables)
重要规则,当请求进来或出去时,匹配到第一条符合要求的规则后,就不再走后面的规则,后面规则不生效。
通过以下两个案例进行说明,我配置两条规则。
案例一、
1.允许IP 196.128.11.2访问3306端口
2.拒绝所有IP访问3306端口
案例二、
1.拒绝所有IP访问3306端口
2.允许IP 196.128.11.2访问3306端口
案例说明:
案例一的话 先走第一条,第二条就不生效了,因此IP196.128.11.2是可以访问3306端口。
案例二先走拒绝所有IP访问3306端口,第二条允许IP196.128.11.2访问就不生效了,因此即使配置了允许,196.128.11.2也无法访问3306端口。
案例一实际上实现的功能为限定指定IP访问指定端口;仅196.128.11.2IP可以访问3306端口
参数说明:
-A? 在指定链的末尾添加(append)一条新的规则
-D? 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I? 在指定链中插入(insert)一条新的规则,默认在第一行添加
-R? 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L? 列出(list)指定链中所有的规则进行查看
-E? 重命名用户定义的链,不改变链本身
-F? 清空(flush)
-N? 新建(new-chain)一条用户自己定义的规则链
-X? 删除指定表中用户自定义的规则链(delete-chain)
-P? 设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n? 使用数字形式(numeric)显示输出结果
-v? 查看规则表详细信息(verbose)的信息
-V? 查看版本(version)
-h? 获取帮助(help)
INPUT为入站规则——进来的数据包应用此规则链中的策略
OUTPUT为出站规则——外出的数据包应用此规则链中的策略?
FORWARD ——转发数据包时应用此规则链中的策略
PREROUTING? ——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
POSTROUTING ——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
-j后面跟的是规则:放行(accept)、拒绝(reject)和丢弃(drop)
3.1以命令行方式配置防火墙规则
?可以先在命令行中执行清空指令,清空系统自带的安全策略,执行以下操作可以将现有规则清空。 #清空所有默认规则iptables -F #清空所有自定义规则iptables -X #所有计数器归0iptables -Z #保存上述规则service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@localhost sysconfig]# iptables -F
[root@localhost sysconfig]# iptables -X
[root@localhost sysconfig]# iptables -Z
[root@localhost sysconfig]# service iptables save
[root@localhost sysconfig]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost sysconfig]#
查看/etc/sysconfig/iptables配置文件,保存是生效的。
命令行执行以下指令:
实现限制仅IP 196.128.1.1可以访问3306端口,这样就漏扫的时候就扫描不到了。
iptables -I INPUT -s 196.128.1.1 -p tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -d 196.128.1.1 -p tcp --sport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
[root@localhost ~]# iptables -I INPUT -s 196.128.1.1 -p tcp --dport 3306 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -d 196.128.1.1 -p tcp --sport 3306 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 3306 -j DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 196.128.1.1 anywhere tcp dpt:mysql
DROP tcp -- anywhere anywhere tcp dpt:mysql
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere 196.128.1.1 tcp spt:mysql
三条指令说明:
第一条:允许IP 196.128.1.1访问3306端口,入站
第二条:允许反馈
第三条:禁止所有IP访问3306端口
第四条:iptables -L 查看防火墙规则
以上安全策略实现的功能是 限定指定IP访问指定端口。仅允许IP 196.128.1.1访问3306端口
切记,以该方式实现的话,务必保存,不然会在服务器或防火墙重启后,安全策略规则丢失。
#保存上述规则service iptables save
3.2直接修改配置文件(推荐该方式)
直接编辑/etc/sysconfig/iptables配置文件,添加以下配置
系统自带的这些配置可以注释掉。
-I INPUT -s 196.128.1.1 -p tcp --dport 3306 -j ACCEPT
-A OUTPUT -d 196.128.1.1 -p tcp --sport 3306 -j ACCEPT
-A INPUT -p tcp --dport 3306 -j DROP
?systemctl restart iptables.service –重启使得配置生效
本机 telnet IP 端口测试下,防护成功
修复规程中遇到的问题:
问题一:本机服务器需要访问数据库,同时我的电脑也需要访问数据库,配置我的电脑的IP允许访问3306端口,结果telnet一直不通;想了一下,是因为我是用VPN跳转访问的,所以访问数据库服务器的IP不是我本机的IP,但是我不知到跳转后的IP是什么,通过以下指令确定
可以过滤出,目前有哪些IP正在访问服务器的3306端口:
[root@localhost 7]# netstat -ntu|grep 3306 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
2 192.168.122.1
需要先允许所有IP访问服务器3306端口,确定好IP后,后面再加限制即可。
问题二:我以直接修改/etc/sysconfig/iptables配置文件方式,重启防火墙之后,安全策略规则会生效,但是持续二十秒左右之后,再次用iptables -L查看,安全策略被清除,查找了半天资料都没搞定。
原因:服务器为云主机,云主机有安全防御策略,把我的策略清除了,需要云主机去掉安全防御策略就解决了。
拓展:
通过本次修复漏洞,了解了相关ipables知识。
iptalbes五链
INPUT, 进站(包含:filter,mangle) OUTPUT, 出站(包含:filter,nat,mangle,raw) FORWARD, 转发(包含:filter,mangle) PREROUTING,前置路由检查(包含:nat,mangle,raw) POSTROUTING 后置路由检查(包含:nat,mangle,raw)
security -->raw-->mangle-->nat-->filter
iptables四表:
filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
我们配置的ipables文件,属于filter表; nat:network address translation 地址转换规则表 mangle:修改数据标记位规则表 raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度 --security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
报文流向
流入本机:PREROUTING --> INPUT–>用户空间进程
流出本机:用户空间进程 -->OUTPUT–> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
|