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

Sepuluh Tips Cara Mencapai Keamanan MySQL dan MariaDB

Keamanan data menjadi prioritas utama saat ini. Terkadang hal ini dipaksakan oleh peraturan eksternal seperti PCI-DSS atau HIPAA, terkadang karena Anda peduli dengan data pelanggan dan reputasi Anda. Ada banyak aspek keamanan yang perlu Anda ingat - akses jaringan, keamanan sistem operasi, hibah, enkripsi, dan sebagainya. Dalam postingan blog ini, kami akan memberi Anda 10 tips tentang apa yang harus diperhatikan saat mengamankan penyiapan MySQL atau MariaDB Anda.

1. Hapus Pengguna Tanpa Kata Sandi

MySQL dulunya datang dengan sekumpulan pengguna yang telah dibuat sebelumnya, beberapa di antaranya dapat terhubung ke database tanpa kata sandi atau, lebih buruk lagi, pengguna anonim. Ini telah berubah di MySQL 5.7 yang, secara default, hanya hadir dengan akun root yang menggunakan kata sandi yang Anda pilih saat instalasi. Namun, ada instalasi MySQL yang ditingkatkan dari versi sebelumnya dan instalasi ini mempertahankan pengguna lama. Juga, MariaDB 10.2 di Centos 7 hadir dengan pengguna anonim:

MariaDB [(none)]> select user, host, password from mysql.user where user like '';
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+
2 rows in set (0.00 sec)

Seperti yang Anda lihat, itu hanya terbatas untuk akses dari localhost tetapi terlepas dari itu, Anda tidak ingin memiliki pengguna seperti itu. Meskipun hak istimewa mereka terbatas, mereka masih dapat menjalankan beberapa perintah yang mungkin menampilkan lebih banyak informasi tentang database - misalnya, versi tersebut dapat membantu mengidentifikasi vektor serangan lebih lanjut.

[[email protected] ~]# mysql -uanonymous_user
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.2.11-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for @localhost: GRANT USAGE ON *.* TO ''@'localhost'
1 row in set (0.00 sec)
MariaDB [(none)]> \s
--------------
mysql  Ver 15.1 Distrib 10.2.11-MariaDB, for Linux (x86_64) using readline 5.1
Connection id:        19
Current database:
Current user:        [email protected]
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server:            MariaDB
Server version:        10.2.11-MariaDB MariaDB Server
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:            12 min 14 sec
Threads: 7  Questions: 36  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 0.049
--------------

Harap dicatat bahwa pengguna dengan kata sandi yang sangat sederhana hampir sama tidak amannya dengan pengguna tanpa kata sandi apa pun. Sandi seperti “password” atau “qwerty” tidak terlalu membantu.

2. Akses Jarak Jauh Ketat

Pertama-tama, akses jarak jauh untuk pengguna super - ini ditangani secara default saat menginstal MySQL (5.7) atau MariaDB (10.2) terbaru - hanya akses lokal yang tersedia. Namun, cukup umum untuk melihat pengguna super tersedia karena berbagai alasan. Yang paling umum, mungkin karena database dikelola oleh manusia yang ingin mempermudah pekerjaan mereka, sehingga mereka menambahkan akses jarak jauh ke database mereka. Ini bukan pendekatan yang baik karena akses jarak jauh memudahkan untuk mengeksploitasi kerentanan keamanan potensial (atau terverifikasi) di MySQL - Anda tidak perlu mendapatkan koneksi ke host terlebih dahulu.

Langkah lain - pastikan bahwa setiap pengguna dapat terhubung ke MySQL hanya dari host tertentu. Anda selalu dapat menentukan beberapa entri untuk pengguna yang sama ([email protected], [email protected]), ini akan membantu mengurangi kebutuhan akan wildcard ([email protected]’%’).

3. Hapus Basis Data Uji

Basis data pengujian, secara default, tersedia untuk setiap pengguna, terutama untuk pengguna anonim. Pengguna tersebut dapat membuat tabel dan menulisnya. Ini berpotensi menjadi masalah tersendiri - penulisan apa pun akan menambah overhead dan mengurangi kinerja basis data. Saat ini, setelah instalasi default, hanya MariaDB 10.2 di Centos 7 yang terpengaruh oleh ini - Oracle MySQL 5.7 dan Percona Server 5.7 tidak memiliki skema 'test' yang tersedia.

