Zum Absichern der MySQL-Replikation verwende ich stunnel. Dadurch wird die Übertragung verschlüsselt; MySQL bietet zwar auch SSH an, das ist aber nicht ganz so einfach zu installieren. Und stunnel kann, einmal installiert, für die Verschlüsselung anderer Dienste genutzt werden.
Für die Replikation über stunnel erfolgen die Zugriffe über den Tunnel, die lokalen Connects erfolgen weiterhin über das Socket-File. Änderungen für lokale Zugriffe (bspw. Webseiten, die in der Config localhost oder 127.0.0.1 verwenden) sind nicht erforderlich. Stunnel nimmt Verbindungen auf Port 3307 entgegen und leitet diese an den (lokalen) Port 3306 weiter.
Installation
./configure
make
make install
mkdir /usr/local/var/lib/stunnel/etc
Bei mir fehlt nach der Installation das passenden Script in /ect/init.d – ich stelle es daher hier zum Download zur Verfügung.
Nach der Installation von stunnel wird für mysql auf jedem Server ein neues Zertikfikat in /usr/local/etc/stunnel/mysql.pem erstellt:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out key.pem
openssl req -new -x509 -key key.pem -out cacert.pem -days 1095
openssl dhparam -2 1024 -out dhparam.pem
cat key.pem cacert.pem dhparam.pem > /usr/local/etc/stunnel/mysql.pem
chmod 400 /usr/local/etc/stunnel/mysql.pem
In die Config für stunnel werden zwei neue Einträge eingefügt. Einmal für den jeweiligen Master und einmal für den Slave.
Auf Server2 müssen accept und connect entsprechend angepasst werden.
[repliserver]
accept = server1:3307
connect=127.0.0.1:3306
cert = /usr/local/etc/stunnel/mysql.pem
[repliclient]
accept=127.0.0.1:3307
connect= server2:3307
client=yes
cert = /usr/local/etc/stunnel/mysql.pem
Die komplette stunnel.conf sieht bei mir so aus:
chroot = /usr/local/var/lib/stunnel/
setuid = nobody
setgid = nogroup
pid = /stunnel.pid
options = NO_SSLv2
[repliserver]
accept = server1:3307
connect=127.0.0.1:3306
cert = /usr/local/etc/stunnel/mysql.pem
[repliclient]
accept=127.0.0.1:3307
connect= server2:3307
client=yes
cert = /usr/local/etc/stunnel/stunnel.pem
Danach kann stunnel auf beiden Servern gestartet werden. Durch netstat -pln | grep :3307
kann getestet werden,
ob stunnel richtig läuft.
tcp 0 0 176.9.24.113:3307 0.0.0.0:* LISTEN 20828/stunnel
Um über den Tunnel auf den anderen Server zugreifen zu können, reicht jetzt mysql -h 127.0.0.1 -P 3307
.
Erklärung: Unter [repliclient] wird von accept auf connect weitergeleitet.
Normale Zugriffe sind weiterhin über mysql -h
127.0.0.1 oder mysql -h 127.0.0.1 -P 3306
möglich.
Damit die Replikation durch den Tunnel läuft, muss der jeweilige Master-Server angepasst werden. Der Master-Server ist jetzt 127.0.0.1:3307 und muss in mysql entsprechend gesetzt werden. Ein einfaches
CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307;
reicht aber nicht.
Geben Sie MASTER_HOST oder MASTER_PORT an, dann setzt der Slave voraus, dass der Master-Server sich vom vorherigen unterscheidet (und zwar auch dann, wenn Sie einen Host- oder Portwert angeben, der mit dem aktuellen Wert identisch ist).
In diesem Fall werden die alten Namens- und Positionswerte der Binärlogdatei auf dem Master-Server als nun ungültig betrachtet
Richtig ist folgendes Vorgehen:
stop slave;
show slave status \G
Wichtig sind hier nur
Master_Log_File: mysql-bin.000229
Read_Master_Log_Pos: 416847212
Mit diesen beiden Werten kann der Master-Server jetzt neu konfiguriert werden:
CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307, MASTER_LOG_FILE='mysql-bin.000229', MASTER_LOG_POS=410672418;
Nach start slave;
läuft die Replikation wie gehabt.
ACHTUNG: Grundsätzlich nutzt stunnel keine Zertifikate. Wie stunnel auch mit Zertifikaten abgesichert werden kann, schreibe ich demnächst.
Zeige,
Doesn’t this have impact on slave Iothread, does this stunnel makes system slow?
I never measured the speed for mysql-mysql with ssl, without ssl or with stunnel. I run must replications using the ssl-option from mysql (http://blog.schaal-24.de/server/mysql-replikation-mit-ssl-absichern/?lang=en) but stunnel is also nice way to get a replication secured in a much easier way.