Query Pembuatan User dan Hak Akses MySQL

Site: Elearning Muhidin Saimin
Course: Web Development
Book: Query Pembuatan User dan Hak Akses MySQL
Printed by: Guest user
Date: Tuesday, 17 September 2024, 3:31 AM

1. Superuser root

Tutorial Belajar MySQL Part 29: Mengenal Superuser root dan Pengertian Privileges MySQL

Sampai dengan artikel belajar MySQL sebelumnya, Tutorial MySQL: Menghapus Duplikasi (DISTINCT), kita masih belajar cara mengakses data dari MySQL, atau dalam teori database, perintah tersebut termasuk ke dalam Data Manipulation Language (DLL), dimana termasuk kelompok perintah query yang  digunakan untuk memanipulasi data dalam database dan menampilkannya.

Dalam beberapa artikel kedapan kita akan belajar perintah query yang dikelompokkan sebagai Data Control Language (DCL), yakni query yang digunakan untuk mengontrol dan membatasi hak akses ke database. Kita akan membahas tentang bagaimana cara membuat user MySQL, membatasi dan mengadministrasikan serta hak akses user dalam database MySQL.

Dalam tutorial belajar MySQL ini kita akan Membahas Superuser root dan pengertian privileges MySQL.


Mengenal Hak Akses Superuser: ‘root’

Jika anda mengikuti tutorial belajar MySQL dari awal, selama ini kita hanya menggunakan 1 user dalam belajar MySQL, yaitu user ‘root’. User root ini otomatis dibuat pada saat instalasi MySQL Server pertama kali.

User ‘root’ dalam istilah keamanan komputer sering disebut sebagai ‘superuser’Superuser merupakan tingkatan user tertinggi dimana user ini dapat melihat, mengubah, bahkan menghapus seluruh database dan menjalankan perintah apapun yang terdapat dalam MySQL.

Dalam tahap pembelajaran, kita diuntungkan dan dimudahkan dengan menggunakan user root dalam membuat database MySQL. Hal ini dikarenakan user root dapat menjalankan segala perintah dalam MySQL.

Namun pada aplikasi real dunia nyata, menggunakan user root untuk mengkases database dalam operasional sehari-hari sangat tidak disarankan. Memberikan kemampuan dan hak akses untuk menghapus seluruh database akan berdampak fatal pada operasional aplikasi.

Kita dapat membuat user baru yang hanya bisa menjalankan perintah SELECT saja, dan user tersebut dibatasi untuk tidak dapat menjalankan query DROP.

Sebagai contoh, dalam database mahasiswa yang kita gunakan sepanjang berlajar MySQL di duniailkom ini, kita mungkin butuh untuk membuat user untuk setiap jurusan, dan membatasi user tersebut hanya dapat mengakses tabel yang sesuai dengan jurusannya masing-masing.

Untuk kerperluan multi user inilah MySQL menyediakan banyak perintah yang dapat digunakan untuk membuat, dan membatasi hak akses user dalam mengakses database.


Pengertian Hak akses (Privileges) dalam MySQL

User dalam MySQL dapat dibuat dengan berbagai kombinasi hak akses yang dapat dibatasi. Apakah user tersebut dapat membuat, mengubah dan menghapus sebuah tabel, atau user tersebut kita batasi hanya untuk melihat tabel saja (perintah SELECT).

Lebih jauh lagi, MySQL memiliki kemampuan untuk membatasi hak akses dari komputer mana MySQL Client dijalankan. Misalkan tabel jurusan_fisika, hanya dapat diakses dari komputer yang alamat IP-nya berasal dari jurusan fisika saja, sehingga membatasi hak akses mahasiswa fisika untuk melihat tabel jurusan pariwisata.

Selain lokasi IP address, hak akses user dalam MySQL dapat dibatasi juga pada level tabel dan kolom tertentu saja. Misalkan dalam tabel mahasiswa terdapat kolom IPK yang harus dirahasiakan, maka kita bisa membatasi hak akses untuk kolom IPK dan membuka akses untuk kolom lainnya.

Dalam bahasa inggrisnya, hak akses ini dikenal dengan istilah ‘privileges’. Kita akan membahas cara membuat user dan membatasi hak aksesnya dalam tutorial selanjutnya.


Mengenal Database mysql

Seluruh user dan hak aksesnya (privileges), disimpan oleh mysql pada sebuah database khusus, yakni database mysql. Tabel khusus ini langsung dibuat secara otomatis pada saat instalasi MySQL. Anda bisa melihat isi database ini dengan menjalankan perintah query dibawah ini:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mahasiswa          |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)
 
mysql> USE mysql;
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)

Dalam membuat user beserta hak aksesnya, MySQL menyediakan 2 cara:

  1. Menggunakan perintah khusus (query GRANT ) dalam pembuatan user.
  2. Mengubah langsung data record yang terdapat dalam database mysql .

Menggunakan perintah khusus dalam membuat uses akan lebih mudah digunakan dan lebih aman, karena jika mengubah tabel mysql langsung, kita memiliki resiko salah perintah yang dapat menyebabkan terhapusnya data dalam database mysql. Namun mengubah database mysql menawarkan fleksibilitas yang lebih dalam membuat hak akses.


2. Membuat dan Menghapus User

Tutorial Belajar MySQL Part 30: Cara Membuat dan Menghapus User MySQL (CREATE USER)

Setelah memahami pengertian Superuser root dan Privileges dalam MySQL, serta pentingnya membatasi hak akses user, dalam tutorial kali ini kita akan mempelajari cara membuat user MySQL, membatasinya dengan password, membatasi hak akses dari alamat IP, serta menghapus user dalam MySQL.

Pembuatan user baru dalam MySQL, hanya dapat dilakukan menggunakan user root, atau user yang diberikan hak akses GRANT OPTION (pembahasan tentang GRANT OPTION akan kita bahas dalam artikel lainnya).

Di karenakan kita akan sering keluar masuk mysql mengunakan beberapa user, maka untuk mengikuti tutorial ini disarankan menggakses MySQL secara manual dari DOS, seperti pada Tutorial Belajar MySQL: Menjalankan MySQL Client.

Menyiapkan Database Sample: universitas

Sebagai database contoh yang akan digunakan untuk belajar membuat user baru MySQL, kita akan membuat sebuah database universitas. Silahkan masuk dengan user root ke dalam MySQL Server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
D:\MySQL\bin>mysql -u root –pqwerty
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> CREATE DATABASE universitas;
Query OK, 1 row affected (0.00 sec)
 
mysql> USE universitas;
Database changed

Database ini akan memiliki 2 buah tabel, yakni tabel mahasiswa_ilkom, dan tabel mahasiswa_ekonomi. Masing-masing tabel berisi tentang data mahasiswa. Dalam query berikut, kita membuat kedua tabel tersebut dan menyiapkan data sampel sebagai contoh.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
mysql> CREATE TABLE mahasiswa_ilkom ( nim CHAR(9), nama CHAR(50), umur INT,
tempat_lahir CHAR(50), IPK DECIMAL (3,2) );
Query OK, 0 rows affected (0.01 sec)
 
mysql> INSERT INTO mahasiswa_ilkom VALUES ('089045001', 'Andi Suryo', 23,
'Jakarta', 2.7);
Query OK, 1 row affected (0.05 sec)
 
mysql> INSERT INTO mahasiswa_ilkom VALUES ('109245021', 'Santi Syanum',
 21, 'Malang', 3.2);
Query OK, 1 row affected (0.04 sec)
 
mysql> INSERT INTO mahasiswa_ilkom VALUES ('099145055', 'Neil Situmorang',
 22, 'Medan', 1.9);
Query OK, 1 row affected (0.12 sec)
 
mysql> CREATE TABLE mahasiswa_ekonomi ( nim CHAR(9), nama CHAR(50),
umur INT, tempat_lahir CHAR(50), IPK DECIMAL (3,2) );
Query OK, 0 rows affected (0.01 sec)
 
mysql> INSERT INTO mahasiswa_ekonomi VALUES ('089023013',
'Alex Supriyanto', 23, 'Surabaya', 2.9);
Query OK, 1 row affected (0.04 sec)
 
mysql> INSERT INTO mahasiswa_ekonomi VALUES ('109223041', 'Rani Sabrina',
 21, 'Padang',3.7);
Query OK, 1 row affected (0.04 sec)
 
mysql> INSERT INTO mahasiswa_ekonomi VALUES ('099123043', 'Ocha Septriani',
 22,'Makasar', 3.1);
Query OK, 1 row affected (0.05 sec)
 
mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
+-----------+-----------------+------+--------------+------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM mahasiswa_ekonomi;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089023013 | Alex Supriyanto |   23 | Surabaya     | 2.90 |
| 109223041 | Rani Sabrina    |   21 | Padang       | 3.70 |
| 099123043 | Ocha Septriani  |   22 | Makasar      | 3.10 |
+-----------+-----------------+------+--------------+------+
3 rows in set (0.00 sec)

Cara Membuat User Baru dalam MySQL

Untuk membuat user baru, MySQL menyediakan query CREATE USER, berikut format dasar perintah:

CREATE USER 'nama_user';
  • nama_user adalah nama dari user yang akan dibuat, maksimal 16 karakter.

Untuk database universitas, kita akan membuat user ilkom_admin, berikut contoh querynya:

1
2
mysql> CREATE USER 'ilkom_admin';
Query OK, 0 rows affected (0.09 sec)

Dengan query CREATE USER tersebut, sebuah user baru telah dibuat di dalam MySQL Server. Untuk mencoba menggunakan user tersebut, kita harus keluar dari user root yang digunakan saat ini, dan login sebagai ilkom_admin.

Agar bisa keluar dari user root dan masuk sebagai user lainnya, harus mengakses MySQL Client dari CMD Windows. Untuk penjelasan lebih lanjut dapat dipelajari dalam artikel Tutorial Belajar MySQL: Menjalankan MySQL Client.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> exit;
Bye
 
D:\MySQL\bin>mysql -u ilkom_admin
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>

Pada contoh diatas, pertama-tama kita menggunakan perintah exit untuk keluar dari root. Setelah itu kita log in menggunakan user yang baru saja dibuat, yakni ilkom_admin.

Jika anda memeriksa database untuk user ini, user ilkom_admin belum memiliki hak akses untuk database apapun. Kita akan membahasnya pada tutorial selanjutnya.

1
2
3
4
5
6
7
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.10 sec)

Terlihat bahwa hasil SHOW DATABASES dari user ilkom_admin hanya berisi database information_schema. Database information_schema sendiri bukan merupakan database ‘asli’information_schema akan ada untuk setiap user MySQL dan hanya database ‘virtual’ yang digunakan untuk menyimpan metadata (data keterangan) tentang database. Kita hanya bisa menggunakan query SELECT untuk database ini, tetapi tidak untuk query DELETE, INSERT, maupun UPDATE.


Cara Membuat User dalam MySQL dengan Password

