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

Pemantauan Keamanan Basis Data untuk MySQL dan MariaDB

Perlindungan data adalah salah satu aspek terpenting dalam mengelola database. Bergantung pada struktur organisasi, apakah Anda seorang pengembang, sysadmin, atau DBA, jika Anda mengelola database produksi, Anda harus memantau data untuk akses dan penggunaan yang tidak sah. Tujuan pemantauan keamanan ada dua. Satu, untuk mengidentifikasi aktivitas yang tidak sah pada database. Dan kedua, untuk memeriksa apakah database dan konfigurasinya di seluruh perusahaan sesuai dengan kebijakan dan standar keamanan.

Pada artikel ini, kami akan membagi pemantauan untuk keamanan dalam dua kategori. Salah satunya akan terkait dengan audit aktivitas database MySQL dan MariaDB. Kategori kedua adalah tentang memantau instance Anda dari kemungkinan celah keamanan.

Pemantauan Berbasis Kebijakan Kueri dan Koneksi

Audit berkelanjutan adalah tugas penting untuk memantau lingkungan database Anda. Dengan mengaudit database Anda, Anda dapat mencapai akuntabilitas atas tindakan yang diambil atau konten yang diakses. Selain itu, audit dapat mencakup beberapa komponen sistem penting, seperti yang terkait dengan data keuangan untuk mendukung serangkaian peraturan yang tepat seperti SOX, atau peraturan GDPR UE. Biasanya, ini dicapai dengan mencatat informasi tentang operasi DB pada database ke file log eksternal.

Secara default, audit di MySQL atau MariaDB dinonaktifkan. Anda dan mencapainya dengan menginstal plugin tambahan atau dengan menangkap semua kueri dengan parameter query_log. File log kueri umum adalah catatan umum tentang kinerja MySQL. Server mencatat beberapa informasi ke log ini ketika klien terhubung atau terputus, dan mencatat setiap pernyataan SQL yang diterima dari klien. Karena masalah kinerja dan kurangnya opsi konfigurasi, general_log bukanlah solusi yang baik untuk tujuan audit keamanan.

Jika Anda menggunakan MySQL Enterprise, Anda dapat menggunakan plugin MySQL Enterprise Audit yang merupakan ekstensi dari versi MySQL berpemilik. Plugin MySQL Enterprise Audit Plugin hanya tersedia dengan MySQL Enterprise, yang merupakan penawaran komersial dari Oracle. Percona dan MariaDB telah membuat versi open source plugin audit mereka sendiri. Terakhir, plugin McAfee untuk MySQL juga dapat digunakan dengan berbagai versi MySQL. Pada artikel ini, kita akan fokus pada plugin open source, meskipun versi Enterprise dari Oracle tampaknya yang paling kuat dan stabil.

Karakteristik Plugin Audit Sumber Terbuka MySQL

Sementara plugin audit open source melakukan pekerjaan yang sama seperti plugin Enterprise dari Oracle - mereka menghasilkan output dengan kueri dan koneksi database - ada beberapa perbedaan arsitektur utama.

Plugin Audit MariaDB – Plugin Audit MariaDB bekerja dengan MariaDB, MySQL (mulai versi 5.5.34 dan 10.0.7) dan Server Percona. MariaDB mulai menyertakan Audit Plugin secara default dari versi 10.0.10 dan 5.5.37, dan dapat diinstal di versi apa pun dari MariaDB 5.5.20. Ini adalah satu-satunya plugin yang mendukung Oracle MySQL, Percona Server, dan MariaDB. Ini tersedia di platform Windows dan Linux. Versi mulai dari 1.2 paling stabil, dan mungkin berisiko menggunakan versi di bawahnya di lingkungan produksi Anda.

McAfee MySQL Audit Plugin – Plugin ini tidak menggunakan API audit MySQL. Baru-baru ini diperbarui untuk mendukung MySQL 5.7. Beberapa pengujian menunjukkan bahwa plugin berbasis API dapat memberikan kinerja yang lebih baik tetapi Anda perlu memeriksanya dengan lingkungan Anda.

Plugin Log Audit Percona – Percona menyediakan solusi audit sumber terbuka yang diinstal dengan Percona Server 5.5.37+ dan 5.6.17+ sebagai bagian dari proses instalasi. Dibandingkan dengan plugin open source lainnya, plugin ini memiliki lebih banyak fitur output jangkauan karena output XML, JSON dan syslog.

