用证书加密保护你的Galera数据库集群

前言

今天发现Galera数据库集群默认状态下如果没有用iptables或者机房防火墙墙制定4567端口的访问权限,所有人都能够直接把你整个数据库给拖下来。因为默认的async同步方式不需要验证,任何人都可以向集群请求SST(传输状态存档,大概就是这个意思,可以理解为一整个数据库)而不需要验证。

Orz我的天,幸好发现了这个问题,不然到时候整个数据库被人拉下来用户密码全部暴露了就不好玩了。我上网搜了一整天,终于研究出一个有效的不用防火墙也能保护数据库的方法。

准备

首先你需要一台电脑

你需要生成一个CA,一个私匙和一个证书。这用Openssl很容易一就能搞上一份。

注意:

  1. 一定一定要用RSA的密匙,包括CA也需要使用RSA的。我才不会告诉你我在ECC的CA上浪费了一个小时寻找错误
  2. 内容(CN啊OU啊之类的)随便填,但是CA的CN(常用名)和证书的CN不能一样,不然会认为是自签名证书而无法认证。

不懂怎么用Openssl的可以参考这份文档进行配置,只需要生成server key即可。

配置数据库

  1. 打开/etc/mysql/conf.d/mariadb.cnf(如果你是用我这篇文章所介绍的方法安装的话,不是的话可以直接在conf.d里面新建一个文本wsrep.cnf(名字随便,只要cnf后缀即可),添加进这么一行:
    [mysqld]
    ...
    wsrep_provider_options="socket.ssl_key=/etc/mysql/你的私匙.key; socket.ssl_cert=/etc/mysql/你的证书.crt; socket.ssl_ca=/etc/mysql/你的CA.crt; socket.ssl_compression=YES";
    

    *注意,私匙、证书和CA需要上传到所有的集群服务器上。这个配置文件也应该在所有服务器上面改*

  2. 然后停掉所有的服务器
  3. 然后在其中一台执行service mysql start --wsrep-new-cluster
  4. 等20秒(其实应该5秒就好了),在其它的机子上执行service mysql start
  5. 至此一切配置完毕。当别人没有密匙的时候,无法与集群建立连接,所以就没法拖你的数据库了。

关联文章: