在Ubuntu 16.04上,如何为MySQL配置SSL/TLS

作者:无名 - 电脑 -

介绍

mysql是世界上最流行的开放源码关系数据库管理系统。

默认情况下,mysql被配置为只接受本地连接,如果需要允许远程连接,那么安全地进行操作是很重要的,在本指南中,我们演示如何在ubuntu 16.04上配置mysql以接受与ssl/tls加密的远程连接。

前提条件

要跟随这个指南,你需要两台ubuntu 16.04服务器,使用一个作为mysql服务器,另一个作为客户端,在每个服务器上创建有sudo权限的非root用户,按照ubuntu 16.04初始服务器设置指南将你的服务器置于适当的初始状态。

在第一台机器上,你应该安装,并且配置了mysql服务器,按照ubuntu 16.04的mysql安装指南来安装和配置软件。

在第二台机器上,安装mysql客户,你可以更新apt软件包索引,并通过键入以下命令安装必需的软件:

sudo apt-get update

sudo apt-get install mysql-client

当你的服务器和客户端准备就绪时,请继续以下操作。

检查当前ssl/tls状态

在开始之前,我们可以在mysql服务器实例上检查ssl/tls的当前状态。

使用root mysql用户登录到一个mysql会话,为了强制客户端与tcp连接而不是使用本地套接字文件,使用-h来指定ipv4本地回送接口,这将允许我们检查tcp连接的ssl状态:

mysql -u root -p -h 127.0.0.1

你将被提示输入安装过程中选择的root密码,之后,你将进入交互式的mysql会话中。

通过键入以下命令显示ssl/tls变量的状态:

show variables like '%ssl%';

output+---------------+----------+

| variable_name | value |

+---------------+----------+

| have_openssl | disabled |

| have_ssl | disabled |

| ssl_ca | |

| ssl_capath | |

| ssl_cert | |

| ssl_cipher | |

| ssl_crl | |

| ssl_crlpath | |

| ssl_key | |

+---------------+----------+

9 rows in set (0.01 sec)

have_opensslhave_ssl变量都标记为disabled ,这意味着ssl功能已经编译到服务器中,但是它还没有被启用。

检查当前连接的状态以确认:

s

output--------------

mysql ver 14.14 distrib 5.7.17, for linux (x86_64) using editline wrapper

connection id: 30

current database:

current user: root@localhost

ssl: not in use

current pager: stdout

using outfile: ''

using delimiter: ;

server version: 5.7.17-0ubuntu0.16.04.1 (ubuntu)

protocol version: 10

connection: 127.0.0.1 via tcp/ip

server characterset: latin1

db characterset: latin1

client characterset: utf8

conn. characterset: utf8

tcp port: 3306

uptime: 3 hours 38 min 44 sec

threads: 1 questions: 70 slow queries: 0 opens: 121 flush tables: 1 open tables: 40 queries per second avg: 0.005

--------------

正如上面的输出表明,连接当前没有使用ssl,即使我们通过tcp连接。

完成后关闭当前的mysql会话:

exit

现在我们可以开始为ssl配置mysql来保护连接。

生成ssl/tls证书和密钥

我们首先需要生成适当的证书和密钥文件来启用对mysql的ssl连接,一个名为mysql_ssl_rsa_setup的实用程序提供了mysql 5.7和上面的来简化这个过程,ubuntu 16.04有一个兼容的mysql版本,所以,我们可以使用这个命令生成必要的文件。

这些文件将在/var/lib/mysql目录的数据中创建,

sudo mysql_ssl_rsa_setup --uid=mysql

生成将产生类似于下面这样的输出:

outputgenerating a 2048 bit rsa private key

...................................+++

.....+++

writing new private key to 'ca-key.pem'

-----

generating a 2048 bit rsa private key

......+++

.................................+++

writing new private key to 'server-key.pem'

-----

generating a 2048 bit rsa private key

......................................................+++

.................................................................................+++

writing new private key to 'client-key.pem'

-----

键入以下命令检查生成的文件:

sudo find /var/lib/mysql -name '*.pem' -ls

output 256740 4 -rw-r--r-- 1 mysql mysql 1078 mar 17 17:24 /var/lib/mysql/server-cert.pem