Karena memiliki beberapa kait internal ke server agar kompatibel dengan fitur dengan plugin Oracle, plugin ini tidak tersedia sebagai plugin mandiri untuk versi MySQL lainnya.

Penginstalan plugin berdasarkan ekstensi audit MariaDB

Pemasangan plugin MySQL open source sangat mirip untuk versi MariaDB, Percona, dan McAfee.
Percona dan MariaDB menambahkan plugin mereka sebagai bagian dari binari server default, jadi tidak perlu mengunduh plugin secara terpisah. Versi Percona hanya secara resmi mendukung fork MySQL-nya sendiri sehingga tidak ada unduhan langsung dari situs web vendor (jika Anda ingin menggunakan plugin ini dengan MySQL, Anda harus mendapatkan plugin dari paket server Percona). Jika Anda ingin menggunakan plugin MariaDB dengan garpu MySQL lainnya, Anda dapat menemukannya dari https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/. Plugin McAfee tersedia di https://github.com/mcafee/mysql-audit/wiki/Installation.

Sebelum Anda memulai instalasi plugin, Anda dapat memeriksa apakah plugin ada di sistem. Lokasi plugin dinamis (tidak memerlukan restart instan) dapat diperiksa dengan:

TAMPILKAN VARIABEL GLOBAL SEPERTI 'plugin_dir';+---------------+------------------- -------+| Nama_variabel | Nilai |+---------------+--------------------------+| plugin_dir | /usr/lib64/mysql/plugin/ |+---------------+----------------------- ---+ 

Periksa direktori yang dikembalikan pada tingkat sistem file untuk memastikan Anda memiliki salinan perpustakaan plugin. Jika Anda tidak memiliki server_audit.so atau server_audit.dll di dalam /usr/lib64/mysql/plugin/, kemungkinan besar versi MariaDB Anda tidak didukung dan harus memutakhirkannya ke versi terbaru..

Sintaks untuk menginstal plugin MariaDB adalah:

INSTAL SONAME 'server_audit'; 

Untuk memeriksa plugin yang diinstal, Anda harus menjalankan:

TAMPILKAN PLUGIN;MariaDB [(none)]> tampilkan plugin;+------------------------------ -+----------+--------------------+---------------- ----+---------+| Nama | Status | Ketik | Perpustakaan | Lisensi |+-------------------------------+----------+---- ----------------+--------------------+---------+| binlog | AKTIF | MESIN PENYIMPANAN | NULL | GPL || mysql_native_password | AKTIF | Otentikasi | NULL | GPL || mysql_old_password | AKTIF | Otentikasi | NULL | GPL || bungkus | AKTIF | MESIN PENYIMPANAN | NULL | GPL || MRG_MyISAM | AKTIF | MESIN PENYIMPANAN | NULL | GPL || MEMORI | AKTIF | MESIN PENYIMPANAN | NULL | GPL || CSV | AKTIF | MESIN PENYIMPANAN | NULL | GPL || MyISAM | AKTIF | MESIN PENYIMPANAN | NULL | GPL || CLIENT_STATISTICS | AKTIF | SKEMA INFORMASI | NULL | GPL || INDEX_STATISTICS | AKTIF | SKEMA INFORMASI | NULL | GPL || TABLE_STATISTICS | AKTIF | SKEMA INFORMASI | NULL | GPL || USER_STATISTICS | AKTIF | SKEMA INFORMASI | NULL | GPL || PERFORMANCE_SCHEMA | AKTIF | MESIN PENYIMPANAN | NULL | GPL || InnoDB | AKTIF | MESIN PENYIMPANAN | NULL | GPL || INNODB_TRX | AKTIF | SKEMA INFORMASI | NULL | GPL || INNODB_LOCKS | AKTIF | SKEMA INFORMASI | NULL | GPL || INNODB_LOCK_WAITS | AKTIF | SKEMA INFORMASI | NULL | GPL || INNODB_CMP | AKTIF | SKEMA INFORMASI | NULL | GPL |...| INNODB_MUTEXES | AKTIF | SKEMA INFORMASI | NULL | GPL || INNODB_SYS_SEMAPHORE_WAITS | AKTIF | SKEMA INFORMASI | NULL | GPL || INNODB_TABLESPACES_ENCRYPTION | AKTIF | SKEMA INFORMASI | NULL | BSD || INNODB_TABLESPACES_SCRUBBING | AKTIF | SKEMA INFORMASI | NULL | BSD || aria | AKTIF | MESIN PENYIMPANAN | NULL | GPL || URUTAN | AKTIF | MESIN PENYIMPANAN | NULL | GPL || variabel_pengguna | AKTIF | SKEMA INFORMASI | NULL | GPL || UMPAN BALIK | DENGAN DISABILITAS | SKEMA INFORMASI | NULL | GPL || partisi | AKTIF | MESIN PENYIMPANAN | NULL | GPL || rpl_semi_sync_master | AKTIF | REPLIKASI | semisync_master.so | GPL || rpl_semi_sync_slave | AKTIF | REPLIKASI | semisync_slave.so | GPL || SERVER_AUDIT | AKTIF | AUDIT | server_audit.so | GPL |+-------------------------------+----------+---- ----------------+--------------------+---------+ 

