如何在VPS上使用SSH保护MySQL复制
red 中的所有命令都必须替换为您的环境中使用的实际值。
序幕
配置 MySQL 复制使端口 3306 对 Internet 开放,并且复制服务器之间的数据未加密。 使用 SSH 隧道可以通过 SSH 连接传输 MySQL 复制数据。 此方法不需要在防火墙中打开任何其他端口。 对于这篇文章:
- 主IP为1.1.1.1
- 从机IP为2.2.2.2
要输入到主站的命令标记为 (master),用于从站的命令标记为 (slave)。
假设您'已经阅读了这篇关于MySQL复制的文章。
第 1 步:设置 SSH 隧道
创建用户并分配密码。 此用户将用于创建 SSH 隧道:(master)
root@mysql-master:~# useradd -d /home/tunneluser -m tunneluser root@mysql-master:~# passwd tunneluser
必须允许 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服务器:(master)
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 将 slave 连接到 master。 -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
将更改为 localhost IP 地址:
bind-address = 127.0.0.1
将 slave_user 的权限更改为仅从 localhost 登录。 (主)
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;
可以使用以下命令从从站测试连接性:(slave)
mysql -h 127.0.0.1 -u slave_user -P 33061 -p
请不要将 localhost 与 -h 参数一起使用,因为 MySQL 将使用默认端口号在本地登录。