Mengelola database secara manual menggunakan command line interface tentunya tidaklah mudah dan rawan kesalahan.

Untuk itu hadirlah phpMyadmin, sebuah perangkat lunak opensource yang berguna sebagai tools administrasi bagi database MySQL dan MariaDB. Sesuai dengan namanya, phpMyadmin ditulis dengan bahasa php, dan tentunya bersifat web-based application.

Pada tulisan kali ini akan membahas bagaimana menginstall phpMyadmin pada Ubuntu 20.04.

Beberapa prasyarat untuk menginstall phpmyadmin :

  1. Webserver (pada artikel ini akan menggunakan NGINX)
  2. PHP 7.1.3 atau yang terbaru
  3. Relational Database seperti MySQL dan MariaDB

Penulis asumsikan pembaca sudah memenuhi prasyarat tersebut, namun jika belum silahkan ikuti tutorialnya dengan klik pada masing-masing prasyarat di atas.

Langkah 1 : Menginstall phpmyadmin

Silahkan jalankan perintah berikut untuk menginstall package phpMyadmin.

~$ sudo apt install phpmyadmin -y

Saat proses instalasi berjalan, akan muncul prompt seperti ini. Pada bagian konfigurasi webserver, pilihan NGINX tidak tersedia,  oleh karena itu silahkan pilih Ok untuk melanjutkan.

Image Description

Selanjutnya pada bagian konfigurasi dbconfig-common silahkan pilih yes untuk menyimpan konfigurasi aplikasi phpMyAdmin.

Image Description

Pada bagian konfigurasi password silahkan kosongkan saja dan pilih Ok. Password ini adalah password yang akan digunakan sebagai credential phpmyadmin. Penulis tidak akan menggunakan credential tersebut.

Image Description

Tunggu proses instalasinya hingga selesai.

Langkah 2 : Konfigurasi NGINX

Agar bisa mengakses aplikasi phpmyadmin dari web browser, kita akan membutuhkan sedikit konfigurasi pada virtual host nginx dan root direktori web server. Jalankan perintah berikut ini untuk membuat symbolic link ke root direktori web server.

~$ sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin

Selanjutnya adalah mengkonfigurasi location blok untuk url aplikasi phpmyadmin yang mau diakses. Silahkan edit file konfigurasi virtual host nginx.

~$ sudo vim /etc/nginx/sites-available/default

Di dalam server block tambahkan baris konfigurasi seperti di bawah ini.

        location /phpmyadmin {
                alias /var/www/phpmyadmin;
                #handle .php
                location ~ \.php$ {
                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                        include fastcgi_params;
                        fastcgi_param SCRIPT_FILENAME $request_filename;
                }
        }

Dan jangan lupa untuk menambahkan index.php pada directive index nginxnya. Setelah semua konfigurasi sudah dilakukan, silahkan restart service nginx. Kemudian akses aplikasi phpmyadmin dengan format ip_public/phpmyadmin. Kemudian akan muncul tampilan login phpmyadmin.  Login phpMyAdmin menggunakan credintial yang sama dengan MySQL, sehingga kita bisa login menggunakan user dan password yang digunakan untuk login ke MySQL.

Image Description

Langkah 3 : Mengamankan Akses phpMyAdmin

Karena aplikasi phpMyAdmin adalah tools adminstrasi database yang sudah pasti berinteraksi langsung dengan database, maka akan sangat rentan bila aksesnya sangat terbuka di internet. Oleh karena itu kita akan memerlukan sistem keamanan untuk melindungi akses langsung ke database.

Cara yang cukup ampuh adalah dengan membuat url/path-nya sulit ditemukan. Keyword seperti /phpmyadmin, /pma, /admin, /mysql atau semacamnya sangat familiar untuk disusupi. Kita bisa menggunakan nama yang unik agar bot atau attacker sulit untuk menjangkau aplikasi phpMyAdmin.

Caranya cukup mudah, dengan mengganti location_match pada blok location nginx yang sudah dikonfigurasi sebelumnya. Misalnya location /phpmyadmin kita ganti menjadi location /gudangdata. Sehingga konfigurasinya akan menjadi seperti ini.

