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

Tips dan Trik menggunakan Audit Logging untuk MariaDB

Plugin Audit MariaDB menyediakan fungsionalitas audit tidak hanya untuk MariaDB tetapi juga MySQL (mulai, versi 5.5.34 dan 10.0.7) dan Server Percona. MariaDB mulai menyertakan secara default Plugin Audit dari versi 10.0.10 dan 5.5.37, dan dapat diinstal di versi apa pun dari MariaDB 5.5.20.

Tujuan dari MariaDB Audit Plugin adalah untuk mencatat aktivitas server. Untuk setiap sesi klien, ini mencatat siapa yang terhubung ke server (yaitu, nama pengguna dan host), kueri apa yang dieksekusi, dan tabel mana yang diakses dan variabel server yang diubah. Informasi ini disimpan dalam file log berputar atau mungkin dikirim ke syslogd lokal.

Dalam posting blog ini, kami akan menunjukkan kepada Anda beberapa penyetelan praktik terbaik dan tip tentang cara mengonfigurasi logging audit untuk server MariaDB. Penulisan ini didasarkan pada MariaDB 10.5.9, dengan versi terbaru MariaDB Audit Plugin 1.4.4.

Penyetelan Instalasi

Cara yang disarankan untuk mengaktifkan logging audit adalah dengan menyetel baris berikut di dalam file konfigurasi MariaDB:

[mariadb]
plugin_load_add = server_audit # load plugin
server_audit=FORCE_PLUS_PERMANENT  # do not allow users to uninstall plugin
server_audit_file_path=/var/log/mysql/mariadb-audit.log # path to the audit log
server_audit_logging=ON  # enable audit logging

Jangan lupa untuk menyetel "server_audit=FORCE_PLUS_PERMANENT" untuk menerapkan log audit dan melarangnya untuk dicopot oleh pengguna lain menggunakan pernyataan UNINSTALL SONAME. Secara default, tujuan logging adalah file log di direktori data MariaDB. Kita harus meletakkan log audit di luar direktori ini karena ada kemungkinan datadir akan dihapus (SST untuk Galera Cluster), atau diganti untuk pemulihan fisik seperti pertukaran datadir saat memulihkan cadangan yang diambil dari Cadangan MariaDB.

Penyetelan lebih lanjut diperlukan, seperti yang ditunjukkan pada bagian berikut.

Pemfilteran Peristiwa Audit

Plugin Audit MariaDB menggunakan beberapa setelan log yang bergantung pada versi plugin. Peristiwa audit berikut tersedia pada versi plugin terbaru 1.4.4:

Jenis

Deskripsi

HUBUNGKAN

Menyambungkan, memutuskan sambungan, dan sambungan gagal, termasuk kode kesalahan

QUERY

Kueri yang dijalankan dan hasilnya dalam teks biasa, termasuk kueri yang gagal karena kesalahan sintaks atau izin

TABEL

Tabel yang dipengaruhi oleh eksekusi kueri

QUERY_DDL

