Setiap kali keamanan aplikasi disebutkan, orang berpikir untuk mengamankan aplikasi dari beberapa serangan yang paling sering terjadi seperti injeksi, autentikasi rusak, paparan data sensitif, dan sejenisnya. Namun, sementara serangan ini lazim, mengetahui cara melindungi aplikasi Anda dari mereka saja tidak akan cukup - terutama saat Anda menjalankan MySQL. Hari ini kita akan melihat sisi keamanan yang berbeda - kita akan melihat cara mengamankan MySQL dengan benar.
Karena keamanan MySQL adalah hal yang cukup besar, perlakukan posting ini sebagai awal dari serangkaian posting tentang langkah-langkah keamanan MySQL. Kami tidak akan membahas semuanya, tetapi postingan ini harus memberikan dasar dari beberapa langkah keamanan MySQL.
Mengapa Anda Perlu Mengamankan MySQL?
Pertama-tama, kita harus menjawab pertanyaan mengapa kita ingin mengamankan MySQL. Lagi pula, jika kita mengamankan aplikasi kita dari ancaman yang paling umum, kita seharusnya aman, bukan? Ya dan tidak.
Anda lihat, ketika Anda mengamankan aplikasi Anda dari serangan tertentu, Anda memastikan bahwa penyerang lebih sulit menembus pertahanan aplikasi Anda - untuk mengamankan database Anda, melindungi dari serangan semacam itu akan tidak cukup. Mengamankan database Anda mungkin merupakan langkah terakhir yang dapat menyelamatkan aplikasi Anda (dan database Anda!) dari kehancuran.
Bagaimana Saya Mengamankan MySQL?
Sekarang, ke pertanyaan yang membara. Bagaimana sebenarnya Anda mengamankan MySQL?
Saat memikirkan keamanan instans MySQL Anda, Anda harus mempertimbangkan berbagai opsi yang memungkinkan. Untungnya, beberapa dari opsi tersebut bahkan tidak terbatas pada MySQL yang berarti bahwa opsi tersebut juga dapat diterapkan di skenario lain! Kita akan mulai dengan hal-hal yang umum.
Keamanan MySQL - Umum
Saat mengamankan MySQL, perlu diingat bahwa MySQL menggunakan Access Control Lists (ACLs) berbasis keamanan untuk operasi yang dilakukan oleh pengguna (Access Control Lists adalah daftar izin yang terkait dengan objek). Berikut ini cara menangani beberapa masalah keamanan paling mendasar:
- Amankan akun MySQL awal - ini sangat jelas, tetapi Anda harus memastikan bahwa akun root memiliki kata sandi. Akun root mungkin atau mungkin tidak memiliki kata sandi saat MySQL pertama kali diinstal - Anda dapat mengetahui kata sandinya dengan memeriksa log kesalahan, lalu mengubahnya ke yang lebih kuat jika Anda mau. Semua akun lain juga harus memiliki kata sandi.
- Jangan pernah menyimpan kata sandi di dalam database MySQL apa pun dalam teks biasa - gunakan fungsi hashing satu arah seperti BCrypt.
- Jangan beri pengguna akses ke tabel pengguna di database mysql (pengguna root adalah pengecualian).
Selain itu, biasakan diri Anda dengan Kontrol Akses dan Manajemen Akun di MySQL. Subjek ini layak mendapatkan seluruh buku itu sendiri, tetapi hal-hal dasar yang harus Anda ketahui meliputi:
- Mengontrol akses di MySQL;
- Membuat, mengubah, dan menghapus pengguna;
- Memberikan dan mencabut hak istimewa ke dan dari pengguna;
- Mengetahui cara memeriksa hak istimewa apa yang diberikan;
- Apa kategori akun itu;
- Apa itu akun yang dicadangkan;
- Apa peran itu;
- Cara kerja pengelolaan sandi;
- Cara kerja penguncian akun;
- Melihat sekilas plugin keamanan yang ditawarkan oleh MySQL;
- Mengetahui cara mengamankan cadangan MySQL.
Sejauh menyangkut keamanan MySQL, cadangan juga harus dilindungi.
Sekarang, kita akan melihat masing-masing opsi ini lebih lanjut.
Mengontrol Akses di MySQL
- Seperti yang telah disebutkan di atas, jangan pernah memberikan akun apa pun, kecuali akun root, akses ke tabel pengguna di database mysql;
- Pastikan bahwa semua akun MySQL yang ada hanya menggunakan hak istimewa yang benar-benar dibutuhkan untuk melakukan tindakannya.
Membuat, Mengubah, dan Menghapus Pengguna di MySQL
Di MySQL, pengguna dapat dibuat dengan menjalankan kueri CREATE USER:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Pengguna dapat diubah dengan menjalankan kueri ALTER USER - kueri memungkinkan Anda melakukan banyak hal berbeda termasuk mengunci dan membuka kunci akun, mengharuskan akun untuk terhubung menggunakan SSL, menetapkan jumlah maksimum koneksi per jam, membuang kata sandi lama, dll. Berikut ini contoh kueri yang dapat mengubah sandi Anda sendiri:
ALTER USER USER() IDENTIFIED BY ‘password’;
Pengguna dapat dihapus dengan menjalankan kueri DROP USER:
DROP USER ‘demouser’@’localhost’;
Memberikan dan Mencabut Hak Istimewa ke dan dari Pengguna di MySQL
Pernyataan GRANT harus memberikan hak istimewa atau peran. Pernyataan ON dapat memberi tahu Anda apakah hak istimewa atau peran akan diberikan. Kueri berikut memberikan hak istimewa:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
Kueri berikut memberikan peran:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT harus merespons dengan Query OK, 0 baris terpengaruh.
Untuk mencabut hak istimewa tertentu dari pengguna, gunakan pernyataan REVOKE (bagian hostname dari nama akun default ke “%”):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Untuk mencabut semua hak istimewa, REVOKE ALL dapat digunakan:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Anda mungkin ingin mengeluarkan HAK ISTIMEWA FLUSH; pernyataan setelah melakukan langkah-langkah di atas.
Memeriksa Hak Istimewa yang Ditetapkan di MySQL
- Untuk memeriksa hak istimewa apa yang diberikan, terbitkan SHOW GRANTS; pernyataan.
- Untuk setiap permintaan yang dikeluarkan, server menentukan operasi yang ingin Anda lakukan, lalu memeriksa apakah hak istimewa Anda cukup untuk melakukan operasi yang dimaksud.
- Server menggunakan tabel pengguna dan db di database mysql untuk memastikan kontrol akses.
- Tabel pengguna dan global_grants memberikan hak istimewa global.
Opsi lainnya akan dibahas di postingan mendatang.
Ringkasan
Sejauh menyangkut keamanan MySQL, Anda memiliki pilihan yang sangat luas untuk dipilih. Opsinya mencakup langkah-langkah keamanan dasar yang dapat diterapkan ke hampir semua aplikasi, tetapi beberapa opsi cukup spesifik untuk MySQL. Perlu diingat bahwa tidak semua opsi yang tersedia telah dibahas - opsi tersebut juga akan dibahas di edisi mendatang dari seri keamanan MySQL.