Memahami Authentication dan Auditing Di MySQL Server


Salah satu yang unik pada MySQL Server adalah nama akun untuk pengguna memiliki syntax seperti 'nama_user'@'nama_host'. Dengan demikian, sebuah nama_user yang sama boleh dipakai lebih dari sekali untuk nama_host yang berbeda. Bahkan nilai nama_user boleh dikosongkan (anonymous user) sehingga nama_host tertentu boleh mengakses database tanpa perlu memberikan nama_user.

Nilai nama_host dipakai untuk melakukan validasi host asal dimana user melakukan koneksi. Bila saya tidak menyertakan nama_host pada saat membuat pengguna, maka nilai tersebut dianggap sebagai % yang berarti pengguna boleh melakukan koneksi dari mana saja.

Sebagai contoh, saya bisa membuat sebuah user yang hanya boleh diakses dari IP 192.168.56.0 sampai 192.168.56.255 dengan menggunakan perintah SQL seperti berikut ini:

CREATE USER 'inventory'@'192.168.56.0/255.255.255.0';

Tentu saja membatasi host asal tidak cukup! Saya perlu memberikan password sehingga pengguna perlu memberikan nilai password yang benar saat melakukan koneksi. Untuk itu, saya bisa menambahkan klausa IDENTIFIED BY seperti pada perintah SQL berikut ini:

CREATE USER 'inventory'@'192.168.56.0/255.255.255.0'
IDENTIFIED BY 'password_12345';

Salah satu masalah dengan perintah di atas adalah saya mengetik nilai password secara polos. Ini memiliki resiko tersendiri, terutama bila saya menyimpan perintah ini dalam file SQL sebagai cadangan untuk dikerjakan suatu hari nanti. Oleh sebab itu, akan lebih baik bila saya menyimpan password dalam bentuk hash. Untuk mengetahui nilai hash dari sebuah password polos, saya dapat memberikan perintah SQL berikut ini:

SELECT PASSWORD('password_12345');

Saya kemudian bisa memakai hash yang dihasilkan perintah di atas sebagai password pada saat membuat user:

CREATE USER 'inventory'@'192.168.56.0/255.255.255.0' 
IDENTIFIED BY PASSWORD '*E758CB9320D032FDC632D7FAB56BE5A50920BB89';

