MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Enkripsi MariaDB Penuh Saat Istirahat dan Dalam Perjalanan untuk Perlindungan Data Maksimum - Bagian Satu

Dalam seri blog ini, kami akan memberi Anda panduan lengkap tentang cara mengonfigurasi server MariaDB terenkripsi penuh untuk enkripsi saat istirahat dan saat transit, untuk memastikan perlindungan maksimum data agar tidak dicuri secara fisik atau saat mentransfer dan berkomunikasi dengan host lain. Ide dasarnya adalah kita akan mengubah penerapan "biasa" menjadi replikasi MariaDB terenkripsi sepenuhnya, seperti yang disederhanakan dalam diagram berikut:

Kita akan mengonfigurasi sejumlah komponen enkripsi:

  • Enkripsi dalam perjalanan, yang terdiri dari:
    • Enkripsi server-klien
    • Enkripsi replikasi
  • Enkripsi saat istirahat, yang terdiri dari:
    • Enkripsi file data
    • Enkripsi log biner/relay.

Perhatikan bahwa entri blog ini hanya mencakup enkripsi saat transit. Kami akan membahas enkripsi diam di bagian kedua dari seri blog ini.

Panduan penerapan ini mengasumsikan bahwa kita sudah memiliki server replikasi MariaDB yang sudah berjalan. Jika Anda tidak memilikinya, Anda dapat menggunakan ClusterControl untuk menerapkan replikasi MariaDB baru dalam beberapa menit, dengan kurang dari 5 klik. Semua server berjalan di MariaDB 10.4.11 pada sistem CentOS 7.

Enkripsi Dalam Perjalanan

Data dapat terkena risiko baik saat transit maupun saat istirahat dan memerlukan perlindungan di kedua status. Enkripsi dalam perjalanan melindungi data Anda jika komunikasi dicegat saat data berpindah antar host melalui jaringan, baik dari situs Anda dan penyedia cloud, antara layanan atau antara klien dan server.

Untuk MySQL/MariaDB, data bergerak saat klien terhubung ke server database, atau saat node slave mereplikasi data dari node master. MariaDB mendukung koneksi terenkripsi antara klien dan server menggunakan protokol TLS (Transport Layer Security). TLS kadang-kadang disebut sebagai SSL (Secure Sockets Layer) tetapi MariaDB sebenarnya tidak menggunakan protokol SSL untuk koneksi terenkripsi karena enkripsinya lemah. Detail lebih lanjut tentang ini di halaman dokumentasi MariaDB.

Enkripsi Server-Klien

Dalam pengaturan ini kita akan menggunakan sertifikat yang ditandatangani sendiri, yang berarti kita tidak menggunakan pihak eksternal seperti Google, Comodo atau penyedia Otoritas Sertifikat populer di luar sana untuk memverifikasi identitas kita. Di SSL/TLS, verifikasi identitas adalah langkah pertama yang harus dilalui sebelum server dan klien menukar sertifikat dan kunci mereka.

MySQL menyediakan alat yang sangat berguna yang disebut mysql_ssl_rsa_setup yang menangani pembuatan kunci dan sertifikat secara otomatis. Sayangnya, belum ada alat seperti itu untuk server MariaDB. Oleh karena itu, kami harus secara manual menyiapkan dan membuat file terkait SSL untuk kebutuhan TLS MariaDB kami.

Berikut adalah daftar file yang akan kita generate menggunakan OpenSSL tool:

  • kunci CA - Kunci pribadi RSA dalam format PEM. Harus dirahasiakan.
  • Sertifikat CA - Sertifikat X.509 dalam format PEM. Berisi kunci publik dan metadata sertifikat.
  • CSR Server - Permintaan penandatanganan sertifikat. Common Name (CN) saat mengisi form penting, misalnya CN=mariadb-server
  • Kunci server - Kunci pribadi RSA. Harus dirahasiakan.
  • Sertifikat server - Sertifikat X.509 ditandatangani oleh kunci CA. Berisi kunci publik dan metadata sertifikat.
  • CSR Klien - Permintaan penandatanganan sertifikat. Harus menggunakan Common Name (CN) yang berbeda dari CSR Server, misalnya CN=client1 
  • Kunci klien - Kunci pribadi RSA. Harus dirahasiakan.
  • Sertifikat klien - Sertifikat X.509 ditandatangani oleh kunci CA. Berisi kunci publik dan metadata sertifikat.

Pertama dan terpenting, buat direktori untuk menyimpan sertifikat dan kunci kami untuk enkripsi dalam perjalanan:

$ mkdir -p /etc/mysql/transit/
$ cd /etc/mysql/transit/

Sekadar memberi Anda gambaran mengapa kami memberi nama direktori seperti yang disebutkan adalah karena di bagian selanjutnya dari seri blog ini, kami akan membuat direktori lain untuk enkripsi diam di /etc/mysql/rest.

Otoritas Sertifikat

Buat file kunci untuk Otoritas Sertifikat (CA):

$ openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus
.......................+++
...............................................................................................................................................................................................................................................+++
e is 65537 (0x10001)

Buat sertifikat untuk Otoritas Sertifikat (CA) kami sendiri berdasarkan ca-key.pem yang dibuat sebelumnya dengan masa berlaku 3650 hari:

$ openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:SE
State or Province Name (full name) []:Stockholm
Locality Name (eg, city) [Default City]:Stockholm
Organization Name (eg, company) [Default Company Ltd]:Severalnines
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:CA
Email Address []:[email protected]

Sekarang kita harus memiliki ca-key.pem dan ca.pem di bawah direktori kerja ini.

Kunci dan Sertifikat untuk Server

Selanjutnya, buat kunci pribadi untuk server MariaDB:

$ openssl genrsa 2048 > server-key.pem
Generating RSA private key, 2048 bit long modulus
.............................................................................................................+++
..................................................................................................................+++
e is 65537 (0x10001)

Sertifikat tepercaya harus berupa sertifikat yang ditandatangani oleh Otoritas Sertifikat di mana di sini, kita akan menggunakan CA kita sendiri karena kita memercayai host di jaringan. Sebelum kita dapat membuat sertifikat yang ditandatangani, kita perlu membuat sertifikat permintaan yang disebut Permintaan Penandatanganan Sertifikat (CSR).

Buat CSR untuk server MariaDB. Kami akan memanggil sertifikat sebagai server-req.pem. Ini bukan sertifikat yang akan kita gunakan untuk server MariaDB. Sertifikat terakhir adalah sertifikat yang akan ditandatangani oleh kunci pribadi CA kita sendiri (seperti yang ditunjukkan pada langkah berikutnya):

$ openssl req -new -key server-key.pem -out server-req.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:SE
State or Province Name (full name) []:Stockholm
Locality Name (eg, city) [Default City]:Stockholm
Organization Name (eg, company) [Default Company Ltd]:Severalnines
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:MariaDBServer
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Perhatikan Nama Umum tempat kami menentukan "MariaDBServer". Ini bisa berupa nama apa saja tetapi nilainya tidak boleh sama dengan sertifikat klien. Biasanya, jika aplikasi terhubung ke server MariaDB melalui FQDN atau nama host (skip-name-resolve=OFF), Anda mungkin ingin menentukan FQDN server MariaDB sebagai Nama Umum.

Kami kemudian dapat membuat sertifikat X.509 final (server-cert.pem) dan menandatangani CSR (server-req.pem) dengan sertifikat CA (ca.pem) dan kunci pribadi CA (ca -key.pem):

$ openssl x509 -req -in server-req.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 3650 -sha256
Signature ok
subject=/C=SE/ST=Stockholm/L=Stockholm/O=Severalnines/CN=MariaDBServer/[email protected]
Getting CA Private Key

Pada titik ini, inilah yang kita miliki sekarang:

$ ls -1 /etc/mysql/transite
ca-key.pem
ca.pem
server-cert.pem
server-key.pem
server-req.pem

Kita hanya memerlukan sertifikat CA (ca.pem), sertifikat yang ditandatangani server (server-cert.pem) dan kunci pribadi server (server-key.pem) untuk server MariaDB. CSR (server-req.pem) tidak lagi diperlukan.

Kunci dan Sertifikat untuk Klien

Selanjutnya, kita perlu membuat file kunci dan sertifikat untuk klien MariaDB. Server MariaDB hanya akan menerima koneksi jarak jauh dari klien yang memiliki file sertifikat ini.

Mulai dengan membuat kunci 2048-bit untuk klien:

$ openssl genrsa 2048 > client-key.pem
Generating RSA private key, 2048 bit long modulus
.............................................................................................................+++
..................................................................................................................+++
e is 65537 (0x10001)

Buat CSR untuk klien bernama client-req.pem:

$ openssl req -new -key client-key.pem -out client-req.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:SE
State or Province Name (full name) []:Stockholm
Locality Name (eg, city) [Default City]:Stockholm
Organization Name (eg, company) [Default Company Ltd]:Severalnines
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Client1
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Perhatikan Common Name di mana kita menentukan "Client1". Tentukan nama apa pun yang mewakili klien. Nilai ini harus berbeda dari Nama Umum server. Untuk penggunaan lanjutan, Anda dapat menggunakan Nama Umum ini untuk mengizinkan pengguna tertentu dengan sertifikat yang cocok dengan nilai ini, misalnya:

MariaDB> GRANT SELECT ON schema1.* TO 'client1'@'192.168.0.93' IDENTIFIED BY 's' REQUIRE SUBJECT '/CN=Client2';

Kami kemudian dapat membuat sertifikat X.509 final (client-cert.pem) dan menandatangani CSR (client-req.pem) dengan sertifikat CA (ca.pem) dan kunci pribadi CA (ca -key.pem):

$ openssl x509 -req -in client-req.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 3650 -sha256
Signature ok
subject=/C=SE/ST=Stockholm/L=Stockholm/O=Severalnines/CN=Client1/[email protected]
Getting CA Private Key

Semua sertifikat yang kami perlukan untuk penyiapan enkripsi dalam perjalanan telah dibuat. Pastikan kedua sertifikat ditandatangani dengan benar oleh CA:

$ openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK

Mengonfigurasi SSL untuk MariaDB

Buat direktori baru di setiap slave:

(slave1)$ mkdir -p /etc/mysql/transit/
(slave2)$ mkdir -p /etc/mysql/transit/

Salin file enkripsi ke semua slave:

$ scp -r /etc/mysql/transit/* [email protected]:/etc/mysql/transit/
$ scp -r /etc/mysql/transit/* [email protected]:/etc/mysql/transit/

Pastikan pemilik direktori certs menjadi pengguna "mysql" dan ubah hak akses semua file kunci agar tidak terbaca secara global:

$ cd /etc/mysql/transit
$ chown -R mysql:mysql *
$ chmod 600 client-key.pem server-key.pem ca-key.pem

Inilah yang seharusnya Anda lihat saat membuat daftar file di bawah direktori "transit":

$ ls -al /etc/mysql/transit
total 32
drwxr-xr-x. 2 root  root 172 Dec 14 04:42 .
drwxr-xr-x. 3 root  root 24 Dec 14 04:18 ..
-rw-------. 1 mysql mysql 1675 Dec 14 04:19 ca-key.pem
-rw-r--r--. 1 mysql mysql 1383 Dec 14 04:22 ca.pem
-rw-r--r--. 1 mysql mysql 1383 Dec 14 04:42 client-cert.pem
-rw-------. 1 mysql mysql 1675 Dec 14 04:42 client-key.pem
-rw-r--r--. 1 mysql mysql 1399 Dec 14 04:42 client-req.pem
-rw-r--r--. 1 mysql mysql 1391 Dec 14 04:34 server-cert.pem
-rw-------. 1 mysql mysql 1679 Dec 14 04:28 server-key.pem
-rw-r--r--. 1 mysql mysql 1415 Dec 14 04:31 server-req.pem

Selanjutnya, kita akan mengaktifkan koneksi SSL untuk MariaDB. Pada setiap host MariaDB (master dan slave) edit file konfigurasi dan tambahkan baris berikut di bawah bagian [mysqld]:

ssl-ca=/etc/mysql/transit/ca.pem
ssl-cert=/etc/mysql/transit/server-cert.pem
ssl-key=/etc/mysql/transit/server-key.pem

Mulai ulang server MariaDB satu node pada satu waktu, mulai dari slave dan terakhir pada master:

(slave1)$ systemctl restart mariadb
(slave2)$ systemctl restart mariadb
(master)$ systemctl restart mariadb

Setelah dimulai ulang, MariaDB sekarang mampu menerima koneksi biasa dengan menyambungkannya tanpa parameter terkait SSL atau dengan koneksi terenkripsi, saat Anda menentukan parameter terkait SSL di string koneksi.

Untuk pengguna ClusterControl, Anda dapat mengaktifkan enkripsi server-klien dengan sekali klik. Cukup buka ClusterControl -> Keamanan -> Enkripsi SSL -> Aktifkan -> Buat Sertifikat -> Kedaluwarsa Sertifikat -> Aktifkan SSL:

ClusterControl akan menghasilkan kunci yang diperlukan, sertifikat X.509 dan sertifikat CA dan mengatur enkripsi SSL untuk koneksi client-server untuk semua node dalam cluster. Untuk replikasi MySQL/MariaDB, file SSL akan ditempatkan di bawah /etc/ssl/replication/cluster_X, di mana X adalah ID cluster pada setiap node database. Sertifikat yang sama akan digunakan pada semua node dan yang sudah ada mungkin akan ditimpa. Node harus dimulai ulang satu per satu setelah pekerjaan ini selesai. Sebaiknya Anda memulai ulang slave replikasi terlebih dahulu dan memverifikasi bahwa setelan SSL berfungsi.

Untuk me-restart setiap node, buka ClusterControl -> Nodes -> Node Actions -> Restart Node.js. Lakukan restart satu node pada satu waktu, dimulai dengan budak. Node terakhir harus menjadi master node dengan force stop flag diaktifkan:

Anda dapat mengetahui apakah sebuah node dapat menangani enkripsi client-server dengan melihat ikon kunci hijau tepat di sebelah simpul basis data di kisi Ikhtisar:

Pada titik ini, cluster kami sekarang siap menerima koneksi SSL dari MySQL pengguna.

Menghubungkan melalui Koneksi Terenkripsi

Klien MariaDB memerlukan semua file SSL terkait klien yang telah kami buat di dalam server. Salin sertifikat klien, sertifikat CA, dan kunci klien yang dihasilkan ke host klien:

$ cd /etc/mysql/transit
$ scp client-cert.pem client-key.pem ca.pem [email protected]:~

**ClusterControl menghasilkan file SSL klien di bawah /etc/ssl/replication/cluster_X/pada setiap node database, di mana X adalah ID cluster.

Buat pengguna database yang memerlukan SSL di master:

MariaDB> CREATE SCHEMA sbtest;
MariaDB> CREATE USER [email protected]'%' IDENTIFIED BY 'mysecr3t' REQUIRE SSL;
MariaDB> GRANT ALL PRIVILEGES ON sbtest.* to [email protected]'%';

Dari host klien, sambungkan ke server MariaDB dengan parameter terkait SSL. Kami dapat memverifikasi status koneksi dengan menggunakan pernyataan "STATUS":

(client)$ mysql -usbtest -p -h192.168.0.91 -P3306 --ssl-cert client-cert.pem --ssl-key client-key.pem --ssl-ca ca.pem -e 'status'
...
Current user: [email protected]
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
...

Perhatikan baris SSL tempat cipher digunakan untuk enkripsi. Ini berarti klien berhasil terhubung ke server MariaDB melalui koneksi terenkripsi.

Pada titik ini, kami telah mengenkripsi koneksi client-server ke server MariaDB, seperti yang ditunjukkan oleh panah hijau berkepala dua dalam diagram berikut:

Pada bagian selanjutnya, kita akan mengenkripsi koneksi replikasi antar node.

Enkripsi Replikasi

Menyiapkan koneksi terenkripsi untuk replikasi mirip dengan melakukannya untuk koneksi klien/server. Kami dapat menggunakan sertifikat klien, kunci, dan sertifikat CA yang sama untuk memungkinkan pengguna replikasi mengakses server master melalui saluran enkripsi. Ini secara tidak langsung akan mengaktifkan enkripsi antar node ketika utas IO budak menarik peristiwa replikasi dari master.

Mari kita konfigurasikan ini pada satu slave pada satu waktu. Untuk slave pertama, 192.168.0.92, tambahkan baris berikut di bawah bagian [client] di dalam file konfigurasi MariaDB:

[client]
ssl-ca=/etc/mysql/transit/ca.pem
ssl-cert=/etc/mysql/transit/client-cert.pem
ssl-key=/etc/mysql/transit/client-key.pem

Hentikan utas replikasi pada slave:

(slave)MariaDB> STOP SLAVE;

Pada master, ubah pengguna replikasi yang ada untuk memaksanya terhubung menggunakan SSL:

(master)MariaDB> ALTER USER [email protected] REQUIRE SSL;

Pada slave, uji konektivitas ke master, 192.168.0.91 melalui baris perintah mysql dengan --ssl flag:

(slave)MariaDB> mysql -urpl_user -p -h192.168.0.91 -P 3306 --ssl -e 'status'
...
Current user: [email protected]
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
...

Pastikan Anda dapat terhubung ke host master tanpa kesalahan. Kemudian pada slave, tentukan pernyataan CHANGE MASTER dengan parameter SSL seperti di bawah ini:

(slave)MariaDB> CHANGE MASTER TO MASTER_SSL = 1, MASTER_SSL_CA = '/etc/mysql/transit/ca.pem', MASTER_SSL_CERT = '/etc/mysql/transit/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/transit/client-key.pem';

Mulai budak replikasi:

(slave)MariaDB> START SLAVE;

Verifikasi bahwa replikasi berjalan dengan baik dengan parameter SSL terkait:

MariaDB> SHOW SLAVE STATUS\G
...
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
            Master_SSL_Allowed: Yes
            Master_SSL_CA_File: /etc/mysql/transit/ca.pem
               Master_SSL_Cert: /etc/mysql/transit/client-cert.pem
                Master_SSL_Key: /etc/mysql/transit/client-key.pem
...

Budak sekarang mereplikasi dari master dengan aman melalui enkripsi TLS.

Ulangi semua langkah di atas pada slave yang tersisa, 192.168.0.93. Satu-satunya perbedaan adalah pernyataan perubahan pengguna yang akan dieksekusi pada master di mana kita harus mengubah ke host masing-masing:

(master)MariaDB> ALTER USER [email protected] REQUIRE SSL;

Pada titik ini kami telah menyelesaikan enkripsi dalam perjalanan seperti yang diilustrasikan oleh garis hijau dari master ke slave dalam diagram berikut:

Anda dapat memverifikasi koneksi enkripsi dengan melihat keluaran tcpdump untuk antarmuka eth1 pada budak. Berikut ini adalah contoh replikasi standar tanpa enkripsi:

(plain-slave)$ tcpdump -i eth1 -s 0 -l -w - 'src port 3306 or dst port 3306' | strings
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
H"-'
binlog.000008Ulw
binlog.000008Ulw
sbtest
sbtest
create table t1 (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255))
binlog.000008
sbtest
BEGIN3
sbtest
test data3
Ok*Z
binlog.000008*Z

^C11 packets captured
11 packets received by filter
0 packets dropped by kernel

Kita dapat dengan jelas melihat teks yang dibaca oleh budak dari master. Saat menggunakan koneksi terenkripsi, Anda akan melihat karakter nonsens seperti di bawah ini:

(encrypted-slave)$ tcpdump -i eth1 -s 0 -l -w - 'src port 3306 or dst port 3306' | strings
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
:|f^yb#
O5~_
@#PFh
k)]O
jtk3c
@NjN9_a
!\[email protected]
NrF
?7&Y

^C6 packets captured
6 packets received by filter
0 packets dropped by kernel

Kesimpulan

Di bagian selanjutnya dari seri blog ini, kita akan melihat untuk menyelesaikan penyiapan terenkripsi sepenuhnya dengan enkripsi diam MariaDB. Tetap disini!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana CONCAT_WS() Bekerja di MariaDB

  2. Cara Mengotomatiskan Failover Basis Data dengan ClusterControl

  3. Membandingkan Solusi Failover DBaaS dengan Pengaturan Pemulihan Manual

  4. Mempersiapkan Server MySQL atau MariaDB untuk Produksi - Bagian Satu

  5. Bagaimana RADIANS() Bekerja di MariaDB