设为首页 收藏本站
查看: 841|回复: 0

[经验分享] 为MySQL设置安全的远程连接

[复制链接]

尚未签到

发表于 2018-10-1 08:31:13 | 显示全部楼层 |阅读模式
  需求:开发、测试部门需要对准生产和生产数据库进行远程访问。
  有一阵子,是直MySQL层面接授予最小权限,并限制只允许从公司出口ip访问;iptables层面也是针对数据库端口只允许公司出口ip访问。
  但是这个样子终究觉得不够放心。后来研究了下MySQL的登录过程(wireshark抓包和参考官方文档),虽然说MySQL实现的登录机制(这里有机会单独说)基本不存在泄露密码的风险(理论上存在被破解的可能,但是也会相当费劲),但是登录之后的SQL语句和执行结果的传输却都是明文传输的。
  这对于运维来说是不可容忍的,必须搞加密。
  一开始打算通过MySQL原生的ssl来实现:
  大致研究了下:
  首先检查服务器是否支持ssl,
  

mysql> show global variables like '%ssl%';  
+---------------+----------+
  
| Variable_name | Value    |
  
+---------------+----------+
  
| have_openssl  | DISABLED |
  
| have_ssl      | DISABLED |
  

  
## have_openssl is alias of have_ssl
  

  YES if mysqld supports SSL connections, NO if not. DISABLED indicates that the server was compiled with SSL support, but was not started with the appropriate --ssl-xxx options
  To use SSL connections between the MySQL server and client programs, your system must support either OpenSSL or yaSSL:
  · MySQL Enterprise Edition binary distributions are compiled using OpenSSL. It is not possible to use yaSSL with MySQL Enterprise Edition.
  · MySQL Community Edition binary distributions are compiled using yaSSL.
  · MySQL Community Edition source distributions can be compiled using either OpenSSL or yaSSL

  To determine whether your server was compiled using OpenSSL, test the existence of any of those variables. For example, this statement returns a row if OpenSSL was used and an empty result if yaSSL was used:
  

SHOW STATUS LIKE 'Rsa_public_key';  

  如何配置:
  参见https://dev.mysql.com/doc/refman/5.6/en/using-secure-connections.html
  参见https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-files-using-openssl.html
  综合考虑,基于mysql(5.7之前)原生支持的ssl配置安全连接,需要手动在server和client端生成对应的证书,公钥、私钥等文件:一是服务端配置步骤较为繁琐;二是客户端的配置也要增加用户证书及私钥等文件,还得算上指导相关修改配置的时间,感觉有些小题大做了。
  5.7的ssl配置及性能损失参考
  之前就知道ssh能实现端口转发,正好借此需求深入研究一番
  最终解决方案:
  通过ssh的端口转发,简单说就是:


  • 让一台本地server和远程server间建立一个长ssh连接(ssh隧道),该隧道openssh有保活机制,默认300s会发送noop保持存活(抓包观察到)
  • 同时openssh会在本地(内网)server监听一个端口,目标是该本地IP:port的流量通过ssh隧道经由远程server转发到对应的目标server的内网IP:port
  • 这样,数据库只需要给远程账号授权该中间server的内网ip即可。即在公网上的传输是经过ssh隧道保证了安全
  配置步骤


  •   

    [kai@git-svn ~]$ cat .ssh/config  
    ControlPath ~/.ssh/master-%r@%h:%p
      
    ControlMaster auto
      

      上述配置详细信息,参考man ssh_config

  •   

      
    [kai@git-svn ~]$ ssh -MNf -L 172.18.200.23:33062:192.168.1.2:3306 ljk@178.19.39.2
      
    [kai@git-svn ~]$ ssh -MNf -L 172.18.200.23:33065:192.168.1.5:3306 ljk@178.19.39.2
      


  #实验过程中发现针对一个“中继主机”实现两个“本地端口转发”,会有如下报错,但是经验证不影响使用
  ControlSocket /home/kai/.ssh/master-kai@178.19.39.2:22 already exists, disabling multiplexin
  

  
如此,相关需求人员的MySQL客户端软件就只需要更改下对应库的ip:port,其他都不需改变,以对用户最小的改变实现了安全性的需求。
  

  
[**关于SSH ControlMaster and ControlPath:**](https://ldpreload.com/blog/ssh-control)
  
[参考1](https://www.reddit.com/r/git/comments/3h7hbm/can_one_maintain_a_constant_ssh_connection_to_a/#content)
  

  
> You want SSH's ControlMaster feature. I wrote a blog post about using it with git a little while back. Briefly, you set a ControlPath so all your SSH processes know how to find each other, and then you make one connection as a "master" that stays around forever. Every other SSH will check for an existing, shared connection before making a new one, which lets them skip authentication.
  

  
>You may also want to use -o ServerAliveInterval=30 or something on the master, which sends a keep-alive packet over the SSH connection every 30 seconds. Depending on your network and server configuration, you may need this to prevent the connection from timing out.
  

  
---
  
[全局参考1](http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html)
  
[全局参考2](http://blogs.perl.org/users/smylers/2011/08/ssh-productivity-tips.html)
  
[全局参考3 OpenSSH/Cookbook/Multiplexing](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-606941-1-1.html 上篇帖子: MySQL Cluster 与 MongoDB集群 下篇帖子: MySQL show processlist;命令详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表