
Di MySQL RDS kita bisa mengaktifkan beberapa log, salah satunya audit log.
Audit log berisi catatan aktifitas server berupa:
- kapan user/client melakukan connect dan disconnect ke database
- IP user yang connect ke database
- database dan table mana saja yang diakses oleh user
- statement (DDL atau DML) yang diexecute oleh user
Contohnya:


Cara kerja MySQL RDS menggenerate audit log
MySQL RDS akan menggenerate audit log ke file/table log (tergantung konfigurasi) di server lalu dikirimkan ke service Cloudwatch agar bisa ditampilkan lognya.

Ditutorial ini kita akan mengeset write lognya ke file supaya lebih cepat (bukan ke table, *karena kalau ke table akan mempengaruhi performa database ketika workloadnya sedang tinggi. (Baca bagian: Note: Enabling table logging…).
Spesifikasi MySQL RDS
Spesifikasi MySQL RDS yang saya gunakan adalah:
- MySQL versi 8.0.35 Community Edition
Cara mengaktifkan audit log MySQL RDS
Untuk mengaktifkan audit log, ada 2 custom konfigurasi RDS yang harus kita buat terlebih dahulu, lalu kita kaitkan ke instance MySQL RDS:
- Parameter group (log_output: FILE)
- Option group (option: MARIADB_AUDIT_PLUGIN)

Note: Jika kalian sudah mempunyai custom konfigurasi parameter dan option group (bukan default), tidak perlu buat baru lagi. Cukup modifikasi yang sudah ada.
Namun karena disini saya masih menggunakan default parameter dan option group, saya harus konfigurasi ulang parameter dan option groupnya di instance MySQL RDS, seperti gambar dibawah:

Parameter group
Untuk membuat parameter group, masuk ke RDS > Parameter groups > Create parameter group:

Isi parameter group, saya isi dengan nama db-identifiernya (database-1-test):
- Parameter group name: database-1-test
- Description: database-1-test
- Engine type: MySQL Community
- Parameter group family: mysql8.0
- Type: DB parameter group
Klik Create

Setelah terbuat, masuk ke detail, klik Edit

Cari log_output dan ubah valuenya ke FILE, klik save changes.
Dengan mengeset log_output = FILE, berarti log akan digenerate ke dalam file didalam server MySQL RDS

Nantinya parameter group ini akan kita kaitkan ke instance MySQL RDS, namun kita lanjut ke pembuatan option group terlebih dahulu.
Option group
Masuk ke RDS > Option groups > Create group

Isi option group, saya isi dengan nama db-identifier (database-1-test), klik Create
- Name: database-1-test
- Description: database-1-test
- Engine: mysql
- Major Engine Version: 8.0

Setelah terbuat, masuk ke detail, klik Add option

Masukkan:
- Option name: MARIADB_AUDIT_PLUGIN
- Option settings: biarkan default
- Apply immediately: Yes
Klik Add option

Option MARIADB_AUDIT_PLUGIN ini berisi konfigurasi audit, dimana log audit disimpan, berapa lama retentionnya, eventnya apa saja. Bisa dipelajari disini MariaDB Audit Plugin support for MySQL.
Kaitkan konfigurasi parameter & option group ke instance MySQL RDS dan aktifkan audit log
Setelah custom parameter dan option group terbuat, selanjutnya kita kaitkan konfigurasi tersebut ke instance MySQL RDS.
- Masih di dashboard RDS
- Pilih instance database yang mau diaktifkan audit lognya. Contoh disini saya ingin mengaktifkan audit log untuk DB identifier database-1-test
- Klik Modify

- Pada bagian Additional configuration, sesuaikan:
- DB parameter group: database-1-test
- Option group: database-1-test

- Masih di Additional configuration, pada Log Exports centang Audit log

- Scroll kebawah, klik Continue
- Lalu pilih Apply Immediately, agar konfigurasi langsung berubah
- Klik Modify DB instance

- Tunggu beberapa saat, maka akan ada proses modifying dan configuring-log-exports pada instance MySQL RDS

- Jika status available maka audit log sudah aktif

Cek audit log di Cloudwatch
Seharusnya log sudah tergenerate dan bisa dilihat pada cloudwatch.
- Buka service cloudwatch dengan mengetikkan keywoard cloudwatch pada kolom pencarian

- Pada dashboard cloudwatch, masuk ke menu Log > Log groups. Akan ada log dengan nama /aws/rds/instance/database-1-test/audit, disitulah audit log tersimpan
- Klik log tersebut untuk melihat detail

- Pada tab Log streams, klik db identifier kalian, misal database-1-test

- Log akan muncul. Paling atas adalah log lama, paling bawah log baru.

Test Audit log
Kita test connect, disconnect, DML dan DDL, apakah lognya tergenerate di cloudwatch?
Test connect ke database
Disini saya test login ke database menggunakan HeidiSQL.

Kita lihat dicloudwatch, akan ada log dengan state CONNECT. Artinya ada yang connect ke database menggunakan user admin, IP 120.188.6.24, jam 2024-07-12 19:27:16 (UTC).

Test disconnect dari database
Sekarang saya tutup koneksi HeidiSQLnya, dicloudwatch akan ada log dengan state DISCONNECT

Test buat database baru (CREATE DATABASE)
Saya buat table baru dengan nama db_test

Log yang tergenerate dicloudwatch adalah `CREATE DATABASE …`

Test buat table baru (CREATE TABLE)
Di heidisql saya buat table dengan nama tb_test dengan 2 column (id dan name)

Maka log dicloudwatch akan tercatat juga lognya

Test insert data ke table (INSERT INTO)
Saya insert 1 data dari heidiSQL, id = 1 dan name = moko

Log di cloudwatch yang tergenerate:

Harga
Untuk harga mengaktifkan auditlog RDS tergantung dari seberapa banyak traffic RDS. Semakin besar trafficnya, maka data yang dicollect dari cloudwatch ke RDS akan semakin besar juga (istilahnya: custom log data ingested). Per GB adalah $0.70.
Just sharing saja, waktu itu saya kena charge $197 cuma dalam waktu seminggu. Setelah dicek ternyata penyebabnya adalah traffic RDSnya yang besar.

Kesimpulan
- Audit log pada MySQL RDS bisa diaktifkan dengan mengkonfigurasi parameter dan option group terlebih dahulu
- Audit log akan ditampilkan lognya di service cloudwatch pada menu Log > Log groups
- Log yang tergenerate adalah CONNECT, DISCONNECT, DDL, DML
- Setingan audit log ada di option group: MARIADB_AUDIT_PLUGIN
- Harga untuk mengaktifkan auditlog RDS akan cukup besar jika traffic RDSnya besar
Semoga bermanfaat!