给MariaDB套件配置TLS

有几个应用的数据运行在MariaDB套件中,并且开启了远程TCP连接,然后通过防火墙控制仅允许远程服务器连接。但是远程连接不使用TLS则存在传输安全问题,因此需要折腾配置一下MariaDB套件的TLS远程连接。

MariaDB套件的图形界面并未提供配置入口:

需要临时开启群晖服务器的SSH,登录后台进行配置。


1. 确认MariaDB 10套件是否支持SSL

使用mysql命令以root用户连接MariaDB:

mysql -u root -p

验证下当前MariaDB 10套件是否支持已编译支持SSL:

SHOW VARIABLES LIKE 'have_ssl';

上图结果说明MariaDB 10套件已编译支持SSL,只是没有配置开启。

2. 查询MariaDB 10套件的错误日志路径

SHOW VARIABLES LIKE 'log_error';

3. 创建自签名证书

3.1. 生成CA私钥和证书

创建目录/etc/mariadb目录,并进入该目录创建自签名证书。

  1. 创建私钥:
openssl genrsa -out mariadb-ca-key.pem 3072

  1. 基于上述私钥,创建X509证书:
openssl req -new -x509 -nodes -days 36500 -key mariadb-ca-key.pem -out mariadb-ca-cert.pem

3.2. 2.1.

3.2. 生成服务器私钥和证书

使用如下命令生成服务器私钥和CSR:

openssl req -newkey rsa:3072 -days 36500 -nodes -keyout mariadb-server-key.pem -out mariadb-server-req.pem

注意:生成服务器证书时的主体信息不要和CA证书的一样,否则会验签失败。

使用openssl rsa命令移除私钥的密码:

openssl rsa -in mariadb-server-key.pem -out mariadb-server-key.pem

使用openssl x509命令使用CA证书根据CSR生成自签名的X509证书:

openssl x509 -req -in mariadb-server-req.pem -CA mariadb-ca-cert.pem -CAkey mariadb-ca-key.pem -CAcreateserial -out mariadb-server-cert.pem -days 36500 -sha256

3.3. 校验证书

使用如下命令校验一下证书:

openssl verify -CAfile mariadb-ca-cert.pem mariadb-server-cert.pem

注意:如果创建CA证书和签发服务器证书时使用的签发者和证书主体相同,验证的时候会认为是自签名证书而校验出错。

4. 修改MariaDB配置文件

在服务器后台找到MariaDB的配置目录,路径在/var/packages/MariaDB10/etc,该目录下当前配置文件如下:

创建一个新文件my.cnf,配置如下内容:

[mysqld]
ssl-ca=/etc/mariadb/mariadb-ca-cert.pem
ssl-cert=/etc/mariadb/mariadb-server-cert.pem
ssl-key=/etc/mariadb/mariadb-server-key.pem
# 考虑是否全部强制走TLS
require_secure_transport=ON

配置完成后在套件中心重启MariaDB服务,或者使用如下命令启动MariaDB 10。

  1. 查看MariaDB 10状态
/usr/syno/bin/synopkg is_onoff MariaDB10
  1. 停止MariaDB 10
/usr/syno/bin/synopkg stop MariaDB10
  1. 启动MariaDB 10
/usr/syno/bin/synopkg start MariaDB10

5. MariaDB启动失败处理

在MariaDB 10的失败日志中发现:

2025-08-10 18:18:02 0 [ERROR] SSL error: SSL_CTX_set_default_verify_paths failed
2025-08-10 18:18:02 0 [ERROR] Aborting

使用如下命令检查证书路径权限:

sudo -u mysql cat /etc/mariadb/mariadb-server-cert.pem

修改/etc/mariadb目录及证书的属主:

chown -R mysql:mysql /etc/mariadb

再次重启就ok啦。

6. 校验SSL是否启用

root@DSM-1621:/var/packages/MariaDB10/etc# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 16

MariaDB [(none)]> 
MariaDB [(none)]> 
MariaDB [(none)]> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl      | YES   |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> 
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+--------------------------------------+
| Variable_name       | Value                                |
+---------------------+--------------------------------------+
| have_openssl        | YES                                  |
| have_ssl            | YES                                  |
| ssl_ca              | /etc/mariadb/mariadb-ca-cert.pem     |
| ssl_capath          |                                      |
| ssl_cert            | /etc/mariadb/mariadb-server-cert.pem |
| ssl_cipher          |                                      |
| ssl_crl             |                                      |
| ssl_crlpath         |                                      |
| ssl_key             | /etc/mariadb/mariadb-server-key.pem  |
| version_ssl_library | OpenSSL 1.1.1u  30 May 2023          |
+---------------------+--------------------------------------+
10 rows in set (0.001 sec)

7. 配置Wordpress使用TLS连接数据库

7.1. wp-config.php配置

wp-config.php文件中添加如下配置:

/** Force to use TLS **/
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

/** Specify CA certificate **/
define('MYSQL_SSL_CA', '{证书路径}/mariadb-ca-cert.pem');

注意证书的权限需要让Wordpress能够读取,与其它主题文件一样的属主。

7.2. MariaDB 10强制确定的客户端TLS连接

远程MariaDB用户需配置强制SSL连接,否则可能回退到非加密连接。

先确认一下当前用户的SSL状态:

MariaDB [(none)]> 
MariaDB [(none)]> select user, host, ssl_type from mysql.user;
+-----------------+------------+----------+
| User            | Host       | ssl_type |
+-----------------+------------+----------+
| mariadb.sys     | localhost  |          |
| root            | localhost  |          |
| mysql           | localhost  |          |
| PUBLIC          |            |          |
| wordpress_user  |{WP服务器IP} |          |
+-----------------+-----------+----------+
7 rows in set (0.001 sec)

MariaDB [(none)]> 

执行:

ALTER USER '{数据库用户名}'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;

或者创建一个新用户:

CREATE USER '{数据库用户名}'@'{Wordpress服务器IP}' IDENTIFIED BY '{密码}' REQUIRE SSL;
GRANT ALL PRIVILEGES ON {数据库名}.* TO '{数据库用户名}'@'{Wordpress服务器IP}';

再执行如下命令刷新权限生效:

FLUSH PRIVILEGES;

再次查询SSL状态:

MariaDB [(none)]> select user, host, ssl_type from mysql.user;
+-----------------+---------------+----------+
| User            | Host          | ssl_type |
+-----------------+---------------+----------+
| mariadb.sys     | localhost     |          |
| root            | localhost     |          |
| mysql           | localhost     |          |
| PUBLIC          |               |          |
| wordpress_user  | {WP服务器IP}   | ANY      |
+-----------------+---------------+----------+
7 rows in set (0.003 sec)

MariaDB [(none)]> 

ssl_type列的值说明:

  • ANY:必须通过 SSL/TLS 加密连接登录,但不对客户端证书类型(如 X.509)做具体要求;
  • SSL:强制加密但不验证客户端证书(仅验证服务器身份);
  • X509: 强制加密且要求客户端提供有效证书(双向验证);
  • 空值:允许非加密连接。

7.3. 重启MariaDB 10和Wordpress

分别重启MariaDB 10和Wordpress的Web服务器。

7.4. 检查连接状态

注释掉之前wp-config.php的配置:

/** Force to use TLS **/
// define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

/** Specify CA certificate **/
// define('MYSQL_SSL_CA', '{证书路径}/mariadb-ca-cert.pem');

重启Web Server,此时Wordpress已经连接不上数据库了:

转载请注明来源:星期九 » 给MariaDB套件配置TLS

相关文章

评论 (0)