location /gudangdata {
        alias /var/www/phpmyadmin;
        #handle .php
        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
        }
}

Kemudian coba buka kembali aplikasi phpMyAdmin, dan tes akses dengan menggunakan url/path yang baru.

Image Description

Setelah membuatnya sulit ditemukan, kita akan menghapus akses root terhadap login phpMyAdmin. Ini untuk mencegah privileged tidak terbatas yang dimiliki oleh root. Untuk melakukannya kita akan menambah satu file konfigurasi yang ada di /etc/phpmyadmin

~$ sudo vim /etc/phpmyadmin/conf.d/pma_secure.php

Silahkan copy script berikut dan pastekan di dalam file konfigurasi.

<?php


$cfg['blowfish_secret'] = '[STRING]';

$i=0;
$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;

?>

Pada bagian [STRING] silahkan ganti dengan 32 karakter random. Simpan konfigurasi filenya, dan akses kembali aplikasi phpMyAdmin dengan login root. Ketika mengakses dengan root akan muncul error Access denied!.

Image Description

Selanjutnya kita bisa menambahkan layer autentikasi tambahan. Jadi ketika attacker akan mencapai halaman login phpMyAdmin akan terlebih dahulu diminta melakukan autentikasi HTTP dengan memasukkan nama pengguna dan kata sandi yang valid. Langkah awal yang dilakukan adalah generate hash password. Masukkan perintah berikut dan isi password pada prompt yang muncul.

openssl passwd

Output yang menghasilkan password yang terenkripsi berupa karakter acak.

Image Description

Kemudian buat sebuah file konfigurasi untuk menyimpan user dan password login.

~$ sudo vim /etc/nginx/pma_pass

Masukkan user dan dan password yang sudah terenkripsi dengan format seperti di bawah ini.

user:encrypted_pass

Selanjutnya tambahkan 2 baris berikut di dalam location block /gudangdata :

auth_basic "Admin Login";
auth_basic_user_file /etc/nginx/pma_pass;

Sehingga konfigurasinya akan seperti berikut ini.

location /gudangdata {
        alias /var/www/phpmyadmin;
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
        #handle .php
        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
        }
}

Simpan konfigurasinya kemudian restart service nginx. Setelah itu akses kembali aplikasi phpMyAdmin. Akan muncul pop-up login.

Image Description

Silahkan login menggunakan user yang sudah tersimpan di dalam konfigurasi file, untuk passwordnya masukkan dengan password yang diinput ketika menjalankan perintah openssl passwd (bukan hasil generate).

Metode berikutnya yang bisa digunakan adalah membatasi akses dengan hanya mengizinkan host/IP yang terautorisasi. Buka kembali konfigurasi virtual host dan kemudian tambah directive berikut di dalam location block, kemudian simpan konfigurasinya dan restart service nginx.

deny all;

Coba akses kembali phpMyAdmin, maka akan muncul error 403 Forbidden.

Image Description

Error ini menunjukkan bahwa resource yang dituju oleh sebuah host/IP tidak mendapatkan permission karena host/IP-nya tidak terautorisasi. Untuk menambahkan autorisasinya kita akan menggunakan directive allow pada konfigruasi virtual host nginx dengan format seperti berikut.

allow [IP_Adrress/Host];

Berikut contoh lengkap konfigurasi location block di virtual host setelah menambahkan IP/host yang terautorisasi.

location /gudangdata{
        alias /var/www/phpmyadmin;
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
        allow [IP_Adrress/Host];
        deny all;
        #handle .php
        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
        }
}

Ganti [IP_Address/Host] dengan IP yang ingin diizinkan.

Setelah semuanya selesai silahkan simpan konfigurasinya dan restart service nginx dan coba akses kembali phpMyAdmin-nya. Dengan demikian kita bisa membatasi akses publik ke dalam phpMyAdmin dan tentunya bisa mencegah serangan ke dalam database.

Demikian untuk cara install phpMyAdmin dan juga cara mengamankannya dari akses publik.