【转载】企业安全建设之数据库安全(中)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库作为绝大多数互联网公司核心用户数据的存储方式,直接或者间接的成为黑客攻击的重点。伴随倒卖个人信息的黑色产业链的迅猛发展,利用Web漏洞、内外勾结等方式窃取互联网公司的个人数据用于黑市交易的事件屡见不鲜。

本文转载自我在freebuf上的专栏 http://www.freebuf.com/column/151319.html

数据库作为绝大多数互联网公司核心用户数据的存储方式,直接或者间接的成为黑客攻击的重点。伴随倒卖个人信息的黑色产业链的迅猛发展,利用Web漏洞、内外勾结等方式窃取互联网公司的个人数据用于黑市交易的事件屡见不鲜。数据库安全成为甲方安全不可回避的一个重要的工作。本文将介绍数据库规模较大时,如何基于DBProxy进行数据库审计以及简单的防护。

当数据库规模较小时,比如10台以内,可以通过镜像数据库流量或者在数据库上安装审计客户端来进行数据库操作审计以及SQL注入检测。但是当数据库规模较大时,分布式的架构下,镜像数据库流量难以实施;部署审计客户端虽然受分布式影响较小,但是说服DBA在数据库服务器上安装软件本身就是一个慢工细活。于是基于DBProxy进行数据库审计以及SQL注入检测成为一个不错的选择。所谓的DBProxy,可以理解为一个支持数据库协议的代理服务,Web前端通过DBProxy访问数据库服务器,审计和各种控制手段都是在DBProxy上进行。目前360、美团、京东和百度都有对应的解决方案,本文以美团开源的DBProxy为例介绍相关使用,有兴趣的同学也可以搜索其他公司的DDBProxy方案。



本文介绍的DBProxy在美团点评广泛应用,开源和内部使用保持一致。目前只支持MySQL 5.55.6DBProxy其主要功能[1]

l  读写分离

l  从库负载均衡

l  IP过滤

l  分表

l  DBA可平滑上下线DB

l  自动摘除宕机的DB

l  监控信息完备

l  SQL审计与过滤

其中可以作为数据库防火墙功能使用的是IP过滤和SQL审计与过滤。


下载与安装

DBProxy对应的GitHub地址为:

https://github.com/Meituan-Dianping/DBProxy

安装方法如下所示。

yum install -y Percona-Server-devel-55.x86_64Percona-Server-client-55.x86_64 Percona-Server-shared-55  jemalloc jemalloc-devel libeventlibevent-devel openssl openssl-devel lua lua-devel bison flex libtool.x86_64libffi-devel libffi glib2.x86_64 glib2-devel.x86_64 glib2-fam.x86_64 git

git clonehttps://github.com/Meituan-Dianping/DBProxy.git

cd DBProxy/

sh autogen.sh

./configure --prefix=/home/maidou/opt/DBProxy --enable-maintainer-mode

make

make install

配置

为了演示方便,我们继续在我的www.douwaf.com的云主机上测试。拓扑结构如下所示,DBProxy监听本地的3307端口,真实数据库服务MySQL监听3306端口,Web服务器以及数据库管理员均通过DBProxy访问数据库服务。


1)       创建配置文件目录和日志目录

cd /home/maidou/opt/DBProxy/

mkdir log conf

cp /home/maidou/DBProxy/script/source.cnf.samplesconf/douwaf.cnf

2)       编辑配置文件

DBProxy的配置文件默认为conf/start.cnfDBProxy启动时根据实例名称加载对应的配置文件,比如本例中实例名称为douwafDBProxy启动时会自动加载配置文件conf/douwaf.cnfDBProxy可以配置的内容比较多,我们这里介绍几个常见的配置内容。

l  后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔

proxy-backend-addresses=127.0.0.1:3306

l  连接数据库服务的用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密。

pwds=pig:7O7YJJEK

l  设置运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true

daemon=false

l  日志存放的路径

log-path=/home/maidou/opt/DBProxy/log

l  实例名称,用于同一台机器上多个dbproxy实例间的区分

instance=douwaf

l  监听的工作接口IP和端口

proxy-address=0.0.0.0:3307

l  后台MySQL版本号,默认为5.5,我们的环境是5.6

mysql-version=5.6

启动服务

DBProxy提供了启动脚本,文件路径为bin/mysql-proxyd,编辑启动脚本,设置需要根据具体情况配置的环境变量,主要需要配置的就是安装路径。

proxydir=/home/maidou/opt/DBProxy/

启动DBProxy服务,调试阶段强烈建议使用终端运行模式,正式运行使用后台运行模式。

bin/mysql-proxyd douwaf start

案例:使用DBProxy审计SQL语句

测试期间,我们使用MySQL命令行模拟Web程序访问MySQL

1)       直接访问数据库

通过3306端口直接连接数据库,默认使用root账户登录。

./mysql -h127.0.0.1 --port 3306 -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 125

Server version: 5.6.36 MySQL Community Server (GPL)

 查询全部数据库实例名称。

mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

| kippo             |

| mysql             |

| performance_schema |

| test              |

| wordpress         |

+--------------------+

6 rows in set (0.01 sec)

2)       通过DBProxy访问数据库

通过3307端口直接连接数据库,发现root账户已经无法登录。

[root@instance-ubtsv90g bin]# ./mysql -h127.0.0.1--port 3307 -p

Enter password:

ERROR 1045 (28000): Access denied for user'root'@'127.0.0.1' (using password: YES)

使用DBProxy上配置的pig账户连接DBProxy,连接成功,细心的同学估计会发现,回显的数据库版本为5.6.22-71.0-log,而我们真实MySQL5.6.36

[root@instance-ubtsv90g bin]# ./mysql -upig   -h127.0.0.1 --port 3307 -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.6.22-71.0-log MySQL CommunityServer (GPL)

Copyright (c) 2000, 2017, Oracle and/or itsaffiliates. All rights reserved.

查询全部数据库实例名称,与直接连接数据库查询的内容一致。

mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

| kippo             |

| mysql             |

| performance_schema |

| test              |

| wordpress         |

+--------------------+

6 rows in set (0.01 sec)

查看DBProxy douwaf实例的连接日志douwaf.log,记录下了rootpig账户的登录情况。

2017-07-28 10:22:48.707429:(warning)proxy-plugin.c:1188(proxy_read_auth) event_thread(1) C:127.0.0.1:51766S:127.0.0.1:3307(thread_id:0) Usr:root Db: Access denied for user'root'@'127.0.0.1' (using password: YES)

2017-07-28 10:22:48.707487: (warning)network-mysqld.c:1647(network_mysqld_con_handle):event_thread(1) C:127.0.0.1:51766 C_usr:root CON_STATE_READ_AUTH process authpacket failed

2017-07-28 10:23:05.162088:(message)network-conn-pool-lua.c:425(self_connect): event_thread(2)C:127.0.0.1:51788 C_usr:pig C_db: S:127.0.0.1:3306(thread_id:292) createbackend connection success

查看DBProxy douwaf实例的SQL审计日志sql_douwaf.log,记录下了相应的查询行为。

[root@instance-ubtsv90g sql]# tail -fsql_douwaf.log

2017-07-28 10:23:05.164223: C_begin:2017-07-2810:23:05.161541 C:127.0.0.1:51788 C_db: C_usr:pigS:127.0.0.1:3306(thread_id:292) S_db: S_usr:pig inj(type:4 bytes:33 rows:1)2.612(ms) OK Query:select @@version_comment limit 1

2017-07-28 10:26:49.353570: C_begin:2017-07-2810:26:49.352848 C:127.0.0.1:51788 C_db: C_usr:pig S:127.0.0.1:3306(thread_id:292)S_db: S_usr:pig inj(type:4 bytes:89 rows:6) 0.639(ms) OK Query:show databases

案例:使用DBProxy进行SQL过滤

DBProxy本身的功能是做数据库代理,透明实现读写分析,主从负载,之所以我们也使用它作为数据库防火墙,主要就是因为它强大的SQL过滤功能。配置文件中与SQL过滤功能相关的功能如下所示。

#设置黑名单文件所在的路径

blacklist-file=/home/maidou/opt/DBProxy/conf/sqlblacklist.conf 

#设置手动添加的拦截语句是否生效,默认是不生效 ON:生效 OFF:不生效                                               

manual-filter-flag=ON                

#设置自动添加的拦截语句是否生效,默认是不生效 ON:生效 OFF:不生效 

auto-filter-flag=OFF                    

测试期间,我们假设要限制使用命令show databases,编辑sqlblacklist.conf文件,其中blacklist_0表示规则的序列号,filter表示限制的SQL语句,is_enabled表示是否是能,1为使能,0为不使能。

[blacklist_0]

filter=show databases

is_enabled=1

使用DBProxy上配置的pig账户连接DBProxy

[root@instance-ubtsv90g bin]# ./mysql -upig   -h127.0.0.1 --port 3307 -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.6.22-71.0-log MySQL CommunityServer (GPL)