User ilkom_admin yang baru saja dibuat, dapat diakses oleh siapapun sepanjang ia mengetahui username yang digunakan, yakni ilkom_admin.

Untuk menambah keamanan, kita seharusnya menambahkan password yang harus diinputkan oleh user pada saat login. Format dasar querynya:

CREATE USER 'nama_user' IDENTIFIED BY 'password' ;
  • nama_user adalah nama dari user yang akan dibuat, maksimal 16 karakter.
  • password adalah password yang harus dituliskan pada saat nama_user mengakses MySQL server.

Misalkan kita ingin membuat user ilkom_admin2 dengan password ‘r4hasia’, maka querynya:

Jika anda masih menggunakan user ilkom_admin, keluarlah terlebih dahulu dan masuk kembali sebagai root.
1
2
mysql> CREATE USER ilkom_admin2 IDENTIFIED BY 'rahasia';
Query OK, 0 rows affected (0.01 sec)

Dan jika anda ingin mengakses user tersebut, haruslah menggunakan password:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
D:\MySQL\bin>mysql -u ilkom_admin2
ERROR 1045 (28000): Access denied for user 'ilkom_admin2'@'localhost'
(using password: NO)
 
D:\MySQL\bin>mysql -u ilkom_admin2 –pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>

Terlihat dari contoh query pertama jika tanpa password, MySQL akan mengeluarkan pesan error.


Cara Membuat User MySQL dengan batasan IP address

Dalam membuat user, MySQL menyediakan pilihan untuk membatasi hak akses user tersebut dari lokasi tempat user mengakses MySQL server.

Seperti yang telah kita bahas pada Tutorial Belajar MySQL: Menjalankan MySQL Server, bahwa pengaksesan MySQL Server dapat dilakukan dari komputer mana saja sepanjang kita memiliki program MySQL Client dan terhubung melalui jaringan dengan MySQL Server. MySQL menggunakan alamat IP address untuk mengetahui darimana MySQL Server diakses.

Misalkan sebuah kantor memiliki 6 komputer yang terhubung dalam jaringan. MySQL Server berada pada komputer yang berada di alamat IP 192.168.0.1., sedangkan komputer lainnya memiliki alamat IP 192.168.0.2 sampai dengan 192.168.0.6. Kebijakan perusahaan adalah untuk mengakses tabel yang bersifat rahasia hanya bisa diakses dari komputer dengan IP 192.168.0.4. Untuk keperluan ini MySQL menyediakan cara agar sebuah user hanya dapat diakses dari alamat IP tertentu saja.

Format dasar query:

CREATE USER 'nama_user'@'lokasi_user' IDENTIFIED BY 'password';
  • nama_user adalah nama dari user yang akan dibuat, maksimal 16 karakter.
  • lokasi_user adalah lokasi tempat user yang diperbolehkan mengakses. Jika berada di komputer yang sama dengan MySQL Server, lokasi_user ditulis sebagai ‘localhost’, namun jika berada di komputer tertentu, kita bisa mengisinya dengan alamat IP seperti ‘192.168.0.2’, atau alamat host domain seperti user.duniailkom
  • password adalah password yang harus dituliskan pada saat nama_user mengakses MySQL server.

Sebagai contoh query, misalkan kita ingin membuat user ilkom_admin3 dengan password r4hasia dan hanya bisa diakses dari IP 192.168.0.4, maka querynya:

1
2
mysql> CREATE USER 'ilkom_admin3'@'192.168.0.4' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.01 sec)

Jika kita menggunakan user ilkom_admin3 dari komputer dengan IP address selain ‘192.168.0.4’, MySQL akan menghasilkan error.

1
2
3
D:\MySQL\bin>mysql -u ilkom_admin3 -pr4hasia
ERROR 1045 (28000): Access denied for user 'ilkom_admin3'@'localhost'
(using password: YES)

MySQL juga memiliki fitur untuk membuat alamat IP menggunakan wildcard ‘%’ yang maksudnya adalah semua alamat IP. Contohnya :

CREATE USER 'ilkom_admin4'@'192.168.0.%';

Perintah tersebut akan membuat user ilkom_admin4 dapat diakses dari seluruh alamat mulai dari 192.168.0.1 sampai dengan 192.168.0.255, namun tidak untuk IP 192.168.1.0.

Bahkan sebenarnya perintah:

CREATE USER 'ilkom_admin';

Adalah sama dengan

CREATE USER 'ilkom_admin'@%;

Yang berarti user ilkom_admin dapat diakses dari mana saja.

Alamat yang sering digunakan sebagai alamat IP adalah localhost, yang berarti alamat IP komputer tempat dimana MySQL Server berada. Karena di dalam tahap belajar ini kita menggunakan MySQL Client pada komputer yang sama dengan MySQL server, maka dalam tutorial selanjutnya saya hanya akan memakai lokasi localhost, seperti:

CREATE USER 'ilkom_admin'@'localhost';


Cara menghapus User MySQL

Untuk menghapus user, MySQL menyediakan query DROP USER. Berikut format dasar penggunaan:

DROP user nama_user
  • nama_user adalah nama dari user yang akan dihapus.

Sebagai contoh, jika anda mengikuti seluruh query dalam tutorial ini, maka akan tercipta 3 user, yakni ilkom_admin, ilkom_admin2 dan ilkom_admin3. Kita akan menghapus ketiganya:

1
2
3
4
5
6
7
8
mysql> DROP USER ilkom_admin;
Query OK, 0 rows affected (0.00 sec)
 
mysql> DROP USER ilkom_admin2;
Query OK, 0 rows affected (0.00 sec)
 
mysql> DROP USER ilkom_admin3; ERROR 1396 (HY000):
Operation DROP USER failed for 'ilkom_admin3'@'%'

Untuk user ilkom_admin3, MySQL akan mengeluarkan pesan error. Hal ini dikarenakan pada saat kita membuat user ilkom_admin3, kita membatasi user ini dengan hanya bisa diakses dari IP 192.168.0.4, sehingga untuk menghapusnya harus mencantumkan alamat lengkap IP:

1
2
mysql> DROP USER 'ilkom_admin3'@'192.168.0.4';
Query OK, 0 rows affected (0.00 sec)

Sampai tahap ini kita sudah mempelajari cara membuat user MySQL, membatasinya dengan password dan alamat IP, serta menghapus user MySQL. Namun user tersebut belum bisa melakukan apa-apa, karena kita belum memberikan hak akses. Dalam tutorial selanjutnya, kita akan membahas cara memberikan hak akses dengan query GRANT.


3. Privileges

Tutorial Belajar MySQL Part 31: Cara Membuat Hak Akses (Privileges) User MySQL (GRANT)

Jika pada Tutorial Cara Membuat dan Menghapus User MySQL, kita telah belajar cara membuat user, pada tutorial kali ini kita akan mempelajari cara untuk membuat dan memberikan hak akses kepada user tersebut dengan query GRANT.

Hak akses dalam MySQL selain dibatasi dengan query apa saja yang dibolehkan, juga dapat dibatasi pada level dimana query tersebut akan dijalankan, misalkan pada level database, level tabel atau level kolom. Kita akan membahasnya secara lengkap pada tutorial kali ini.

Secara sekilas, kita telah membahas tentang pengertian hak akses (privileges) pada artikel Tutorial Belajar MySQL: Mengenal Superuser root dan Pengertian Privileges MySQL.

Dalam perancangan aplikasi yang membutuhkan database, setiap user yang akan mengakses database seharusnya memiliki batasan masing-masing sesuai dengan fungsinya. Sebagai contoh, pada database universitas yang telah kita buat, terdapat 2 buah tabel, yakni mahasiswa_ilkom dan mahasiswa_ekonomi.

Misalkan kita membuat user mahasiswa. User mahasiswa ini hanya diberikan hak akses untuk melihat-lihat data tabel mahasiswa_ilkom dan mahasiswa_ekonomi, namun tidak bisa merubah apapun di dalam tabel tersebut. Di dalam MySQL, user mahasiswa ini hanya kita berikan hak akses SELECT.

Contoh lainnya, untuk keperluan administrasi, user ilkom_admin sebagai administrator akan diberikan hak akses untuk dapat menginput data dan merubah data dari tabel mahasiswa_ilkom. Tetapi , user ilkom_admin tidak bisa melihat dan merubah tabel mahasiswa_ekonomi, karena hak akses itu seharusnya diberikan kepada ekonomi_admin.

Dari contoh ini kita dapat melihat perlunya membatasi hak akses untuk masing-masing user: user mahasiswa, user ilkom_admin, dan user ekonomi_admin.

Saya akan menggunakan contoh database universitas yang telah dibuat pada Tutorial Cara Membuat dan Menghapus User MySQL, jika anda ingin mengikuti contoh yang tersedia, silahkan buat database tersebut terlebih dahulu.

Cara Memberikan Hak Akses Kepada User dengan query GRANT

Untuk memberikan hak akses kepada sebuah user, MySQL menyediakan query GRANT. Berikut format dasar query GRANT:

GRANT hak_akses ON nama_database.nama_tabel TO 'nama_user'@'lokasi_user';
  • hak_akses adalah privileges yang akan berikan kepada user tersebut. Hak akses disini berisi query yang diperbolehkan, seperti: SELECT, INSERT, UPDATE, DELETE, atau query lainnya. Jika kita ingin memberikan hak penuh untuk semua query dasar tersebut, hak_akses ini bisa diisi dengan ALL.
  • nama_database adalah nama database yang ingin diberikan hak akses. Jika kita mengizinkan user tersebut dapat mengakses semua database yang ada, nama_database bisa ditulis dengan tanda bintang (*).
  • nama_tabel adalah nama tabel yang ingin diberikan hak akses. Jika kita mengizinkan user dapat menggunakan semua  tabel, nama_tabel bisa ditulis dengan tanda bintang (*).
  • nama_user adalah nama dari user yang akan diberikan hak akses.
  • lokasi_user adalah alamat IP dari user yang ingin diberikan hak akses.

Sebagai contoh penggunaan query GRANT, misalkan kita ingin memberikan privileges kepada ilkom_admin untuk dapat melihat (melakukan query SELECT) pada tabel mahasiswa_ilkom yang berada pada database universitas, maka berikut query yang kita gunakan:

1
2
3
4
5
6
mysql> CREATE USER 'ilkom_admin'@'localhost' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.52 sec)
 
mysql> GRANT SELECT ON universitas.mahasiswa_ilkom TO
'ilkom_admin'@'localhost';
Query OK, 0 rows affected (0.12 sec)

Query diatas terdiri dari 2 bagian, pada bagian pertama kita membuat user ilkom_admin yang harus diakses dari komputer localhost (komputer yang sama dengan server MySQL berada), dan memberikan password ‘r4hasia’. Cara membuat user telah kita bahas pada tutorial sebelumnya, Cara Membuat dan Menghapus User MySQL (CREATE USER).

Selanjutnya pada bagian kedua, kita memberikan hak akses dengan query GRANT pada untuk user ilkom_admin.

