Ansible使用REQUIRE SSL创建MySQL用户

5
我刚刚开始学习Ansible,进展神速,已经可以自动化我们整个IT堆栈了,这太好了!但我遇到了难题。我们选择忍受一些性能损失并使用SSL功能加密所有MySQL连接,以便让我们的办公室IP远程管理它,也可以在数据中心之间使用。使用“mysql_user”模块,我可以确保用户被添加,并设置密码等。但是我似乎找不到任何强制用户使用SSL的方法?根据快速谷歌和文档中缺少的选项,我猜测无法使用mysql_user来实现。但真正的问题是:您知道(最好是干净的)解决方法吗? 如果我可以用Ansible执行原始查询,那就太完美了。具体而言,我需要在Ansible中复制此SQL,但任何可能的方法都可以:
GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘pass’ REQUIRE SSL;

我知道在没有“REQUIRE SSL”语句的情况下仍然可以使用SSL,但我只想强制执行它,这样就不会有“新手”(或疲惫的我)在没有SSL的情况下连接到服务器,如果确实发生了这种情况,我希望立即出现连接错误,以便我知道出了什么问题。这就是为什么我想要强制执行它的原因。 - Henrik
这并不是直接回答你的问题,但是考虑到安全性,建议将MySQL仅监听在127.0.0.1上,并使用SSH隧道进行远程管理,而不是将其暴露在互联网上(即使已经启用了SSL)。 - Mxx
谢谢@Mxx,我已经考虑过了。老实说,我只是喜欢简单性和保持安全性。服务器只开放给办公室IP,所以我不认为这是一个大问题。我只是想在数据传输时保护数据,以防止我们ISP上的普通系统管理员观察者等人员。尽管如此,未来我可能会这样做,因为即使只对特定IP开放,暴露的MySQL服务器感觉很“肮脏”。 - Henrik
通过SSH,那些随意观察的人甚至不会知道你有mysql流量经过,因为一切都将被封装在SSH中。设置SSH隧道只需要一个命令。 - Mxx
2个回答

5

这对我有用,不需要使用 append_privs 选项(ansible 2+)

priv='some_db.*:ALL,GRANT,REQUIRESSL'

2
我相信你可以使用mysql_user模块来实现这个功能:
- mysql_user: name=bob password=12345 append_privs=*.*:REQUIRESSL

通过使用 "append_privs",您只需将 "REQUIRE SSL" 添加到 bob 的现有权限中即可。
如果您想手动执行此操作,则可能会变得有些麻烦,但您始终可以通过 command 模块调用 mysql 客户端。假设您已为 mysql 用户和主机定义了变量:
- command: mysql -u {{ myslq_user }} -h {{ mysql_host }} -p{{ mysql_password }} "GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘pass’ REQUIRE SSL;"

更新:在确保安装了正确的Python库后,我进行了一些测试,并成功地使其正常工作:

- hosts: myhost
  name: test
  user: my-user
  tasks:
    - local_action: mysql_user
                    user=foo
                    host='%'
                    password=bar
                    state=present
                    append_privs=yes
                    login_host=<my_database_host>
                    login_user=<my_database_root_user>
                    login_password=<my_database_root_password>
                    priv='*.*:REQUIRESSL'

以上导致了以下结果:
mysql> show grants for 'foo'@'%';
+----------------------------------------------------------------------------------------------------------------+
| Grants for foo@%                                                                                               |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'foo'@'%' IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' REQUIRE SSL |
+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

1
嗯,我尝试了使用append_privs的方法,但是出现了错误“msg: Boolean *.*:require ssl not in either boolean list”,所以我认为它不起作用,因为它不是mysql的“priv_type”。 - codercake
有趣。我看了一下mysql模块的源代码,发现有“require ssl”的引用,这似乎意味着它应该可以工作。如果下周我有时间,我会试着弄清楚…… - Bruce P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接