【轉載】企業安全建設之數據庫安全(中)
本文轉載自我在freebuf上的專欄 https://www.freebuf.com/column/151319.html
數據庫作為絕大多數互聯網公司核心用戶數據的存儲方式,直接或者間接的成為黑客攻擊的重點。伴隨倒賣個人信息的黑色產業鏈的迅勐發展,利用Web漏洞、內外勾結等方式竊取互聯網公司的個人數據用於黑市交易的事件屢見不鮮。數據庫安全成為甲方安全不可回避的一個重要的工作。本文將介紹數據庫規模較大時,如何基於DBProxy進行數據庫審計以及簡單的防護。
當數據庫規模較小時,比如10台以內,可以通過鏡像數據庫流量或者在數據庫上安裝審計客戶端來進行數據庫操作審計以及SQL注入檢測。但是當數據庫規模較大時,分布式的架構下,鏡像數據庫流量難以實施;部署審計客戶端雖然受分布式影響較小,但是說服DBA在數據庫服務器上安裝軟件本身就是一個慢工細活。於是基於DBProxy進行數據庫審計以及SQL注入檢測成為一個不錯的選擇。所謂的DBProxy,可以理解為一個支持數據庫協議的代理服務,Web前端通過DBProxy訪問數據庫服務器,審計和各種控製手段都是在DBProxy上進行。目前360、美團、京東和百度都有對應的解決方案,本文以美團開源的DBProxy為例介紹相關使用,有興趣的同學也可以搜索其他公司的DDBProxy方案。
本文介紹的DBProxy在美團點評廣泛應用,開源和內部使用保持一致。目前隻支持MySQL 5.5和5.6,DBProxy其主要功能[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.cnf,DBProxy啟動時根據實例名稱加載對應的配置文件,比如本例中實例名稱為douwaf,DBProxy啟動時會自動加載配置文件conf/douwaf.cnf。DBProxy可以配置的內容比較多,我們這裏介紹幾個常見的配置內容。
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,而我們真實MySQL是5.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,記錄下了root和pig賬戶的登錄情況。
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] https://www.cnblogs.com/olinux/p/6626347.html
[2] https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/USER_GUIDE.md#3.1.1
最後更新:2017-10-20 10:03:26