Bagaimana saya tahu jika replikasi mysql terjadi lebih dari SSL

4

Kami memiliki replikasi SQL server. Saya mencoba memastikan bahwa replikasi terjadi melalui saluran yang aman. Mengingat itu MASTER_SSL_Allowedbenar ("Ya"), apakah ini menunjukkan bahwa hal-hal berjalan melalui SSL / TLS?

Bagaimana saya bisa yakin bahwa koneksi replikasi dienkripsi? Bagaimana saya bisa secara efektif melarang lalu lintas tidak terenkripsi antara master dan replikasi?

mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.10.100 Master_User: slave_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000192 Read_Master_Log_Pos: 37748817 Relay_Log_File: mysqld-relay-bin.000032 Relay_Log_Pos: 1244 Relay_Master_Log_File: mysql-bin.000092 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: omega Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 37748817 Relay_Log_Space: 124980 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File: /etc/mysql/certs/omega-ca-cert.pem Master_SSL_CA_Path: Master_SSL_Cert: /etc/mysql/certs/omega-client-cert.pem Master_SSL_Cipher: Master_SSL_Key: /etc/mysql/certs/omega-client-key.pem

Rick
sumber

Jawaban:

2

Ada dua hal yang bisa Anda lakukan

SARAN # 1: Periksa Master

Pastikan MySQL dimulai pada Master dengan baris seperti ini di my.cnf

[mysqld]
ssl-ca=cacert.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem

Login ke Master, dan jalankan

SHOW GLOBAL VARIABLES LIKE '%ssl%';

Anda harus melihat sesuatu seperti ini:

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        | ...      |
| ssl_capath    | ...      |
| ssl_cert      | ...      |
| ssl_cipher    | ...      |
| ssl_key       | ...      |
+---------------+----------+

Jika have_open_ssl dan have_ssl dinonaktifkan, maka mysqld pada Master tidak menggunakan SSL.

Silakan baca Dokumentasi MySQL pada ssl_ca , ssl_capath , ssl_cert , ssl_cipher dan ssl_key tentang cara menggunakannya. Jelas, jika tidak ada yang ditetapkan, bahkan jika have_open_ssl dan have_ssl diaktifkan, maka mysqld pada Master tidak menggunakan SSL.

SARAN # 2: Periksa Hibah MySQL pada Master

Koneksi itu sendiri harus menggunakan opsi SSL. Dalam SHOW SLAVE STATUS\Goutput, saya melihat Anda memiliki pengguna yang dipanggil slave_user. Pada Master, jalankan ini:

SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';')
INTO @slaveusergrants FROM mysql.user WHERE user='slave_user';
PREPARE s FROM @slaveusergrants; EXECUTE s; DEALLOCATE PREPARE s;

Dalam hasil ini, Anda akan melihat satu atau lebih hal berikut ini:

REQUIRE SSL
REQUIRE SUBJECT
REQUIRE X509
REQUIRE ISSUER
REQUIRE CIPHER

Jika pengguna budak pada Master memiliki setidaknya satu dari hal-hal ini didefinisikan dalam hibahnya, perintah CHANGE MASTER TO yang Anda jalankan pada Slave harus cocok dengan pengaturan SSL pada Master.

Untuk klarifikasi lebih lanjut, silakan baca Menyiapkan Replikasi Menggunakan SSL dari Dokumentasi MySQL

SARAN # 3: Periksa Sambungan Langsung

Anda harus menggunakan tcpdump dan memeriksa port 3306 . Jika Anda melihat hal-hal dalam teks biasa, SSL tidak berfungsi untuk Anda. Jika tidak, itu tidak berarti itu terenkripsi juga. Mengapa Menurut Pedoman Keamanan dalam Dokumentasi MySQL (lihat bagian bawah halaman) :

Jangan mengirimkan data biasa (tidak terenkripsi) melalui Internet. Informasi ini dapat diakses oleh semua orang yang memiliki waktu dan kemampuan untuk mencegatnya dan menggunakannya untuk tujuan mereka sendiri. Sebagai gantinya, gunakan protokol terenkripsi seperti SSL atau SSH. MySQL mendukung koneksi SSL internal. Teknik lain adalah dengan menggunakan penerusan port SSH untuk membuat terowongan terenkripsi (dan terkompresi) untuk komunikasi.

Pelajari cara menggunakan utilitas tcpdump dan string. Dalam kebanyakan kasus, Anda dapat memeriksa apakah aliran data MySQL tidak dienkripsi dengan mengeluarkan perintah seperti berikut:

shell> tcpdump -l -i eth0 -w - src atau port pertama 3306 | strings Ini berfungsi di Linux dan harus bekerja dengan modifikasi kecil di bawah sistem lain.

Peringatan Jika Anda tidak melihat data teks-jelas, ini tidak selalu berarti bahwa informasi tersebut dienkripsi. Jika Anda membutuhkan keamanan tinggi, berkonsultasilah dengan pakar keamanan.

RolandoMySQLDBA
sumber
1
1 untuk menyarankan penggunaan tcpdump, Wiresharkatau analisa paket jaringan lainnya. Itulah cara terbaik yang dapat saya pikirkan untuk membuktikan positif bahwa replikasi terjadi pada TLS daripada cleartext. Teknik "memeriksa master" di sini tidak membantu, karena hanya menunjukkan apakah master dapat mendukung TLS, tidak jika itu benar-benar digunakan. Demikian juga, Anda mungkin ingin memastikan bahwa TLS benar-benar berfungsi sebelum Anda memodifikasi GRANTs agar pengguna memerlukan TLS.
Christopher Schultz