10 min read

Cara Menginstal dan Mengamankan phpMyAdmin dengan Nginx di server Ubuntu 18.04

Iman Sugirman

Penjelasan

Sementara banyak pengguna memerlukan fungsionalitas sistem basis data seperti MySQL, berinteraksi dengan sistem semata-mata dari klien baris perintah MySQL memerlukan keakraban dengan bahasa SQL, sehingga mungkin bukan antarmuka yang disukai untuk beberapa.

phpMyAdmin dibuat agar pengguna dapat berinteraksi dengan MySQL melalui antarmuka web yang intuitif, berjalan berdampingan dengan lingkungan pengembangan PHP. Dalam panduan ini, kita akan membahas cara menginstal phpMyAdmin di atas server Nginx, dan cara mengkonfigurasi server untuk meningkatkan keamanan.

Prasyarat

Sebelum Anda mulai dengan panduan ini, Anda harus menyediakan yang berikut ini untuk Anda:

  • Server Ubuntu 18.04 yang menjalankan tumpukan LEMP (Linux, Nginx, MySQL dan PHP) diamankan dengan ufw, seperti dijelaskan dalam panduan pengaturan server awal untuk Ubuntu 18.04. Jika Anda belum mengatur server Anda, Anda dapat mengikuti panduan untuk menginstal tumpukan LEMP di Ubuntu 18.04.
  • Akses ke server ini sebagai pengguna non-root dengan hak sudo.

Karena phpMyAdmin menangani otentikasi menggunakan kredensial MySQL, sangat disarankan untuk menginstal sertifikat SSL / TLS untuk memungkinkan lalu lintas terenkripsi antara server dan klien. Jika Anda tidak memiliki domain yang ada yang dikonfigurasi dengan sertifikat yang valid, Anda dapat mengikuti panduan ini untuk mengamankan Nginx dengan Let's Encrypt di Ubuntu 18.04.

Setelah Anda memenuhi prasyarat ini, Anda dapat melanjutkan dengan panduan ini.

Menginstal phpMyAdmin

Hal pertama yang perlu kita lakukan adalah menginstal phpMyAdmin di server LEMP. Kita akan menggunakan repositori default Ubuntu untuk mencapai tujuan ini.

Mari kita mulai dengan memperbarui indeks paket server dengan:

sudo apt update

Sekarang Anda dapat menginstal phpMyAdmin dengan:

sudo apt install phpmyadmin

Selama proses instalasi, Anda akan diminta untuk memilih server web (baik Apache atau Lighthttp) untuk dikonfigurasi. Karena kami menggunakan Nginx sebagai server web, kami tidak boleh membuat pilihan di sini. Tekan tab lalu OK untuk melanjutkan ke langkah berikutnya.

Selanjutnya, Anda akan diminta apakah akan menggunakan dbconfig-common untuk mengonfigurasi basis data aplikasi. Pilih Yes. Ini akan mengatur basis data internal dan pengguna administratif untuk phpMyAdmin. Anda akan diminta untuk menentukan kata sandi baru untuk pengguna MySQL phpmyadmin. Anda juga dapat membiarkannya kosong dan membiarkan phpMyAdmin membuat kata sandi secara acak.

Instalasi sekarang akan selesai. Agar server web Nginx menemukan dan menayangkan file phpMyAdmin dengan benar, kita perlu membuat tautan simbolis dari file instalasi ke direktori root dokumen Nginx:

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

Instalasi phpMyAdmin Anda sekarang operasional. Untuk mengakses antarmuka, buka nama domain server Anda atau alamat IP publik diikuti oleh /phpmyadmin di browser web Anda:

https://server_domain_or_IP/phpmyadmin

Image

Seperti disebutkan sebelumnya, phpMyAdmin menangani otentikasi menggunakan kredensial MySQL, yang berarti Anda harus menggunakan nama pengguna dan kata sandi yang sama yang biasanya Anda gunakan untuk terhubung ke database melalui konsol atau melalui API. Jika Anda perlu bantuan membuat pengguna MySQL, lihat panduan ini tentang Cara Mengelola Basis Data SQL.