256735 4 -rw------- 1 mysql mysql 1675 mar 17 17:24 /var/lib/mysqlsql/ca-key.pem

256739 4 -rw-r--r-- 1 mysql mysql 451 mar 17 17:24 /var/lib/mysqlsql/public_key.pem

256741 4 -rw------- 1 mysql mysql 1679 mar 17 17:24 /var/lib/mysqlsql/client-key.pem

256737 4 -rw-r--r-- 1 mysql mysql 1074 mar 17 17:24 /var/lib/mysqlsql/ca.pem

256743 4 -rw-r--r-- 1 mysql mysql 1078 mar 17 17:24 /var/lib/mysqlsql/client-cert.pem

256736 4 -rw------- 1 mysql mysql 1675 mar 17 17:24 /var/lib/mysqlsql/private_key.pem

256738 4 -rw------- 1 mysql mysql 1675 mar 17 17:24 /var/lib/mysqlsql/server-key.pem

最后一列显示生成的文件名,显示"mysql"表明生成的文件拥有正确的用户和组所有权。

这些文件是证书颁发机构(以" ca "开头),mysql服务器进程(以" server "开头)和mysql客户端(以" client "开头)的密钥和证书对。此外,mysql使用private_key.pempublic_key.pem文件在不使用ssl的情况下安全地传输密码。

在mysql服务器上启用ssl连接

现代mysql版本将在服务器启动时在mysql数据目录中查找相应的证书文件,因此,我们实际上不需要修改mysql配置来启用ssl 。

我们只需重新启动mysql服务:

sudo systemctl restart mysql

重新启动后,使用与前面相同的命令打开一个新的mysql会话,如果服务器支持,mysql客户端将自动尝试使用ssl进行连接:

mysql -u root -p -h 127.0.0.1

来看看上次我们请求的相同信息,检查ssl相关变量的值:

show variables like '%ssl%';

output+---------------+-----------------+

| variable_name | value |

+---------------+-----------------+

| have_openssl | yes |

| have_ssl | yes |

| ssl_ca | ca.pem |

| ssl_capath | |

| ssl_cert | server-cert.pem |

| ssl_cipher | |

| ssl_crl | |

| ssl_crlpath | |

| ssl_key | server-key.pem |

+---------------+-----------------+

9 rows in set (0.00 sec)

have_opensslhave_ssl变量在这次读取"yes"而不是"disabled" 此外,ssl_cassl_certssl_key变量已经用我们生成的相关证书的名称填充。

接下来,再次检查连接详细信息:

s

output--------------

. . .

ssl: cipher in use is dhe-rsa-aes256-sha

. . .

connection: 127.0.0.1 via tcp/ip

. . .

--------------

这次,显示特定的ssl密码,表示使用ssl来保护连接。

退出到shell :

exit

服务器现在能够使用加密,但是需要一些额外的配置来允许远程访问和授权使用安全连接。

为远程客户端配置安全连接

现在服务器上有了可用的ssl,我们可以开始配置安全远程访问了,要做到这一点,我们需要:

远程连接需要ssl
绑定到公共接口
为远程连接创建mysql用户
调整防火墙规则以允许外部连接

使用强制ssl配置远程访问

目前,mysql服务器被配置为接受来自客户端的ssl连接,但是如果客户端请求,它仍然允许未加密连接。

通过打开require_secure_transport选项来解决这个问题,这需要使用ssl或本地unix套接字进行所有连接,因为unix套接字只能从服务器本身访问,所以,唯一打开的连接选项将是ssl 。

要启用此设置,请在文本编辑器中打开/etc/mysql/my.cnf文件:

sudo nano /etc/mysql/my.cnf

内部,将有两个includedir指令用于源配置文件,!

首先创建一个[mysqld]部分以针对mysql服务器进程,在该节头下,将require_secure_transport设置为on

/etc/mysql/my.cnf

. . .

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

[mysqld]

# require clients to connect either using ssl

# or through a local socket file

require_secure_transport = on

默认情况下,mysql配置为只监听来自本地计算机的连接,我们可以将bind-address设置为其他接口来配置它以监听远程连接。

为了允许mysql在它接口上接受连接,我们可以将bind-address设置为"0.0.0.0":

/etc/mysql/my.cnf

. . .

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

[mysqld]

# require clients to connect either using ssl

# or through a local socket file

