Menambahkan Sertifikat TLS SSL pada database MariaDB dengan OpenSSL | UNIX LINUX EXPLORE
Edit

Menambahkan Sertifikat TLS SSL pada database MariaDB dengan OpenSSL

2024/08/20
Secara default, MariaDB mengirimkan data antara server dan klien tanpa mengenkripsinya. Hal ini secara umum dapat diterima ketika server dan klien berjalan pada host yang sama atau dalam jaringan yang keamanannya dijamin melalui cara lain. Namun, dalam kasus di mana server dan klien berada pada jaringan terpisah atau berada dalam jaringan berisiko tinggi, kurangnya enkripsi memang menimbulkan masalah keamanan karena pelaku kejahatan berpotensi menguping lalu lintas saat data dikirim melalui jaringan di antara keduanya.

Untuk mengurangi masalah ini, MariaDB memungkinkan Anda mengenkripsi data saat transit antara server dan klien menggunakan protokol Transport Layer Security (TLS). TLS sebelumnya dikenal sebagai Secure Socket Layer (SSL), tetapi secara tegas protokol SSL merupakan pendahulu TLS dan versi protokol tersebut sekarang dianggap tidak aman. Dokumentasi masih sering menggunakan istilah SSL dan untuk alasan kompatibilitas, sistem server dan variabel status terkait TLS masih menggunakan awalan ssl, tetapi secara internal, MariaDB hanya mendukung penerusnya yang aman.

Dalam tutorial ini, saya akan memberikan petunjuk tentang cara menyiapkan server MariaDB dengan TLS/SSL, dan cara membuat koneksi aman antara server dan klien MariaDB

dari konsol dan skrip PHP/Python. MariaDB adalah server basis data yang menawarkan fungsionalitas pengganti langsung untuk server MySQL. MariaDB dibuat oleh beberapa penulis asli MySQL, dengan bantuan dari komunitas pengembang perangkat lunak gratis dan sumber terbuka yang lebih luas. Selain fungsionalitas inti MySQL, MariaDB menawarkan serangkaian peningkatan fitur yang lengkap, termasuk mesin penyimpanan lain, pengoptimalan server, dan patch.

1. Kompatibilitas

Koneksi klien dan server yang terenkripsi menggunakan protokol TLS dengan tujuan agar data yang direplikasi dapat dienkripsi sehingga server master dan slave memerlukan koneksi aman untuk diaktifkan.

Meskipun prosedur di atas memungkinkan server untuk menggunakan koneksi terenkripsi TLS dengan klien. Perlu diketahui bahwa ini tidak ada paksaan penggunaan untuk mengenkripsi data dengan cara apa pun. Untuk memastikan koneksi dengan klien tertentu (pengguna @host) dienkripsi, profil pengguna basis data harus diedit dengan opsi GRANT khusus TLS.

Dukungan untuk koneksi terenkripsi TLS sangat bervariasi di berbagai versi server MariaDB dan MySQL. Panduan ini mengasumsikan MariaDB versi 10.2.x terhubung secara dinamis dengan pustaka TLS dari OpenSSL yang mendukung setidaknya TLSv1.2.

Untuk memeriksa ketersediaan koneksi terenkripsi TLS di server database MariaDB anda, lakukan perintah di bawah ini.


SHOW VARIABLES LIKE 'have_ssl';
Variable_name             Value
have_ssl                        YES

SHOW VARIABLES LIKE 'have_openssl';
Variable_name                Value
have_openssl                   YES

2. Buat Otoritas Sertifikat untuk MariaDB

Sertifikat yang digunakan antara server basis data dan klien tidak boleh dikeluarkan oleh otoritas sertifikat publik atau komersial, karena ini bukan tentang mengamankan layanan publik.

Tujuannya di sini adalah untuk melindungi data pribadi yang mengalir antara server dan klien pribadi kita sendiri. Oleh karena itu, semua entitas harus mengautentikasi diri mereka sendiri di kedua sisi koneksi dengan sertifikat yang valid yang dikeluarkan oleh otoritas sertifikat pribadi kita sendiri.

Penggunaan sertifikat OpenSSL pada MariaDB akan sangat oftimal jika dilakukan pada perangkat terpisah, seeprti perangkat penyimpanan flashdisk (alias stik USB terenkripsi) untuk CA. Baiklah tanpa panjang lebar kita langsung saja mulai cara pembuatan sertifikat TLS/SSL. Kita mulai dengan perintah di bawah ini.


$ cd /media/$USER/safe_storage

3. Buat Direktori dan file

Setelah itu, anda buat direktori bernama database-ca di perangkat penyimpanan aman anda (USB) dengan perintah di bawah ini.


$ mkdir -p database-ca/{certreqs,certs,crl,newcerts,private}
$ cd /database-ca
Direktori yang digunakan untuk menyimpan kunci pribadi tidak boleh dapat diakses oleh orang lain, jalankan perintah chmod.


$ chmod 700 private
Beberapa file data diperlukan untuk melacak sertifikat yang diterbitkan, nomor seri, dan pencabutannya (revocations).


$ touch database-ca.index
$ echo 00 > database-ca.crlnum
$ echo 00 > database-ca.serial

4. Konfigurasi OpenSSL

Buat file konfigurasi OpenSSL untuk database CA baru database_ca.cnf dengan script berikut ini.

Contoh script database_ca.cnf
#
# OpenSSL configuration for the MariaDB/MySQL Database Clients and Servers
# Certification Authority.
#

#
# This definition doesn't work if HOME isn't defined.
CA_HOME                 = .
RANDFILE                = $ENV::CA_HOME/private/.rnd

#
# Default Certification Authority
[ ca ]
default_ca              = database_ca

#
# Database Certification Authority
[ database_ca ]
dir                     = $ENV::CA_HOME
certs                   = $dir/certs
serial                  = $dir/database-ca.serial
database                = $dir/database-ca.index
new_certs_dir           = $dir/newcerts
certificate             = $dir/database-ca.cert.pem
private_key             = $dir/private/database-ca.key.pem
default_days            = 368 # Two years
crl                     = $dir/database-ca.crl
crl_dir                 = $dir/crl
crlnumber               = $dir/database-ca.crlnum
name_opt                = multiline, align
cert_opt                = no_pubkey
copy_extensions         = copy
crl_extensions          = crl_ext
default_crl_days        = 60
default_md              = sha256
preserve                = no
email_in_dn             = no
policy                  = cert_policy
unique_subject          = yes

#
# Distinguished Name Policy for the CA
[ ca_policy ]
organizationName        = supplied
commonName              = supplied

#
# Distinguished Name Policy Server and Client Certificates
[ cert_policy ]
commonName              = supplied

#
# CA Request Options
[ ca_req ]
default_bits            = 4096
default_keyfile         = private/mariadatabase-ca.key.pem
encrypt_key             = yes
default_md              = sha256
string_mask             = utf8only
utf8                    = yes
prompt                  = no
req_extensions          = database_ca_req_ext
distinguished_name      = ca_distinguished_name
subjectAltName          = @subject_alt_name

#
# CA Request Extensions
[ database_ca_req_ext ]
subjectKeyIdentifier    = hash

#
# Distinguished Name (DN)
[ ca_distinguished_name ]
organizationName        = example.net
commonName              = example.net Database Clients and Servers Certification Authority

#
# CA Certificate Extensions
[ ca_ext ]
basicConstraints        = critical, CA:true
keyUsage                = critical, keyCertSign, cRLSign
subjectKeyIdentifier    = hash
subjectAltName          = @subject_alt_name
authorityKeyIdentifier  = keyid:always
issuerAltName           = issuer:copy
authorityInfoAccess     = @auth_info_access
crlDistributionPoints   = crl_dist

#
# CRL Certificate Extensions
[ crl_ext ]
authorityKeyIdentifier  = keyid:always
issuerAltName           = issuer:copy

#
# Clients and Servers Certificate Extensions
[ cert_ext ]
basicConstraints        = CA:FALSE
keyUsage                = critical, digitalSignature, keyEncipherment
extendedKeyUsage        = critical, serverAuth, clientAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always

# EOF
Setelah itu anda harus menetapkan file konfigurasi OpenSSL untuk CA database.


$ export OPENSSL_CONF=./database-ca.cnf

5. Hasilkan (generate) CSR dan Buat Kunci baru

Perintah berikut membuat kunci baru dan permintaan penandatanganan sertifikat untuk root.


$ openssl req -new -out database-ca.req.pem
Generating a 4096 bit RSA private key
.......................................................................++
.......................................................................++
.......................................................................++
.......................................................................++
writing new private key to 'private/database-ca.key.pem'
Enter PEM pass phrase: ********
Verifying - Enter PEM pass phrase: ********
-----

6. Tandatangani sendiri sertifikat yang dibuat

Setelah anda menjalankan perintah generate sertifikat, lanjutkan dengan menandatangani sertifikat yang akan dibuat. Untuk melakukannya anda dapat menjalankan script berikut.


$ openssl ca -selfsign \
    -in database-ca.req.pem \
    -out database-ca.cert.pem \
    -extensions ca_ext \
    -startdate `date +%y%m%d000000Z -u -d -1day` \
    -enddate `date +%y%m%d000000Z -u -d +5years+1day`
Perintah di atas akan membuat tanda tangan yang berlaku selama lima tahun ke depan.


7. Revocation List (CRL)

Kita lanjutkan dengan membuat CRL kosong awal dari CA database yang telah kita buat di atas.


$ openssl ca -gencrl -out crl/database-ca.crl

8. Salin ke Sistem Target

CA kini telah siap untuk menandatangani permintaan sertifikat. Salin berkas berikut ke sistem mana pun (server dan klien basis data) yang menginisialisasi atau menerima koneksi menggunakan sertifikat dari CA ini.
  1. Sertifikat CA (CA certificate)
  2. Berkas CRL (file CRL)

$ scp database-ca.cert.pem crl/database-ca.crl aiken.example.net:/etc/mysql/ssl/
$ scp database-ca.cert.pem crl/database-ca.crl margaret.example.net:/etc/mysql/ssl/
$ scp database-ca.cert.pem crl/database-ca.crl gannibal.example.net:/etc/mysql/ssl/
Perintah di atas dapat anda terapkan juga pada server workstation anda.


9. Permintaan Penandatanganan Sertifikat

Buat permintaan penandatanganan sertifikat di server dan klien mana pun yang terhubung ke server dan klien lainnya. Jalankan perintah berikut untuk membuat permintaan penandatanganan sertifikat.


$ sudo mkdir -p /etc/mysql/ssl/private
Kemudian anda buat file konfigurasi OpenSSL /etc/mysql/ssl/openssl.cnf dengan script berikut.

Contoh script /etc/mysql/ssl/openssl.cnf
#
# OpenSSL configuration for generation of MariaDB/MySQL servers and client
# certificate requests.
# Environment variable '$CN' **MUST** be defined or else OpenSSL aborts.

CN                          = $ENV::CN
HOME                        = .
RANDFILE                    = $ENV::HOME/.rnd

[ req ]
default_bits                = 3072
default_keyfile             = ${HOME}/private/${CN}.key.pem
encrypt_key                 = no
default_md                  = sha256
req_extensions              = req_extensions
prompt                      = no
distinguished_name          = req_distinguished_name

[ req_extensions ]
keyUsage                    = digitalSignature, keyEncipherment
extendedKeyUsage            = serverAuth, clientAuth
subjectKeyIdentifier        = hash

[ req_distinguished_name ]
commonName                  = ${CN}
Buat permintaan penandatanganan sertifikat baru dengan script berikut.


$ cd /etc/mysql/ssl
$ sudo -s
$ export OPENSSL_CONF=/etc/mysql/ssl/openssl.cnf
$ export CN=aiken.example.net
$ openssl req -new -out ${CN}.req.pem
Generating a 3072 bit RSA private key
..........................................................................
........................................................................++
................................................................++
writing new private key to './private/aiken.example.net.key.pem


10. Tanda tangani sertifikat

Kembali ke lingkungan otoritas sertifikat yang disimpan pada perangkat aman anda (USB).


$ cd /media/$USER/safe_storage/database-ca
Salin permintaan penandatanganan sertifikat dari server basis data (database).


$ scp aiken.example.net:/etc/mysql/ssl/aiken.example.net.req.pem certreqs/
Langkah terakhir adalah menandatangani file CSR.


$ export OPENSSL_CONF=./database-ca.cnf
$ openssl ca \
    -in ./certreqs/aiken.example.net.req.pem \
    -out ./certs/aiken.example.net.cert.pem \
    -extensions cert_ext --policy cert_policy
Using configuration from ./database-ca.cnf
Enter pass phrase for ./private/database-ca.key: ********

Anda telah mempelajari cara menyiapkan dan memasang sertifikat SSL antara server dan klien MariaDB. Untuk informasi lebih lanjut, lihat situs resmi MariaDB. Periksa juga perintah update-ca-certificates.