Instalasi dan Hardening phpMyAdmin

Ketika mendevelop website atau aplikasi, banyak pengguna membutuhkan sistem basis data seperti MySQL. Namun, jika berinteraksi langsung melalui MySQL command-line (CLI) kamu harus sudah familiar dengan Structured-Query-Languange yaitu bahasa khusus untuk mengelola data didalam database. Selengkapnya mengenai SQL bisa klik disini. phpMyAdmin dibuat untuk memudahkan pengguna berinteraksi dengan MySQL melalui antar muka (interface) web berbasis grafis / GUI.

Perlu diperhatikan !
phpMyAdmin menjalankan database server, menyimpan kredensial database, dan
memungkinkan pengguna untuk mengeksekusi perintah SQL statement ke database.
Ditambah lagi aplikasi phpMyAdmin ini banyak digunakan (populer). Hal ini
berarti aplikasi ini sering menjadi sasaran serangan hacker. Jika kita tidak
menginstal dan mengkonfigurasi phpMyAdmin tanpa menerapkan langkah pengamanan
dari penyerang, data yang disimpan pada database akan hilang atau dicuri.
Oleh karena itu, pada tutorial ini saya menyertakan langkah-langkah untuk me-
lakukan hardening keamanan phpMyAdmin.

Sebelum melakukan instalasi phpMyAdmin pastikan kamu sudah membuat LEMP Stack dan sangat-sangat di rekomendasikan juga untuk menginstall sertifikat SSL/TLS (HTTPS) guna mengenkripsi data yang di transfer client ke server maupun sebaliknya. 


Langkah 1 – Install phpMyAdmin

Kamu bisa menginstall phpMyAdmin dengan mendownloadnya langsung dari repository menggunakan perintah APT.

sudo apt update
sudo apt install phpmyadmin

Saat proses instalasi, akan muncul prompt untuk memilih konfigurasi web server (antara Apache atau Lighttpd).phpMyAdmin akan secara otomatis menambahkan beberapa baris konfigurasi untuk menyesuaikan dengan web server yang kita pilih diawal. Namun, karena kita menggunakan Nginx sebagai web server, Jangan memilih apapun pada bagian ini, langsung saja tekan TAB & klik OK

Selanjutnya, akan muncul prompt untuk menggunakan dbconfig-common. Pilih <Yes>, phpMyAdmin akan membuat konfigurasi internal database dan administratif user untuk phpmyadmin. Akan muncul lagi prompt untuk menset password user MySQL, namun biarkan saja kosong nantinya phpmyadmin akan membuat password secara random.

Lanjutkan prosesnya hingga phpmyadmin berhasil terinstal. Namun sampai sini web phpmyadmin masih belum bisa diakses dikarenakan lokasi file phpmyadmin-nya belum disesuaikan. Untuk itu kita perlu membuat symbolic link (symlink) dari lokasi file phpmyadmin ke direktori document root. Jika kamu belum melakukan perubahan document root default, maka lokasinya ada disini : /var/www/html

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

Setelah itu kita lanjut untuk melakukan ujicoba akses phpmyadmin di browser client menggunakan

https://NamaDomain_atau_IP/phpmyadmin

Kredensial authentikasi phpmyadmin, menggunakan kredensial yang sama dengan MySQL. Ini artinya untuk login kedalam phpmyadmin kita bisa menggunakan username dan password yang sama untuk masuk kedalam database mysql.

Instalasi phpmyadmin sudah selesai dan berhasil sampai tahap ini. Namun, aplikasi ini adalah web interface, kamu melakukan ekspos database MySQL ke dunia luar. Karena aplikasi ini populer, dan mampu memberikan akses ke banyak data-data sensitif, instalasi phpmyadmin seperti ini sering menjadi target serangan hacker. Untuk itu pada langkah selanjutnya kita akan berfokus kepada beberapa metode untuk mengamankan / memperkuat (hardening) instalasi phpmyadmin.


Langkah 2 – Metode 1 : Mengubah lokasi default phpMyAdmin

Metode hardening pertama yang bisa dikakukan untuk mengamankan instalasi phpmyadmin adalah membuatnya susah untuk ditemukan wkwkwk :V. penggunaan /phpmyadmin, /php, /admin, /mysql, dan nama lain yang serupa akan sangat mudah di tebak. Mengubah URL dari /phpmyadmin menjadi nama lain yang tidak standar akan membuatnya lebih sulit ditebak dan ditemukan oleh skrip otomatis maupun oleh serangan brute-force.

