如何在 VPS 上使用 SSH 保护 MySQL 复制
所有红色命令必须替换为您环境中使用的实际值。
序幕
配置 MySQL 复制会使端口 3306 向 Internet 开放,并且复制服务器之间的数据未加密。使用 SSH 隧道,MySQL 复制数据可以通过 SSH 连接传输。此方法不需要在防火墙中打开任何其他端口。对于本文:
- 主 IP 为1.1.1.1
- 从属IP为2.2.2.2
在主机中输入的命令标记为(主机),在从机中输入的命令标记为(从机)。
假设您已经阅读过有关 MySQL 复制的这篇文章。
步骤 1:设置 SSH 隧道
创建用户并分配密码。此用户将用于创建 SSH 隧道:( 主)
root@mysql-master:~# useradd -d /home/tunneluser -m tunneluser root@mysql-master:~# passwd tunneluser
必须允许隧道用户仅从从属服务器进行连接,因此必须将其作为允许的用户 输入到/etc/ssh/sshd_config文件中。 (主服务器)
root@mysql-master:~# nano /etc/ssh/sshd_config
由于正在定义允许的用户,不在该列表中的用户将被拒绝访问,因此请添加将使用 SSH 登录此 VPS 的管理用户。 (主)
AllowUsers root alice bob tunneluser@2.2.2.2
重新启动 SSH 服务器:( 主)
root@mysql-master:~# service ssh restart
这篇文章中提到了生成 SSH 密钥的步骤,但我将在这里重复这些命令。 (从属)
[root@mysql-slave ~]# ssh-keygen
示例输出:
[root@mysql-slave ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 5d:db:9c:50:e8:b2:88:18:de:78:5f:ed:83:14:47:d7 root@mysql-slave The key's randomart image is: +--[ RSA 2048]----+ | ... | | o.. E| | oo. | | . .o.o= . | | . = .S..*. + | | + + . + . | | . . o o | | . . o | | . | +-----------------+
请勿输入密码,因为此密钥将用于自动建立 SSH 隧道,如果包含密码则无法建立。将公钥复制到主服务器。 (从属)
[root@mysql-slave ~]# ssh-copy-id tunneluser@1.1.1.1
示例输出:
[root@mysql-slave ~]# ssh-copy-id tunneluser@1.1.1.1 The authenticity of host '1.1.1.1 (1.1.1.1)' can't be established. RSA key fingerprint is 3f:33:0c:73:bd:da:51:b9:45:2e:d7:2e:00:47:33:17. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '1.1.1.1' (RSA) to the list of known hosts. tunneluser@1.1.1.1's password: Now try logging into the machine, with "ssh 'tunneluser@1.1.1.1'", and check in: ~/.ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
tunneluser用户将仅用于隧道而不用于管理,因此将 shell 更改为nologin并删除密码。 (主)
usermod -s /sbin/nologin tunneluser passwd -d tunneluser
Debian 和 Ubuntu 用户将/sbin/nologin替换为/usr/sbin/nologin。
使用以下命令创建 SSH 隧道。 (从属)
ssh -L 33061:localhost:3306 tunneluser@1.1.1.1 -f -N
隧道已创建,因此访问 localhost 的 33061 端口将通过 SSH 将从服务器连接到主服务器。-f参数在后台运行此命令,-N参数表示“不执行命令”,因为隧道用户有一个nologin shell。
第 2 步:MySQL 配置更改
本节仅提及本文中概述的有关 MySQL 复制的步骤中的更改。所有要更改的内容都以橙色标记。如果编辑了my.cnf文件以监听公共 IP 地址,请将其改回 localhost。
root@mysql-master:~# nano /etc/mysql/my.cnf
以下行:
bind-address = 1.1.1.1
将更改为本地主机 IP 地址:
bind-address = 127.0.0.1
将从属用户的权限更改为仅从本地主机登录。 (主)
root@mysql-master:~# mysql -u root -p mysql>GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'localhost' IDENTIFIED BY 'password';
先前输入的CHANGE MASTER查询指向主服务器的公共 IP 地址,但未指定端口号。以下查询将更改该情况。 (从属)
root@mysql-slave:~# mysql -u root -p mysql>STOP SLAVE; mysql>CHANGE MASTER TO MASTER_HOST='127.0.0.1',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_PORT=33061, MASTER_LOG_FILE='mysql-bin. 000001', MASTER_LOG_POS=107; mysql>START SLAVE;
可以使用以下命令从从站测试连接性:( 从站)
mysql -h 127.0.0.1 -u slave_user -P 33061 -p
请不要使用带有-h参数的localhost,因为 MySQL 将使用默认端口号在本地登录。