Instalasi phpMyAdmin Anda harus sepenuhnya berfungsi pada saat ini. Namun, dengan menginstal antarmuka web, kami telah mengekspos server database MySQL kami ke dunia luar. Karena popularitas phpMyAdmin, dan sejumlah besar data dapat menyediakan akses ke, instalasi seperti ini adalah target umum untuk serangan. Pada bagian berikut dari panduan ini, kita akan melihat beberapa cara berbeda di mana kita dapat membuat instalasi phpMyAdmin kita lebih aman.

Mengubah Lokasi Default phpMyAdmin

Salah satu cara paling mendasar untuk melindungi instalasi phpMyAdmin Anda adalah dengan membuatnya lebih sulit ditemukan. Bot akan memindai jalur umum, seperti phpmyadmin, pma, admin, mysql dan semacamnya. Mengubah URL antarmuka dari /phpmyadmin menjadi sesuatu yang tidak standar akan mempersulit skrip otomatis untuk menemukan instalasi phpMyAdmin Anda dan mencoba serangan brute-force.

Dengan instalasi phpMyAdmin kami, kami telah membuat tautan simbolis yang menunjuk ke /usr/share/phpmyadmin, tempat file aplikasi aktual berada. Untuk mengubah URL antarmuka phpMyAdmin, kami akan mengganti nama tautan simbolis ini.

Pertama, mari kita menavigasi ke direktori root dokumen Nginx dan daftar file yang dikandungnya untuk mendapatkan pemahaman yang lebih baik tentang perubahan yang akan kita buat:

cd /var/www/html/
ls -l

Anda akan menerima output berikut:

Output
total 8
-rw-r--r-- 1 root root 612 Apr  8 13:30 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr  8 15:36 phpmyadmin -> /usr/share/phpmyadmin

Output menunjukkan bahwa kita memiliki tautan simbolik yang disebut phpmyadmin dalam direktori ini. Kami dapat mengubah nama tautan ini menjadi apa pun yang kami inginkan. Ini pada gilirannya akan mengubah URL akses phpMyAdmin, yang dapat membantu mengaburkan titik akhir dari bot yang dikodekan untuk mencari nama titik akhir yang umum.

Pilih nama yang mengaburkan tujuan titik akhir. Dalam panduan ini, kami akan memberi nama titik akhir kami /nothingtosee, tetapi Anda harus memilih nama alternatif. Untuk mencapai ini, kami akan mengganti nama tautannya:

sudo mv phpmyadmin nothingtosee
ls-l

Setelah menjalankan perintah di atas, Anda akan menerima output ini:

Output
total 8
-rw-r--r-- 1 root root 612 Apr  8 13:30 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr  8 15:36 nothingtosee -> /usr/share/phpmyadmin

Sekarang, jika Anda membuka URL lama, Anda akan mendapatkan kesalahan 404:

https://server_domain_or_IP/phpmyadmin

Error

Antarmuka phpMyAdmin Anda sekarang akan tersedia di URL baru yang baru saja kami konfigurasikan:

https://server_domain_or_IP/nothingtosee

Error

Dengan mengaburkan lokasi asli phpMyAdmin di server, Anda mengamankan antarmuka terhadap pemindaian otomatis dan upaya brute-force manual.

Menonaktifkan Login Root

Pada MySQL dan juga dalam sistem Linux biasa, akun root adalah akun administratif khusus dengan akses tidak terbatas ke sistem. Selain sebagai akun istimewa, ini adalah nama login yang dikenal, yang menjadikannya target yang jelas untuk serangan brute-force. Untuk meminimalkan risiko, kami akan mengonfigurasi phpMyAdmin untuk menolak upaya login apa pun yang berasal dari root pengguna. Dengan cara ini, bahkan jika Anda memberikan kredensial yang valid untuk root pengguna, Anda masih akan mendapatkan kesalahan "akses ditolak" dan tidak akan diizinkan masuk.

Karena kami memilih untuk menggunakan dbconfig-common untuk mengkonfigurasi dan menyimpan pengaturan phpMyAdmin, konfigurasi default saat ini disimpan dalam database. Kami perlu membuat file config.inc.php baru untuk menetapkan pengaturan khusus kami.

