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

Dasar-dasar Enkripsi Database Server MariaDB

Enkripsi adalah salah satu fitur keamanan terpenting untuk menjaga data Anda seaman mungkin. Bergantung pada data yang Anda tangani, tidak selalu itu suatu keharusan tetapi Anda setidaknya harus menganggapnya sebagai peningkatan keamanan di organisasi Anda, dan sebenarnya disarankan untuk menghindari pencurian data atau akses tidak sah.

Dalam blog ini, kami akan menjelaskan dua tipe dasar enkripsi dan cara mengkonfigurasinya di Server MariaDB.

Apa itu Enkripsi Data?

Ada dua tipe dasar enkripsi data:saat istirahat dan saat transit. Mari kita lihat apa artinya.

Enkripsi Data saat Istirahat

Data yang disimpan dalam sistem dikenal sebagai data-at-rest. Enkripsi data ini terdiri dari penggunaan algoritme untuk mengubah teks atau kode menjadi tidak dapat dibaca. Anda harus memiliki kunci enkripsi untuk memecahkan kode data yang dienkripsi.

Mengenkripsi seluruh basis data harus dilakukan dengan hati-hati karena dapat mengakibatkan dampak kinerja yang serius. Oleh karena itu, sebaiknya mengenkripsi hanya bidang atau tabel individual.

Mengenkripsi data-at-rest melindungi data dari pencurian fisik hard drive atau akses penyimpanan file yang tidak sah. Enkripsi ini juga mematuhi peraturan keamanan data, terutama jika ada data keuangan atau kesehatan yang tersimpan di sistem file.

Enkripsi Data-dalam-Transit

Data yang ditransfer atau berpindah antar transaksi dikenal sebagai data-in-transit. Data yang berpindah antara server dan klien saat menjelajahi halaman web adalah contoh yang baik dari jenis data ini.

Karena selalu berpindah, data perlu dilindungi dengan enkripsi yang tepat untuk menghindari pencurian atau pengubahan data sebelum mencapai tujuannya.

Situasi ideal untuk melindungi data-in-transit adalah membuat data dienkripsi sebelum dipindahkan dan hanya didekripsi saat mencapai tujuan akhir.

Enkripsi Data saat Istirahat MariaDB

Enkripsi tabel dan tablespace telah ditambahkan di MariaDB dari versi 10.1, dan mendukung enkripsi untuk mesin penyimpanan XtraDB, InnoDB, dan Aria, dan juga untuk log biner.

Anda dapat memilih berbagai cara untuk mengenkripsi:

  • Semua tabel
  • Tabel individu
  • Semuanya, kecuali tabel individual

Menurut dokumentasi, menggunakan enkripsi memiliki overhead sekitar 3-5%, jadi penting untuk memiliki lingkungan pengujian untuk menekankannya dan melihat bagaimana responsnya, untuk menghindari masalah dalam produksi.

Cara Mengonfigurasi Enkripsi Data saat Istirahat di MariaDB

Mari kita periksa tabel "kota" yang ada di database MariaDB:

$ strings city.ibd |head

infimum

supremum

infimum

supremum

3ABW

3KHM

infimum

supremum

Kabul                              AFGKabol

Qandahar                           AFGQandahar

Seperti yang Anda lihat, Anda dapat membaca data dari sana tanpa masalah menggunakan perintah string Linux misalnya. Sekarang, mari kita lihat cara mengenkripsinya.

Buat kunci enkripsi menggunakan perintah openssl rand:

$ mkdir -p /etc/mysql/encryption

$ for i in {1..4}; do openssl rand -hex 32 >> /etc/mysql/encryption/keyfile;  done;

Edit file /etc/mysql/encryption/keyfile yang dihasilkan dan tambahkan ID kunci yang akan dirujuk saat membuat tabel terenkripsi. Formatnya harus sebagai berikut:

<encryption_key_id1>;<hex-encoded_encryption_key1>

<encryption_key_id2>;<hex-encoded_encryption_key2>

Anda dapat mengeditnya menggunakan perintah sed linux dengan cara ini:

$ for i in {1..4}; do sed -i -e "$i s/^/$i;/" keyfile; done

Jadi filenya harus seperti ini:

$ cat /etc/mysql/encryption/keyfile