Perhatikan cara penulisan query GRANT tersebut, setelah keyword GRANT, diikuti dengan kata SELECTSELECT disini adalah hak akses yang ingin di berikan kepada user, saya memberikan hak SELECT karena user admin saat ini hanya dapat melakukan perintah SELECT.

Setelah SELECT, diikuti dengan penulisan tabel yang diperbolehkan, yakni universitas.mahasiswa_ilkom (dibaca:tabel mahasiswa_ilkom pada database universitas). Bagian terakhir adalah user yang akan diberikan hak aksesnya, yakni ilkom_admin pada localhost.

Untuk mencoba user ilkom_admin, keluarlah dari root, dan masuk sebagai ilkom_admin:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
D:\MySQL\bin>mysql -u ilkom_admin -pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.00 sec)
 
mysql> USE universitas;
Database changed
 
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ilkom       |
+-----------------------+
1 row in set (0.00 sec)
 
mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
+-----------+-----------------+------+--------------+------+
3 rows in set (0.07 sec)
 
mysql> DELETE FROM mahasiswa_ilkom WHERE nama="Andi Suryo";
ERROR 1142 (42000): DELETE command denied to user
'ilkom_admin'@'localhost' fortable 'mahasiswa_ilkom'
 
mysql> DROP TABLE mahasiswa_ilkom;
ERROR 1142 (42000): DROP command denied to user
'ilkom_admin'@'localhost' for table 'mahasiswa_ilkom'

Dari contoh query diatas, dapat dilihat bahwa pada saat ilkom_admin menjalankan perintah SHOW TABLES, ia hanya dapat melihat satu tabel, yakni tabel mahasiswa_ilkom. Padahal dalam database tersebut kita juga telah membuat tabel mahasiswa_ekonomi, namun karena hak akses yang diberikan, ilkom_admin hanya dapat melihat tabel yang diperbolehkan.

Setelah menampilkan isi tabel mahasiswa_ilkom,  user ilkom_admin mencoba menghapus tabel mahasiswa_ilkom. Tetapi karena kita membatasi hak aksesnya, ilkom_admin tidak dapat menjalankan query DELETE dan DROP, dan akan langsung ditolak oleh MySQL.


Cara Memberikan Hak Akses Untuk Seluruh Tabel

Sebagai contoh kedua, kali ini kita akan membuat user mahasiswa yang diberikan hak akses untuk dapat melihat seluruh tabel yang ada pada database universitas, berikut querynya:

1
2
3
4
5
mysql> CREATE USER 'mahasiswa'@'localhost' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT SELECT ON universitas.* TO 'mahasiswa'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Pembuatan user mahasiswa ini hampir sama dengan perintah saat membuat user ilkom_admin. Kecuali kali ini untuk penulisan tabel kita menggunakan format universitas.* yang berarti dapat mengakses seluruh tabel pada database universitas.

Selanjutnya, kita akan mencoba menggunakan user mahasiswa untuk melihat database universitas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
D:\MySQL\bin>mysql -u mahasiswa -pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> USE universitas;
Database changed
 
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ekonomi     |
| mahasiswa_ilkom       |
+-----------------------+
2 rows in set (0.00 sec)

Dari hasil query diatas, terlihat bahwa user mahasiswa dapat melihat terdapat 2 tabel dalam database universitas. Dan jika kita membuat sebuah tabel baru dalam database universitas, user mahasiswa juga akan bisa melihatnya.


Cara Memberikan Seluruh Hak Akses (query GRANT ALL)

Dari kedua contoh user sebelumnya, yakni user ilkom_admin dan mahasiswa, kita hanya menggunakan hak akses SELECT. Kali ini kita akan memberikan hak akses penuh kepada user ekonomi_admin, dengan query GRANT ALL. Berikut querynya:

1
2
3
4
5
6
mysql> CREATE USER 'ekonomi_admin'@'localhost' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT ALL ON universitas.mahasiswa_ekonomi
TO 'ekonomi_admin'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Dengan memberikan hak akses GRANT ALL, maka user ekonomi_admin dapat menggunakan seluruh query dasar pada tabel mahasiswa_ekonomi, seperti SELECT, UPDATE, bahkan DELETE. Sebagai latihan, silahkan mencoba masuk sebagai user ekonomi_admin dan lakukan perintah seperti UPDATE, DELETE, dan DROP.


Cara Memberikan Hak Akses MySQL Pada Level Kolom

Untuk keperluan yang lebih spesifik, hak akses dapat juga dibatasi hanya untuk kolom tertentu. Hal ini bisa didasarkan bahwa terdapat sebuah kolom yang dirasakan rahasia, dan tidak boleh diketahui user tersebut.

Misalkan kita membuat user tamu_ilkom yang hanya dapat melihat nama dan umur mahasiswa pada tabel mahasiswa_ilkom, dan merahasiakan kolom lainnya seperti alamat dan IPK, maka berikut querynya:

1
2
3
4
5
6
mysql> CREATE USER 'tamu_ilkom'@'localhost';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT SELECT (nama,umur) ON universitas.mahasiswa_ilkom
TO 'tamu_ilkom'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Perhatikan cara penulisan kolom yang diberikan hak aksesnya, setelah hak akses (dalam contoh adalah SELECT), penulisan nama kolom harus berada dalam tanda kurung. Dapat dilihat bahwa kita memberikan hak akses hanya pada kolom nama dan umur untuk tabel mahasiswa_ilkom.

Untuk mengujinya, masuklah sebagai user tamu_ilkom:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
D:\MySQL\bin>mysql -u tamu_ilkom
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> USE universitas;
Database changed
 
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ilkom       |
+-----------------------+
1 row in set (0.00 sec)
 
mysql> SELECT * FROM mahasiswa_ilkom;
ERROR 1143 (42000): SELECT command denied to user 'tamu'@'localhost'
for column 'nim' in table 'mahasiswa_ilkom'
 
mysql> SELECT nama,umur FROM mahasiswa_ilkom;
+-----------------+------+
| nama            | umur |
+-----------------+------+
| Andi Suryo      |   23 |
| Santi Syanum    |   21 |
| Neil Situmorang |   22 |
+-----------------+------+
3 rows in set (0.00 sec)

Pada saat user tamu_ilkom mencoba menampilkan seluruh kolom dengan query SELECT * FROM mahasiswa_ilkom, MySQL akan mengeluarkan error karena user tamu_ilkom hanya memiliki hak akses untuk kolom nama dan umur saja, dimana pada saat menggunakan perintah SELECT nama,umur FROM mahasiswa_ilkom, MySQL menampilkannya dengan baik.


 

Dari tutorial Cara Membuat Hak Akses (Privileges) User MySQL dengan query GRANT ini, kita telah mempelajari cara memberikan hak akses untuk user. Hak akses itu sendiri sebenarnya dapat dibatasi pada 4 tingkatan level, yakni level global, level databaselevel tabel, dan level kolom. Pada tutorial diatas, kita telah mencoba level databasetabel dan kolom, namun untuk lebih dalam, kita akan membahasnya pada tutorial MySQL selanjutnya: Membahas Jenis-jenis Hak Akses dalam MySQL.


4. Jenis-jenis Hak Akses

Tutorial Belajar MySQL Part 32: Jenis-jenis Hak Akses (Privileges) dalam MySQL

Jika pada tutorial sebelumnya kita telah membahas cara membuat user dalam MySQL, Dalam tutorial kali ini kita akan membahas jenis-jenis hak akses yang ada pada MySQL. Hak akses ini nantinya digunakan untuk membatasi hak dari masing-masing user dalam mengunakan MySQL.


Jenis Hak Akses Berdasarkan Cakupan Akses Level

Seperti yang telah kita pelajari pada tutorial Cara Membuat Hak Akses (Privileges) User MySQL, bahwa MySQL menyediakan berbagai tingkatan level hak akses. Setiap user dapat dibatasi untuk dapat mengakses baik itu sebuah database tertentu saja, tabel tertentu, atau bahkan hanya kolom tertentu.

Jika didasarkan pada pengelompokkan ini, kita dapat membagi hak akses MySQL menjadi 4 level tingkatan, yaitu:

1. Hak Akses Global (*.*)

Hak akses ini berarti user dapat memiliki hak akses untuk seluruh database yang terdapat di dalam MySQL. Contoh penulisan query GRANT untuk level ini adalah:

GRANT SELECT ON *.* TO 'user'@'localhost';

Perhatikan cara penulisan nama_database.nama_tabel, dimana kita menulisnya dengan *.*, sehingga user tersebut dapat mengakses seluruh tabel pada seluruh database.

2. Hak Akses Level Database (nama_database.*)

Hak akses ini berarti user memiliki hak akses penuh untuk sebuah database. Contoh penulisan query GRANT untuk level database ini adalah:

GRANT SELECT ON universitas.* TO 'user'@'localhost';

Untuk penulisan nama_database.nama_tabel, kita membatasi nama database, namun memberikan hak akses untuk seluruh tabel, penulisannya adalah nama_database.*

3. Hak Akses Level Tabel (nama_database.nama_tabel)

Hak akses ini berarti user memiliki hak akses untuk sebuah tabel yang berada pada sebuah database. Contoh penulisan query GRANT untuk level ini adalah:

GRANT SELECT ON universitas.mahasiswa_ilkom TO 'user'@'localhost';

Hak akses yang dimiliki user hanya terbatas pada level sebuah tabel saja.

4. Hak Akses Level Kolom (nama_kolom)

Hak akses ini adalah hak akses paling kecil yang dapat diberikan kepada sebuah user. Dengan hak akses level kolom, user hanya memiliki hak akses untuk beberapa kolom pada sebuah tabel. Contoh penulisan query GRANT untuk level kolom ini adalah:

GRANT SELECT (nama,umur) ON universitas.mahasiswa_ilkom TO 'user'@'localhost';

Level paling akhir ini kita membatasi hak akses user hanya untuk kolom tertentu saja. Penulisan kolom yang diperbolehkan diletakkan di dalam tanda kurung.


Tipe-Tipe Hak Akses dalam MySQL

Untuk setiap level diatas, kita dapat menerapkan berbagai tipe hak akses yang ingin diberikan, apakah itu hanya untuk melihat saja (query SELECT), menambahkan data (query INSERT), mengupdate data (query UPDATE), bahkan menghapus data (query DELETE).

Pada tabel dibawah ini saya melampirkan seluruh tipe hak akses yang dapat diberikan/dibatasi untuk user. Tabel tersebut diambil langsung dari manual resmi MySQL. Kebanyakan dari hak akses tersebut akan jarang digunakan dan belum kita pelajari, namun tabel dibawah dapat dijadikan referensi terkait hak akses (privileges).