Jika Anda memerlukan informasi tambahan, periksa tabel PLUGINS di database information_schema yang berisi informasi lebih detail.

Cara lain untuk menginstal plugin adalah dengan mengaktifkan plugin di my.cnf dan memulai ulang instance. Contoh konfigurasi plugin audit dasar dari MariaDB adalah :

server_audit_events=CONNECTserver_audit_file_path=/var/log/mysql/audit.logserver_audit_file_rotate_size=1073741824server_audit_file_rotations=8server_audit_logging=ONserver_audit_incl_users=server_audit_excl_users=server_audit_output_type=FILEserver_audit_query_log_limit=1024 

Pengaturan di atas harus ditempatkan di my.cnf. Plugin audit akan membuat file /var/log/mysql/audit.log yang akan berputar pada ukuran 1GB dan akan ada delapan rotasi hingga file tersebut ditimpa. File hanya akan berisi informasi tentang koneksi.

Saat ini, ada enam belas setelan yang dapat Anda gunakan untuk menyesuaikan plugin audit MariaDB.

server_audit_eventsserver_audit_excl_usersserver_audit_file_pathserver_audit_file_rotate_nowserver_audit_file_rotate_sizeserver_audit_file_rotationsserver_audit_incl_usersserver_audit_loc_infoserver_audit_loggingserver_audit_modeserver_audit_output_type_audit_limit_server_logsylogsylog_audit_server_type_audit_limit_server_logsinfosylogserver_audit_idententserver

Di antaranya, Anda dapat menemukan opsi untuk menyertakan atau mengecualikan pengguna, mengatur berbagai aktivitas logging (CONNECT atau QUERY) dan beralih antara file dan syslog.

Untuk memastikan plugin akan diaktifkan pada startup server, Anda harus mengatur
plugin_load=server_audit=server_audit.so di pengaturan my.cnf Anda. Konfigurasi tersebut dapat dilindungi tambahan oleh server_audit=FORCE_PLUS_PERMANENT yang akan menonaktifkan opsi uninstall plugin.

UNINSTALL PLUGIN server_audit;ERROR 1702 (HY000):Plugin 'server_audit' bersifat force_plus_permanent dan tidak dapat dibongkar 

Berikut adalah beberapa contoh entri yang dihasilkan oleh plugin audit MariaDB:

20180817 20:00:01,slave,cmon,cmon,31,0,DISCONNECT,information_schema,,020180817 20:47:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,, 020180817 20:47:02,slave,cmon,cmon,19,0,DISCONNECT,information_schema,,020180817 20:47:02,slave,cmon,cmon,18,0,DISCONNECT,information_schema,,020180819 17:19:19 ,slave,cmon,cmon,12,0,CONNECT,information_schema,,020180819 17:19:19,slave,root,localhost,13,0,FAILED_CONNECT,,,104520180819 17:19:19,slave,root,localhost, 13,0,DISCONNECT,,,020180819 17:19:20,slave,cmon,cmon,14,0,CONNECT,mysql,,020180819 17:19:20,slave,cmon,cmon,14,0,DISCONNECT,mysql ,,020180819 17:19:21,slave,cmon,cmon,15,0,CONNECT,information_schema,,020180819 17:19:21,slave,cmon,cmon,16,0,CONNECT,information_schema,,020180819 19:00 :01,slave,cmon,cmon,17,0,CONNECT,information_schema,,020180819 19:00:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0 

Laporan perubahan skema

