Archery icon indicating copy to clipboard operation
Archery copied to clipboard

无法添加开启了ssl 的 mysql实例

Open kikizq opened this issue 5 years ago • 17 comments

问题描述

mysql 实例开启了ssl ,require_secure_transport设置为ON。在平台上添加该实例,将出现错误。

3159, 'Connections using insecure transport are prohibited while --require_secure_transport=ON.

版本信息

  • 应用版本/分支:Release v1.7.12
  • 部署方式:Docker

kikizq avatar Oct 14 '20 06:10 kikizq

开启 ssl 的实例确实没见过, 😅 是不是加个选项就行, 需要有证书吗?

LeoQuote avatar Oct 14 '20 06:10 LeoQuote

navicat 连接勾选ssl ,不需要添加证书即可连接。mysql 命令行客户端也是不需要做什么特别的也可以连接。 是不是class MysqlEngine 里的mysqldb 的连接需要添加额外参数呢。

kikizq avatar Oct 14 '20 07:10 kikizq

https://github.com/hhyo/Archery/blob/3343a7022da21f42614f2d71dde40e8e2c79c216/sql/engines/mysql.py#L30-L48 就在这, 是不是要加个什么选项

LeoQuote avatar Oct 14 '20 08:10 LeoQuote

mysqldb 需要加ssl 证书,建议是否考虑换成pymysql

kikizq avatar Oct 14 '20 10:10 kikizq

在上面的get_connection函数中,如果使用pymysql模块,在connect里添加ssl={"fake_flag_to_enable_tls":True},就可以正常连接开启了ssl的实例。

solon-liu avatar Oct 15 '20 01:10 solon-liu

https://github.com/hhyo/Archery/commit/4ad72880c5bbf970636bedacd9fdcc3a4c59b37f pymysql 去年去掉了, mysqldb 没有办法吗?

LeoQuote avatar Oct 15 '20 06:10 LeoQuote

基于什么原因去掉pymysql而使用mysqldb呢,mysqldb还没有找到方法

solon-liu avatar Oct 15 '20 06:10 solon-liu

感觉这个fake ssl 也不是特别好的方案, 本来是为了增加安全性, 这样不是会被中间人吗?

感觉要做的话, 可能提供一下 ca 上传比较好

LeoQuote avatar Oct 15 '20 12:10 LeoQuote

那得看他的fake ssl具体是怎么实现的了,我猜测传输还是加密的。 按理说数据库作为服务端,开启了必须通过ssl的远程连接,如果客户端能这么简单的就破解了不用加密传输,这就不是改变客户端的配置问题了,而是mysql的服务端ssl验证的安全性问题了。 我以为加上ca证书只是加强了客户端的连接验证,但是数据传输始终都是加密的?

solon-liu avatar Oct 15 '20 13:10 solon-liu

需要ssl的可以参考这个进行修改https://github.com/getredash/redash/blob/db4e97fa6f8d4c3e4d0ca37d06b743a22079da8e/redash/query_runner/mysql.py#L75

hhyo avatar Oct 15 '20 14:10 hhyo

其实需求是这样的,mysql服务端开启了ssl模式。其他客户端的连接,比如java都只需要加上sslMode=Required就可以正常连接了,都不需要客户端提供ca证书验证的。pymysql模块也可以加参数,但是mysqldb里好像没有这样的方法?因为每个实例都要用ca证书来做身份验证,就搞麻烦了。

solon-liu avatar Oct 16 '20 01:10 solon-liu

MySQLdb支持ssl-model的选项,可以调整为PREFERRED试试 https://github.com/PyMySQL/mysqlclient-python/blob/ca630c01fb39f252a4c91a525e440beea4ac4447/MySQLdb/connections.py#L113-L119

参考:https://dev.mysql.com/doc/refman/5.7/en/connection-options.html#option_general_ssl-mode

hhyo avatar Oct 17 '20 04:10 hhyo

感觉这个fake ssl 也不是特别好的方案, 本来是为了增加安全性, 这样不是会被中间人吗?

感觉要做的话, 可能提供一下 ca 上传比较好

MySQL配置ssl,一般都只做服务端单向检验,所以只要客户端信任就行,保证数据传输是加密的,要避免中间人攻击可以给账号配置规则,不过比较少会用到

https://dba.stackexchange.com/questions/205219/why-am-i-connecting-securely-to-mysql-when-i-dont-have-client-certificates

https://dev.mysql.com/doc/refman/5.7/en/create-user.html#create-user-tls

hhyo avatar Oct 17 '20 04:10 hhyo

做了代码的debug ,现在用的这个 截屏2020-10-19下午3 33 52 并没有ssl-mode 的选项

kikizq avatar Oct 19 '20 07:10 kikizq

升级到2.0的版本是有的,我这边本地测试可以连接,不过你用ssl,要改的地方比较多,因为执行是通过goinception或者inception去操作,相关的地方也需要调整

hhyo avatar Oct 20 '20 15:10 hhyo

AWS 的 redis 连接也需要 TLS 才能管理,这个是否会考虑一并添加呢

michael-liumh avatar Sep 13 '22 09:09 michael-liumh

AWS 技术支持人员给的答复如下 image

michael-liumh avatar Sep 13 '22 09:09 michael-liumh