Hak AksesKeterangan
ALL [PRIVILEGES]Memberikan seluruh hak akses, kecuali GRANT OPTION
ALTERHak akses untuk merubah tabel (ALTER TABLE)
ALTER ROUTINEHak akses untuk merubah stored routines
CREATEHak akses untuk membuat tabel dan database
CREATE ROUTINEHak akses untuk membuat dan menghapus stored routine
CREATE TABLESPACEHak akses untuk membuat, mengubah dan menghapus tablespaces dan log file
CREATE TEMPORARYTABLESHak akses untuk membuat tabel sementara CREATE TEMPORARY TABLE
CREATE USERHak akses untuk membuat, menghapus, dan mengubah user (CREATE USER, DROP USER, RENAME USER, dan REVOKE ALL PRIVILEGES)
CREATE VIEWHak akses untuk membuat dan mengubah views
DELETEHak akses untuk menghapus data (DELETE)
DROPHak akses untuk menghapus database, tabel dan view
EVENTHak akses untuk membuat event
EXECUTEHak akses untuk menjalankan stored routines
FILEHak akses untuk membuat server membaca maupun membuat file
GRANT OPTIONHak akses untuk memberikan hak akses kepada user lainnya.
INDEXHak akses untuk membuat dan menghapus index
INSERTHak akses untuk menambahkan data (query INSERT)
LOCK TABLESHak akses untuk mengunci tabel (LOCK TABLES)
PROCESSHak akses untuk melihat seluruh proses (SHOW PROCESSLIST)
PROXYHak akses untuk proses proxy
REFERENCESBelum diimplementasikan
RELOADHak akses untuk operasi FLUSH
REPLICATION CLIENTHak akses untuk mengubah urutan master dan slave server
REPLICATION SLAVEHak akses untuk server replikasi untuk membaca log event biner dari server master
SELECTHak akses untuk melihat data (query SELECT)
SHOW DATABASESHak akses untuk melihat seluruh database (SHOW DATABASES)
SHOW VIEWHak akses untuk melihat pembuatan view (SHOW CREATE VIEW)
SHUTDOWNHak akses untuk mysqladmin shutdown
SUPERHak akses untuk fungsi administrasi server, seperti CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, dan perintah debug mysqladmin
TRIGGERHak akses untuk operasi trigger
UPDATEHak akses untuk memperbaharui data (UPDATE)
USAGESama artinya dengan “tanpa hak akses”


Pengertian Hak Akses GRANT ALL

Pada tutorial Cara Membuat Hak Akses (Privileges) User MySQL dengan query GRANT, kita telah melihat penulisan hak akses GRANT ALL. Namun sebenarnya apa saja hak akses yang bisa dilakukan dengan GRANT ALL? Dan apa saja hak akses lainnya?

GRANT ALL adalah cara penyingkatan memberikan hampir semua hak akses kepada sebuah user tertentu. Hak akses ini mencakup seluruh query dasar:

ALTER, CREATE, CREATE TEMPORARY TABLES, DELETE, DROP, EXECUTE, FILE, INDEX, INSERT, LOCK TABLES, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHOW DATABASES, SHUTDOWN, SUPER, dan UPDATE.

Sebagian besar hak akses diatas belum kita bahas, namun ini dapat menjadi referensi jika anda memberikan hak akses dengan GRANT ALL kepada sebuah user.


Untuk lebih memahami cara pembuatan user dan hak aksesnya, saya akan memberikan beberapa contoh, dan jika anda sudah mempelajari tutorial sebelumnya, contoh disini akan mudah dipahami.

1. Buatlah user ‘dosen_ilkom’ yang dapat melihatmerubah dan menambahkan data ke tabel mahasiswa_ilkom, namun tidak dapat menghapus data yang ada. User tersebut hanya dapat diakses dari localhost.

Berikut adalah query yang dibutuhkan:

1
2
3
4
5
6
mysql> CREATE USER 'dosen_ilkom'@'localhost' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT SELECT,INSERT,UPDATE ON universitas.mahasiswa_ilkom
TO 'dosen_ilkom'@'localhost';
Query OK, 0 rows affected (0.07 sec)

2. Buatlah user ‘sensus_ilkom’ yang dapat melihat seluruh tabel di dalam database mahasiswa_ilkom, namun hanya pada kolom nimnama, dan umur. User tersebut akan mengakses database dari IP 192.168.0.4 .

Berikut adalah query yang dibutuhkan:

1
2
3
4
5
6
mysql> CREATE USER 'sensus_ilkom'@'192.168.0.4' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT SELECT(nim,nama,umur) ON universitas.mahasiswa_ilkom
TO 'sensus_ilkom'@'192.168.0.4';
Query OK, 0 rows affected (0.00 sec)

3. Buatlah user ’admin_kampus’ yang dapat mengeditmembuat, dan menghapus tabel dalam database universitas, namun tidak bisa melakukan manipulasi data di dalam tabel tersebut. User ini bisa diakses dari komputer manapun.

Berikut adalah query yang dibutuhkan:

1
2
3
4
5
mysql> CREATE USER 'admin_kampus'@'%' IDENTIFIED BY 'r4hasia';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT CREATE,DROP,ALTER ON universitas.* TO 'admin_kampus'@'%';
Query OK, 0 rows affected (0.00 sec)

Dalam merancang aplikasi yang memerlukan database MySQL, pembatasan hak akses seperti diatas memerlukan seni tersendiri. Permasalahan muncul jika tiba-tiba user yang sudah dibatasi ternyata memerlukan akses ke tabel lain. Kita sebaiknya sudah memperkirakan level apa saja yang bisa diakses oleh user tertentu dan pada tabel apa saja sebelum aplikasi direlease.

Jika anda membangun aplikasi, biasanya pengguna tidak akan diberikan akses langsung dengan MySQL Server, namun kita biasanya akan memandu pengguna melalui interface lainnya seperti halaman web (untuk situs online) atau form visual basic (untuk aplikasi desktop). Dalam aplikasi web, kode PHPlah (atau lebih tepatnya: web server) yang mengakses MySQL, pengguna hanya dihadapkan pada halaman form website.

Untuk hal keamanan database, Jika anda telah membatasi hak akses pengguna pada level PHP, hal tersebut bisa dikatakan sudah cukup. Namun jika terdapat kemungkinan pengguna mengakses MySQL Server secara langsung, kita sedapat mungkin telah mengantisipasinya dengan membuat user berlapis (dari kode PHP dan dari dalam MySQL).


5. Melihat Daftar User

Tutorial Belajar MySQL Part 33: Cara Melihat Daftar User MySQL dan Hak Aksesnya (SHOW GRANTS FOR)

Pada tutorial MySQL kali ini kita akan membahas tentang cara melihat siapa saja user yang terdaftar dalam MySQL, dan melihat hak akses apa saja yang diberikan kepada user tersebut menggunakan query SHOW GRANTS FOR.

Pada artikel sebelumnya, kita telah belajar cara membuat user MySQL dan hak akses user MySQL. Untuk sistem yang besar, pemantauan dan manajemen user akan sangat diperlukan. Selain untuk kenyamanan pengguna, hal ini juga berkaitan erat dengan keamanan Server MySQL. Misalnya, untuk user yang tidak aktif lagi sebaiknya dihapus dari sistem, karena bisa saja disalahgunakan oleh orang lain.


Cara Melihat Daftar User MySQL

Untuk melihat user yang terdaftar di dalam MySQL Server, kita dapat mengaksesnya dengan melihat tabel user yang terdapat di dalam database mysql.

Database mysql digunakan secara internal untuk manajemen meta data MySQL (metadata adalah data tentang sistem mysql itu sendiri) dimana salah satunya adalah tabel user MySQL. Karena pentingnya database ini, biasanya hanya user root yang memiliki hak akses penuh untuk database mysql.

Database mysql terdiri dari banyak tabel, namun untuk keperluan user, kita hanya akan menggunakan tabel user. Berikut query untuk melihat seluruh user yang terdaftar dalam MySQL:

SELECT user,host FROM mysql.user;

Dari query SELECT diatas, kita bisa melihat user apa saja dan pada alamat mana saja yang terdaftar.

Jika anda mengikuti tutorial MySQL untuk membuat user dalam duniailkom ini, didalam MySQL Server akan terdapat beberapa user, berikut adalah contoh perintah melihat user pada MySQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
D:\MySQL\bin>mysql -uroot -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mahasiswa          |
| mysql              |
| performance_schema |
| test               |
| universitas        |
+--------------------+
6 rows in set (0.11 sec)
 
mysql> USE mysql;
Database changed
 
mysql> SELECT user,host FROM mysql.user;
+------------------+-------------+
| user             | host        |
+------------------+-------------+
| admin_kampus     | %           |
| sensus_ilkom     | 192.168.0.4 |
| sensus_mahasiswa | 192.168.0.4 |
| dosen_ilkom      | localhost   |
| ekonomi_admin    | localhost   |
| ilkom_admin      | localhost   |
| mahasiswa        | localhost   |
| root             | localhost   |
| tamu             | localhost   |
+------------------+-------------+
9 rows in set (0.12 sec)

Dari perintah diatas, pertama kali saya login sebagai root, lalu menggunakan database mysql, dan terakhir menjalankan query SELECT user,host FROM mysql.user untuk melihat daftar user yang ada di dalam MySQL. Secara total terdapat 9 user yang merupakan user yang saya buat pada penjelasan tutorial sebelum ini. Jika anda perhatikan terdapat juga user root di dalam daftar tersebut.


Cara Melihat Hak Akses User MySQL (SHOW GRANTS FOR)

Setelah mendapatkan daftar user MySQL, tentunya kita ingin melihat apa saja hak akses yang dimiliki oleh masing-masing user tersebut. Untuk melihat hak aksesnya, MySQL menyediakan query SHOW GRANTS FOR.

Perhatikan bahwa MySQL menggunakan kata bentuk jamak GRANTS (bukan GRANT) dan jika anda lupa menambahkan ‘S’ kepada GRANTS, MySQL akan menghasilkan error.

Format dasar query SHOW GRANTS FOR adalah sebagai berikut:

SHOW GRANTS FOR ‘nama_user’@’lokasi_user’;
  • nama_user adalah nama dari user yang akan diquery.
  • lokasi_user adalah alamat IP dari user nama_user, dapat berupa: localhost192.168.0.5, atau ‘%’.

Sebagai contoh, kita akan melihat hak akses untuk user admin_kampus dengan query berikut:

1
2
3
4
5
6
7
8
9
10
mysql> SHOW GRANTS FOR 'admin_kampus' \G
 
*************************** 1. row ***************************
Grants for admin_kampus@%: GRANT USAGE ON *.* TO 'admin_kampus'@'%'
IDENTIFIED BY PASSWORD '*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for admin_kampus@%: GRANT CREATE, DROP, ALTER ON `universitas`.*
TO 'admin_kampus'@'%'
2 rows in set (0.00 sec)

Saya menambahkan perintah \G sebagai pengganti titik koma (;) diakhir query agar hasil tampilan tidak dalam bentuk tabel, tetapi ditampilakan per baris kebawah (pernah kita bahas pada tutorial Dasar Penulisan Query MySQL), hal ini karena hasil query SHOW GRANTS FOR bisa menjadi sangat panjang sehingga susah membacanya jika dalam bentuk tabel (silahkan mencoba query tersebut tanpa format \G untuk melihat perbedaan yang saya maksud, ganti \G menjadi titik koma ‘;’).

