Isolasi Domain pada Shared Hosting untuk Mencegah Akses Lintas Situs



---


Materi: Isolasi Domain pada Shared Hosting untuk Mencegah Cross-Site File Access


Latar Belakang  

Dalam lingkungan shared hosting, beberapa domain atau subdomain sering kali dihosting dalam satu server fisik atau satu akun sistem. Jika tidak dikonfigurasi dengan benar, kompromi pada satu domain (misalnya melalui upload file berbahaya) dapat memberikan akses ke seluruh direktori server — termasuk file milik domain lain.


Kasus nyata:  

Penyerang mengunggah web shell di domain-a.com, lalu berhasil menjelajahi dan mengakses file konfigurasi domain-b.net yang berada di server yang sama — padahal tidak ada hubungan antar keduanya.




Akar Masalah  

- Semua domain berjalan di bawah user sistem yang sama (misal: www-data, apache, atau nobody).  

- Tidak ada batasan terhadap akses file oleh skrip (misal: PHP tanpa open_basedir).  

- Struktur direktori tidak terisolasi — semua domain berada di bawah satu path seperti /var/www/html/.  


Akibatnya: tidak ada boundary keamanan antar domain.


Solusi: Prinsip Isolasi Multi-Tenant


1. User dan Home Directory Terpisah  

Setiap domain harus memiliki:  

- User sistem khusus  

- Direktori root sendiri (misal: /home/domain-a/public_html)  


Contoh perintah:  

adduser --disabled-password --gecos "" domain_a  

mkdir -p /home/domain_a/public_html  

chown -R domain_a:domain_a /home/domain_a/public_html  

chmod 750 /home/domain_a/public_html  


2. PHP Terisolasi dengan PHP-FPM Pool  

Gunakan PHP-FPM dengan konfigurasi pool per domain.  


File: /etc/php/8.2/fpm/pool.d/domain-a.conf  

[domain-a]  

user = domain_a  

group = domain_a  

listen = /run/php/domain-a.sock  

listen.owner = domain_a  

listen.group = domain_a  

php_admin_value[open_basedir] = /home/domain_a/public_html:/tmp  

php_admin_flag[allow_url_fopen] = off  


Restart PHP-FPM setelah perubahan:  

systemctl reload php8.2-fpm  


3. Batas Akses File dengan open_basedir  

Pastikan PHP hanya bisa mengakses direktori yang diperlukan:  

open_basedir = "/home/domain_a/public_html:/tmp"  


Jika skrip mencoba membaca /etc/passwd atau /home/domain_b/, PHP akan menolak dengan error.


4. Konfigurasi Web Server (Nginx/Apache)  


Nginx:  

server {  

    listen 80;  

    server_name domain-a.com;  

    root /home/domain_a/public_html;  

    

    location ~ \.php$ {  

        fastcgi_pass unix:/run/php/domain-a.sock;  

        include fastcgi_params;  

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  

    }  

}  


Apache (dengan mod_itk):  

<VirtualHost *:80>  

    ServerName domain-a.com  

    DocumentRoot /home/domain_a/public_html  

    <IfModule mpm_itk_module>  

        AssignUserId domain_a domain_a  

    </IfModule>  

</VirtualHost>  


Tanpa mod_itk atau suPHP, Apache akan tetap menjalankan semua virtual host sebagai user yang sama.


Best Practice Tambahan  

- Nonaktifkan fungsi eksekusi sistem di PHP:  

  disable_functions = exec,passthru,shell_exec,system,proc_open,popen  

- Gunakan permission direktori: 750 untuk folder, 640 untuk file.  

- Jangan gunakan chmod 777 — ini membuka celah akses universal.  

- Lakukan audit berkala terhadap file yang tidak dikenal di direktori web.


Verifikasi Isolasi  

1. Buat file test.php di domain-a:  

<?php  

echo file_get_contents('/home/domain_b/public_html/config.php');  

?>  


2. Jika konfigurasi benar, permintaan akan gagal dengan pesan:  

Warning: file_get_contents(): open_basedir restriction in effect...


Kesimpulan  

Keamanan shared hosting bukan hanya soal firewall atau SSL. Isolasi proses, user, dan direktori adalah kunci utama. Tanpa itu, satu celah keamanan cukup untuk membahayakan seluruh tenant di server yang sama.


Aturan emas:  

Jika dua domain bisa saling baca file satu sama lain, maka server tersebut belum aman.


Referensi  

- PHP Manual: open_basedir  

- Nginx + PHP-FPM Security Guide  

- Apache MPM-ITK Documentation  

- OWASP: Local File Inclusion (LFI)


---



Komentar

Postingan Populer