Jika Anda hanya perlu melacak perubahan DDL, Anda dapat menggunakan Laporan Operasional ClusterControl pada Perubahan Skema. Laporan Deteksi Perubahan Skema menunjukkan perubahan DDL pada database Anda. Fungsionalitas ini memerlukan parameter tambahan dalam file konfigurasi ClusterControl. Jika ini tidak disetel, Anda akan melihat informasi berikut:schema_change_detection_address tidak disetel di /etc/cmon.d/cmon_1.cnf. Setelah itu di tempat contoh output mungkin seperti di bawah ini:

Itu dapat diatur dengan jadwal, dan laporan dikirim melalui email ke penerima.

ClusterControl:Jadwalkan Laporan Operasional

Penilaian Keamanan Database MySQL

Pemeriksaan Peningkatan Paket

Pertama, kita akan mulai dengan pemeriksaan keamanan. Menjadi up-to-date dengan patch MySQL akan membantu mengurangi risiko yang terkait dengan kerentanan yang diketahui ada di server MySQL. Anda dapat menjaga lingkungan Anda tetap mutakhir dengan menggunakan repositori paket vendor. Berdasarkan informasi ini, Anda dapat membuat laporan sendiri, atau menggunakan alat seperti ClusterControl untuk memverifikasi lingkungan Anda dan memperingatkan Anda tentang kemungkinan pembaruan.

Laporan Peningkatan ClusterControl mengumpulkan informasi dari sistem operasi dan membandingkannya dengan paket yang tersedia di repositori. Laporan ini dibagi menjadi empat bagian; ringkasan upgrade, paket database, paket keamanan, dan paket lainnya. Anda dapat dengan cepat membandingkan apa yang telah Anda instal di sistem Anda dan menemukan peningkatan atau patch yang disarankan.

Kontrol Cluster:Laporan Peningkatan ClusterControl:Perbarui detail Laporan

Untuk membandingkannya secara manual, Anda dapat menjalankan

TAMPILKAN VARIABEL DI MANA variable_name SEPERTI "versi"; 

Dengan buletin keamanan seperti:
https://www.Oracle.com/technetwork/topics/security/alerts-086861.html
https://nvd.nist.gov/view/vuln/search- result?adv_search=true&cves=on&cpe_vendor=cpe%3a%2f%3aoracle&cpe_produ
https://www.percona.com/doc/percona-server/LATEST/release-notes/release-notes_index.html
https://downloads.mariadb.org/mariadb/+releases/
https://www.cvedetails.com/vulnerability-list/vendor_id-12010/Mariadb.html
https://www. cvedetails.com/vulnerability-list/vendor_id-13000/Percona.html

Atau repositori vendor:

Di Debian

sudo apt list mysql-server 

Di RHEL/Centos

daftar enak | grep -i mariadb-server 

Akun Tanpa Kata Sandi

Kata sandi kosong memungkinkan pengguna untuk masuk tanpa menggunakan 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. Untungnya, ini telah berubah di MySQL 5.7. Terakhir, ia hanya datang dengan akun root yang menggunakan kata sandi yang Anda pilih saat penginstalan.

Untuk setiap baris yang dikembalikan dari prosedur audit, tetapkan kata sandi:

PILIH Pengguna,hostFROM mysql.userWHERE authentication_string=''; 

Selain itu, Anda dapat memasang plugin validasi kata sandi dan menerapkan kebijakan yang lebih aman:

INSTALL PLUGIN validate_password SONAME 'validate_password.so';TAMPILKAN VARIABEL SEPERTI 'default_password_lifetime';TAMPILKAN VARIABEL SEPERTI 'validate_password%'; 

Awal yang baik dapat berupa:

plugin-load=validate_password.sovalidate-password=FORCE_PLUS_PERMANENTvalidate_password_length=14validate_password_mixed_case_count=1validate_password_number_count=1validate_password_special_char_count=1validate_password_policy=MEDIUM 

Tentu saja, pengaturan ini akan bergantung pada kebutuhan bisnis Anda.

Pemantauan Akses Jarak Jauh

Menghindari penggunaan karakter pengganti dalam nama host membantu mengontrol lokasi tertentu dari mana pengguna tertentu dapat terhubung dan berinteraksi dengan database.

Anda harus memastikan bahwa setiap pengguna dapat terhubung ke MySQL hanya dari host tertentu. Anda selalu dapat menentukan beberapa entri untuk pengguna yang sama, ini akan membantu mengurangi kebutuhan akan wildcard.