Hasil query SHOW GRANTS FOR diatas terdiri dari 2 baris, baris pertama berisi:

GRANT USAGE ON *.* TO 'admin_kampus'@'%' IDENTIFIED BY PASSWORD '......'

Barisi ini lebih kepada penjelasan bahwa user admin_kampus berada pada lokasi ‘%’ dan memiliki passwordPassword yang tertera di sini adalah hasil fungsi hashing yang digunakan secara internal oleh MySQL untuk menyimpan password. Saya akan membuat artikel tersendiri untuk menjelaskan bagaimana password untuk user disimpan dan diproses oleh MySQL. Untuk saat ini kita sepakati saja bahwa MySQL tidak menyimpan password dalam bentuk aslinya.

Baris kedua berisi :

GRANT CREATE, DROP, ALTER ON `universitas`.* TO 'admin_kampus'@'%'

Inilah hasil query yang menjelaskan hak akses apa saja yang dimiliki oleh user admin_kampus. Terlihat bahwa user admin_kampus memiliki hak akses CREATEDROP, dan ALTER untuk seluruh tabel dalam database universitas.

Query SHOW GRANTS FOR akan meminta masukan alamat lokasi user jika alamat user tersebut tidak didefenisikan sebagai ‘%’, berikut contoh yang saya maksud:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SHOW GRANTS FOR 'dosen_ilkom' \G
 
ERROR 1141 (42000): There is no such grant defined for user
'dosen_ilkom' on host '%'
 
mysql> SHOW GRANTS FOR 'dosen_ilkom'@'localhost'\G
 
*************************** 1. row ***************************
Grants for dosen_ilkom@localhost: GRANT USAGE ON *.* TO 'dosen_ilkom'
@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for dosen_ilkom@localhost: GRANT SELECT, INSERT, UPDATE ON
`universitas`.`mahasiswa_ilkom` TO 'dosen_ilkom'@'localhost'
2 rows in set (0.00 sec)

Terlihat bahwa MySQL mengeluarkan pesan error pada saat perintah SHOW GRANTS FOR ‘dosen_ilkom’ dijalankan, karena secara default MySQL akan mengeksekusi SHOW GRANTS FOR ‘dosen_ilkom’@’%’, padahal user dosen_ilkom berada pada localhost, bukan pada ‘%‘ (perhatikan hasil tabel user yang menjelaskan dosen_ilkom berada di localhost).

Sehingga ketika saya menggantinya menjadi SHOW GRANTS FOR ‘dosen_ilkom’@’localhost’, MySQL sukses menjalankan query tersebut.


Dalam tutorial kali ini kita telah membahas query SHOW GRANTS FOR untuk melihat hak akses sebuah user. Jika anda ingin menghapus beberapa user diatas, bisa menggunakan perintah DROP USER, seperti yang telah kita bahas pada tutorial Cara Membuat dan Menghapus User MySQL.

Sedangkan jika anda ingin mencabut hak akses user yang ada tanpa menghapus user tersebut, dapat menggunakan query REVOKE yang akan kita bahas pada tutorial selanjutnya, Cara menghapus hak akses user MySQL menggunakan query REVOKE.


6. Menghapus Hak Akses User

Tutorial Belajar MySQL Part 34: Cara Menghapus Hak Akses User MySQL (REVOKE)

Dalam maintenance database, kadang kita perlu mengubah dan menghapus beberapa user. Dalam tutorial MySQL kali ini kita akan mempelajari query REVOKE yang digunakan untuk mencabut previlege (hak akses) dari user MySQL.

Hak akses yang diberikan ke seorang user, adakalanya perlu dilakukan perubahan, tergantung kondisi dan kebijakan pengguna. Untuk menghapus user, kita dapat menggunakan query DROP user, namun kadang kita perlu hanya menghapus hak aksesnya saja, tanpa menghapus user yang bersangkutan. Untuk hal ini MySQL menyediakan perintah REVOKE.


Cara Penggunaan Query REVOKE untuk Menghapus Hak Akses

Langkah pertama sebelum membuat query REVOKE adalah mengetahui user siapa dan hak apa saja yang akan dihapus. Dari tutorial MySQL: Jenis-jenis Hak Akses (Privileges) dalam MySQL , kita telah mempelajari bahwa setiap user bisa memiliki hak akses yang berbeda-beda. Untuk melihat hak akses apa saja yang dimiliki oleh seorang user, dapat menggunakan query SHOW GRANTS FOR (kita telah mempelajarinya pada tutorial Cara Melihat Daftar User MySQL dan Hak Aksesnya)

Untuk tutorial kali ini saya akan membuat user baru admin_data. User admin_data akan diberikan hak akses untuk query SELECT,INSERT,UPDATE, dan DELETE untuk seluruh tabel yang berada di dalam database universitas. Berikut adalah query yang saya gunakan dengan user root:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
D:\MySQL\bin>mysql -u root -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> CREATE USER 'admin_data'@'localhost'IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON universitas.*
TO 'admin_data'@'localhost';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR 'admin_data'@'localhost'\G
 
*************************** 1. row ***************************
Grants for admin_data@localhost: GRANT USAGE ON *.* TO
'admin_data'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for admin_data@localhost: GRANT SELECT, INSERT, UPDATE,
DELETE ON `universitas`.* TO 'admin_data'@'localhost'
2 rows in set (0.06 sec)

Jika anda telah mempelajari tutorial sebelumnya, perintah query diatas dapat dengan mudah dimengerti. Pada query pertama, saya membuat user admin_data dengan perintah CREATE USER, lalu memberikan hak akses dengan query GRANT, dan memeriksa hak akses dengan query SHOW GRANTS FOR.

Setelah menjalankan perintah diatas, user admin_data memiliki 4 jenis hak akses, yaitu SELECT,INSERT,UPDATE, dan DELETE. Query REVOKE dapat di buat untuk menghapus seluruh atau salah satu hak akses saja. Berikut adalah format dasar penulisan query REVOKE:

REVOKE jenis_hak_akses (kolom1,kolom2) ON
nama_database.nama_tabel FROM nama_user@lokasi_user;
  • Jenis_hak_akses adalah privileges yang akan dihapus dari user tersebut. Kita bisa membuat hak akses secara satu persatu untuk keperluan yang spesifik, atau mengisikan perintah ALL PRIVILEGES untuk menghapus seluruh hak akses.
  • kolom1,kolom2 adalah nama judul kolom yang hak aksesnya akan dicabut. Jika tidak diisi, maka dianggap query REVOKE akan menghapus pada seluruh kolom.
  • nama_database adalah nama database yang ingin dihapuskan hak aksesnya. nama_database bisa ditulis dengan tanda bintang (*) untuk merujuk kepada seluruh database.
  • nama_tabel adalah nama tabel yang ingin dihapuskan hak aksesnya. nama_tabel bisa ditulis dengan tanda bintang (*) untuk merujuk kepada seluruh tabel.
  • nama_user adalah nama dari user yang akan dihapus hak aksesnya.
  • lokasi_user adalah alamat IP dari user yang akan dihapus hak aksesnya.

Sebagai contoh, saya akan menghapus hak akses SELECT dari user admin_data:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
mysql> exit;
Bye
 
D:\MySQL\bin>mysql -uadmin_data -pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.08 sec)
 
mysql> USE universitas;
Database changed
 
mysql> SHOW tables;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ekonomi     |
| mahasiswa_ilkom       |
+-----------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
+-----------+-----------------+------+--------------+------+
3 rows in set (0.07 sec)
 
mysql> exit;
Bye
 
D:\MySQL\bin>mysql -u root -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> REVOKE SELECT ON universitas.* FROM 'admin_data'@'localhost';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR 'admin_data'@'localhost'\G
 
*************************** 1. row ***************************
Grants for admin_data@localhost: GRANT USAGE ON *.*
TO 'admin_data'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for admin_data@localhost: GRANT INSERT, UPDATE, DELETE ON
`universitas`.* TO 'admin_data'@'localhost'
2 rows in set (0.00 sec)

Dari contoh query MySQL diatas, pertama-tama saya keluar dari user root dengan perintah exit;, dan masuk sebagai admin_data. Selanjutnya saya ingin menguji user admin_data untuk menampilkan isi tabel mahasiswa_ilkom, dan melakukan pengecekan hak akses user tersebut.

Setelah memastikan hak akses admin_data,  saya kembali menggunakan user root dan menghapus hak akses SELECT dari admin_data dengan query REVOKE, dan kembali memeriksa hak aksesnya.

Untuk menguji bahwa user admin_data sudah tidak dapat melihat database universitas lagi, saya akan kembali masuk sebagai user admin_data:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
mysql> exit;
Bye
 
D:\MySQL\bin>mysql -uadmin_data -pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.00 sec)
 
mysql> USE universitas;
Database changed
 
mysql> SHOW tables;
+-----------------------+
| Tables_in_universitas |
+-----------------------+
| mahasiswa_ekonomi     |
| mahasiswa_ilkom       |
+-----------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM mahasiswa_ilkom;
ERROR 1142 (42000): SELECT command denied to user
'admin_data'@'localhost' fortable 'mahasiswa_ilkom'
 
mysql> SHOW GRANTS FOR 'admin_data'@'localhost'\G
 
*************************** 1. row ***************************
Grants for admin_data@localhost: GRANT USAGE ON *.* TO
'admin_data'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for admin_data@localhost: GRANT INSERT, UPDATE, DELETE
ON `universitas`.* TO 'admin_data'@'localhost'
2 rows in set (0.00 sec)
 
mysql> INSERT INTO mahasiswa_ilkom VALUES ('129245021', 'Ginara Maulida',
22, 'Malang', 3.8);
Query OK, 1 row affected (0.11 sec)

Pada saat menggunakan user admin_data, saya mencoba melakukan query SELECT, dan seperti yang diharapkan, MySQL menolak untuk memperlihatkan isi tabel mahasiswa_ilkom karena hak akses untuk query SELECT telah dihapus.

Namun karena user admin_data masih memiliki hak akses INSERT, UPDATE dan DELETE, pada perintah terakhir saya mencoba menambahkan data baru kedalam tabel mahasiswa_ilkom, dan berhasil.

Untuk menghapus hak akses lainnya, anda tinggal membuat perintah REVOKE untuk masing-masing hak akses, atau menggunakan REVOKE ALL untuk menghapus seluruh hak akses.


Cara Penggunaan Query REVOKE ALL untuk Menghapus Seluruh Hak Akses

Jika pada penjelasan sebelumnya kita diberikan fleksibilitas untuk dapat memilih hak akses apa saja yang akan dihapus, namun sebagai cara singkat, MySQL menyediakan query REVOKE ALL untuk mencabut seluruh hak akses.