require_secure_transport = on

bind-address = 0.0.0.0

完成后保存并关闭文件。

接下来,重新启动mysql以应用新设置:

sudo systemctl restart mysql

验证mysql是否通过键入以下命令来监听"0.0.0.0"而不是"127.0.0.1":

sudo netstat -plunt

outputactive internet connections (only servers)

proto recv-q send-q local address foreign address state pid/program name

tcp 0 0 0.0.0.0:3306 0.0.0.0:* listen 4330/mysqld

tcp 0 0 0.0.0.0:22 0.0.0.0:* listen 1874/sshd

tcp6 0 0 :::22 :::* listen 1874/sshd

上面输出的"0.0.0.0"表示mysql正在监听所有可用接口上的连接。

接下来,我们需要通过防火墙允许mysql连接,通过键入以下命令创建异常:

sudo ufw allow mysql

outputrule added

rule added (v6)

远程连接尝试现在应该能够到达mysql服务器。

配置远程mysql用户

现在,mysql服务器正在监听远程连接,但是目前没有配置可以从外部计算机连接的用户。

作为root用户登录到mysql,以便开始:

mysql -u root -p

内部,你可以使用create user命令创建新的远程用户,

对于以后关闭require_secure_transport选项的一些冗余,我们还将在帐户创建期间指定此用户需要ssl子句:

create user 'remote_user'@'mysql_client_ip' identified by 'password' require ssl;

接下来,授予新用户对它应该访问的数据库或表的权限,为了演示,我们创建一个example数据库,并且赋予新用户的所有权:

create database example;

grant all on example.* to 'remote_user'@'mysql_client_ip';

接下来,刷新权限以立即应用这些设置:

flush privileges;

完成后,退出到shell :

exit

服务器设置为允许连接到远程用户。

测试远程连接

在mysql客户端上,测试以确保能够成功连接到服务器,使用-u选项指定远程用户和-h选项,以指定服务器地址的mysql ip :

mysql -u remote_user -p -h mysql_server_ip

指定密码后,你将登录到远程服务器。

检查以确保你的连接是安全的:

s

output--------------

. . .

ssl: cipher in use is dhe-rsa-aes256-sha

. . .

connection: mysql_server_ip via tcp/ip

. . .

--------------

退出到shell :

exit

接下来,尝试不安全连接:

mysql -u remote_user -p -h mysql_server_ip --ssl-mode=disabled

在提示输入密码之后,你的连接应该被拒绝:

outputerror 1045 (28000): access denied for user 'remote_user'@'mysql_server_ip' (using password: yes)

这就是我们要做的,它显示了允许ssl连接,而未加密连接被拒绝。

至此,mysql服务器被配置为安全地接受远程连接。

配置mysql连接的验证(可选)

目前,mysql服务器使用由本地生成的证书颁发机构(ca )签署的ssl证书进行配置,服务器和密钥对的证书足以为传入连接提供加密。

但是,我们目前没有利用证书颁发机构可以提供的信任关系,通过将ca证书以及客户端证书和密钥分发给客户端,双方都可以提供证明它证书由相互信任的证书颁发机构签名的证据。这可以帮助防止恶意服务器的欺骗连接。

为了实现此额外的可选保护,我们需要:

将适当的ssl文件传输到客户端机器
创建客户端配置文件
更改远程用户以要求可信证书

将客户端证书传输到客户端计算机

首先,我们需要从mysql服务器获取mysql ca和客户端证书文件,并将它们放在mysql客户端上。

首先在用户的主目录中创建一个目录,该目录在你要用来连接的用户的主目录中,调用此client-ssl

mkdir ~/client-ssl

由于证书密钥敏感,我们应该锁定对此目录的访问,以便只有当前用户可以访问该目录:

chmod 700 ~/client-ssl

现在,我们可以将证书信息复制到新目录。

在mysql服务器计算机上,通过键入以下命令显示ca证书的内容:

sudo cat /var/lib/mysql/ca.pem

output-----begin certificate-----

. . .

-----end certificate-----

复制整个输出,包括begin certificateend certificate行到剪贴板。

在mysql客户端上,在新目录中创建有相同名称的文件:

nano ~/client-ssl/ca.pem

在内部,从剪贴板粘贴复制的证书内容,完成后保存并关闭文件。

