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, danmemungkinkan pengguna untuk mengeksekusi perintah SQL statement ke database.Ditambah lagi aplikasi phpMyAdmin ini banyak digunakan (populer). Hal iniberarti aplikasi ini sering menjadi sasaran serangan hacker. Jika kita tidakmenginstal dan mengkonfigurasi phpMyAdmin tanpa menerapkan langkah pengamanandari 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.
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.
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 🐳
0 Comments