Sebagai lanjutan dari user admin_data, saya memutuskan untuk mencabut seluruh hak aksesnya kembali. Silahkan masuk sebagai root, dan jalankan perintah berikut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
D:\MySQL\bin>mysql -u root -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW GRANTS FOR 'admin_data'@'localhost'\G
 
*************************** 1. row ***************************
Grants for admin_data@localhost: GRANT USAGE ON *.* TO
'admin_data'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for admin_data@localhost: GRANT INSERT, UPDATE, DELETE ON
`universitas`.* TO 'admin_data'@'localhost'
2 rows in set (0.00 sec)
 
mysql> REVOKE ALL ON universitas.* FROM 'admin_data'@'localhost';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR 'admin_data'@'localhost'\G
 
*************************** 1. row ***************************
Grants for admin_data@localhost: GRANT USAGE ON *.* TO
'admin_data'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
1 row in set (0.00 sec)

Pada perintah pertama, saya menggunakan query SHOW GRANTS FOR untuk melihat hak akses admin_data, lalu menggunakan query REVOKE ALL untuk menghapus seluruh hak aksesnya, dan memastikannya lagi dengan memeriksa query SHOW GRANTS FOR.


Dari tutorial cara menghapus hak akses user MySQL dengan query REVOKE ini kita telah mempelajari cara menghapus dan mencabut hak akses dari user tertentu tanpa menghapus user tersebut, Dalam tutorial selanjutnya kita akan mempelajari tentang query GRANT OPTION, yaitu sebuah hak akses yang dapat digunakan untuk memberikan hak akses tersebut kepada user lainnya.

Dalam tutorial MySQL berikutnya, kita akan membahas Pengertian Fungsi Hashing dan cara kerja MySQL dalam menyimpan password user.


7. Mengalihkan Hak Akses User

Tutorial Belajar MySQL Part 35: Cara Mengalihkan Hak Akses User MySQL (GRANT OPTION)

Dalam tutorial MySQL ini, kita akan membahas cara mengalihkan/memberikan hak akses dari seorang user MySQL ke user lainnya. Untuk keperluan ini MySQL menyediakan perintah GRANT OPTION.


Pengertian Hak Akses GRANT OPTION

Ada kalanya seorang user MySQL ingin mengalihkan hak akses yang ia miliki ke user lainnya.

Misalkan mahasiswa ilkom sudah dirasa terlalu banyak, sehingga user ilkom_admin1 membutuhkan admin baru untuk membantunya. User ilkom_admin1 bisa saja mengalihkan hak akses yang dimilikinya (tanpa mengapus hak akses sendiri) ke user ilkom_admin2.

Kemampuan untuk memberikan hak akses inilah yang disebut dengan hak GRANT OPTION. Tetapi syarat untuk seorang user dapat mengalihkan hak aksesnya adalah sewaktu pembuatan user asal, user root harus memberikan hak GRANT OPTION.


Cara Penggunaan dan Penulisan query GRANT OPTION (1)

Terdapat beberapa cara penulisan GRANT OPTION. Cara pertama yaitu menuliskan GRANT OPTION secara terpisah dengan hak akses. Cara ini digunakan jika user telah ada dan hak akses telah diberikan.

Format dasar penulisan GRANT OPTION:

GRANT GRANT OPTION ON nama_database.nama_tabel TO 'nama_user'@'lokasi_user';
  • GRANT OPTION adalah perintah yang dituliskan jika kita mengizinkan user tersebut bisa memberikan hak akses kepada user lainnya.
  • nama_database adalah nama database yang ingin diberikan hak akses. Jika kita mengizinkan user tersebut dapat mengakses semua database yang ada, nama_database bisa ditulis dengan tanda bintang (*).
  • nama_tabel adalah nama tabel yang ingin diberikan hak akses. Jika kita mengizinkan user dapat menggunakan semua  tabel, nama_tabel bisa ditulis dengan tanda bintang (*).
  • nama_user adalah nama dari user yang akan diberikan hak akses.
  • lokasi_user adalah alamat IP dari user yang ingin diberikan hak akses.

Sebagai contoh latihan, saya akan membuat user ilkom_admin1 dengan hak GRANT OPTION, lalu memberikan akses tersebut ke user ilkom_admin2.

Untuk langkah awal, saya akan masuk sebagai root dan membuat user ilkom_admin1 dengak hak akses query SELECT pada tabel mahasiswa_ilkom, lalu memberikan hak akses GRANT OPTION untuk user ilkom_admin1. Berikut query yang digunakan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
D:\MySQL\bin>mysql -uroot -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> CREATE USER 'ilkom_admin1'@'localhost' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.04 sec)
 
mysql> GRANT SELECT ON universitas.mahasiswa_ilkom TO
'ilkom_admin1'@'localhost';
Query OK, 0 rows affected (0.14 sec)
 
mysql> GRANT GRANT OPTION ON universitas.mahasiswa_ilkom
TO 'ilkom_admin1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR ilkom_admin1@localhost \G
 
*************************** 1. row ***************************
Grants for ilkom_admin1@localhost: GRANT USAGE ON *.*
TO 'ilkom_admin1'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for ilkom_admin1@localhost: GRANT SELECT ON
`universitas`.`mahasiswa_ilkom` TO 'ilkom_admin1'@'localhost'
WITH GRANT OPTION
2 rows in set (0.00 sec)

Perhatikan pada baris setelah saya membuat user ilkom_admin1 (baris ke-14) dan hak akses SELECT (baris ke-17). Pada baris ke-21 saya memberikan perintah GRANT OPTION untuk user ilkom_admin1. Lalu pada baris ke 25 saya menggunakan menggunakan query SHOW GRANTS FOR untuk memeriksa hak akses ilkom_admin1, dan seperti yang terlihat pada baris ke-35, ada tambahan penjelasan pada user ilkom_admin1 ‘WITH GRANT OPTION’.

Jika anda mencoba masuk sebagai user ilkom_admin1, user tersebut dapat melihat isi seluruh tabel mahasiswa_ilkom. Untuk mencoba memberikan hak akses yang sama kepada user ilkom_admin2, pertama-tama dari user root kita akan membuat user ilkom_admin2. Berikut querynya:

1
2
3
4
5
6
7
8
9
10
mysql> CREATE USER 'ilkom_admin2'@'localhost' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR ilkom_admin2@localhost \G
 
*************************** 1. row ***************************
Grants for ilkom_admin2@localhost: GRANT USAGE ON *.*
TO 'ilkom_admin2'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
1 row in set (0.00 sec)

Perintah diatas digunakan untuk membuat user ilkom_admin2 tanpa hak akses, karena kita akan memberikan hak aksesnya melalui user ilkom_admin1. Untuk mencoba hak GRANT OPTION ini, keluarlah dari root, dan masuk sebagai ilkom_admin1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
mysql> exit;
Bye
 
D:\MySQL\bin>mysql -uilkom_admin1 -pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.10 sec)
 
mysql> USE universitas;
Database changed
 
mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
| 129245021 | Ginara Maulida  |   22 | Malang       | 3.80 |
+-----------+-----------------+------+--------------+------+
4 rows in set (0.12 sec)
 
mysql> GRANT SELECT ON universitas.mahasiswa_ilkom TO
 'ilkom_admin2'@'localhost';
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT INSERT ON universitas.mahasiswa_ilkom TO
'ilkom_admin2'@'localhost';
 
ERROR 1142 (42000): INSERT command denied to user
'ilkom_admin1'@'localhost' for table 'mahasiswa_ilkom'

Setelah masuk sebagai user ilkom_admin1 (baris ke-4), saya menjalankan beberapa query untuk mengecek hak akses ilkom_admin1 dengan perintah SELECT pada tabel mahasiswa_ilkom (baris ke-17 dan 29). Terlihat bahwa user ilkom_admin1 dapat menjalankan perintah SELECT tersebut tanpa masalah.

Pada baris ke 40 dan 44 saya menjalankan perintah GRANT untuk meneruskan hak akses SELECT kepada user ilkom_admin2. Baris 40 berjalan sukses karena user ilkom_admin1 memiliki hak akses GRANT OPTION untuk query SELECT.

Namun perintah pada baris ke 44, menghasilkan error karena user ilkom_admin1 tidak memiliki hak akses untuk perintah INSERT, sehingga tidak bisa meneruskan hak aksesnya kemapa user ilkom_admin2.

Sebagai langkah terakhir, saya akan mencoba masuk dengan user ilkom_admin2 untuk testing perintah SELECT yang didapat dari user ilkom_admin1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mysql> exit
Bye
 
D:\MySQL\bin>mysql -uilkom_admin2 -pr4hasia
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| universitas        |
+--------------------+
2 rows in set (0.00 sec)
 
mysql> USE universitas;
Database changed
 
mysql> SELECT * FROM mahasiswa_ilkom;
+-----------+-----------------+------+--------------+------+
| nim       | nama            | umur | tempat_lahir | IPK  |
+-----------+-----------------+------+--------------+------+
| 089045001 | Andi Suryo      |   23 | Jakarta      | 2.70 |
| 109245021 | Santi Syanum    |   21 | Malang       | 3.20 |
| 099145055 | Neil Situmorang |   22 | Medan        | 1.90 |
| 129245021 | Ginara Maulida  |   22 | Malang       | 3.80 |
+-----------+-----------------+------+--------------+------+
4 rows in set (0.00 sec)

Seperti yang diharapkan, user ilkom_admin2 dapat menjalankan perintah SELECT yang diberikan oleh user ilkom_admin1.


Cara Penggunaan dan Penulisan query GRANT OPTION (2)

Selain format penulisan GRANT OPTION yang diberikan pada perintah terpisah setelah membuat user dan hak aksesnya seperti contoh sebelumnya, MySQL memiliki cara kedua dengan menyatukannya penulisan GRANT OPTION dengan pemberian hak akses.

Berikut adalah format dasar penulisannya:

GRANT hak_akses ON nama_database.nama_tabel TO 'nama_user'@'lokasi_user' with GRANT OPTION;

Perhatikan bahwa penambahan kata WITH GRANT OPTION pada bagian akhir perintah.

Sebagai contoh, saya akan membuat user ekonomi_admin1 dengan hak akses ALL PRIVILEGES pada tabel mahasiswa_ekonomi dengan hak GRANT OPTION.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
D:\MySQL\bin>mysql -uroot -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
 
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> CREATE USER 'ekonomi_admin1'@'localhost' IDENTIFIED by 'r4hasia';
Query OK, 0 rows affected (0.01 sec)
 
mysql> GRANT ALL ON universitas.mahasiswa_ekonomi TO
'ekonomi_admin1'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR ekonomi_admin1@localhost \G
 
*************************** 1. row ***************************
Grants for ekonomi_admin1@localhost: GRANT USAGE ON *.*
TO 'ekonomi_admin1'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for ekonomi_admin1@localhost: GRANT ALL PRIVILEGES ON
`universitas`.`mahasiswa_ekonomi` TO 'ekonomi_admin1'@'localhost'
WITH GRANT OPTION
2 rows in set (0.00 sec)