Copyright (c) 2000, 2017, Oracle and/or itsaffiliates. All rights reserved.

查询全部数据库实例名称,查询失败,我们的过滤策略生效。

mysql> show databases;

ERROR 1105 (07000): Proxy Warning - BlacklistForbidden

mysql>

查看DBProxy douwaf实例的连接日志douwaf.log,记录下了SQL过滤的日志。

2017-07-28 11:33:04.143579:(warning)proxy-plugin.c:4103(filter_pre)event_thread(1) C:127.0.0.1:53206Query:show databases fobidden by filter:show databases

2017-07-28 11:33:04.143641:(critical)proxy-plugin.c:2137(proxy_read_query) event_thread(1)C:127.0.0.1:53206 S:127.0.0.1:3307(thread_id:0) Usr:pig Db: Proxy Warning -Blacklist Forbidden

通过3306端口直接连接数据库,默认使用root账户登录。

./mysql -h127.0.0.1 --port 3306 -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 125

Server version: 5.6.36 MySQL Community Server (GPL)

 查询全部数据库实例名称,命令正常执行。

mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

| kippo             |

| mysql             |

| performance_schema |

| test              |

| wordpress         |

+--------------------+

6 rows in set (0.01 sec)



[1] http://www.cnblogs.com/olinux/p/6626347.html

[2] https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/USER_GUIDE.md#3.1.1


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
13 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
28天前
|
安全 NoSQL 关系型数据库
阿里云数据库:助力企业数字化转型的强大引擎
阿里云数据库:助力企业数字化转型的强大引擎
|
1月前
|
安全 NoSQL 关系型数据库
阿里云数据库:构建高性能与安全的数据管理系统
在企业数字化转型过程中,数据库是支撑企业业务运转的核心。随着数据量的急剧增长和数据处理需求的不断增加,企业需要一个既能提供高性能又能保障数据安全的数据库解决方案。阿里云数据库产品为企业提供了一站式的数据管理服务,涵盖关系型、非关系型、内存数据库等多种类型,帮助企业构建高效的数据基础设施。
54 2
|
29天前
|
存储 NoSQL MongoDB
小川科技携手阿里云数据库MongoDB:数据赋能企业构建年轻娱乐生态
基于MongoDB灵活模式的特性,小川实现了功能的快速迭代和上线,而数据库侧无需任何更改
|
29天前
|
运维 NoSQL BI
简道云搭载阿里云MongoDB数据库,帮助数以万计企业重构业务系统
通过与MongoDB和阿里云团队的合作,让简道云少走了弯路,保障了线上服务的长期稳定运行,提高了吞吐效率,并相应降低了线上运行成本
|
1月前
|
NoSQL 关系型数据库 OLAP
如何选择最合适的数据库,帮助企业及个人业务更好的开展
如何选择最合适的数据库,帮助企业及个人业务更好的开展
|
3月前
|
关系型数据库 分布式数据库 数据库
安全可靠的国产自研数据库PolarDB V2.0,让数据库开发像“搭积木”一样简单!
安全可靠的国产自研数据库PolarDB V2.0,让数据库开发像“搭积木”一样简单!
安全可靠的国产自研数据库PolarDB V2.0,让数据库开发像“搭积木”一样简单!
|
3月前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
164 1
|
3月前
|
存储 安全 关系型数据库
"揭秘!如何设计数据库架构,让信息系统心脏强健无比?一场关于数据效率、安全与可扩展性的深度探索"
【8月更文挑战第19天】数据库架构是信息系统的核心,关乎数据存储效率与安全及应用性能和扩展性。优秀设计需综合考量业务需求、数据模型选择、查询优化、事务处理、安全性和扩展性。首先,深刻理解业务需求,如电商系统需高效处理并增长商品、订单等数据。其次,基于需求选择合适的数据模型,如关系型或非关系型数据库。再者,优化查询性能与索引策略以平衡读写负载。同时,考虑事务处理和并发控制以保证数据一致性和完整性。最后,加强安全性措施和备份恢复策略以防数据风险。通过这些步骤,可以构建稳健高效的数据库架构,支持系统的稳定运行。
39 0
|
4月前
|
存储 运维 NoSQL
现代化企业管理中的数据库选择与优化策略
在当今信息化时代,企业管理越来越依赖于高效的数据库系统来支撑业务运作。本文探讨了在选择和优化数据库时需要考虑的关键因素,包括数据类型、访问模式以及性能需求。通过分析不同数据库系统的特性和优劣势,帮助企业在面对日益复杂的业务需求时,选择合适的数据库解决方案,提升管理效率和业务运行质量。