Meskipun file PHP untuk phpMyAdmin terletak di dalam /usr/share/phpmyadmin, aplikasi ini menggunakan file konfigurasi yang terletak di /etc/phpmyadmin. Kami akan membuat file pengaturan khusus baru di dalam /etc/phpmyadmin/conf.d, dan beri nama pma_secure.php:

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

File konfigurasi berikut berisi pengaturan yang diperlukan untuk menonaktifkan login tanpa kata sandi (AllowNoPassword disetel ke false) dan login root (AllowRoot disetel ke false):

<?php

# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = '3!#32@3sa(+=_4?),5XP_:U%%8\34sdfSdg43yH#{o';

$i=0;
$i++;

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

?>

Simpan file ketika Anda selesai mengedit dengan menekan CTRL + X lalu y untuk mengonfirmasi perubahan dan ENTER. Perubahan akan berlaku secara otomatis. Jika Anda memuat ulang halaman login sekarang dan mencoba masuk sebagai root, Anda akan mendapatkan kesalahan Akses Ditolak:

Php My Admin Error

Login root sekarang dilarang di instalasi phpMyAdmin Anda. Tindakan keamanan ini akan memblokir skrip kasar untuk mencoba menebak kata sandi basis data root di server Anda. Selain itu, ini akan menegakkan penggunaan akun MySQL yang kurang istimewa untuk mengakses antarmuka web phpMyAdmin, yang dengan sendirinya merupakan praktik keamanan yang penting.

Membuat Otentikasi Gateway

Menyembunyikan instalasi phpMyAdmin Anda di lokasi yang tidak biasa mungkin menghindari beberapa bot otomatis yang memindai jaringan, tetapi tidak berguna terhadap serangan yang ditargetkan. Untuk lebih melindungi aplikasi web dengan akses terbatas, umumnya lebih efektif untuk menghentikan penyerang sebelum mereka bahkan dapat mencapai aplikasi. Dengan cara ini, mereka tidak akan dapat menggunakan eksploitasi generik dan serangan brute-force untuk menebak kredensial akses.

Dalam kasus khusus phpMyAdmin, bahkan lebih penting untuk menjaga antarmuka login tetap terkunci. Dengan menjaganya tetap terbuka bagi dunia, Anda menawarkan platform brute-force bagi penyerang untuk menebak kredensial basis data Anda.

Menambahkan lapisan otentikasi tambahan ke instalasi phpMyAdmin Anda memungkinkan Anda meningkatkan keamanan. Pengguna akan diminta untuk melewati prompt otentikasi HTTP sebelum melihat layar login phpMyAdmin. Sebagian besar server web, termasuk Nginx, menyediakan kemampuan ini secara asli.

Untuk mengatur ini, pertama-tama kita perlu membuat file kata sandi untuk menyimpan kredensial otentikasi. Nginx mengharuskan kata sandi dienkripsi menggunakan fungsi crypt (). Suite OpenSSL, yang seharusnya sudah diinstal pada server Anda, termasuk fungsi ini.

Untuk membuat kata sandi terenkripsi, ketik:

openssl passwd

Anda akan diminta memasukkan dan mengonfirmasi kata sandi yang ingin Anda gunakan. Utilitas kemudian akan menampilkan versi terenkripsi dari kata sandi yang akan terlihat seperti ini:

# Output
O5az.RSPzd.HE

Salin nilai ini, karena Anda harus menempelkannya ke file otentikasi yang akan kami buat.

Sekarang, buat file otentikasi. Kami akan memanggil file ini pma_pass dan menempatkannya di direktori konfigurasi Nginx:

sudo nano /etc/nginx/pma_pass

Dalam file ini, Anda akan menentukan nama pengguna yang ingin Anda gunakan, diikuti oleh titik dua (:), diikuti oleh versi terenkripsi dari kata sandi yang Anda terima dari utilitas openssl passwd.

Kami akan memberi nama asep pengguna kami, tetapi Anda harus memilih nama pengguna yang berbeda. File akan terlihat seperti ini:

asep:O5az.RSPzd.HE

Simpan dan tutup file setelah selesai.

Sekarang kita siap untuk memodifikasi file konfigurasi Nginx. Untuk panduan ini, kami akan menggunakan file konfigurasi yang terletak di /etc/nginx/sites-available/example.com. Anda harus menggunakan file konfigurasi Nginx yang relevan untuk lokasi web tempat phpMyAdmin saat ini dihosting. Buka file ini di editor teks Anda untuk memulai:

sudo nano /etc/nginx/sites-available/example.com

Temukan blok server, dan location / bagian di dalamnya. Kita perlu membuat bagian location baru di dalam blok ini untuk mencocokkan jalur phpMyAdmin saat ini di server. Dalam panduan ini, lokasi phpMyAdmin relatif terhadap root web adalah /nothingtosee:

server {
    . . .

        location / {
                try_files $uri $uri/ =404;
        }

        location /nothingtosee {
                # Settings for phpMyAdmin will go here
        }

    . . .
}

Dalam blok ini, kita perlu menyiapkan dua arahan yang berbeda: auth_basic, yang mendefinisikan pesan yang akan ditampilkan pada prompt otentikasi, dan auth_basic_user_file, menunjuk ke file yang baru saja kita buat. Ini adalah bagaimana file konfigurasi Anda akan terlihat ketika Anda selesai:

server {
    . . .

        location /nothingtosee {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }


    . . .
}

Simpan dan tutup file setelah selesai. Untuk memeriksa apakah file konfigurasi tersebut valid, Anda dapat menjalankan:

sudo nginx -t

Output berikut diharapkan:

# Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Untuk mengaktifkan gerbang otentikasi baru, Anda harus memuat ulang server web:

sudo systemctl reload nginx

Sekarang, jika Anda mengunjungi URL phpMyAdmin di browser web Anda, Anda akan diminta memasukkan nama pengguna dan kata sandi yang Anda tambahkan ke file pma_pass:

https://server_domain_or_IP/nothingtosee

Autentikasi PHPMyadmin

Setelah Anda memasukkan kredensial Anda, Anda akan dibawa ke halaman login standar phpMyAdmin.

Mengatur Akses melalui Terenkripsi (Opsional)

Untuk meningkatkan keamanan, dimungkinkan untuk mengunci instalasi phpMyAdmin Anda hanya untuk host yang diotorisasi. Anda dapat memasukkan daftar putih host resmi di file konfigurasi Nginx Anda, sehingga permintaan apa pun yang berasal dari alamat IP yang tidak ada dalam daftar akan ditolak.

Meskipun fitur ini saja sudah cukup dalam beberapa kasus penggunaan, itu tidak selalu merupakan solusi jangka panjang terbaik, terutama karena kenyataan bahwa kebanyakan orang tidak mengakses Internet dari alamat IP statis. Segera setelah Anda mendapatkan alamat IP baru dari penyedia Internet Anda, Anda tidak akan bisa sampai ke antarmuka phpMyAdmin sampai Anda memperbarui file konfigurasi Nginx dengan alamat IP baru Anda.

Untuk solusi jangka panjang yang lebih kuat, Anda dapat menggunakan kontrol akses berbasis IP untuk membuat pengaturan di mana pengguna hanya akan memiliki akses ke antarmuka phpMyAdmin Anda jika mereka mengakses dari alamat IP resmi atau localhost melalui tunneling SSH. Kami akan melihat cara mengatur ini di bagian di bawah.

Menggabungkan kontrol akses berbasis IP dengan tunneling SSH sangat meningkatkan keamanan karena sepenuhnya memblokir akses yang datang dari internet publik (kecuali untuk IP resmi), selain menyediakan saluran aman antara pengguna dan server melalui penggunaan terowongan terenkripsi.

Menyiapkan Kontrol Akses Berbasis IP di Nginx

Pada Nginx, kontrol akses berbasis IP dapat didefinisikan dalam blok lokasi yang sesuai dari situs tertentu, dengan menggunakan arahan allow dan deny. Misalnya, jika kami hanya ingin membolehkan permintaan yang datang dari host tertentu, kami harus memasukkan dua baris berikut, dalam urutan ini, di dalam blok lokasi yang relevan untuk situs yang ingin kami lindungi: