Untuk mengatasi risiko ini, MySQL mendukung enkripsi transit antara klien dan server melalui protokol TLS/SSL. Artikel ini berfokus pada pembuatan sertifikat SSL dan file kunci secara manual di MySQL untuk mengonfigurasi SSL. Belakangan, artikel tersebut juga berfokus pada pengaktifan persyaratan enkripsi wajib dari klien
Mulai
MySQL versi 5. 7. 28+ menyediakan alat praktis yang dikenal sebagai mysql_ssl_rsa_setup, yang bergantung pada binari OpenSSL untuk secara otomatis menghasilkan sertifikat dan kunci SSL yang diperlukan untuk mendukung koneksi yang aman
Oleh karena itu, sebelum memulai, periksa status koneksi SSL default dari server MySQL. Ketik perintah berikut untuk memverifikasi nilai sesi SSL
mysql> tampilkan variabel global seperti '%ssl%';
+----+----+
Nama_variabel. Nilai
+----+----+
have_openssl. DENGAN DISABILITAS
have_ssl. DENGAN DISABILITAS
ssl_ca.
ssl_capath.
ssl_cert.
ssl_cipher.
ssl_crl.
ssl_crlpath.
ssl_key.
+----+----+
9 baris dalam set (0. 53 detik)
Output di atas menunjukkan MySQL tidak mendukung enkripsi saat transit untuk sesi saat ini
Gunakan OpenSSL untuk Membuat Sertifikat dan Kunci SSL
Untuk menyediakan enkripsi saat transit, MySQL memerlukan sertifikat X509 sisi klien dan sisi server yang ditandatangani oleh otoritas Sertifikat untuk memvalidasi kepemilikan domain. Kami akan membuat sertifikat yang ditandatangani sendiri, serta sertifikat sisi server dan klien melalui utilitas baris perintah OpenSSL. Ini adalah alat pustaka OpenSSL yang menghasilkan kunci pribadi, membuat permintaan sertifikat X509, menandatanganinya sebagai CA, dan memverifikasinya
Sebelum memulai, buat direktori untuk menyimpan semua file
ubuntu@ubuntu. ~$ mkdir / var /lib/mysql/transit
ubuntu@ubuntu. ~$ cd / var /lib/mysql/transit
Serangkaian perintah berikut akan menghasilkan beberapa prompt yang harus memiliki respons yang tidak kosong
Kunci Otoritas Sertifikat dan Pembuatan Sertifikat
Membuat sertifikat yang ditandatangani sendiri memerlukan sertifikat Otoritas Sertifikat (CA) melalui file kunci pribadi. Gunakan perintah OpenSSL untuk membuat kunci privat RSA 2048 bit untuk CA
ubuntu@ubuntu. ~$ openssl genrsa 2048 > kunci-ca. pem
Gunakan kunci di atas dengan perintah req OpenSSL untuk menghasilkan sertifikat untuk CA Anda sendiri dengan kedaluwarsa 3000 hari
ubuntu@ubuntu. ~$ openssl req -new -x509 -nodes -days 3000 -key ca-key.pem -out ca. pem
Perintah di atas membuat file baru ca-key. pem dan ca. pem untuk menandatangani sendiri sertifikat X509 server dan klien MySQL
Hasilkan Kunci Pribadi dan Sertifikat yang Ditandatangani Sendiri untuk Server MySQL
Gunakan OpenSSL untuk menghasilkan kunci RSA server MySQL dan Permintaan Penandatanganan Sertifikat (CSR)
ubuntu@ubuntu. ~$ openssl genrsa 2048 > server-key. pem
ubuntu@ubuntu. ~$ openssl req -new -key server-key. pem -out server-req. pem
Sekarang, hapus frasa sandi dari kunci server
ubuntu@ubuntu. ~$ openssl rsa -in server-key. pem -out server-key. pem
Hasilkan sertifikat yang ditandatangani sendiri server MySQL dari permintaan sertifikat dengan menggunakan kunci privat CA dan sertifikat
ubuntu@ubuntu. ~$ openssl x509 -req -in server-req. pem -hari 3600 -CA ca. pem -CAkey ca-key. pem -set_serial 01 -out sertifikat server. pem
Sekarang, konfigurasi SSL untuk MySQL tidak memerlukan CSR
Hasilkan Kunci Klien dan Sertifikat yang Ditandatangani Sendiri
Demikian pula, buat permintaan kunci dan sertifikat untuk klien
ubuntu@ubuntu. ~$ openssl req -newkey rsa. 2048 -hari 3600 -node -keyout client-key.pem -out permintaan-klien. pem
Hapus frasa sandi dari kunci dan hasilkan sertifikat klien dari permintaan sertifikat menggunakan file CA
ubuntu@ubuntu. ~$ openssl rsa -in kunci-klien. pem -out kunci klien. pem
ubuntu@ubuntu. ~$ openssl x509 -req -in client-req. pem -hari 365000 -CA ca. pem -CAkey ca-key. pem -set_serial 01 -keluar sertifikat klien. pem
Server hanya akan menerima koneksi jarak jauh dari klien dengan file-file ini
Terakhir, verifikasi sertifikat klien dan sisi server terhadap sertifikat CA
ubuntu@ubuntu. ~$ openssl verifikasi -CAfile ca. pem server-cert. pem klien-sertifikat. pem
server-cert. pem. OKE
sertifikat klien. pem. OKE
Nilai OK menunjukkan bahwa sertifikat dibuat dengan benar dan siap digunakan
Konfigurasi Server MySQL
Untuk mengaktifkan layanan TLS/SSL untuk server MySQL memerlukan pengaturan sejumlah variabel sistem di dalam file konfigurasi utama MySQL mysqld. conf, seperti
- Gunakan ssl_cert dan ssl_key untuk menyetel jalur ke sertifikat server dan kunci pribadi
- Gunakan variabel ssl_ca untuk menyetel jalur ke sertifikat CA di sisi server
Gunakan editor favorit Anda untuk mengedit file konfigurasi yang terletak di dalam /etc/mysql/mysql. conf. d direktori
ubuntu@ubuntu. ~$ vim / dll /mysql/mysql.conf.d/ mysqld. cnf
[ mysqld ]
ssl_ca = / var /lib/mysql/new_certs/ca.pem
ssl_cert = / var /lib/mysql/new_certs/ server-cert.pem
ssl_key = / var /lib/mysql/new_certs/server-key.pem
Terakhir, ubah kunci SSL dan kepemilikan sertifikat, serta izin
ubuntu@ubuntu. ~$ chown -R mysql. mysql / var / lib /mysql/new_certs/
ubuntu@ubuntu. ~$ chmod 600 kunci klien. kunci server pem. pem ca-key. pem
Mulai ulang database untuk memuat perubahan terbaru
ubuntu@ubuntu. ~$ sudo layanan restart mysql
Login ke server setelah restart dan periksa status sesi MySQL SSL saat ini
Konfigurasi sisi klien
Membuat koneksi jarak jauh yang aman dari klien memerlukan transfer file sertifikat OpenSSL sisi klien yang dihasilkan di atas. Buat direktori baru dan gunakan utilitas SCP untuk transfer file yang aman
ubuntu@ubuntu. ~$ mkdir ~ / sertifikat-klien
ubuntu@ubuntu. ~$ scp pengguna @[IP_Address]:/ var / lib / . pem ~mysql/transit/ca-cert.pem ~/ sertifikat-klien /
ubuntu@ubuntu. ~$ scp pengguna @[IP_Address]:/ var / lib / . pem ~mysql/transit/client-cert.pem ~/ sertifikat-klien /
ubuntu@ubuntu. ~$ scp pengguna @[IP_Address]:/ var / lib / . pem ~mysql/transit/client-key.pem ~/ sertifikat-klien /
Saat membuat koneksi jarak jauh terenkripsi, klien sekarang memerlukan penambahan opsi sisi klien yang memverifikasi kunci dan sertifikat sisi klien. Opsi yang disertakan mirip dengan variabel sistem sisi server tetapi, opsi –ssl-key dan –ssl-cert mengidentifikasi jalur ke kunci pribadi dan sertifikat klien. Gunakan opsi –ssl-ca untuk menambahkan jalur ke sertifikat CA. File ini harus sama dengan sertifikat CA sisi server
Gunakan perintah di bawah ini dengan semua opsi yang diperlukan untuk membuat koneksi jarak jauh yang aman dengan server database MySQL
ubuntu@ubuntu. ~$ mysql -u pengguna -p -h --ssl-ca= ~/client-cert/ca.pem --ssl-cert =~ / client-cert /client-cert.pem --ssl-key =under ~ / client-cert< . pem /client-key.pem
Konfigurasikan Koneksi Terenkripsi Wajib
Untuk beberapa server MySQL, klien tidak hanya diharuskan untuk terhubung dengan server melalui koneksi terenkripsi, tetapi juga wajib. MySQL memungkinkan administrator server untuk mengonfigurasi koneksi terenkripsi wajib. Itu dimungkinkan dengan menempatkan tiga tingkat kontrol yang berbeda
- Konfigurasi MySQL yang mengharuskan klien untuk mengakses database hanya melalui koneksi terenkripsi
- Aktifkan program klien untuk memerlukan koneksi terenkripsi, meskipun MySQL mengizinkan tetapi tidak selalu memerlukannya
- Konfigurasikan akun pengguna tertentu untuk mengakses database hanya melalui saluran terenkripsi
Mari kita perinci masing-masing
membutuhkan_mengamankan_transportasi
Untuk memastikan klien menggunakan koneksi terenkripsi, aktifkan variabel require_secure_transport di file konfigurasi MySQL yang terletak di /etc/mysql/mysql. cnf. d direktori
ubuntu@ubuntu. ~$ sudo vim / dll /mysql/mysql.conf.d/ mysqld. cnf
[ mysqld ]
require_secure_transport =AKTIF
Variabel sistem di atas memastikan klien menggunakan transportasi aman untuk terhubung dengan server, dan server hanya mengizinkan koneksi TCP melalui SSL. Oleh karena itu, server menolak permintaan koneksi klien apa pun tanpa transportasi yang aman dan mengembalikan keluaran kesalahan ke program klien
Selain itu, konfigurasi server di atas juga menonaktifkan koneksi klien jarak jauh ke server dengan string –ssl-mode=DISABLED
Memanggil Program Klien
Tingkat kontrol ini memungkinkan pemanggilan program klien untuk mengatur komunikasi terenkripsi yang aman, terlepas dari pengaturan server. Artinya, bahkan jika server tidak dikonfigurasi untuk wajib membangun transportasi SSL/TLS, itu dapat mempertahankan koneksi aman sesuai keinginan klien.
Ini dimungkinkan dengan menggunakan opsi –ssl-mode yang tersedia di MySQL 5. 7. 11 beserta berbagai nilainya. Sangat membantu untuk menentukan status keamanan yang diinginkan dari koneksi klien ke server. Nilai opsi diterapkan berdasarkan tingkat keketatan yang semakin meningkat
- DENGAN DISABILITAS. nilai membuat koneksi tidak aman
- DIUTAMAKAN. modenya mirip dengan ketika tidak ada opsi –ssl-mode yang ditentukan. Itu membuat enkripsi hanya jika server mendukungnya sebaliknya, itu kembali ke koneksi default yang tidak terenkripsi
- YG DIBUTUHKAN. nilainya memastikan komunikasi terenkripsi jika server diaktifkan untuk mendukungnya. Klien gagal dalam upaya koneksi jika MySQL tidak mendukung TLS/SSL
- VERIFIKASI_CA. nilainya berfungsi mirip dengan REQUIRED, tetapi selain itu, juga memverifikasi sertifikat CA server. Klien gagal terhubung jika tidak ada sertifikat pencocokan yang valid
- VERIFIKASI_IDENTITAS. mirip dengan VERIFY_CA, tetapi untuk OpenSSL versi 1. 0. 2+, klien juga dapat memverifikasi nama host yang mereka gunakan untuk terhubung dengan identitas di sertifikat server. Koneksi terputus jika terjadi ketidakcocokan
Namun, perlu diperhatikan bahwa verifikasi nama host tidak berfungsi untuk sertifikat yang ditandatangani sendiri. Ini termasuk sertifikat yang dibuat secara otomatis oleh server atau dibuat secara manual melalui alat mysql_ssl_rsa_setup
Terlepas dari enkripsi default, MySQL memungkinkan klien untuk menyertakan pengaturan keamanan tambahan dengan memberikan sertifikat CA, sama seperti server, dan mengaktifkan verifikasi identitas nama host. Pengaturan ini memungkinkan kedua belah pihak untuk mempercayai entitas yang sama, dan klien dapat memverifikasi bahwa itu terhubung ke host yang tepat
Kami sekarang memahami bagaimana mode di atas berinteraksi dengan opsi sertifikat CA
- tentukan sertifikat CA dengan opsi -ssl-ca dengan –ssl-mode=VERIFY_CA
- aktifkan verifikasi identitas hostname dengan menggunakan –ssl-mode=VERIFY_IDENTITY
- nilai –ssl-mode selain VERIFY_IDENTITY atau VERIFY_CA dengan -ssl-ca akan menghasilkan peringatan yang menyatakan non-verifikasi sertifikat server
Konfigurasikan Akun Pengguna
Untuk mengaktifkan komunikasi terenkripsi oleh klien, konfigurasikan akun pengguna tertentu untuk mengakses server MySQL melalui SSL. Buat akun pengguna CREATE USER dengan pernyataan klausa REQUIRE. Atau, gunakan pernyataan ALTER USER untuk menambahkan klausa REQUIRE. Kontrol ini menghentikan upaya koneksi klien ke server jika tidak mendukung koneksi terenkripsi
Klausul REQUIRE berguna untuk menjalankan konfigurasi terkait enkripsi yang menerapkan persyaratan keamanan yang ketat. Ini memungkinkan menentukan satu atau lebih dari satu nilai tls_option
Mari masuk ke detail opsi perintah yang diperlukan dari klien yang dikonfigurasi dengan berbagai nilai REQUIRE
TIDAK ADA. tidak memerlukan koneksi SSL
SSL. server hanya mengizinkan koneksi terenkripsi dari akun yang mendukung SSL
X509. mengharuskan klien untuk menunjukkan kunci pribadi dan sertifikat. Nilai ini tidak mengharuskan untuk menunjukkan sertifikat CA, subjek, dan penerbit
Klausa menentukan karakteristik enkripsi yang diperlukan sehingga tidak perlu menyertakan opsi SSL
mysql> BUAT PENGGUNA 'pengguna'@'localhost' MEMBUTUHKAN X509;
Sekarang, klien perlu menentukan opsi –ssl-key dan –ssl-cert untuk terhubung, sementara -ssl-ca tidak diperlukan (ini juga berlaku untuk nilai penerbit dan subjek)
ubuntu@ubuntu. ~$ mysql -u pengguna -p -h --ssl-cert=client-cert.pem --ssl-key =client-key. pem
PENERBIT. akun yang dibuat dengan pernyataan REQUIRE ISSUER, mengharuskan klien untuk menentukan opsi –ssl-key dan –ssl-cert dengan sertifikat valid yang dikeluarkan oleh 'penerbit' CA. Buat akun pengguna sebagai berikut
mysql> CREATE USER 'user'@'localhost' REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL/CN=CA/emailAddress=ca@example. com';
Jika sertifikat valid dengan penerbit yang berbeda, upaya sambungan gagal
SUBJEK. mewajibkan klien untuk menunjukkan sertifikat dengan nilai subjek yang diberikan saat membuat akunnya. Sambungan dengan sertifikat yang valid tetapi subjek yang berbeda mengakibatkan pemutusan sambungan
mysql> CREATE USER 'user'@'localhost' REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/ O=MySQL demo client certificate/ CN=client/emailAddress=client@example. com';
SANDI. akun yang dibuat dengan pernyataan tersebut mengharuskan klien untuk menyertakan metode penyandian yang digunakan untuk mengenkripsi komunikasi. Penting untuk memastikan apakah sandi dan panjang kunci cukup kuat
mysql> BUAT USER 'user'@'localhost' MEMERLUKAN CIPHER 'EDH-RSA-DES-CBC3-SHA';
Kesimpulan
Artikel ini mengilustrasikan cara mengamankan komunikasi antara server MySQL dan klien dengan mengaktifkan protokol SSL. Kami belajar membuat sertifikat yang ditandatangani sendiri secara manual karena kami mempercayai host di jaringan. Kami juga menerapkan enkripsi transit untuk komunikasi server MYSQL di luar jaringan dan mempelajari cara mengonfigurasi server untuk persyaratan enkripsi wajib