Dari query diatas, saya menggabungkan query pemberian hak akses dengan pemberian GRANT OPTION. Sebagai latihan, anda bisa meneruskan membuat user ekonomi_admin2, dan memberikan hak akses ALL dari user ekonomi_admin1.

Hak GRANT OPTION sebaiknya diberikan dengan hati-hati. Karena sifatnya yang dapat meneruskan hak akses kepada orang lain, perintah GRANT OPTION bisa digunakan dengan cara yang diluar prediksi. User yang seharusnya tidak memiliki akses untuk tabel tertentu, bisa saja tiba-tiba menambahkan data baru pada tabel tersebut karena mendapat hak akses dari user lainnya.

Namun pada kasus-kasus tertentu, hak akses GRANT OPTION memberikan fleksibilitas yang tinggi dalam merancang database.


Selanjutnya kita akan membahas cara MySQL menyimpan password user, pada tutorial Pengertian Fungsi Hashing dan Cara MySQL Menyimpan Password.


8. Fungsi Hashing

Tutorial Belajar MySQL Part 36: Pengertian Fungsi Hashing dan Cara Kerja Password MySQL

Dalam tutorial tentang user MySQL sebelumnya, saya selalu menambahkan password dalam membuat user baru agar lebih aman, namun bagaimana sebenarnya MySQL menyimpan password tersebut? dalam tutorial kali ini saya akan membahas tentang fungsi hashing dan kaitannya dengan cara kerja sistem password MySQL dalam mengelola password user.


Mengenal Sistem Enkripsi Hashing

Dalam mengelola user, MySQL menyimpan password di dalam tabel user yang berada di dalam database mysql. Sampai pada tutorial ini, tentunya kita telah membuat beberapa user yang harusnya terdapat di dalam tabel ini, saya akan mencoba melihat password tiap-tiap user yang terdaftar dengan melihatnya dari tabel user ini.

Berikut query yang diperlukan untuk melihat password seluruh user dalam MySQL (masuklah sebagai root):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
D:\MySQL\bin>mysql -uroot -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mahasiswa          |
| mysql              |
| performance_schema |
| test               |
| universitas        |
+--------------------+
6 rows in set (0.54 sec)
 
mysql> USE mysql;
Database changed
 
mysql> SELECT user,password,host FROM user;
+------------------+-------------------------------------------+-------------+
| user             | password                                  | host        |
+------------------+-------------------------------------------+-------------+
| root             | *AA1420F182E88B9E5F874F6FBE7459291E8F4601 | localhost   |
| ilkom_admin      | *7438236BE048F242AA18D2EE074296F078CD701A | localhost   |
| mahasiswa        | *7438236BE048F242AA18D2EE074296F078CD701A | localhost   |
| ekonomi_admin    | *7438236BE048F242AA18D2EE074296F078CD701A | localhost   |
| tamu             |                                           | localhost   |
| dosen_ilkom      | *7438236BE048F242AA18D2EE074296F078CD701A | localhost   |
| sensus_mahasiswa | *7438236BE048F242AA18D2EE074296F078CD701A | 192.168.0.4 |
| admin_kampus     | *7438236BE048F242AA18D2EE074296F078CD701A | %           |
| ilkom_admin1     | *7438236BE048F242AA18D2EE074296F078CD701A | localhost   |
+------------------+-------------------------------------------+-------------+
13 rows in set (0.16 sec)

Dari query diatas, kita dapat melihat seluruh userpassword, dan lokasi dari user yang terdaftar dalam MySQL. Namun seperti yang terlihat, isian dari password disimpan dalam angka yang acak. Ini adalah hasil fungsi hashing yang digunakan MySQL untuk menangani password.


Pengertian Fungsi Hashing MySQL

Dalam ilmu komputer, fungsi hashing biasanya dipelajari bersama-sama dengan kriptografi, yaitu ilmu tentang pembuatan pesan rahasia dan cara memecahkannya.

Secara sederhana, fungsi hashing adalah sebuah fungsi yang digunakan untuk mengacak sebuah kata menjadi kata lain yang tidak bermakna dan sedapat mungkin kata hasil hashing tidak bisa ditebak dari kata apa kata tersebut berasal.

Seluruh password user yang disimpan MySQL, terlebih dahulu diproses melalui fungsi hashing ini. Tujuannya, agar user yang tidak berhak, tidak dapat melihat password user lainnya.

Sepanjang tutorial MySQL dalam duniailkom ini, saya menggunakan password qwerty untuk user root. Tetapi seperti yang terlihat dari hasil diatas, MySQL bukan menyimpan kata qwerty, tetapi menyimpannya menjadi : “AA1420F182E88B9E5F874F6FBE7459291E8F4601”. Ini adalah hasil fungsi hashing dari kata qwerty yang disimpan sebagai password MySQL.


Mengenal Fungsi PASSWORD()

Untuk mendapatkan hasil hashing untuk password MySQL, kita bisa menggunakan fungsi PASSWORD yang disediakan MySQL. Berikut contoh query untuk penggunaan fungsi PASSWORD:

1
2
3
4
5
6
7
mysql> SELECT PASSWORD('qwerty');
+-------------------------------------------+
| PASSWORD('qwerty')                        |
+-------------------------------------------+
| *AA1420F182E88B9E5F874F6FBE7459291E8F4601 |
+-------------------------------------------+
1 row in set (0.16 sec)

Seperti yang terlihat, MySQL meng-hashing kata qwerty menjadi karakter-karakter acak sepanjang 41 karakter. Hasil hashing inilah yang disimpan dalam tabel user diatas.

Lalu bagaimana cara MySQL membandingkan password saat user masuk ke sistem? MySQL cukup membandingkan isian password yang diinput penguna, memasukkannya ke dalam fungsi PASSWORD, dan membandingkan hasilnya dengan yang terdapat di tabel user. Jika hasil hashing nya bernilai sama, maka password tersebut benar dan pengguna berhak masuk ke dalam sistem.

Anda bisa mencoba kata-kata lainnya ke dalam fungsi PASSWORD ini, misalnya untuk user ilkom_admin, saya menggunakan password ‘r4hasia’.

1
2
3
4
5
6
7
mysql> SELECT PASSWORD('r4hasia');
+-------------------------------------------+
| PASSWORD('r4hasia')                       |
+-------------------------------------------+
| *7438236BE048F242AA18D2EE074296F078CD701A |
+-------------------------------------------+
1 row in set (0.00 sec)

Fungsi hashing ini dirancang untuk tidak bisa ditebak dari apa kata password ‘yang asli’ berasal. Namun bagaimana jika terdapat user yang lupa passwordnya sendiri? Caranya adalah dengan membuat password baru untuk user tersebut, atau menghapus password tersebut. Langkah-langkah untuk merubah dan menghapus password user MySQL akan kita bahas pada tutorial selanjutnya.


9. Merubah dan Menghapus Password

Tutorial Belajar MySQL Part 37: Cara Merubah dan Menghapus Password User MySQL

Seperti yang telah kita bahas pada tutorial Pengertian Fungsi Hashing dan Cara Kerja Password MySQL, MySQL menyimpan password user sebagai ‘kata’ yang terdiri dari 41 karakter acak yang berasal dari hashing fungsi PASSWORD. Dalam tutorial kali ini saya akan membahas Cara Untuk Merubah dan Menghapus Password user MySQL.


Password asli dari user MySQL tidak dapat diketahui dari tabel mysql, bahkan melalui user root sekalipun. Hal ini berguna seandainya ada pihak yang tidak berhak masuk ke dalam sistem dan melihat-lihat password user, namun juga menjadi masalah ketika ada user yang lupa dengan password yang digunakan.

Cara Merubah Password User MySQL dari User Root

Jika user yang ‘lupa’ passwordnya bukan user root, maka kita tinggal menimpa password lama dengan yang baru. Berikut adalah format dasar query yang digunakan:

SET PASSWORD FOR nama_user@'lokasi_user' = PASSWORD('password_baru');
  • nama_user adalah nama dari user yang akan diubah passwordnya.
  • lokasi_user adalah alamat IP dari user yang akan diubah passwordnya.
  • password_baru adalah password yang akan diberikan kepada nama_user.

Perhatikan bahwa kita menggunakan fungsi PASSWORD untuk membuat password baru.

Sebagai contoh, saya akan merubah password ilkom_admin menjadi ‘s3cret’. Berikut query yang digunakan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
D:\MySQL\bin>mysql -uroot -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SHOW GRANTS FOR ilkom_admin@localhost \G
 
*************************** 1. row ***************************
Grants for ilkom_admin@localhost: GRANT USAGE ON *.*
TO 'ilkom_admin'@'localhost' IDENTIFIED BY PASSWORD
'*7438236BE048F242AA18D2EE074296F078CD701A'
 
*************************** 2. row ***************************
Grants for ilkom_admin@localhost: GRANT SELECT ON
`universitas`.`mahasiswa_ilkom` TO 'ilkom_admin'@'localhost'
2 rows in set (0.07 sec)
 
mysql> SET PASSWORD FOR ilkom_admin@'localhost' = PASSWORD('s3cret');
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR ilkom_admin@localhost \G
 
*************************** 1. row ***************************
Grants for ilkom_admin@localhost: GRANT USAGE ON *.*
TO 'ilkom_admin'@'localhost' IDENTIFIED BY PASSWORD
'*B865CAE8F340F6CE1485A06F4492BB49718DF1EC'
 
*************************** 2. row ***************************
Grants for ilkom_admin@localhost: GRANT SELECT ON
`universitas`.`mahasiswa_ilkom` TO 'ilkom_admin'@'localhost'
2 rows in set (0.00 sec)

Setelah masuk sebagai root (baris…), saya memeriksa terlebih dahulu user ilkom_admin dengan query SHOW GRANTS FOR (baris …). Pada baris…, terdapat hasil hashing dari password ‘r4hasia’ yang saya gunakan sebagai password pada waktu membuat user ilkom_admin. Hasil hashing inilah yang disimpan MySQL di dalam databasenya.

Pada baris ke… saya merubah password ilkom_admin menjadi ‘s3cret’. Lalu pada baris.. saya kembali memeriksa hasil hashing password dengan SHOW GRANTS FOR . Dan seperti yang terlihat, hasil hashing juga telah berubah yang menandakan pergantian password berhasil.


Cara Merubah Password User MySQL dari User itu Sendiri

Untuk merubah password dari user yang kita login saat ini, bisa menggunakan perintah yang lebih sederhana:

1
SET PASSWORD=PASSWORD('the_password')

Berikut adalah contoh query dimana saya login sebagai ilkom_admin dengan password ‘s3cret’ dan mengubahnya menjadi ‘4dmin’:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D:\MySQL\bin>mysql -uilkom_admin -ps3cret
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SET PASSWORD = PASSWORD('4dmin');
Query OK, 0 rows affected (0.00 sec)