[[email protected] ~]# mysql -uanonymous_user
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.2.11-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for @localhost: GRANT USAGE ON *.* TO ''@'localhost'
1 row in set (0.00 sec)
MariaDB [(none)]> USE test;
Database changed
MariaDB [test]> CREATE TABLE testtable (a INT);
Query OK, 0 rows affected (0.01 sec)
MariaDB [test]> INSERT INTO testtable VALUES (1), (2), (3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
MariaDB [test]> SELECT * FROM testtable;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

Tentu saja, masih mungkin terjadi bahwa MySQL 5.7 Anda telah ditingkatkan dari versi sebelumnya di mana skema 'pengujian' tidak dihapus - Anda harus menangani ini dan memeriksa apakah Anda telah membuatnya.

4. Mengaburkan Akses ke MySQL

Sudah diketahui bahwa MySQL berjalan pada port 3306, dan superuser-nya disebut 'root'. Untuk membuat segalanya lebih sulit, cukup sederhana untuk mengubahnya. Sampai batas tertentu, ini adalah contoh keamanan melalui ketidakjelasan tetapi setidaknya dapat menghentikan upaya otomatis untuk mendapatkan akses ke pengguna 'root'. Untuk mengubah port, Anda perlu mengedit my.cnf dan mengatur variabel 'port' ke beberapa nilai lain. Sedangkan untuk pengguna - setelah MySQL terinstal, Anda harus membuat superuser baru (GRANT ALL ... WITH GRANT OPTION) dan kemudian hapus akun '[email protected]' yang ada.

5. Keamanan Jaringan

Idealnya, MySQL tidak akan tersedia melalui jaringan dan semua koneksi akan ditangani secara lokal, melalui soket Unix. Dalam beberapa pengaturan, ini mungkin - dalam hal ini Anda dapat menambahkan variabel 'lewati-jaringan' di my.cnf. Ini akan mencegah MySQL menggunakan komunikasi TCP/IP apa pun, hanya soket Unix yang tersedia di Linux (Pipa bernama dan memori bersama di host Windows).

Namun, sebagian besar waktu, keamanan yang ketat seperti itu tidak layak dilakukan. Dalam hal ini Anda perlu mencari solusi lain. Pertama, Anda dapat menggunakan firewall untuk mengizinkan lalu lintas hanya dari host tertentu ke server MySQL. Misalnya, host aplikasi (walaupun mereka seharusnya baik-baik saja dengan menjangkau MySQL melalui proxy), lapisan proxy, dan mungkin server manajemen. Host lain di jaringan Anda mungkin tidak memerlukan akses langsung ke server MySQL. Ini akan membatasi kemungkinan serangan pada database Anda, jika beberapa host di jaringan Anda akan disusupi.

Jika Anda menggunakan proxy yang memungkinkan pencocokan ekspresi reguler untuk kueri, Anda dapat menggunakannya untuk menganalisis lalu lintas SQL dan memblokir kueri yang mencurigakan. Kemungkinan besar host aplikasi Anda tidak boleh menjalankan “DELETE * FROM your_table;” secara teratur. Jika diperlukan untuk menghapus beberapa data, itu dapat dijalankan dengan tangan, secara lokal, pada instance MySQL. Anda dapat membuat aturan seperti itu menggunakan sesuatu seperti ProxySQL:blokir, tulis ulang, arahkan kueri semacam itu. MaxScale juga memberi Anda opsi untuk memblokir kueri berdasarkan ekspresi reguler.

6. Plugin Audit

Jika Anda tertarik untuk mengumpulkan data tentang siapa yang mengeksekusi apa dan kapan, ada beberapa plugin audit yang tersedia untuk MySQL. Jika Anda menggunakan MySQL Enterprise, Anda dapat menggunakan MySQL Enterprise Audit yang merupakan ekstensi dari MySQL Enterprise. Percona dan MariaDB juga memiliki plugin audit versi mereka sendiri. Terakhir, plugin McAfee untuk MySQL juga dapat digunakan dengan versi MySQL yang berbeda. Secara umum, plugin tersebut mengumpulkan data yang kurang lebih sama - menghubungkan dan memutuskan acara, kueri dieksekusi, tabel diakses. Semua ini berisi informasi tentang pengguna mana yang berpartisipasi dalam acara tersebut, dari host mana ia login, kapan itu terjadi dan sebagainya. Outputnya bisa berupa XML atau JSON, jadi lebih mudah untuk menguraikannya daripada mengurai konten log umum (walaupun datanya agak mirip). Output tersebut juga dapat dikirim ke syslog dan, lebih lanjut, semacam server log untuk diproses dan dianalisis.

7. Nonaktifkan LOAD DATA LOCAL INFILE

Jika server dan klien memiliki kemampuan untuk menjalankan LOAD DATA LOCAL INFILE, klien akan dapat memuat data dari file lokal ke server MySQL jarak jauh. Ini, berpotensi, dapat membantu membaca file yang dapat diakses oleh klien - misalnya, pada server aplikasi, seseorang dapat mengakses file apa pun yang dapat diakses oleh server HTTP. Untuk menghindarinya, Anda perlu mengatur local-infile=0 di my.cnf

8. Hak Istimewa File

Anda harus ingat bahwa keamanan MySQL juga tergantung pada pengaturan sistem operasi. MySQL menyimpan data dalam bentuk file. Server MySQL menulis banyak informasi ke log. Terkadang informasi ini berisi data - log kueri lambat, log umum atau log biner, misalnya. Anda perlu memastikan bahwa informasi ini aman dan hanya dapat diakses oleh pengguna yang harus mengaksesnya. Biasanya ini berarti bahwa hanya root dan pengguna yang haknya menjalankan MySQL, yang memiliki akses ke semua file terkait MySQL. Sebagian besar waktu itu adalah pengguna khusus yang disebut 'mysql'. Anda harus memeriksa file konfigurasi MySQL dan semua log yang dihasilkan oleh MySQL dan memverifikasi bahwa mereka tidak dapat dibaca oleh pengguna lain.

9. SSL dan Enkripsi Data dalam Transit

Mencegah orang mengakses konfigurasi dan file log adalah satu hal. Masalah lainnya adalah memastikan data ditransfer dengan aman melalui jaringan. Dengan pengecualian pengaturan di mana semua klien adalah lokal dan menggunakan soket Unix untuk mengakses MySQL, dalam sebagian besar kasus, data yang membentuk kumpulan hasil untuk kueri, meninggalkan server dan ditransfer ke klien melalui jaringan. Data juga dapat ditransfer antar server MySQL, misalnya melalui replikasi MySQL standar atau dalam cluster Galera. Lalu lintas jaringan dapat diendus, dan melalui cara itu, data Anda akan diekspos.

Untuk mencegah hal ini terjadi, dimungkinkan untuk menggunakan SSL untuk mengenkripsi lalu lintas, baik sisi server maupun sisi klien. Anda dapat membuat koneksi SSL antara klien dan server MySQL. Anda juga dapat membuat koneksi SSL antara master dan slave Anda, atau antara node kluster Galera. Ini akan memastikan bahwa semua data yang ditransfer aman dan tidak dapat diendus oleh penyerang yang mendapatkan akses ke jaringan Anda.

Dokumentasi MySQL mencakup secara rinci cara mengatur enkripsi SSL. Jika Anda merasa terlalu rumit, ClusterControl dapat membantu Anda menerapkan lingkungan yang aman untuk replikasi MySQL atau cluster Galera dalam beberapa klik:

10. Enkripsi Data saat Istirahat

Mengamankan data saat transit menggunakan enkripsi SSL hanya menyelesaikan sebagian masalah. Anda juga perlu menjaga data saat istirahat - semua data yang disimpan dalam database. Enkripsi data saat istirahat juga dapat menjadi persyaratan untuk peraturan keamanan seperti HIPAA atau PCI DSS. Enkripsi semacam itu dapat diterapkan pada berbagai level - Anda dapat mengenkripsi seluruh disk tempat file disimpan. Anda hanya dapat mengenkripsi database MySQL melalui fungsionalitas yang tersedia di versi terbaru MySQL atau MariaDB. Enkripsi juga dapat diimplementasikan dalam aplikasi, sehingga mengenkripsi data sebelum menyimpannya di database. Setiap opsi memiliki pro dan kontra:enkripsi disk hanya dapat membantu ketika disk dicuri secara fisik, tetapi file tidak akan dienkripsi pada server database yang sedang berjalan. Enkripsi database MySQL memecahkan masalah ini, tetapi tidak dapat mencegah akses ke data saat akun root disusupi. Enkripsi tingkat aplikasi adalah yang paling fleksibel dan aman, tetapi kemudian Anda kehilangan kekuatan SQL - cukup sulit untuk menggunakan kolom terenkripsi dalam klausa WHERE atau JOIN.

Semua rasa MySQL menyediakan semacam enkripsi data saat istirahat. MySQL Oracle menggunakan Enkripsi Data Transparan untuk mengenkripsi tablespace InnoDB. Ini tersedia dalam penawaran MySQL Enterprise komersial. Ini memberikan opsi untuk mengenkripsi tablespace InnoDB, file lain yang juga menyimpan data dalam beberapa bentuk (misalnya, log biner, log umum, log kueri lambat) tidak dienkripsi. Hal ini memungkinkan toolchain (MySQL Enterprise Backup tetapi juga xtrabackup, mysqldump, mysqlbinlog) untuk bekerja dengan benar dengan pengaturan tersebut.

Mulai dari MySQL 5.7.11, MySQL versi komunitas juga mendapat dukungan untuk enkripsi tablespace InnoDB. Perbedaan utama dibandingkan dengan penawaran perusahaan adalah cara kunci disimpan - kunci tidak terletak di brankas yang aman, yang diperlukan untuk kepatuhan terhadap peraturan. Ini berarti bahwa mulai dari Percona Server 5.7.11, juga dimungkinkan untuk mengenkripsi tablespace InnoDB. Di Percona Server 5.7.20 yang baru-baru ini diterbitkan, dukungan untuk mengenkripsi log biner telah ditambahkan. Dimungkinkan juga untuk berintegrasi dengan server Hashicorp Vault melalui plugin keyring_vault, mencocokkan (dan bahkan memperluas - enkripsi log biner) fitur yang tersedia di edisi Oracle MySQL Enterprise.

MariaDB menambahkan dukungan untuk enkripsi data di 10.1.3 - ini adalah implementasi terpisah yang disempurnakan. Ini memberi Anda kemungkinan untuk tidak hanya mengenkripsi tablespace InnoDB, tetapi juga file log InnoDB. Akibatnya, data lebih aman tetapi beberapa alat tidak akan berfungsi dalam konfigurasi seperti itu. Xtrabackup tidak akan berfungsi dengan log redo terenkripsi - MariaDB membuat fork, MariaDB Backup, yang menambahkan dukungan untuk enkripsi MariaDB. Ada juga masalah dengan mysqlbinlog.

Apa pun jenis MySQL yang Anda gunakan, selama itu adalah versi terbaru, Anda akan memiliki opsi untuk menerapkan enkripsi data saat istirahat melalui server database, memastikan bahwa data Anda juga diamankan.

Mengamankan MySQL atau MariaDB bukanlah hal yang sepele, tetapi kami berharap 10 tips ini akan membantu Anda.

Ringkasan

Dalam lanskap saat ini, keamanan data adalah prioritas utama bagi setiap administrator database. Apakah motivasi Anda adalah mematuhi persyaratan peraturan atau melindungi pelanggan dan reputasi bisnis Anda, sepuluh tips untuk mengamankan database MySQL dan MariaDB ini akan membantu Anda lebih mengamankan infrastruktur dan memberikan ketenangan pikiran.

Ada banyak langkah yang perlu dipertimbangkan saat memastikan infrastruktur database Anda aman. Dalam postingan ini, kami telah membahas dasar-dasar seperti enkripsi data, kontrol akses jaringan, autentikasi dan hak istimewa pengguna, keamanan sistem operasi, dan banyak lagi.

Perangkat lunak otomatisasi manajemen basis data, seperti ClusterControl, dapat menjadi alat yang hebat untuk membantu upaya keamanan basis data Anda secara keseluruhan. Jika Anda ingin mempelajari lebih dalam setiap langkah yang harus Anda ambil untuk mengamankan database MySQL Anda, pastikan untuk membaca Bagian 1 dan Bagian 2 dari seri kami tentang Cara Mengamankan MySQL. Untuk tetap mendapat informasi tentang praktik terbaik manajemen basis data lainnya, ikuti kami di Twitter, LinkedIn, dan berlangganan buletin kami untuk pembaruan.


  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 REPLACE() Bekerja di MariaDB

  2. Pemantauan Keamanan Basis Data untuk MySQL dan MariaDB

  3. MariaDB KECUALI Operator Dijelaskan

  4. Bagaimana Langkah Wildcard JSONPath (**) Bekerja di MariaDB

  5. Tips dan Trik menggunakan Audit Logging untuk MariaDB