Jalankan pernyataan SQL berikut untuk menilai rekomendasi ini (pastikan tidak ada baris yang dikembalikan):

PILIH pengguna, host FROM mysql.user WHERE host ='%'; 

Uji basis data

Instalasi MySQL default dilengkapi dengan database yang tidak digunakan yang disebut tes dan database tes tersedia untuk setiap pengguna, terutama untuk pengguna anonim. Pengguna tersebut dapat membuat tabel dan menulisnya. Ini berpotensi menjadi masalah tersendiri - dan penulisan akan menambah beberapa overhead dan mengurangi kinerja database. Direkomendasikan bahwa database pengujian dijatuhkan. Untuk menentukan apakah database pengujian ada, jalankan:

TAMPILKAN DATABASES SEPERTI 'test'; 

Jika Anda melihat bahwa database pengujian ada, ini mungkin karena skrip mysql_secure_installation yang menghapus database pengujian (serta aktivitas terkait keamanan lainnya) tidak dijalankan.

MUAT INFILE DATA

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. Parameter local_infile menentukan apakah file yang terletak di komputer klien MySQL dapat dimuat atau dipilih melalui LOAD DATA INFILE atau SELECT local_file.

Ini, berpotensi, dapat membantu membaca file yang dapat diakses oleh klien - misalnya, pada server aplikasi, seseorang dapat mengakses data apa pun yang dapat diakses oleh server HTTP. Untuk menghindarinya, Anda perlu menyetel local-infile=0 di my.cnf.

Jalankan pernyataan SQL berikut dan pastikan bidang Nilai disetel ke OFF:

TAMPILKAN VARIABEL DI MANA Variable_name ='local_infile'; 

Pantau untuk ruang tabel yang tidak dienkripsi

Mulai dari MySQL 5.7.11, InnoDB mendukung enkripsi data untuk tabel yang disimpan dalam ruang tabel file-per-tabel. Fitur ini menyediakan enkripsi saat istirahat untuk file data tablespace fisik. Untuk memeriksa apakah tabel Anda telah dienkripsi, jalankan:

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';+--------------+---- ---------+----------------+| TABLE_SCHEMA | TABEL_NAME | CREATE_OPTIONS |+--------------+------------+----------------+| tes | t1 | ENKRIPSI="Y" |+--------------+------------+--------------- -+ 

Sebagai bagian dari enkripsi, Anda juga harus mempertimbangkan enkripsi log biner. Server MySQL menulis banyak informasi ke log biner.

Validasi koneksi enkripsi

Dalam beberapa pengaturan, database tidak boleh diakses melalui jaringan jika setiap koneksi dikelola secara lokal, melalui soket Unix. Dalam kasus seperti itu, Anda dapat menambahkan variabel 'lewati-jaringan' di my.cnf. Lewati jaringan mencegah MySQL menggunakan koneksi TCP/IP apa pun, dan hanya soket Unix yang dimungkinkan di Linux.

Namun ini adalah situasi yang agak jarang karena biasanya mengakses MySQL melalui jaringan. Anda kemudian perlu memantau bahwa koneksi Anda dienkripsi. MySQL mendukung SSL sebagai sarana untuk mengenkripsi lalu lintas baik antara server MySQL (replikasi) maupun antara server MySQL dan klien. Jika Anda menggunakan kluster Galera, fitur serupa tersedia - komunikasi intra-cluster dan koneksi dengan klien dapat dienkripsi menggunakan SSL. Untuk memeriksa apakah Anda menggunakan enkripsi SSL, jalankan kueri berikut:

TAMPILKAN variabel WHERE variable_name ='have_ssl'; pilih ssl_verify_server_cert dari mysql.slave_master_info; 

Itu saja untuk saat ini. Ini bukan daftar lengkap, beri tahu kami jika ada pemeriksaan lain yang Anda lakukan hari ini pada basis data produksi Anda.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mencapai Kepatuhan PCI untuk MySQL &MariaDB dengan ClusterControl - Pemutaran Ulang

  2. Membangun Cold Standby MySQL atau MariaDB Database di Amazon AWS

  3. MariaDB ROUND() vs LANTAI()

  4. Perbaiki "ERROR 1250 (42000):Tabel '...' dari salah satu SELECT tidak dapat digunakan dalam klausa ORDER" di MariaDB

  5. Bagaimana BIN() Bekerja di MariaDB