1;f237fe72e16206c0b0f6f43c3b3f4accc242564d77f5fe17bb621de388c193af

2;0c0819a10fb366a5ea657a71759ee6a950ae8f25a5ba7400a91f59b63683edc5

3;ac9ea3a839596dbf52492d9ab6b180bf11a35f44995b2ed752c370d920a10169

4;72afc936e16a8df05cf994c7902e588de0d11ca7301f9715d00930aa7d5ff8ab

Sekarang, buat kata sandi acak menggunakan perintah openssl serupa yang Anda lihat sebelumnya:

$ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key

Sebelum melanjutkan ke langkah berikutnya, penting untuk mengetahui detail berikut tentang mengenkripsi file kunci:

  • Satu-satunya algoritme yang saat ini didukung MariaDB untuk mengenkripsi file kunci adalah mode Cipher Block Chaining (CBC) dari Advanced Encryption Standard (AES).
  • Ukuran kunci enkripsi bisa 128-bit, 192-bit, atau 256-bit.
  • Kunci enkripsi dibuat dari hash SHA-1 dari sandi enkripsi.
  • Kata sandi enkripsi memiliki panjang maksimal 256 karakter.

Sekarang, untuk mengenkripsi file kunci menggunakan perintah openssl enc, jalankan perintah berikut:

$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc

Terakhir, Anda perlu menambahkan parameter berikut di file konfigurasi my.cnf Anda (terletak di /etc/ pada OS berbasis RedHat atau /etc/mysql/ pada OS Berbasis Debian):

[mysqld]

…

#################### DATABASE ENCRYPTION ####################

plugin_load_add = file_key_management

file_key_management_filename = /etc/mysql/encryption/keyfile.enc

file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key

file_key_management_encryption_algorithm = aes_cbc

encrypt_binlog = 1



innodb_encrypt_tables = ON

innodb_encrypt_log = ON

innodb_encryption_threads = 4

innodb_encryption_rotate_key_age = 0 

…

Dan restart layanan MariaDB untuk mengambil perubahan:

$ systemctl restart mariadb

Pada titik ini, semuanya siap untuk menggunakan fitur enkripsi. Mari kita mengenkripsi tabel yang sama yang kita tunjukkan sebelumnya, "kota". Untuk ini, Anda perlu menggunakan pernyataan ALTER TABLE yang mengatur parameter ENCRYPTED di YA:

MariaDB [world]> ALTER TABLE city ENCRYPTED=YES;

Query OK, 0 rows affected (0.483 sec)

Records: 0  Duplicates: 0  Warnings: 0

Sekarang, jika Anda mencoba mengakses tabel langsung dari sistem file, Anda akan melihat sesuatu seperti ini:

$ strings city.ibd |head

PU%O

!ybN)b

9,{9WB4

T3uG:

?oiN

,35sz

8g)Q

