Welcome

Welcome, thanks to look my blog

Monday, 31 March 2014

Manajemen User dan Hak Akses Database di MySQL

Manajemen User dan Hak Akses Database di MySQL


Masih sering saya jumpai para developer aplikasi yang kurang memperhatikan masalah pengaturan hak akses database yang digunakannya. Padahal hal ini permasalahan yang sangat riskan sekali karena menyangkut masalah keamanan databasenya. Sebagai contoh, misalkan ada developer yang masih menggunakan user ‘root’ untuk keperluan koneksi dari aplikasi yang dibuatnya ke database MySQL. Padahal ini riskan sekali, coba bayangkan seandainya ada peretas yang berhasil masuk ke aplikasinya melalui celah kelemahannya, maka peretas bisa melakukan apapun terhadap semua databasenya karena user ‘root’ adalah top level user di MySQL. Hal ini merupakan salah satu contoh kasus saja yang bisa berakibat permasalahan yang fatal.
Oleh karena itu, dalam artikel ini saya akan memaparkan bagaimana cara melakukan manajemen user di MySQL, mulai dari cara membuat user baru, kemudian memberi hak akses si user tersebut pada database tertentu, dan juga bagaimana cara membatasi hak akses si user tersebut.

Dalam artikel ini nanti, semua langkah untuk melakukan manajemen user menggunakan query SQL. Kita dapat menjalankan query ini melalui tools MySQL seperti phpMyAdmin, Navicat dll atau bisa juga melalui console. Meskipun kita dapat melakukan manajemen user dan hak akses ini melalui fitur yang ada di setiap tools tersebut, namun tidak ada salahnya tetap kita belajar dengan query supaya di saat tool-tool tersebut tidak tersedia (melalui console), kita tetap bisa melakukan hal ini. Dan yang perlu diingat, bahwa tool itu juga software tentunya kemungkinan terdapat celah keamanan yang beresiko.
Membuat User Akses
Secara default, ketika MySQL pertama kali diinstall maka hanya terdapat user ‘root’. User ‘root’ ini memiliki level tertinggi (top level) dalam MySQL. Sebaiknya jangan menggunakan ‘root’ ini untuk mengkoneksikan aplikasi database Anda ke MySQL demi keamanan. Untuk itu kita perlu membuat user koneksi selain ‘root’ ini. Ketika pertama kali dalam membuat user di MySQL, kita menggunakan user ‘root’ terlebih dahulu.
Secara umum perintah query untuk membuat user baru adalah sbb:
1.CREATE USER 'namauser'@'host' IDENTIFIED BY 'password';
Keterangan: ‘host’ adalah menunjukkan dari host mana si user ini bisa melakukan koneksi ke MySQL nya.
Contoh 1:
1.CREATE USER 'rosihanari'@'192.168.1.7' IDENTIFIED BY '12345';
Dengan perintah di atas, si user ‘rosihanari’ ini hanya bisa melakukan koneksi ke MySQL dari host dengan IP ’192.168.1.7′. Maksudnya hanya bisa koneksi dari IP tertentu ini bagaimana ya? OK saya ambil kasus seperti ini. Misalkan database MySQL terdapat di server komputer dengan IP ’192.168.1.2′. Kemudian saya buat aplikasi web dengan PHP di komputer lain dengan IP ’192.168.1.3′. Di dalam script koneksinya, saya tulis parameter koneksi ke server MySQLnya sbb:
1.<?php
2.$dbhost = '192.168.1.2';
3.$dbuser = 'rosihanari'
4.$dbpass = '12345'
5.mysql_connect($dbhost, $dbuser, $dbpass);
6.?>;
Jika script koneksi PHP tersebut dijalankan, maka koneksi gagal dilakukan karena user ‘rosihanari’ tersebut melakukan koneksi dari IP ’192.168.1.3′, bukan dari host ’192.168.1.7′. Metode ini sering dipakai untuk sistem yang terintegrasi, yaitu interface aplikasi dan server MySQL tidak berada dalam host/server yang sama.
Contoh 2:
1.CREATE USER 'rosihanari'@'localhost' IDENTIFIED BY '12345';
Dengan perintah di atas, maka user ‘rosihanari’ hanya bisa melakukan koneksi dari IP/host yang sama dengan host MySQL nya. Hal ini paling cocok dilakukan jika lokasi server MySQL dan aplikasi databasenya berada di server yang sama.
Contoh 3:
1.CREATE USER 'rosihanari'@'%' IDENTIFIED BY '12345';
Host dengan tanda ‘%’ (wild card) menunjukkan bahwa si user ‘rosihanari’ ini bisa melakukan koneksi dari host manapun atau tidak terbatas IP/host nya. Meskipun dengan wild card host ini tampak fleksibel dalam hal konektivitas, namun juga beresiko karena si user ini bisa akses dari host manapun. Bayangkan seandainya ada orang jahat yang tahu akun si user ini, lalu dia mencoba masuk ke database dari komputer manapun. Hiiii… :-)
Mungkin pertanyaan berikutnya adalah, apakah bisa kita membuat sebuah user untuk melakukan koneksi dari beberapa host IP saja? OK bisa, caranya ya cukup membuat beberapa query seperti di atas namun dengan IP host yang berbeda-beda. Misalkan:
1.CREATE USER 'rosihanari'@'192.168.1.7' IDENTIFIED BY '12345';
2.CREATE USER 'rosihanari'@'192.168.1.8' IDENTIFIED BY '12345';
3.CREATE USER 'rosihanari'@'192.168.1.9' IDENTIFIED BY '12345';
dengan 3 query di atas, maka user ‘rosihanari’ dapat mengakses MySQL dari 3 host: ’192.168.1.7, 192.168.1.8, dan 192.168.1.9′.
Menghapus User
Untuk menghapus user yang sudah dibuat, perintahnya adalah
1.DROP USER ‘namauser’@‘host’;
Contoh :
1.DROP USER ‘rosihanari’@‘localhost’;
Perintah di atas digunakan untuk menghapus user ‘rosihanari’ yang mengakses dari ‘localhost’.
Memberikan Hak Akses User ke Database Tertentu
Setelah kita membuat user-user yang memiliki hak akses ke MySQL nya. Kemudian bagaimana caranya kita membatasi hak akses tiap user tersebut hanya bisa mengakses database tertentu dan hanya bisa melakukan query tertentu saja? OK secara umum sintaks query SQL untuk pembatasan hak akses user adalah sbb:
1.GRANT hak1, hak2, ... ON namadatabase.namatabel TO 'namauser'@'host';
Beberapa macam hak akses yang bisa diberikan kepada suatu user adalah:
  • SELECT: si user bisa melakukan perintah SELECT
  • INSERT: si user bisa melakukan perintah INSERT untuk menambah record
  • UPDATE: si user bisa melakukan perintah UPDATE untuk update record
  • DELETE: si user bisa melakukan perintah DELETE untuk hapus record
  • CREATE: si user bisa melakukan perintah CREATE untuk membuat tabel baru
  • ALTER: si user bisa melakukan perintah ALTER untuk mengubah struktur tabel
  • DROP: si user bisa melakukan perintah DROP untuk menghapus tabel