Password baru tersebut akan aktif setelah user keluar dari sesi MySQL saat ini.


Cara Menghapus Password User MySQL

Jika yang anda inginkan adalah menghapus password dari seorang user secara keseluruhan, maka cukup memberikan string kosong sebagai isian password.

SET PASSWORD FOR 'nama_user'@'lokasi_user' = ''

Berikut saya contohkan ketika menghapus password untuk user ekonomi_admin melalui user root:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
D:\MySQL\bin>mysql -uroot -pqwerty
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> SET PASSWORD FOR ekonomi_admin@'localhost' = '';
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW GRANTS FOR ekonomi_admin@localhost \G
 
*************************** 1. row ***************************
Grants for ekonomi_admin@localhost: GRANT USAGE ON *.*
TO 'ekonomi_admin'@'localhost'
 
*************************** 2. row ***************************
Grants for ekonomi_admin@localhost: GRANT ALL PRIVILEGES ON
`universitas`.`mahasiswa_ekonomi` TO 'ekonomi_admin'@'localhost'
2 rows in set (0.00 sec)

Terlihat dari hasil SHOW GRANTS FOR, user ekonomi_admin tidak memiliki password, dan user tersebut dapat masuk kedalam MySQL tanpa password sama sekali.


Cara Membuat Password User MySQL, Sama Dengan User Lain

Walaupun anda tidak tahu password asli yang digunakan oleh user lain, namun jika yang diinginkan adalah membuat password yang sama dengan user lain, kita dapat menggunakan hasil hashing dari password user tersebut.

Berikut adalah format dasarnya:

SET PASSWORD FOR 'nama_user'@'lokasi_user' ='*nilai hashing';
  • nama_user adalah nama dari user yang akan diubah passwordnya.
  • lokasi_user adalah alamat IP dari user yang akan diubah passwordnya.
  • nilai_hashing adalah nilai dari fungsi hashing password user yang akan disamakan passwordnya.

Dari hasil SHOW GRANTS FOR untuk user ilkom_admin, saya mendapati hasil hashingnya adalah ‘*F366568C1E05004FD78F38B712C83917196C95D8’, dan nilai inilah yang akan saya pakai untuk password user ekonomi_admin. Berikut query yang digunakan (dari user root):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SET PASSWORD FOR ekonomi_admin@'localhost'
'*F366568C1E05004FD78F38B712C83917196C95D8';
Query OK, 0 rows affected (0.00 sec)
 
mysql> exit
Bye
 
D:\MySQL\bin>mysql -uekonomi_admin -p4dmin
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.27 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Karena user ilkom_admin baru saya ganti passwordnya menjadi 4dmin, maka dengan men-copy hasil hashing user ilkom_admin ke user ekonomi_admin, keduanya memiliki password yang sama, yaitu s3cret.


Pada tutorial kali ini kita telah membahas cara merubah dan menghapus user MySQL dari user root. Hal ini berguna jika ada user yang lupa password atau ingin merubah password.

Namun bagaimana jika user root lah yang lupa passwordnya? Kita akan membahasnya pada tutorial berikutnya: Lupa password root MySQL.


10. Mereset Password root

Tutorial Belajar MySQL Part 38: Cara Mereset Password root (Lupa Password root MySQL)

Lupa password root MySQL? Pada tutorial MySQL ini kita akan membahas tentang cara mereset password user root, ketika administrator MySQL Lupa password root tersebut.


User root merupakan superuser yang memiliki hak akses paling tinggi dalam sistem manajemen user MySQL. Jika user ‘biasa’ mengalami masalah, user root dapat mereset kembali password user tersebut dari sistemnya. Namun jika yang lupa password adalah user root itu sendiri, user lain tidak dapat meresetnya.

Terdapat beberapa cara untuk mengembalikan password user root. Pada tutorial MySQL kali ini saya akan menjelaskan 2 cara diantaranya. Cara pertama yaitu dengan menjalankan MySQL dengan opsi skip-grant-tables dan cara kedua, menjalankan MySQL dengan opsi init-file. Kedua opsi ini mengharuskan user dapat mengakses folder sistem tempat file MySQL berada.

Dalam tutorial ini saya akan mencoba mereset password user root MySQL dengan menggunakan sistem Operasi Windows 7. Untuk sistem operasi windows lainnya, cara yang dibutuhkan kurang lebih akan mirip.

Dalam menjalankan langkah-langkah yang diperlukan untuk mereset user root ini, kita akan sering mengakses MySQL Server, terutama menghentikan dan menjalankan kembali MySQL Server, anda bisa mempelajari cara menjalankan dan menghentikan MySQL Server pada tutorial Menjalankan MySQL Server.


Reset Password root MySQL dengan Opsi skip-grant-tables

Cara pertama yang akan saya gunakan untuk mereset user root MySQL adalah dengan menjalankan MySQL Server tanpa sistem manajemen user sama sekali. Dengan cara ini, user root dapat masuk tanpa password.

MySQL menyimpan hak akses dan password user di dalam database mysql. Database ini menyimpan data-data tentang setingan MySQL, termasuk data tentang userpassword dan hak aksesnya di dalam tabel mysql. Karena tabel mysql ini menyimpan tentang user dan hak aksesnya, maka disebut juga dengan Grant Tabel.

Cara yang akan kita lakukan adalah menjalankan MySQL Server tanpa menggunakan database mysql ini. Yang berarti MySQL Server tidak dapat memeriksa setiap user, dan setiap user yang log in akan memiliki akses root!.

Langkah pertama untuk mereset password user root adalah menghentikan MySQL Server apabila masih berjalan. Seperti yang kita pelajari pada Menjalankan MySQL Server, terdapat beberapa cara untuk menghentikan MySQL Server.

Cara paling cepat mematikan MySQL Server adalah dari menu task manager, pilih tab Procesess, cari mysqld.exe, klik kanan dan pilih menu end process.

Cara Menghentikan MySQL Server dari Task Manager

Selanjutnya kita akan menjalankan kembali MySQL Server (menggunakan mysqld), namun dengan perintah tambahan skip-grant-tables. Buka lokasi file mysqld melalui cmd, lalu jalankan perintah :

mysqld --skip-grant-tables

Berikut adalah tampilan cmd windows:

Menjalankan MySQL Server dengan opsi skip-grant-tables

Untuk memeriksa apakah MySQL Server telah berjalan, dapat dilihat dari task manager, pilih tab Procesess, dan jika ada mysqld.exe, berarti MySQL Server telah berjalan.

Saat ini MySQL Server telah berjalan dengan opsi skip-grant-tables, sehingga kita dapat masuk sebagai root tanpa password:

Masuk sebagai root dengan opsi skip-grant-tables

Segera setelah masuk sebagi root, langsung jalankan perintah untuk membuat password untuk user root. Karena kita masuk dengan opsi skip-grant-tables, maka kita tidak bisa menjalankan cara membuat password seperti tutorial Cara Merubah dan Menghapus Password User MySQL, namun harus secara manual mengupdate tabel user pada database mysql.

Berikut query yang digunakan untuk update password root:

UPDATE mysql.user SET Password = PASSWORD('password_baru') WHERE User = 'root';

Perintah tersebut adalah query UPDATE yang biasa kita gunakan untuk mengupdate sebuah record atau baris, namun yang diupdate kali ini adalah tabel user pada database mysql.

Setelah perintah tersebut dijalankan, untuk merefresh tabel user, jalankan query:

FLUSH PRIVILEGES;

Perintah FLUSH PRIVILEGES digunakan untuk membuat MySQL Server mengupdate hak akses di tabel user. Lalu keluarlah dari MySQL.

Berikut query yang saya gunakan untuk mereset password root menjadi ‘123456’:

1
2
3
4
5
6
7
8
9
mysql> UPDATE mysql.user SET Password = PASSWORD('123456') WHERE User = 'root';
Query OK, 1 row affected (0.20 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.42 sec)
 
mysql> exit;
Bye

Setelah keluar dari MySQL Client, hentikan MySQL Server dari task manager dan jalankan MySQL Server seperti biasa.

Karena opsi ini mengizinkan user root masuk tanpa password, sebaiknya anda memutuskan jaringan server terlebih dahulu agar tidak ada user lain yang masuk selama kita mereset password root. Bahkan selama opsi skip-grant-option, setiap user yang masuk akan memiliki hak akses sebagai root, walaupun user tersebut tidak terdaftar sebelumnya.

Reset Password root MySQL dengan Opsi init-file

Cara kedua untuk mereset password user root MySQL adalah dengan menggunakan opsi init-file.

Opsi init-file digunakan untuk memerintahkan MySQL Server menjalankan sebuah file pada saat Server pertama kali dijalankan. Dan kita akan memanfaatkan fitur ini untuk mereset password root MySQL

Sebagai langkah pertama, kita akan membuat sebuah file text yang berisi perintah query MySQL untuk mereset password. Isi dari file text tersebut adalah:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('password_baru');

Perintah ini sama dengan query untuk mereset password user pada tutorial Cara Merubah dan Menghapus Password User MySQL, namun kali ini user yang direset adalah root, dan ‘password_baru’ adalah password root yang diinginkan.

Sebagai contoh, saya akan mereset password root menjadi ‘123456’, sehingga perintahnya adalah:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

Savelah file ini sebagai ‘reset_password.sql’. Anda bisa menggunakan program notepad bawaan windows untuk menulisnya, namun pastikan akhiran dari file adalah ‘.sql’. Savelah file ini di lokasi yang bisa diakses MySQL, untuk contoh kali ini saya akan meletakkannya di dalam folder bin MySQL.

File reset_password di folder bin MySQL

Selanjutnya, hentikan MySQL Server jika masih berjalan. Lalu jalankan kembali MySQL Server, namun kali ini dengan opsi init-file=’lokasi_file_reset_password.sql’.

Karena saya menyimpan file reset_password di drive D:\MySQL\bin, maka lokasi_file_reset_password.sql adalah di “D:\MySQL\bin\reset_password.sql”. Berikut perintah untuk menjalankan MySQL Server dengan opsi init-file:

mysqld --init-file=D:\MySQL\bin\reset_password.sql

Menjalankan MySQL Server dengan opsi init-file

MySQL Server akan menjalankan file ‘reset_password.sql’ tersebut dan mereset password user root menjadi ‘123456’.

Untuk mencoba password root yang baru saja di reset, masuklah sebagai user root dengan password ‘123456’.

Jika anda berhasil masuk sebagai root, berarti reset password berhasil dijalankan.

Masuk sebagai root dengan opsi init-file

Sebagai langkah terakhir, hentikan MySQL Server dan hapus file reset_password.sql.


Pada tutorial MySQL kali ini kita telah membahas cara mereset dan mengembalikan password MySQL jika ternyata user root lupa password untuk login. Tutorial ini juga sebagai sesi terakhir dalam pembahasan user dan hak askes MySQL, untuk tutorial MySQL selanjutnya saya akan membahas query-query lanjutan untuk keperluan-keperluan khusus dalam MySQL.