Mengijinkan akses hanya dari IP terdaftar di negara tertentu untuk direktori terproteksi password pada Apache HTTP Server


Ada kalanya, kita ingin agar direktori atau lokasi tertentu pada web server hanya dapat diakses dari IP terdaftar di negara tertentu. Dan, ketika kondisi ini terpenuhi, kita berikan proteksi tambahan pada direktori tersebut dengan password.

Sebagai contoh, ketika user mengunjungi /data dari web browser, kita hanya ijinkan dari IP yang terdaftar di country code ID dan isi direktori hanya dapat ditampilkan apabila user telah memasukkan kombinasi username dan password yang tepat.

Tutorial ini mengasumsikan sistem operasi yang digunakan adalah Alma Linux 8 dan web server yang digunakan adalah Apache HTTP Server, dimana semua yang dibutuhkan tersedia sebagai package yang siap diinstalasi.

Catatan:


A. Instalasi Apache HTTP Server

Berikanlah perintah berikut untuk melakukan instalasi web server, kemudian memastikan web server tersebut dijalankan:

sudo dnf install httpd
sudo systemctl enable httpd
sudo systemctl restart httpd

Apabila diperlukan, cobalah untuk mengunjungi IP komputer tersebut dengan web browser (secara default, sebuah halaman welcome akan ditampilkan).


B. Siapkan direktori yang ingin diproteksi

Kita akan membuat direktori data di /var/www/html/ dengan perintah berikut:

cd /var/www/html/
sudo mkdir data

Dengan browser sebelumnya, tambahkanlah /data pada URL yang dikunjungi. Secara default, isi direktori akan ditampilkan.


C. Ijinkan hanya dari IP terdaftar di negara tertentu

Untuk kebutuhan ini, kita perlu menginstalasi package mod_maxminddb (dari EPEL) beserta package tambahan.

sudo dnf install mod_maxminddb geolite2-country geolite2-city

Perhatikanlah bahwa konfigurasi /etc/httpd/conf.d/maxminddb.conf telah dibuat. Sesuaikanlah menjadi isi berikut:

<IfModule mod_maxminddb.c>
    MaxMindDBEnable On
    MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBFile CITY_DB    /usr/share/GeoIP/GeoLite2-City.mmdb
</IfModule>

Perhatikanlah juga bahwa modul httpd terkait telah di-load, sebagaimana isi file /etc/httpd/conf.modules.d/10-maxminddb.conf

LoadModule maxminddb_module modules/mod_maxminddb.so

Misal kita hanya mengijinkan akses dari country code ID untuk /data, buatlah file /etc/httpd/conf.d/data.conf (misal sudo vim /etc/httpd/conf.d/data.conf) dengan isi berikut.

<Location /data>
    MaxMindDBEnable On
    MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
    SetEnvIf MM_COUNTRY_CODE ^(ID) AllowCountry
    Require env AllowCountry
</Location>

Kemudian, restartlah httpd dengan:

sudo systemctl restart httpd

Apabila IP yang digunakan sesuai country code, maka /data tetap dapat diakses. Cobalah mengubah ID menjadi country code lain (dan restart httpd), dan dengan koneksi internet yang sama, kunjungilah /data. Error 403 Forbidden akan tampil. Kembalikanlah ke konfigurasi semula dan restartlah kembali httpd untuk melanjutkan pembahasan kita.


D. Kombinasikan dengan proteksi password

Mari kita buat file /etc/httpd/.passwd dan tambahkan user dengan nama admin. Apabila file/user telah ada, sesuaikanlah opsi menjalankan htpasswd.

sudo htpasswd -c /etc/httpd/.passwd admin

Sesuaikanlah /etc/httpd/conf.d/data.conf menjadi isi berikut. Pastikanlah baris Require env AllowCountry sebelumnya telah dihapus. Perhatikanlah juga bahwa kita mengunakan RequireAll untuk kondisi yang diinginkan.

<Location /data>
    MaxMindDBEnable On
    MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
    SetEnvIf MM_COUNTRY_CODE ^(ID) AllowCountry

    AuthType Basic
    AuthName "Data"
    AuthUserFile /etc/httpd/.passwd

    <RequireAll>
        Require env AllowCountry
        Require valid-user
    </RequireAll>
</Location>
Restartlah httpd. Apabila tidak berhasil authentikasi, error 401 Unauthorized akan ditampilkan.


Terima kasih telah membaca :)