Pada langkah sebelumnya, kita sudah membuat symbolic link di document root web default Nginx yang mengarah ke /usr/share/phpmyadmin, dimana itu adalah lokasi file aplikasi phpmyadmin disimpan. Kamu bisa mengubah nama symbolic link ini untuk mengganti interface URL phpmyadmin.

Contohnya disini saya akan mengubah url akses phpmyadmin yang semulanya adalah, https://domain/phpmyadmin menjadi sesuatu yang sulit ditebak misalnya lubda007 (nama abdul dibalik kemudian diberikan angka 007).

Pindah kedalam direktori document root web nginx (disini saya masih menggunakan lokasi default).

cd /var/www/html

Cek terlebih dahulu symbolic link yang sudah kita buat pada langkah ke satu menggunakan perintah berikut.

ls -l

Selanjutnya kita ganti nama symlink yang sudah dibuat dengan nama lain yang lebih susah untuk ditebak.

sudo mv phpmyadmin lubda007

Akses url phpmyadmin sudah berubah,  sekarang coba akses menggunakan url sebelumnya, kamu akan mendapatkan pesan error 404 Not Found.


Untuk mengakses phpmyadmin-nya bisa menggunakan URL lain yang baru saja kita konfigurasikan.

Dengan mengaburkan lokasi sebenarnya phpMyAdmin di server, kamu mengamankan antarmukanya dari pemindaian otomatis dan upaya brute-force manual.

Langkah 3 – Metode 2 : Menon-aktifkan login Root

Sebelum melanjutkan ke metode 2 silahkan ujicoba akses login phpMyAdmin menggunakan user root.

Secara default login sebagai user root masih di izinkan

Di MySQL, sama seperti sistem Linux reguler, akun root adalah akun administartif spesial yang memiliki akses tidak terbatas ke sistem.Selain sebagai akun yang istimewa, akun ini juga memiliki nama login yang sudah dikenali, sehingga mudah menjadikannya target serangan brute-force.Untuk meminimalkan resiko ini, pada langkah ke-3 ini kita akan melakukan konfigurasi phpmyadmin agar menolak segala upaya akses login menggunakan user root, dan akan menampilkan pesan error Access denied! jika percobaan login root dilakukan.

Karena kita memilih dbconfig-common untuk konfigurasi dan pengaturan phpMyAdmin saat proses instalasi, maka konfigurasi default aplikasi saat ini disimpan dalam database MySQL. Kamu harus membuat file config.inc.php baru di direktori konfigurasi phpmyadmin untuk menentukan pengaturan khusus. File konfigurasi phpmyadmin terletak di /etc/phpmyadmin

Buat file pengaturan baru didalam direktori /etc/phpmyadmin/conf.d dengan nama pma_secure.php

sudo nano /etc/phpmyadmin/conf.d/pma_secure.php

Kemudian tambahkan skrip konfigurasi sebagai berikut kedalam file

    Keterangan :

  • Dengan menambahkan AllowNoPassword dan AllowRoot yang keduanya diset false, konfigrasi ini akan mendisable akses login tanpa memasukan passowrd dan login menggunakan user root.
  • Setting auth_type menggunakan metode cookie. phpMyAdmin menggunakan cookie authentikasi method secara default, ini juga memungkinkan kita untuk login menggunakan user MySQL, user MySQL yang login kedalam phpmyadmin akan dienkripsi menggunakan Advanced Encription Standard (AES) didalam cookie sementara.
  • phpMyAdmin menggunakan algoritma Blowfish untuk tujuan ini. Kita membutuhkan setidaknya 32 karakter random yang harus di isi pada baris blowfis_secret, nantinya digunkan sebagai frasa-sandi secara internal oleh algoritma AES. Tenang saja frasa sandi ini tidak harus di ingat.

Untuk membuat karakter random blowfish_secret kita bisa menggunakan aplikasi pwgen, instal menggunakan perintah berikut :

sudo apt install pwgen

Gunakan perintah berikut untuk membuat password random baru.

pwgen -s 32 1

    Keterangan : 

  • Secara default pwgen akan membuat password yang mudah diucapkan dan dihapal.
  • Gunakan flag -s untuk membuat password benar-benar random.
  • Flag 32 menandakan berapa banyak huruf yang akan dibuat dalam password (panjang password).
  • Flag 1 menandakan berapa banyak yang password yang harus dibuat (jumlah password).

Selanjutnya tambahkan output perintah diatas kedalam file pma_secure.php

Untuk melihat perubahannya, silahkan kembali lagi kedalam form login phpmyadmin dan lakukan akses login menggunakan user root.'


Login dengan user root MySQL sekarang sudah dilarang pada aplikasi phpMyAdmin kita. Tindakan keamanan ini akan memblokir skrip brute force yang mencoba menebak kata sandi pengguna basis data root di server Kita. Selain itu, ini akan menerapkan penggunaan akun MySQL yang kurang memiliki hak istimewa untuk mengakses antarmuka web phpMyAdmin, yang dengan sendirinya merupakan praktik keamanan yang penting.


Langkah 4 – Metode 3 : Membuat Authentication Gateway

Menyembunyikan lokasi instalasi phpmyadmin kita dengan menggunakan lokasi yang tidak biasa, mungkin bisa menghindari beberapa bot otomatis yang memindai jaringan. Namun hal ini tidak ada gunanya melawan serangan yang ditargetkan. Untuk lebih melindungi aplikasi web kita bisa melakukan pembatasan akses (restricted access), metode ini efektif menghentikan penyerang bahkan sebelum mereka dapat menjangkau aplikasi tersebut. Dengan cara ini, penyerang tidak akan dapat menggunakan eksploitasi umum dan serangan brute-force untuk menebak kredensial akses.

Pada metode ke-3 ini kita akan mengamankan interface login phpmyadmin dengan menambahkan authentikasi extra untuk meningkatkan keamanan database MySQL. Sebagian besar web server, termasuk NGINX menyediakan kemampuan ini secara bawaan. Dengan menambahkan langkah ini, setiap orang yang ingin mengakses halaman login, harus terlebih dahulu memasukan password melalui prompt authentikasi HTTP dengan username dan password yang valid. Oke mari kita lanjut ke langkah-langkahnya.

Step pertama, kita membuat terlebih dahulu file password untuk menyimpan kredensial authentikasi.

 Buat password menggunakan openssl, saat mengeksekusi perintah dibawah akan muncul prompt untuk memasukan password, silahkan masukan password yang kamu inginkan. Setelah itu akan muncul versi password yang sudah terenkripsi.

openssl passwd

Password yang kamu masukan pada langkah diatas akan digunakan untuk authentikasi login ke website.

Sekarang, buat file untuk authentikasi dengan nama pma_pw di direktori konfigurasi nginx (/etc/nginx), kemudian tentukan username spesifik yang akan digunakan, diikuti oleh tanda titik dua (:) untuk menentukan password yang dipakai dan didapatkan dari langkah sebelumnya.

sudo nano /etc/nginx/pma_pw

Save dan exit.

Pada contoh diatas saya menggunakan username abdul007 dan passwordnya yang di input dilangkah sebelumnya, untuk username sendiri itu tidak harus sama dengan username yang sudah ada di system linux ataupun MySQL.

Step kedua, kita akan melakukan modifikasi pada file serverblok atau virtualhost Nginx. Lagi-lagi untuk ditahap ini saya sudah melakukan konfigurasi sesuai tutorial LAMP Stack *ini harus ada link ke tutor lamp stack*, jadi file konfigurasinya sudah berubah menjadi /etc/nginx/sites-available/default.blocks dari yang awalnya default saja. Pastikan kamu mengakses file konfigrasi diatas sesuai dengan lokasi terkini di host.

sudo nano /etc/nginx/sites-available/default.blocks

Dibawah baris konfigurasi location / kamu bisa menambahkan lokasi baru dengan menambahkan block yang cocok dengan path phpmyadmin di server. Ingat kembali pada metode ke-1 / langkah kedua, kita sudah melakukan rename symbolic link dari /phpmyadmin ke /lubda007 dalam contoh tutorial ini. Setelah itu, didalam blok yang sudah kita buat tambahkan beberapa konfigurasi sebagai berikut.

    Keterangan :

  • Tanda ^~ didalam block merupakan selector sebelum mendefinisikan lokasi baru, tanda ini membuat akses web server Nginx tidak bisa di bypass dengan mencocokan nama file php.
  • Pada baris auth_basic dan auth_basic_user_file, silahkan tentukan nama pop-up login yang akan muncul dan lokasi tempat menyimpan file kredensial authentication.
  • Didalam block lokasi /lubda007/ tambahkan sub-blok untuk menentukan lokasi file php-fpm yang akan memproses semua file php didalam document root phpmyadmin. Pada server debian11 ini, saya menggunakan php versi 7.4.

