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
Posting Komentar