Beberapa hal yang bisa digunakan untuk melakukan secure database mysql/mariadb
Secure di my.cnf
Konfigurasi MySQL berada di file “my.cnf”
File ini dapat di temukan di “/etc/mysql”.
untuk langkahnya adalah sebahai berikut, pertama kita buka file :
vim /etc/mysl/my.cnf
setelah itu kita pastikan bind-address mengarah ke localhost / 127.0.0.1
[mysqld] ..... bind-address = 127.0.0.1
dengan begitu maka mysql tidak akan menerima koneksi dari mana saja, kecuali dari local mesin.
Apabila kita membutuhkan untuk mengakses database dari server lain, maka kita harus ssh dari server tersebut ke server databasenya.
Selanjutnya kita akan menutup fungsi yang memungkinkan mengakses ke sistem kita.
di my.cnf kita menambahkan perintah untuk menonaktifkan akses file lokal :
local-infile=0
ini akan disable loading file dari filesistem untuk user tanpa privileges ke database> Jika memungkinkan, kita juga bisa menambah log untuk melihat aktifitas, dengan menambahkan
log=/var/log/mysql-logfile
setelah menambahkan, cek kembali bahwa log MySQL, log eror dan direktory tidak hanya bisa read
sudo ls -l /var/log/mysql*
-rw-r----- 1 mysql adm 0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm 0 Jul 23 18:06 /var/log/mysql.log
/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log
sudo ls -l /var/log/mysql*
Securing MySQL From Within
There are a number of steps you can take while using MySQL to improve security.
We will be inputting the commands in this section into the MySQL prompt interface, so we need to log in.
mysql -u root -p
You will be asked for the root password that you set up earlier.
Securing Passwords and Host Associations
Pertama, kita cek apakah ada user yang tanpa password di Mysql
SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+ | user | host | password | +------------------+-----------+-------------------------------------------+ | root | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | | demo-user | % | | | root | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | | root | ::1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | | debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 | +------------------+-----------+-------------------------------------------+ 5 rows in set (0.00 sec)
dari tampilan di contoh tersebut dapat kita lohat user “demo-user” tidak memiliki password dan dapat diakses dari mana saja ( % ) ini sangat berbahaya
Kita dapat set password user dengan perintah ini.
*rubah newPassWord” dengan password yang diinginkan.
UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";
Jika kita cek kembali, kita akan melihat bahwa user “demo-user” sudah memiliki password
SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+ | user | host | password | +------------------+-----------+-------------------------------------------+ | root | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | | demo-user | % | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 | | root | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | | root | ::1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | | debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 | +------------------+-----------+-------------------------------------------+ 5 rows in set (0.00 sec)
Jika dilihar di “Host” field, akan terlihat masih terisi “%”, ini berarti wildcard atau any host.
untuk itu kita rubah menjadi “localhost”
UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";
Kita cek kembali untuk memastikan bahwa host sudah berubah
SELECT User,Host,Password FROM mysql.user;
Jika table memiliki banyak user kosong, kita harus me-remove nya, dengan menggunakan perintah :
DELETE FROM mysql.user WHERE User="";
Setelah kita selesai memodifikasi table User, kita perlu me-refresh privileges dengan cara :
FLUSH PRIVILEGES;
Implementasi Applikasi dengan user spesifik
Kita juga bisa melakukan secure dengan membuat user yang spesifik untuk masing masing database.
create database testDB;
Query OK, 1 row affected (0.00 sec)
Setelah itu, kita membuat user untuk manage database tersebut dan hanya membuka privileges yang dibutuhkan saja.
untuk membut user baru, kita bisa menggunakan perintah :
CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';
Setelah itu berikan privileges yang dibutuhkan
GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';
Jika nanti kita perlu mencabut hak akses maka kita bisa menggunakan perintah :
REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';
Untuk memberikan semua privileges di database, kita dapat menggunakan perintah :
GRANT ALL ON testDB.* TO 'demo-user'@'localhost';
Untuk melihat privileges user, pertama kita me-refresh “flush privileges” command. Kemudian baru bisa kita cek :
FLUSH PRIVILEGES; show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+ | Grants for demo-user@localhost | +------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' | | GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost' | +------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
Selalu flush privileges ketika kita selesai melakukan perubahan
Mengganti Root User
Untuk melakukan secure, bisa juga dengan cara mengubah nama login root.
Jika ada yang akan mencoba untuk mengakses mysql, maka mereka perlu melakukan langkah tambahan untuk menemukan username
root login dapat dirubah dengan perintah berikut :
rename user 'root'@'localhost' to 'newAdminUser'@'localhost';
Kita dapat melihat perubahan seperti saat kita melihat User database :
select user,host,password from mysql.user;
Jangan lupa untuk flush privileges :
FLUSH PRIVILEGES;
Jangan lupa, saat login user root sudah dirubah.
mysql -u newAdminUser -p