o(o

q_A1

k=-w

Seperti yang Anda lihat, tabel tidak dapat dibaca. Anda juga dapat menentukan ID Kunci Enkripsi dengan menambahkan parameter ENCRYPTION_KEY_ID = di perintah MySQL, di mana adalah nomor ID dari file kunci yang dibuat sebelumnya.

Tabel baru akan dienkripsi secara default saat kita menyetel parameter innodb_encrypt_tables ke AKTIF dalam file konfigurasi my.cnf.

Enkripsi Data-dalam-Transit MariaDB

MariaDB memungkinkan Anda untuk mengenkripsi data-in-transit antara server dan klien menggunakan protokol Transport Layer Security (TLS), sebelumnya dikenal sebagai Secure Socket Layer atau SSL.

Pertama-tama, Anda perlu memastikan bahwa server MariaDB Anda telah dikompilasi dengan dukungan TLS. Anda dapat memverifikasi ini dengan menjalankan pernyataan SHOW GLOBAL VARIABLES berikut:

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'version_ssl_library';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |

+---------------------+----------------------------+

1 row in set (0.001 sec)

Dan periksa apakah saat ini tidak digunakan menggunakan pernyataan SHOW VARIABLES:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| have_openssl        | YES                        |

| have_ssl            | DISABLED                   |

| ssl_ca              |                            |

| ssl_capath          |                            |

| ssl_cert            |                            |

| ssl_cipher          |                            |

| ssl_crl             |                            |

| ssl_crlpath         |                            |

| ssl_key             |                            |

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |

+---------------------+----------------------------+

10 rows in set (0.001 sec)

Anda juga dapat memverifikasi status SSL menggunakan perintah status MariaDB:

MariaDB [(none)]> status

--------------

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id: 22

Current database:

Current user: [email protected]

SSL: Not in use

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server: MariaDB

Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset: latin1

Db     characterset: latin1

Client characterset: utf8

Conn.  characterset: utf8

UNIX socket: /var/lib/mysql/mysql.sock

Uptime: 4 hours 28 min 25 sec

Threads: 11  Questions: 111668  Slow queries: 0  Opens: 92  Flush tables: 1  Open tables: 85  Queries per second avg: 6.933

--------------

Cara Mengonfigurasi Enkripsi Data-in-Transit di MariaDB

Mari kita buat direktori certs untuk menyimpan semua sertifikat:

$ mkdir -p /etc/mysql/certs

Sekarang, mari buat sertifikat CA yang akan dikonfigurasi untuk mengenkripsi koneksi:

$ openssl genrsa 2048 > ca-key.pem

$ openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem

Perintah terakhir ini akan meminta Anda untuk melengkapi informasi berikut:

Country Name (2 letter code) [AU]:

State or Province Name (full name) [Some-State]:

Locality Name (eg, city) []:

Organization Name (eg, company) [Internet Widgits Pty Ltd]:

Organizational Unit Name (eg, section) []:

Common Name (e.g. server FQDN or YOUR name) []:

Email Address []:

Sekarang, Anda perlu membuat sertifikat server:

$ openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem

Perintah ini akan meminta Anda untuk mengisi informasi yang sama seperti sebelumnya ditambah sandi sertifikat opsional.

$ openssl rsa -in server-key.pem -out server-key.pem

$ openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

Dan terakhir, Anda perlu membuat sertifikat klien:

$ openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem

Ini juga akan meminta Anda untuk melengkapi informasi dan sandi sertifikat opsional.

$ openssl rsa -in client-key.pem -out client-key.pem

$ openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Pastikan Anda menggunakan Nama Umum yang berbeda pada setiap sertifikat, jika tidak maka tidak akan berfungsi dan Anda akan menerima pesan seperti:

ERROR 2026 (HY000): SSL connection error: self signed certificate

Saat ini, Anda akan memiliki sesuatu seperti ini:

$ ls /etc/mysql/certs/

ca-cert.pem  ca-key.pem  client-cert.pem  client-key.pem  client-req.pem  server-cert.pem  server-key.pem  server-req.pem

Dan Anda dapat memvalidasi sertifikat menggunakan perintah berikut:

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

server-cert.pem: OK

client-cert.pem: OK

Jadi sekarang mari kita konfigurasikan di file konfigurasi my.cnf (terletak di /etc/ pada OS berbasis RedHat atau /etc/mysql/ pada OS Berbasis Debian):

[mysqld]

ssl_ca=/etc/mysql/certs/ca-cert.pem

ssl_cert=/etc/mysql/certs/server-cert.pem

ssl_key=/etc/mysql/certs/server-key.pem



[client-mariadb]

ssl_ca =/etc/mysql/certs/ca-cert.pem

ssl_cert=/etc/mysql/certs/client-cert.pem

ssl_key=/etc/mysql/certs/client-key.pem

Pastikan Anda menambahkannya di bawah bagian yang sesuai (mysqld dan client-mariadb).

Ubah pemilik sertifikat dan mulai ulang layanan database:

$ chown mysql.mysql /etc/mysql/certs/

$ systemctl restart mariadb

Setelah ini, jika Anda melihat output SHOW VARIABLES, Anda akan mendapatkan ini:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

+---------------------+----------------------------------+

| Variable_name       | Value                            |

+---------------------+----------------------------------+

| have_openssl        | YES                              |

| have_ssl            | YES                              |

| ssl_ca              | /etc/mysql/certs/ca-cert.pem     |

| ssl_capath          |                                  |

| ssl_cert            | /etc/mysql/certs/server-cert.pem |

| ssl_cipher          |                                  |

| ssl_crl             |                                  |

| ssl_crlpath         |                                  |

| ssl_key             | /etc/mysql/certs/server-key.pem  |

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018       |

+---------------------+----------------------------------+

10 rows in set (0.001 sec)

Sekarang, mari buat pengguna dengan parameter REQUIRE SSL untuk menggunakannya:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 's9s'@'%' IDENTIFIED BY 'root123' REQUIRE SSL;

Query OK, 0 rows affected (0.005 sec)

Jika Anda menggunakan pengguna ini untuk mengakses database, dan memeriksa perintah status, Anda akan melihat SSL sedang digunakan:

MariaDB [(none)]> status

--------------

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id: 15

Current database:

Current user: [email protected]

SSL: Cipher in use is TLS_AES_256_GCM_SHA384

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server: MariaDB

Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution

Protocol version: 10

Connection: 127.0.0.1 via TCP/IP

Server characterset: latin1

Db     characterset: latin1

Client characterset: utf8

Conn.  characterset: utf8

TCP port: 3306

Uptime: 16 sec

Threads: 11  Questions: 136  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 8.500

--------------

Cara Mengaktifkan Enkripsi SSL dengan ClusterControl

Cara lain, dan bahkan cara yang lebih mudah, untuk mengaktifkan SSL di database MariaDB Anda adalah dengan menggunakan ClusterControl. Kami akan menganggap Anda telah menginstal ClusterControl dan Anda mengelola database MariaDB Anda menggunakannya, jadi buka ClusterControl -> Pilih Cluster MariaDB Anda -> Keamanan -> Enkripsi SSL -> Aktifkan.

Dan hanya itu, enkripsi SSL Anda akan diaktifkan di database MariaDB Anda tanpa tugas manual.

Batasan Enkripsi Saat Istirahat di MariaDB

Ada beberapa batasan terkait enkripsi diam MariaDB yang perlu diperhatikan:

  • Metadata (misalnya file .frm) dan data yang dikirim ke klien tidak dienkripsi.
  • Hanya server MariaDB yang tahu cara mendekripsi data, khususnya
    • mysqlbinlog dapat membaca log biner terenkripsi hanya jika --read-from-remote-server digunakan.
    • Percona XtraBackup tidak dapat mencadangkan instans yang menggunakan InnoDB terenkripsi. Namun, Mariabackup dapat mencadangkan instance terenkripsi.
  • Gcache Galera berbasis disk tidak dienkripsi dalam versi komunitas MariaDB Server, namun, file ini dienkripsi di MariaDB Enterprise Server 10.4.
  • Plugin Audit tidak dapat membuat keluaran terenkripsi. Kirim ke syslog dan konfigurasikan perlindungan di sana.
  • Log kueri umum berbasis file dan log kueri lambat tidak dapat dienkripsi.
  • Log Aria tidak dienkripsi. Ini hanya memengaruhi tabel Aria non-sementara.
  • Log kesalahan MariaDB tidak dienkripsi. Log kesalahan dapat berisi teks kueri dan data dalam beberapa kasus, termasuk mogok, kegagalan pernyataan, dan kasus di mana InnoDB/XtraDB menulis output monitor ke log untuk membantu proses debug. Itu dapat dikirim ke syslog juga jika diperlukan.

Kesimpulan

Melindungi data-in-transit sama pentingnya dengan melindungi data-at-rest, dan bahkan jika itu bukan keharusan di organisasi Anda, Anda harus mempertimbangkan untuk menerapkannya karena dapat membantu Anda menghindari data pencurian atau akses tidak sah.

MariaDB memiliki cara yang cukup mudah untuk mengimplementasikannya dengan mengikuti langkah-langkah yang disebutkan sebelumnya, tetapi tentunya lebih mudah menggunakan ClusterControl.


  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 menghubungkan ke AWS MySQL / MariaDB RDS atau Database EC2 dari MySQL WorkBench

  2. MariaDB JSON_MERGE() Dijelaskan

  3. ClusterControl - Manajemen Cadangan Tingkat Lanjut - mariabackup Bagian II

  4. Cara Mengatur Zona Waktu Bernama di MariaDB

  5. Memahami Pengaruh Latensi Tinggi pada Solusi MySQL dan MariaDB Ketersediaan Tinggi