Mirip dengan QUERY, tetapi hanya memfilter kueri tipe DDL (pernyataan CREATE, ALTER, DROP, RENAME dan TRUNCATE - kecuali CREATE/DROP [PROCEDURE / FUNCTION / USER] dan RENAME USER (mereka 'bukan DDL)

QUERY_DML

Mirip dengan QUERY, tetapi hanya memfilter kueri tipe DML (pernyataan DO, CALL, LOAD DATA/XML, DELETE, INSERT, SELECT, UPDATE, HANDLER, dan REPLACE)

QUERY_DML_NO_SELECT

Mirip dengan QUERY_DML, tetapi tidak mencatat kueri SELECT. (sejak versi 1.4.4) (pernyataan DO, CALL, LOAD DATA/XML, DELETE, INSERT, UPDATE, HANDLER dan REPLACE)

QUERY_DCL

Mirip dengan QUERY, tetapi hanya memfilter kueri tipe DCL (pernyataan CREATE USER, DROP USER, RENAME USER, GRANT, REVOKE, dan SET PASSWORD)

Secara default, ini akan melacak semuanya karena variabel server_audit_events akan disetel ke kosong secara default. Perhatikan bahwa versi yang lebih lama memiliki lebih sedikit dukungan untuk jenis operasi di atas, seperti yang ditunjukkan di sini. Jadi pastikan Anda menjalankan versi terbaru jika Anda ingin melakukan pemfilteran tertentu.

Jika cache kueri diaktifkan, dan kueri dikembalikan dari cache kueri, tidak ada catatan TABEL yang akan muncul di log karena server tidak membuka atau mengakses tabel apa pun dan sebaliknya mengandalkan cache hasil. Jadi, Anda mungkin ingin menonaktifkan cache kueri.

Untuk memfilter peristiwa tertentu, setel baris berikut di dalam file konfigurasi MariaDB (harus dimulai ulang):

server_audit_events = 'CONNECT,QUERY,TABLE'

Atau atur secara dinamis di runtime menggunakan SET GLOBAL (tidak memerlukan restart, tetapi tidak persisten):

MariaDB> SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';

Ini adalah contoh satu peristiwa audit:

20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,226,QUERY,information_schema,'SHOW GLOBAL VARIABLES',0

Entri log ini terdiri dari sekumpulan informasi yang dipisahkan oleh koma yang berisi informasi berikut:

  • Stempel waktu

  • Host MySQL (identik dengan nilai SELECT @@hostname)

  • Pengguna database

  • Host tempat pengguna terhubung

  • ID Koneksi

  • ID Thread

  • Operasi

  • Database

  • Pernyataan/perintah SQL

  • Kembalikan kode. 0 berarti operasi mengembalikan respons sukses (bahkan kosong), sedangkan nilai bukan nol berarti kesalahan menjalankan operasi seperti kueri yang gagal karena kesalahan sintaks atau izin.

Saat memfilter entri, seseorang akan melakukan grep sederhana dan mencari pola tertentu:

$ grep -i global /var/lib/mysql/server_audit.log
20210325 04:19:17,ip-172-31-0-44,root,localhost,14,37080,QUERY,,'set global server_audit_file_rotate_now = 1',0
20210326 00:46:48,ip-172-31-0-44,root,localhost,35,329003,QUERY,,'set global server_audit_output_type = \'syslog\'',0

Secara default, semua nilai sandi akan ditutup dengan tanda bintang:

20210326 05:39:41,ip-172-31-0-44,root,localhost,52,398793,QUERY,mysql,'GRANT ALL PRIVILEGES ON sbtest.* TO [email protected] IDENTIFIED BY *****',0

Pemfilteran Pengguna Audit

Jika Anda melacak semuanya, Anda mungkin akan dibanjiri pengguna pemantau untuk tanggung jawab pengambilan sampelnya, seperti yang ditunjukkan pada contoh di bawah ini:

20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,226,QUERY,information_schema,'SHOW GLOBAL VARIABLES',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,227,QUERY,information_schema,'select @@global.wsrep_provider_options',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,228,QUERY,information_schema,'SHOW SLAVE STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,229,QUERY,information_schema,'SHOW MASTER STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,230,QUERY,information_schema,'SHOW SLAVE HOSTS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,231,QUERY,information_schema,'SHOW GLOBAL VARIABLES',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,232,QUERY,information_schema,'select @@global.wsrep_provider_options',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,233,QUERY,information_schema,'SHOW SLAVE STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,234,QUERY,information_schema,'SHOW MASTER STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,235,QUERY,information_schema,'SHOW SLAVE HOSTS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,5,236,QUERY,information_schema,'SET GLOBAL SLOW_QUERY_LOG=0',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,5,237,QUERY,information_schema,'FLUSH /*!50500 SLOW */ LOGS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,6,238,QUERY,information_schema,'SHOW GLOBAL STATUS',0

Dalam rentang satu detik, kita dapat melihat 14 peristiwa QUERY yang direkam oleh plugin audit untuk pengguna pemantauan kita yang disebut "cmon". Dalam beban kerja pengujian kami, kecepatan logging sekitar 32 KB per menit, yang akan terakumulasi hingga 46 MB per hari. Bergantung pada ukuran penyimpanan dan kapasitas IO, ini bisa menjadi berlebihan di beberapa beban kerja. Jadi akan lebih baik untuk memfilter pengguna pemantau dari pencatatan audit, sehingga kami dapat memiliki keluaran yang lebih bersih dan lebih mudah untuk diaudit dan dianalisis.

Bergantung pada kebijakan keamanan dan audit, kami dapat memfilter pengguna yang tidak diinginkan seperti pengguna pemantauan dengan menggunakan variabel berikut di dalam file konfigurasi MariaDB (memerlukan restart):

server_audit_excl_users='cmon'

Atau atur secara dinamis di runtime menggunakan SET GLOBAL (tidak memerlukan restart, tetapi tidak persisten):

MariaDB> SET GLOBAL server_audit_excl_users = 'cmon'

Anda dapat menambahkan beberapa pengguna database, dipisahkan dengan koma. Setelah menambahkan di atas, kami mendapatkan log audit yang lebih bersih, seperti di bawah ini (tidak ada lagi dari pengguna 'cmon'):

$ tail -f /var/log/mysql/mysql-audit.log
20210325 04:16:06,ip-172-31-0-44,cmon,172.31.1.119,6,36218,QUERY,information_schema,'SHOW GLOBAL STATUS',0
20210325 04:16:06,ip-172-31-0-44,root,localhost,13,36219,QUERY,,'set global server_audit_excl_users = \'cmon\'',0
20210325 04:16:09,ip-172-31-0-44,root,localhost,13,36237,QUERY,,'show global variables like \'%server_audit%\'',0
20210325 04:16:12,ip-172-31-0-44,root,localhost,13,0,DISCONNECT,,,0

Manajemen Rotasi Log

Karena log audit akan merekam sejumlah besar peristiwa, disarankan untuk mengonfigurasi rotasi log yang tepat untuknya. Jika tidak, kita akan berakhir dengan ukuran file log yang sangat besar yang membuatnya sangat sulit untuk dianalisis. Saat server sedang berjalan, dan server_audit_output_type=file, kita dapat memaksa rotasi file log dengan menggunakan pernyataan berikut:

MariaDB> SET GLOBAL server_audit_file_rotate_now = 1;

Untuk rotasi log otomatis, kita harus mengatur variabel berikut di dalam file konfigurasi MariaDB:

server_audit_file_rotate_size=1000000 # in bytes
server_audit_file_rotations=30

Atau atur secara dinamis saat runtime menggunakan SET GLOBAL (tidak perlu dimulai ulang):

MariaDB> SET GLOBAL server_audit_file_rotate_size=1000000;
MariaDB> SET GLOBAL server_audit_file_rotations=30;

Untuk menonaktifkan rotasi log audit, cukup setel server_audit_file_rotations ke 0. Nilai defaultnya adalah 9. Rotasi log akan terjadi secara otomatis setelah mencapai ambang yang ditentukan dan akan menyimpan 30 log terakhir, yang berarti logging audit selama 30 hari terakhir.

Audit menggunakan Syslog atau Fasilitas Rsyslog

Menggunakan fasilitas syslog atau rsyslog akan membuat manajemen log lebih mudah karena memungkinkan logging dari berbagai jenis sistem di repositori pusat. Alih-alih mempertahankan komponen logging lain, kita dapat menginstruksikan Audit MariaDB untuk masuk ke syslog. Ini berguna jika Anda memiliki pengumpul/streamer log untuk layanan penganalisis log seperti Splunk, LogStash, Loggly, atau Amazon CloudWatch.

Untuk melakukannya, setel baris berikut di dalam file konfigurasi MariaDB (harus dimulai ulang):

server_audit_logging = 'syslog'
server_audit_syslog_ident = 'mariadb-audit'

Atau jika Anda ingin mengubah runtime (tidak memerlukan restart, tetapi tidak persisten):

MariaDB> SET GLOBAL server_audit_logging = 'syslog';
MariaDB> SET GLOBAL server_audit_syslog_ident = 'mariadb-audit';

Entri akan mirip dengan format Syslog:

$ grep mariadb-audit /var/log/syslog
Mar 26 00:48:49 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,36,329540,QUERY,,'SET GLOBAL server_audit_syslog_ident = \'mariadb-audit\'',0
Mar 26 00:48:54 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,36,0,DISCONNECT,,,0

Jika Anda ingin mengatur layanan logging jarak jauh untuk repositori logging terpusat, kita dapat menggunakan rsyslog. Caranya adalah dengan menggunakan variabel server_audit_syslog_facility dimana kita bisa membuat filter untuk memudahkan logging, seperti di bawah ini:

MariaDB> SET GLOBAL server_audit_logging = 'syslog';
MariaDB> SET GLOBAL server_audit_syslog_ident = 'mariadb-audit';
MariaDB> SET GLOBAL server_audit_syslog_facility = 'LOG_LOCAL6';

Namun, ada beberapa langkah prasyarat sebelumnya. Pertimbangkan arsitektur replikasi master-slave MariaDB berikut dengan server rsyslog terpusat:

Dalam contoh ini, semua server berjalan di Ubuntu 20.04. Di server tujuan rsyslog, kita perlu mengatur yang berikut di dalam /etc/rsyslog.conf:

module(load="imtcp")
input(type="imtcp" port="514")
$ModLoad imtcp
$InputTCPServerRun 514
if $fromhost-ip=='172.31.0.44' then /var/log/mariadb-centralized-audit.log
& ~
if $fromhost-ip=='172.31.0.82' then /var/log/mariadb-centralized-audit.log
& ~

Perhatikan bahwa bagian "&~" penting dan jangan lewatkan. Ini pada dasarnya memberitahu fasilitas logging untuk login ke /var/log/mariadb-centralized-audit.log dan menghentikan pemrosesan lebih lanjut segera setelah itu.

Selanjutnya, buat file log tujuan dengan kepemilikan dan izin file yang benar:

$ touch /var/log/mariadb-centralized-audit.log
$ chown syslog:adm /var/log/mariadb-centralized-audit.log
$ chmod 640 /var/log/mariadb-centralized-audit.log

Mulai ulang rsyslog:

$ systemctl restart rsyslog

Pastikan itu mendengarkan semua alamat IP yang dapat diakses pada port TCP 514:

$ netstat -tulpn | grep rsyslog
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      3143247/rsyslogd
tcp6       0      0 :::514                  :::*                    LISTEN      3143247/rsyslogd

Kami telah menyelesaikan konfigurasi server rsyslog tujuan. Sekarang kita siap untuk mengkonfigurasi bagian sumber. Di server MariaDB, buat file konfigurasi rsyslog baru yang terpisah di /etc/rsyslog.d/50-mariadb-audit.conf dan tambahkan baris berikut:

$WorkDirectory /var/lib/rsyslog # where to place spool files
$ActionQueueFileName queue1     # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g     # 1GB space limit (use as much as possible)
$ActionQueueSaveOnShutdown on   # save messages to disk on shutdown
$ActionQueueType LinkedList     # run asynchronously
$ActionResumeRetryCount -1      # infinite retries if rsyslog host is down
local6.* action(type="omfwd" target="172.31.6.200" port="514" protocol="tcp")

Setelan di bagian pertama adalah tentang membuat antrean di disk, yang disarankan agar entri log tidak hilang. Baris terakhir itu penting. Kami mengubah variabel server_audit_syslog_facility menjadi LOG_LOCAL6 untuk plugin audit. Di sini, kami menetapkan "local6.*" sebagai filter untuk hanya meneruskan entri Syslog menggunakan fasilitas local6 ke rsyslog yang berjalan di server rsyslog 172.31.6.200, pada port 514 melalui protokol TCP.

Untuk mengaktifkan perubahan rsyslog, langkah terakhir adalah me-restart rsyslog di server MariaDB untuk mengaktifkan perubahan:

$ systemctl restart rsyslog

Sekarang, rsyslog dikonfigurasi dengan benar pada node sumber. Kami dapat menguji dengan mengakses server MariaDB dan melakukan beberapa aktivitas untuk menghasilkan peristiwa audit. Anda akan melihat entri log audit diteruskan di sini:

$ tail -f /var/log/mariadb-centralized-audit.log
Mar 26 12:56:18 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,0,CONNECT,,,0
Mar 26 12:56:18 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,489413,QUERY,,'select @@version_comment limit 1',0
Mar 26 12:56:19 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,489414,QUERY,,'show databases',0
Mar 26 12:56:37 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,0,DISCONNECT,,,0

Pemikiran Terakhir

Plugin Audit MariaDB dapat dikonfigurasi dalam banyak cara agar sesuai dengan kebijakan keamanan dan audit Anda. Informasi audit dapat membantu Anda memecahkan masalah kinerja atau aplikasi, dan memungkinkan Anda melihat dengan tepat kueri SQL apa yang sedang diproses.


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

  2. Apa itu MariaDB ColumnStore?

  3. Memaksimalkan Efisiensi Kueri Basis Data untuk MySQL - Bagian Satu

  4. MIN() Fungsi di MariaDB

  5. MariaDB CURRENT_TIMESTAMP() Dijelaskan