接下来,在mysql服务器上显示客户端证书:

sudo cat /var/lib/mysql/client-cert.pem

output-----begin certificate-----

. . .

-----end certificate-----

再次,将内容复制到剪贴板,记住包含第一行和最后一行。

client-ssl目录中打开一个有相同名称的文件,在目录中:

nano ~/client-ssl/client-cert.pem

粘贴剪贴板中的内容,保存并关闭文件。

最后,在mysql服务器上显示客户端密钥文件的内容:

sudo cat /var/lib/mysql/client-key.pem

output-----begin rsa private key-----

. . .

-----end rsa private key-----

将显示的内容(包括第一行和最后一行)复制到剪贴板。

打开client-ssl客户端,在目录中打开有相同名称的文件:

nano ~/client-ssl/client-key.pem

粘贴剪贴板中的内容,保存并关闭文件。

客户端机器现在应该拥有访问mysql服务器所需的所有凭证,接下来,我们需要更改远程用户。

远程用户需要来自可信ca的证书

目前,mysql客户端有在连接时向服务器提供它证书的可用文件,但是,服务器仍未设置为要求来自受信任的服务器的客户端证书。

要更改此选项,请在mysql服务器上再次登录到mysql root帐户:

mysql -u root -p

接下来,我们需要更改远程用户的需求,我们需要应用require x509子句,而不是require ssl子句,这意味着前一个需求所提供的所有安全性,但是,另外要求连接客户端提供由mysql服务器信任的证书。

若要调整用户要求,请使用alter user命令:

alter user 'remote_user'@'mysql_client_ip' require x509;

刷新更改以确保立即应用这些更改:

flush privileges;

完成后,退出到shell :

exit

接下来,我们可以测试以确保仍然可以连接。

测试连接时验证证书

现在是检查连接时是否可以验证双方的好时机。

在mysql客户端上,首先尝试连接,而不提供客户端证书:

mysql -u remote_user -p -h mysql_server_ip

outputerror 1045 (28000): access denied for user 'remote_user'@'mysql_client_ip' (using password: yes)

在不提供客户端证书的情况下,服务器拒绝连接。

现在,使用--ssl-ca--ssl-cert--ssl-key选项指向~/client-ssl目录中的相关文件:

mysql -u remote_user -p -h mysql_server_ip --ssl-ca=~/client-ssl/ca.pem --ssl-cert=~/client-ssl/client-cert.pem --ssl-key=~/client-ssl/client-key.pem

你应该成功登录,退出以重新获得对shell会话的访问权限:

exit

创建一个mysql客户端配置文件

为了避免每次连接时必须指定证书文件,我们可以创建一个简单的mysql客户端配置文件。

在mysql客户端上的主目录内,创建一个名为~/.my.cnf的隐藏文件:

nano ~/.my.cnf

在文件的顶部,创建一个名为[client]的,下面,我们可以设置ssl-cassl-certssl-key选项来指向我们从服务器上复制的文件,它应该是这样的:

~/.my.cnf

[client]

ssl-ca = ~/client-ssl/ca.pem

ssl-cert = ~/client-ssl/client-cert.pem

ssl-key = ~/client-ssl/client-key.pem

ssl-ca选项告诉客户端验证mysql服务器提供的证书是否由我们指向的证书颁发机构签名,这允许客户端信任它正在连接到可信的mysql服务器。

ssl-certssl-key选项指向证书所需的文件,该文件也是由同一证书颁发机构签署的证书,如果我们希望mysql服务器也验证客户端是否受到ca的信任,我们就需要这样做。

完成后保存并关闭文件。

现在,不需要在命令行上添加--ssl-ca--ssl-cert--ssl-key选项,就可以连接到mysql服务器了:

mysql -u remote_user -p -h mysql_server_ip

现在,你的客户端和服务器在协商连接时都应分别提供证书,配置成了对照本地拥有的ca证书来验证远程证书。



文章标签:ubuntussl

正文

这篇内容就是由IT人知识库 小编为各位整理 原文链接:http://www.itpeo.net/389619/4630144.html





标签 如何配置

如何使用apache作为Debian 8上mod_proxy的反向代理

介绍反向代理是一种代理服务器,它接受http(s)请求,并且透明地将它分发到一个或多个后端服务器,反向代理非常有用,因为 ...

如何在CentOS 7上使用Apache作为mod_proxy的反向代理

介绍反向代理是一种代理服务器,它接受http(s)请求,并且透明地将它分发到一个或多个后端服务器,反向代理非常有用,因为 ...

如何在Debian上设置Apache虚拟主机

介绍apache web服务器是互联网上提供网络内容最流行的方式,它占了互联网上所有活跃网站的一半上,而且非常强大和灵活 ...

如何在python 3中安装pandas包,并且使用数据结构

介绍python pandas软件包用于数据处理和分析,旨在让你以更直观的方式处理带标签的数据或关系数据。pandas构 ...

在Debian上,如何安装和使用Composer

介绍composer是php的一个流行的依赖管理工具,主要用于为项目依赖项的安装和更新提供帮助,它检查特定项目依赖的其他 ...

如何在Ubuntu 16.04上使用osquery监控系统安全

介绍osquery是一个开源安全工具,它采用监控操作系统并将它转换为一个巨大的数据库,可以使用sql-like语句查询表 ...

Ubuntu 16.04上,如何使用StrongSwan设置IKEv2 VPN服务器

介绍虚拟专用网络或vpn允许你在通过不受信任的网络(如coffee,会议或机场)传输流量时加密。ikev2或者是一个允许 ...

在这种特殊情况下,如何修复损坏的包?

问题:运行以下四个命令后,我的系统最终处于损坏的软件包状态:1) apt-get purge nvidia*2) apt ...

在 Lubuntu 16.04的( 2 ) 中,引导我无法访问登录屏幕

问题:我的电话 repeat,但是没人回答我,因为我不能继续更新电脑,因为我不能继续更新电脑到和更高版本。 请帮助我预先 ...

14.04能跟 python 一起玩的that?

问题:我刚刚安装了 ubuntu 14.04版和我的linux新版本。 我知道 ubuntu 14.04是 python ...

在 kern.log 中,Ubuntu 15.04秒冻结一秒钟,每 6 10秒,pci/radeon相关消息

问题:今晚我在笔记本电脑上安装了 xubuntu aspire aspire timelinex tg tg。 我以前, ...

在,项目中,应用程序开发如何使用 i18n.tr

问题:我一直在用英镑的i18n.tr 在我的 touch项目中。 我知道这个函数是什么,但是我不知道如何将翻译添加到我的 ...

通过 NVIDIA HDMI跳过声音音频

问题:除了听音频,hdmi ( 视频)的所有其它内容外,除了我将它直接指向我的电视机上的音频外,其它的音频也。 虽然看起 ...

在 Ubuntu 14.04中,如何在安装Xubuntu桌面后恢复统一登录屏幕

问题:我刚刚在我的ubuntu unity 14.04系统上安装了一个xubuntu桌面使用这个命令:sudo apt- ...

Chrome 14.04上的/Firefox 上没有加载Whatsapp网页二维码

问题:我正在尝试使用 14.04上的chrome/firefox 上的服务 https://web.whatsapp.c ...

在其他监视器上,compiz ( 双监视器和 12.04 ) 捕捉窗口将窗口放到全屏窗口

问题:背景( 这里问题不在 unity 2中出现)在移动窗口时,将光标放到屏幕顶部,橙色的盒子会扩展到屏幕上,并且窗口全 ...

rfedfre

Google地球和 $BROWSER 环境变量

问题:当我点击google地球中的图片以在全屏中查看它时,它会显示出这个错误信息:无法启动任何网页浏览器。 请确定你已经 ...

rfedfre

在加载屏幕上,笔记本电脑为什么要重置亮度设置?

问题:自从我第一次安装 ubuntu 11.10以来,我注意到每次ubuntu启动时音量和屏幕亮度都会被重置。为什么这样 ...

在 Ubuntu 14.04中,如何修复"软件导致连接中止"错误?

问题:我只是在以前拥有 ubuntu 12.04安装的pc上执行一个干净的安装( 不是升级) 到 ubuntu 14.0 ...

12.04 Empathy音频呼叫,视频呼叫,桌面共享和文件发送不工作

问题:当试图从gmail帐户将视频或者音频调用发送到另一个gmail帐户时,它会引发以下输出: 在启动呼叫时出现了错误我 ...