OneProxy :: 合理设置安全选项来增强数据库的安全性,非常实用的技巧。

由于所有的流量都经过代理中间件,因此可以在OneProxy里定制各种安全策略来增强数据库的安全性。比如禁止DDL语句、要求查询语句中必须有Where条件、或者禁止删除语句,也可以禁止所有的DML语句,或者根据你的业务需求进行安全功能定制。

database_security_improve

可以使用如下选项来定制应用程序或用户对数据库的访问等级。

  1. proxy-security-level, 在整个Proxy上设置安全访问等级。
  2. proxy-group-security,对某一个MySQL集群设置安全访问等级。
  3. proxy-table-security,对某张表(根据表名)设置安全访问等级。

对于安全访问等级,则使用不同的比特位来表示不同的访问权限。

  1. 任何非零值(通常为“1”)将会禁止DDL语句(Create / Alter / Drop / Truncate / Rename)的执行,这是默认行为(proxy-group-security选项的默认值为“1”)。
  2. 值“2”强制查询/更新/删除语句有一个明显的Where条件,比如“select * from tab”将会被禁止执行,而“select * from tab where 1=1”则会被允许执行。
  3. 值“4”将会禁止Delete语句的执行,以避免应用程序或用户误删除数据。
  4. 值“8”将会禁止所有的DDL语句,将变成只读状态,可以布署OneProxy来当作自助查询系统。

如果有应用或用户违反安全策略,将会返回如下错误,并且会在按客户端统计的性能数据中反映出来,会记录每个IP地址违反安全策略的次数

mysql> drop table abc;
ERROR 1044 (42000): Access denied due to security policy, DDL disabled or DML restricted!

对于应用程序来讲,默认禁用DDL语句是非常合理的,一般都不允许应用程序动态执行DDL语句。但对于DBA来讲,就不合适了,每次应用发布时都会多多少少地伴随着部份数据库表结构的变更,可以通过“proxy-secure-clietn”选项设置部份IP地址为可信IP地址,来跳过前面所示的安全策略,由于DBA一般从固定的几台机器登录,这将极大地方便运维工作,例如“127.0.0.1”表示信任OneProxy所在机器本地登录的所有连接。

密码保护对数据库安全来讲十分重要,但在应用程序中必须使用明文密码来进行数据库连接,其实是有比较大的安全风险的,意味着从应用程序中一定能够找出数据库的明文密码。当使用OneProxy中间件后,由于接管了整个应用登录过程(参照连接池功能介绍),因此可以在中间件上设置不同于数据库用户密码的应用登录密码专门用于应用程序到中间件的连接,从而应用不需要知道数据库用户的真实密码,将更有利于数据库的安全。可以在“proxy-user-list”选项里指定应用连接OneProxy的密码,而在“proxy-user-group”选项里指定OneProxy连接后端数据库的真实用户密码,如下所示:

[oneproxy]
......
proxy-address = :3307
proxy-master-addresses.1 = 192.168.1.119:3306@server1

proxy-user-list = test/956C97523BADD23B6091B09E332A77B5CBDBBEEF@test
proxy-user-group = server1:test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3

即使你从应用服务器上得到了密码,也只能连接到OneProxy中间件,受其监控和安全控制,但无法直接登录后端的MySQL数据库,因为前后端指定使用了不同的密码。

[root@rh4srv1 oneproxy]# mysql -utest -p123 -h127.0.0.1 -P3307 -e "select now()"
+---------------------+
| now()               |
+---------------------+
| 2016-01-10 09:38:20 |
+---------------------+
[root@rh4srv1 oneproxy]# mysql -utest -p123 -h127.0.0.1 -P3306 -e "select now()"
ERROR 1045 (28000): Access denied for user 'test'@'127.0.0.1' (using password: YES)

两层密码机制将使你可以定期更改数据库的真实密码,而无须应用程序重新发布。所有的数据库操作都将被OneProxy中间件记录而得以审计,或者受到SQL白名单的严格安全管制。