Contoh 1:
1.GRANT SELECT ON db1.* TO 'rosihanari'@'192.168.1.2';
Maksud query di atas, adalah memberikan hak akses kepada user ‘rosihanari’ yang mengakses dari host ’192.168.1.2′ ke database ‘db1′. Si user ini hanya bisa melakukan query SELECT saja pada semua tabel yang ada di database ‘db1′.
Contoh 2:
1.GRANT SELECT, INSERT ON db1.* TO 'rosihanari'@'192.168.1.2';
Maksud query di atas, adalah memberikan hak akses kepada user ‘rosihanari’ yang mengakses dari host ’192.168.1.2′ ke database ‘db1′. Si user ini hanya bisa melakukan query SELECT dan INSERT saja pada semua tabel yang ada di database ‘db1′.
Contoh 3:
1.GRANT SELECT, INSERT, DELETE ON db1.tabel1 TO 'rosihanari'@'192.168.1.2';
Maksud query di atas, adalah memberikan hak akses kepada user ‘rosihanari’ yang mengakses dari host ’192.168.1.2′ ke database ‘db1′. Si user ini hanya bisa melakukan query SELECT, INSERT dan DELETE namun tidak pada semua tabel yang ada di database ‘db1′, melainkan hanya di tabel ‘tabel1′ saja.
Contoh 4:
1.GRANT ALL PRIVILEGES ON  db1.* TO 'rosihanari'@'localhost';
Maksud query di atas, adalah memberikan hak akses pada user ‘rosihanari’ yang mengakses dari host ‘localhost’ ke database ‘db1′. Dengan ‘ALL PRIVILEGES’, user ini mendapat full akses ke database ‘db1′ ini, sehingga bisa melakukan semua query.
Contoh 5:
1.GRANT ALL PRIVILEGES ON  *.* TO 'rosihanari'@'localhost';
Maksud query di atas, adalah memberikan hak akses pada user ‘rosihanari’ yang mengakses dari host ‘localhost’ ke semua database yang ada dengan full akses.
Note:
Setiap kali kita memberikan perintah GRANT di atas, jangan lupa memberikan perintah query
1.FLUSH PRIVILEGES;
untuk mereload semua privileges (hak akses) di MySQL nya, atau bisa juga melakukan restart service MySQL nya.
Mencabut Hak Akses User
Selanjutnya bagaimana cara mencabut hak akses yang dimiliki user tertentu? Secara umum sintak query SQL nya adalah sbb:
1.REVOKE hak1, hak2, ... ON namadatabase.namatabel FROM 'namauser'@'host';
Contoh 1:
1.REVOKE SELECT ON 'db1'.* FROM 'rosihanari'@'192.168.1.2';
Perintah di atas bertujuan untuk mencabut hak untuk menjalankan perintah SELECT di database ‘db1′ pada semua tabel, dari user ‘rosihanari’ yang mengakses dari host ’192.168.1.2′.
Contoh 2:
1.REVOKE SELECT, DELETE ON 'db1'.* FROM 'rosihanari'@'192.168.1.2';
Perintah di atas bertujuan untuk mencabut hak untuk menjalankan perintah SELECT dan DELETE di database ‘db1′ pada semua tabel, dari user ‘rosihanari’ yang mengakses dari host ’192.168.1.2′.
Contoh 3:
1.REVOKE ALL PRIVILEGES ON 'db1'.* FROM 'rosihanari'@'localhost';
Perintah di atas bertujuan untuk mencabut semua hak akses di database ‘db1′ pada semua tabel, dari user ‘rosihanari’ yang mengakses dari host ‘localhost’.
Note:
Jangan lupa kembali memberikan perintah query FLUSH PRIVILEGES; setelah menjalankan query REVOKE di atas.
OK dari tutorial di atas mudah-mudahan bisa memberikan manfaat untuk pengunjung blog tutorial ini untuk mewujudkan server MySQL yang aman dan handal. Usahakan sedari sekarang mempraktikkan manajemen user di atas, jangan sampai menunda-nunda dan baru menyadari setelah terjadi sesuai dengan database kita. Karena terkadang kelalaian kita dari hal-hal kecil seperti ini bisa membawa masalah yang besar dari sistem yang kita bangun dengan susah payah. Betul??? :-)

No comments:

Post a Comment