Jika sudah selesai selanjutnya cek apakah terdapat kesalahan penulisan syntax nginx menggunakan perintah berikut.

sudo nginx -t

Jika sudah ok dan succesfull, reload service nginx untuk menerapkan perubahan konfigurasi.

sudo systemctl reload nginx

Sekarang coba lakukan ujicoba akses phpmyadmin di web browser, kamu akan mendapatkan prompt untuk memasukan username dan passowrd, silahkan isi dengan username dan password yang sudah diset pada step pertama.

https://domain_atau_ip/lubda007

Setelah berhasil memasukan kredensial yang benar, kamu akan diarahkan ke halaman login phpMyAdmin. Metode 3 ini memberikan lapisan keamanan ekstra yang dapat menjaga logs MySQL bersih dari spam percobaan login.

Catatan !
Prompt authentikasi mungkin tidak akan muncul kembali jika baru-baru ini kamu
melakukan login. Untuk memunculkan prompt login, kamu bisa melakukan refresh
halaman, membersihkan cache, atau membuka sesi baru di browser lain.


Langkah 5 – Metode 4 : Setting akses phpMyAdmin lewat Encrypted Tunnels

Untuk lebih meningkatkan keamanan, kita bisa melakukan lockdown akses phpMyAdmin hanya untuk user-user yang berwenang saja. Kita bisa melakukan limit akses phpMyAdmin dengan menambahkan spesifik host authorized di file konfigurasi Nginx. Dengan cara ini, request yang datang dari IP address yang tidak ada didalam list akan dibatalkan (dilarang).

Meskipun ini dirasa sebagai solusi yang sangat aman, ini bukanlah solusi yang baik dalam jangka panjang,  terlebih sebagian besar orang mendapatkan alamat ip public yang dinamis, alih-alih selalu menggunakan ip statis tertentu. Suatu saat kita mendapatkan ip address yang baru dari ISP, maka kita harus melakukan pendaftaran ulang ip tersebut didalam file konfigurasi Nginx.

Oleh karena itu mengkombinasikan metode IP-based access control dengan SSH tunneling merupakan cara yang lebih baik dalam meningkatkan keamanan, user yang memiliki Authorized ip address dapat mengakses langsung phpmyadmin, sedangkan jika tidak sedang mendapatkan/menggunakan authorized ip, kamu bisa melakukan mengaksesnya menggunakan localhost lewat SSH tunneling.

Setting Akses Kontrol berbasis IP di NGINX

Kontrol akses berbasis IP dapat ditentukan di blok lokasi yang sesuai dengan situs tertentu, menggunakan keterangan allow dan deny. Misalnya kamu ingin mengizinkan request yang datang dari satu host dan tidak mengizinkan akses dari host lainnya, maka skrip yang harus ditambahkan setidaknya ada 2 baris sebagai berikut.

allow hostname_or_ipaddress;
deny all;

Sebelum masuk ketahap konfigurasi, kamu harus mengetahui ip address yang di dapatkan oleh client yang akan mengakses phpmyadmin, jika server kamu disimpan di hosting public maka kamu bisa cek ip public client ke halaman berikut : https://whatismyipaddress.com/. Namun jika kamu hanya menjalankan server di lingkungan virtual, pengecekan ip client bisa diakses pada pengaturan network adapter dnegan menjalankan shortcut Windows + R lalu search ncpa.cpl kemudian cek interface yang terhubung ke server virtual.

Contoh :IP Address client yang didapatkan dari DHCP Server Debian 11

Oke mari kita lanjutkan ke tahap konfigurasi IP-Based akses.

 Edit file konfigurasi serverblock web utama menggunakan perintah berikut.

sudo nano /etc/nginx/sites-available/default.blocks

Kemudian tambahkan script konfigurasi berikut pada baris lokasi blok konfigurasi phpMyAdmin.

Save dan tutup filenya jika sudah selesai mengedit, setelah itu cek apakah konfigurasi nginx valid.

Kemudian reload service nginx

Lakukan ujicoba akses phpmyadmin menggunakan web browser, sampai sejauh ini akses masih aman-aman saja karena ip yang client dapatkan sesuai dengan daftar ip yang diizinkan (10.0.0.4).

Untuk ujicoba kedua, coba lakukan pengubahan ip address client dengan menkonfigurasikan secara statis maupun mengedit di file host-fantasia DHCP Server.

Tampilan IP client setelah di ubah

IP address client sudah berubah, kemudain coba lakukan akses kembali web phpmyadmin di browser.

Maka akan muncul pesan error 403 Forbidden access seperti gambar diatas. Sampai sini konfigurasi akses kontrol berbasis IP Address berhasil. Bagaimana kalau saya tidak mau error seperti ini ka ? ya kamu harus mendaftarkan ip address baru ini di konfigurasi Nginx. Kebayang kan gimana ribetnya kalau setiap mau akses harus edit dulu. Nah pada langkah selanjutnya kita bakal praktikan solusi untuk masalah ini.


Akses phpMyAdmin melalui SSH Tunnel Ter-Enkripsi

SSH tunneling (tunnel = terowongan) bekerja dengan meneruskan lalulintas jaringan melalui channel yang terenkripsi. Dengan menjalankan perintah ssh yang serupa dengan yang biasa kita masukan untuk melakukan remote server, kamu dapat membuat “Tunnel” atau teorwongan aman antara mesin lokal dengan server yang dituju. Setelah membuat terowongan, semua lalu lintas yang masuk pada port lokal tertentu dapat dialihkan melalui secured tunneling menggunakan remote server sebagai proxy sebelum menjangkau internet. Hal ini mirip dengan apa yang terjadi ketika anda menggunakan Virtual Private Server (VPN), namun SSH tunneling ini memerlukan lebih sedikit konfigurasi.

Kamu dapat menggunakan terowongan SSH untuk mem-proxy permintaan Anda ke server web jarak jauh yang menjalankan phpMyAdmin. Dengan membuat terowongan antara mesin lokal Anda dan server tempat phpMyAdmin diinstal, kamu dapat mengarahkan permintaan lokal ke server web jarak jauh. Lebih penting lagi, lalu lintas akan dienkripsi dan permintaan akan sampai ke Nginx seolah-olah berasal dari localhost. Dengan cara ini, tidak peduli dari alamat IP mana Anda terhubung, Anda akan dapat mengakses antarmuka phpMyAdmin dengan aman.

Di client / mesin lokal, jalankan perintah berikut di CMD atau terminal ketika kamu ingin mengakses phpMyAdmin.

ssh username@server_domain_atau_ip -L 8000:127.0.0.1:80 -L 8443:127.0.0.1:443 -N

Setelah itu akan muncul prompt isian password, kemudian enter. Jika tidak ada keterangan error berarti akses SSH Tunneling berhasil.

    Keterangan : 

  • Username = adalah user yang terdapat didalam server Debian, untuk keperluan remote ssh.
  • server_domain_atau_IP =  alamat host SSH server yang menjalankan phpMyAdmin.
  • -L 8000:127.0.0.1:80 = redirect trafik HTTP ke port 8000
  • -L 8443:127.0.0.1:443 = redirect trafik HTTPS ke port 8443
  • -N = Mencegah eksekusi perintah jarak jauh

Perintah diatas akan tetap berjalan sampai kamu menekan CTRL+C untuk mengakhiri koneksi SSH dan menghentikan packet redirection. Jika kamu ingin menjalankannya di latar belakang (background mode) bisa menambahkan opsi -f

Sekarang coba menuju browser dan akses phpMyAdmin menggunakan alamat URL berikut.

https://localhost:8443/lubda007

Akses phpMyAdmin menggunakan SSH Tunneling berhasil 😎

Penutup

Dengan mengikuti tutorial ini, kamu sudah berhasil melakukan instalasi phpMyAdmin diatas web server Nginx. Kamu juga belajar berbagai metode advance untuk mengamankan / hardening instalasi phpMyAdmin, seperti menonaktifkan root login, membuat lapisan extra untuk authentikasi, dan membuat SSH tunneling untuk akses ke phpMyAdmin hanya melalui request local saja.

Setelah menyelesaikan handout ini, kamu bisa melakukan administrasi database MySQL seperti membuat skema database, mengeksekusi queries, membuat data sets, ataupun strukutur data dari web interface yang aman. 

Terima kasih 🙏

Sumber : DigitalOcean 🐳

Post a Comment

0 Comments