Untuk tingkat keamanan yang lebih tinggi, MySQL Server sejak versi 5.6.6 memiliki fitur sha256_password (http://dev.mysql.com/doc/refman/5.6/en/sha256-authentication-plugin.html) sebagai authentication plugin. Plugin ini mensyaratkan penggunaan SSL atau RSA pada saat melakukan koneksi guna meng-enkripsi password yang dikirim dari client ke server. MySQL Community Edition (versi gratis yang di-build dengan yaSSL) tidak mendukung enkripsi RSA sehingga untuk menggunakan sha256_password dibutuhkan SSL. Penggunaan SSL bisa membuat database menjadi lebih lambat akibat beban enkripsi & deskripsi koneksi. Ini adalah pengorbanan yang wajar bila menginginkan keamanan yang lebih baik. Sementara itu, MySQL Enterprise Edition (di-build dengan OpenSSL) memiliki dukungan enkripsi RSA sehingga sha256_password dapat dipakai tanpa mengaktifkan SSL.

Selain itu, bagi pengguna Windows yang memakai MySQL 5.6.10 versi berbayar, terdapat Windows Native Authentication Plugin dimana pengguna dapat login ke server database berdasarkan informasi akun Windows. Dengan demikian, pengguna tidak perlu memberikan password lagi karena ia akan dikenali berdasarkan akun di sistem operasi Windows yang sedang dipakainya.

Langkah berikutnya setelah membuat pengguna adalah menentukan apa saja yang boleh diakses oleh penguna tersebut. Secara default, pengguna yang baru dibuat hanya memiliki akses ke database information_schema dan test. Pengguna tersebut juga tidak memiliki hak untuk membuat database baru. Oleh sebab itu, saya perlu memberikan hak akses atas sebuah database yang sudah ada dengan memberikan perintah SQL seperti berikut ini:

GRANT ALL ON inventory.* TO 'inventory'@'192.168.56.0/255.255.255.0';

Selain itu, bila saya ingin seluruh komputer dengan IP 192.168.56.0 sampai 192.168.56.255 boleh membaca isi tabel pesan di database inventory dan tidak boleh menghapus atau mengubah isinya, saya dapat memberikan SQL seperti berikut ini:

CREATE USER ''@'192.168.56.0/255.255.255.0';
GRANT SELECT ON inventory.pesan TO ''@'192.168.56.0/255.255.255.0';

Perintah SQL di atas akan menyebabkan komputer dengan IP 192.168.56.0 sampai 192.168.56.255 boleh melakukan koneksi ke database tanpa harus memberikan nama user dan password. Tetapi, bila melakukan koneksi secara anonymous seperti ini, mereka hanya bisa melihat isi tabel pesan saja:

C:\>mysql -h mydatabase.com

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| inventory          |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> use inventory;
Database changed

mysql> show tables;
+---------------------+
| Tables_in_inventory |
+---------------------+
| pesan               |
+---------------------+
1 row in set (0.00 sec)

mysql> delete from pesan;
ERROR 1142 (42000): DELETE command denied to user ''@'192.168.56.30' for table 'pesan'

Salah satu fasilitas lainnya yang penting dalam mengamankan database adalah auditing. Fasilitas ini memungkinkan database administrator untuk mengetahui kapan pengguna melakukan koneksi dan apa saja query yang diberikan pengguna tersebut. Pada MySQL Server, auditing dilakukan dengan bantuan Audit Server Plugin. Sayang sekali, walaupun MySQL Server menyediakan API untuk menulis Audit Server Plugin, satu-satunya implementasi resmi berupa MySQL Audit Log Plugin hanya tersedia di MySQL Enterprise Edition (versi berbayar).

Sebagai alternatif untuk melakukan auditing tanpa harus beralih ke versi berbayar, saya dapat menggunakan Audit Plugin dari MariaDB di MySQL Server. Walaupun merupakan bagian dari MariaDB, Audit Plugin diprogram berdasarkan Audit Server Plugin API dari MySQL Server dan telah diuji untuk MySQL Server. Tentu saja alasan utama lain untuk memakainya di MySQL Server adalah karena ia dapat di-download secara gratis di https://mariadb.com/products/connectors-plugins.

Pada saat tulisan ini dibuat, versi terakhir Audit Plugin dari MariaDB adalah 1.1.8. Setelah men-download dan men-extract file server_audit-1.1.8.zip, saya perlu memindahkan file server_audit.dll di folder windows-32 (karena saya memakai Windows 32-bit) ke lokasi direktori plugin milik MySQL Server. Saya dapat mengetahui lokasi direktori plugin dengan memberikan perintah SQL seperti berikut ini:

SHOW VARIABLES LIKE 'plugin_dir';

Setelah men-copy file server_audit.dll pada direktori bersangkutan, saya dapat men-install plugin dengan memberikan perintah SQL seperti berikut ini:

INSTALL PLUGIN server_audit SONAME 'server_audit.dll';

Setelah ini, MariaDB Audit Plugin akan aktif. Saya akan menemukan beberapa variabel baru seperti berikut ini:

mysql> SHOW VARIABLES LIKE 'server_audit%';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           |                       |
| server_audit_excl_users       |                       |
| server_audit_file_path        | server_audit.log      |
| server_audit_file_rotate_now  | OFF                   |
| server_audit_file_rotate_size | 1000000               |
| server_audit_file_rotations   | 9                     |
| server_audit_incl_users       |                       |
| server_audit_logging          | OFF                   |
| server_audit_mode             | 1                     |
| server_audit_output_type      | file                  |
| server_audit_syslog_facility  | LOG_USER              |
| server_audit_syslog_ident     | mysql-server_auditing |
| server_audit_syslog_info      |                       |
| server_audit_syslog_priority  | LOG_INFO              |
+-------------------------------+-----------------------+
14 rows in set (0.00 sec)

Karena nilai server_audit_logging adalah OFF, saya perlu mengaktifkannya dengan memberikan perintah SQL berikut ini:

SET GLOBAL server_audit_logging = ON;

Untuk perubahan yang permanen, saya perlu menyimpan nilai variabel di file konfigurasi my.cnf.

Sekarang, saya dapat melihat status auditing dengan memberikan perintah SQL seperti berikut ini:

mysql> SHOW STATUS LIKE 'server_audit%';
+----------------------------+------------------+
| Variable_name              | Value            |
+----------------------------+------------------+
| server_audit_active        | ON               |
| server_audit_current_log   | server_audit.log |
| server_audit_last_error    |                  |
| server_audit_writes_failed | 0                |
+----------------------------+------------------+
4 rows in set (0.00 sec)

Terlihat bahwa MariaDB Audit Plugin akan menulis hasil audit ke file dengan nama server_audit.log. Pada instalasi default MySQL Server di Windows, file ini terletak di folder seperti C:\ProgramData\MySQL\MySQL Server 5.6\data.

MariaDB Audit Plugin menyediakan 3 jenis informasi yang di-audit, yaitu CONNECT, QUERY dan TABLE. Pada MySQL Server, hanya CONNECT dan QUERY yang dapat dipakai. Sebagai contoh, bila saya hanya ingin merekam aktifitas koneksi dan mengabaikan aktifitas query, saya dapat memberikan perintah SQL seperti berikut ini:

SET GLOBAL server_audit_events = 'CONNECT';

Bila ada pengguna yang melakukan koneksi atau memutuskan koneksi, saya akan memperoleh baris baru di file server_audit.log yang isinya seperti berikut ini:

20141207 20:00:46,mydatabase.com,inventory,192.168.56.30,12,0,CONNECT,,,0
20141207 20:01:06,mydatabase.com,inventory,192.168.56.30,12,0,DISCONNECT,,,0

Informasi di atas terdiri atas waktu, nama server database yang dihubungi, nama user dan lokasi host asal yang melakukan koneksi, id koneksi, dan informasi seperti CONNECT & DISCONNECT.

Baris yang sangat penting untuk dipantau adalah baris dimana pengguna gagal melakukan koneksi, yang terlihat seperti berikut ini:

20141207 18:06:06,mydatabase.com,inventory,192.168.56.30,13,0,FAILED_CONNECT,,,1045
20141207 18:06:06,mydatabase.com,inventory,192.168.56.30,13,0,DISCONNECT,,,0

Informasi FAILED_CONNECT menunjukkan bahwa ada pengguna yang gagal melakukan koneksi. Nilai 1045 adalah kode kesalahan yang menyebabkan kegagalan koneksi. Berdasarkan informasi di http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html, nilai ini adalah ER_ACCESS_DENIED_ERROR yang memiliki pesan seperti Access denied for user '%s'@'%s' (using password: %s). Hal ini menunjukkan bahwa pengguna gagal melakukan koneksi karena memberikan password yang salah. Bila baris seperti ini sering terlihat, maka ada kemungkinan pengguna (atau hacker) sedang berusaha mengakses sesuatu yang bukan hak-nya.

Perihal Solid Snake
I'm nothing...

2 Responses to Memahami Authentication dan Auditing Di MySQL Server

  1. Ping-balik: Membuat Plugin MySQL Yang Menulis Hasil Audit Ke Windows Event Log | The Solid Snake

  2. Ping-balik: Memakai Full-Text Search Di MySQL Server | Programming Logic And Technology

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: