Panduan Hardening Keamanan PHP 8.5 di AlmaLinux 9 untuk Server Production

Panduan Hardening Keamanan PHP 8.5 di AlmaLinux 9 untuk Server Production

Pengantar

PHP merupakan bahasa pemrograman server-side yang banyak digunakan untuk membangun website, sistem informasi, aplikasi bisnis, dan layanan berbasis API. Meskipun PHP terus mendapatkan pembaruan keamanan, konfigurasi default belum tentu sesuai dengan kebutuhan server production.

Hardening PHP adalah proses memperkuat keamanan konfigurasi PHP dengan membatasi fitur yang tidak diperlukan, mengurangi risiko kebocoran informasi, mengendalikan akses filesystem, serta mengamankan proses eksekusi aplikasi.

Pada tutorial ini, kita akan membahas langkah-langkah hardening PHP 8.5 di AlmaLinux 9 menggunakan PHP-FPM, mulai dari konfigurasi php.ini, pembatasan fungsi berisiko, keamanan session, isolasi PHP-FPM pool, hingga optimasi keamanan OPcache.

Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

1. Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

1. Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

1. Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

1. Persiapan dan Pemeriksaan Lingkungan Server

Lingkungan yang digunakan dalam tutorial ini:

  • Sistem operasi: AlmaLinux 9
  • PHP: 8.5.x
  • Repository: Remi RPM Repository
  • PHP handler: PHP-FPM
  • Web server: Apache atau Nginx
  • Akses server: root atau user dengan hak sudo

Sebelum melakukan hardening, periksa versi PHP yang terpasang:

php -v

Periksa lokasi konfigurasi PHP:

php --ini

Pada instalasi PHP standar melalui repository Remi di AlmaLinux 9, file konfigurasi umumnya berada di:

/etc/php.ini
/etc/php.d/
/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

Lokasi sebenarnya dapat berbeda jika menggunakan instalasi PHP paralel dari Remi.

Backup Konfigurasi PHP

Sebelum mengubah konfigurasi, buat backup terlebih dahulu:

cp -a /etc/php.ini /etc/php.ini.backup
cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

Backup diperlukan agar konfigurasi dapat dikembalikan apabila terjadi masalah kompatibilitas aplikasi setelah proses hardening.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

2. Menonaktifkan expose_php

Directive expose_php menentukan apakah PHP menampilkan informasi keberadaannya melalui HTTP response header.

Jika diaktifkan, server dapat mengirimkan header seperti:

X-Powered-By: PHP/8.5.12

Informasi tersebut dapat membantu pihak lain mengidentifikasi teknologi dan versi PHP yang digunakan oleh server.

Untuk menonaktifkannya, edit file konfigurasi PHP:

nano /etc/php.ini

Ubah konfigurasi menjadi:

expose_php = Off

Dengan konfigurasi tersebut, PHP tidak lagi menambahkan header X-Powered-By secara otomatis.

Catatan: Pengaturan ini hanya mengurangi informasi yang ditampilkan server. Keamanan utama tetap bergantung pada pembaruan PHP, konfigurasi web server, dan keamanan aplikasi.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

3. Membatasi Fungsi PHP Menggunakan disable_functions

PHP menyediakan sejumlah fungsi yang memungkinkan aplikasi menjalankan perintah sistem operasi. Fungsi tersebut memiliki kegunaan yang sah, tetapi dapat memperbesar dampak eksploitasi apabila aplikasi memiliki kerentanan command injection.

Beberapa fungsi yang perlu dievaluasi antara lain:

  • exec() - Menjalankan perintah sistem.
  • system() - Menjalankan perintah dan menampilkan output.
  • shell_exec() - Menjalankan perintah melalui shell.
  • passthru() - Menjalankan program eksternal dan meneruskan output.
  • popen() - Membuka proses melalui pipe.
  • proc_open() - Menjalankan proses dengan kontrol input dan output.

Untuk aplikasi yang tidak membutuhkan eksekusi perintah sistem operasi, fungsi-fungsi tersebut dapat dibatasi.

Contoh konfigurasi pada php.ini:

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

Namun, konfigurasi ini tidak boleh diterapkan tanpa mempertimbangkan kebutuhan aplikasi.

Beberapa aplikasi menggunakan fungsi tersebut untuk menjalankan backup, memproses video dengan FFmpeg, menghasilkan dokumen, atau menjalankan proses eksternal.

Pembatasan Fungsi pada PHP-FPM Pool

Untuk server dengan beberapa website, pembatasan sebaiknya diterapkan berdasarkan kebutuhan masing-masing aplikasi.

Contoh konfigurasi PHP-FPM:

php_admin_value[disable_functions] = exec,system,shell_exec,passthru,popen,proc_open

Konfigurasi tersebut sebaiknya diterapkan hanya setelah melakukan pengujian kompatibilitas.

Catatan keamanan: disable_functions bukan mekanisme sandbox yang lengkap. Pembatasan permission Linux, isolasi proses, dan validasi input tetap diperlukan.

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

4. Membatasi Akses File Menggunakan open_basedir

Secara default, aplikasi PHP dapat mengakses file yang diizinkan oleh permission sistem operasi.

Directive open_basedir dapat digunakan untuk membatasi direktori yang dapat diakses melalui operasi filesystem PHP.

Contoh struktur website:

/var/www/website/
├── public/
├── app/
├── storage/
└── vendor/

Untuk membatasi akses PHP pada direktori website dan direktori sementara:

open_basedir = /var/www/website:/tmp

Konfigurasi tersebut membatasi operasi file PHP pada jalur yang diizinkan, dengan tetap tunduk pada permission sistem operasi.

Konfigurasi open_basedir pada PHP-FPM

Untuk PHP-FPM, pengaturan dapat diterapkan melalui konfigurasi pool:

php_admin_value[open_basedir] = /var/www/website:/tmp

Direktori yang diperlukan aplikasi, seperti direktori session, cache, upload, atau library, harus diperhitungkan.

Perhatian: open_basedir bukan mekanisme isolasi filesystem pada tingkat kernel dan dapat menimbulkan overhead pada operasi file tertentu.

Untuk lingkungan multi-website, penggunaan user Linux terpisah dan permission filesystem yang benar merupakan pendekatan yang lebih kuat.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

5. Mengatur allow_url_fopen

Directive allow_url_fopen mengizinkan fungsi filesystem PHP tertentu untuk membuka sumber daya melalui URL.

Contohnya:

<?php
$content = file_get_contents(
    'https://example.com/data.json'
);
?>

Jika aplikasi tidak memerlukan akses URL melalui fungsi filesystem PHP, fitur ini dapat dinonaktifkan:

allow_url_fopen = Off

Namun, jika aplikasi membutuhkan fitur tersebut, konfigurasi berikut tetap dapat digunakan:

allow_url_fopen = On

Mengaktifkan allow_url_fopen tidak otomatis membuat aplikasi rentan. Risiko utamanya muncul apabila aplikasi menerima URL dari input pengguna tanpa validasi yang benar.

Validasi URL, pembatasan akses jaringan, dan perlindungan terhadap Server-Side Request Forgery (SSRF) tetap diperlukan.

Menonaktifkan allow_url_fopen tidak memblokir seluruh koneksi HTTP keluar dari PHP, termasuk koneksi yang menggunakan ekstensi cURL.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

6. Mengamankan display_errors dan log_errors

Pada server development, pesan error sering ditampilkan langsung agar developer lebih mudah melakukan debugging.

Namun, pada server production, pesan error dapat membocorkan informasi sensitif seperti:

  • Struktur direktori aplikasi.
  • Lokasi file konfigurasi.
  • Nama class dan function.
  • Query database.
  • Detail internal aplikasi.

Untuk mengurangi risiko kebocoran informasi, gunakan konfigurasi:

display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL

display_errors = Off

Mencegah pesan error PHP ditampilkan langsung kepada pengunjung.

display_startup_errors = Off

Mencegah diagnostic startup ditampilkan melalui output aplikasi.

log_errors = On

Mengaktifkan pencatatan error untuk kebutuhan monitoring dan troubleshooting.

error_reporting = E_ALL

Memungkinkan seluruh kategori error yang didukung PHP dilaporkan ke mekanisme logging.

Untuk PHP-FPM, pengaturan administratif dapat diterapkan melalui konfigurasi pool:

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

Pastikan file log memiliki permission yang sesuai dan tidak berada di direktori yang dapat diakses melalui web.

Menonaktifkan tampilan error tidak memperbaiki kerentanan aplikasi. Error tetap harus dianalisis dan diperbaiki.

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

7. Hardening Keamanan PHP Session

Session digunakan untuk mempertahankan status pengguna, seperti login dan autentikasi.

Konfigurasi session yang tidak tepat dapat meningkatkan risiko session fixation, pencurian cookie, dan penyalahgunaan session.

Untuk aplikasi production berbasis HTTPS, konfigurasi yang direkomendasikan adalah:

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Lax
session.upload_progress.enabled = Off

session.use_strict_mode = 1

Membantu mencegah session fixation dengan menolak session ID yang belum diinisialisasi, selama session handler mendukung validasi ID.

session.use_only_cookies = 1

Menggunakan cookie sebagai mekanisme pengiriman session ID.

session.cookie_httponly = 1

Mencegah JavaScript mengakses cookie session secara langsung.

session.cookie_secure = 1

Memastikan cookie session hanya dikirim melalui koneksi HTTPS.

Pengaturan ini sebaiknya diterapkan ketika seluruh halaman yang membutuhkan session telah menggunakan HTTPS.

session.cookie_samesite = Lax

Membantu membatasi pengiriman cookie pada beberapa jenis request lintas situs.

Pengaturan SameSite bukan pengganti CSRF token dan perlu diuji pada aplikasi yang menggunakan autentikasi lintas situs.

Mitigasi Kerentanan Session Upload Progress

Pada 21 Oktober 2026, PHP Security Team menerbitkan advisory terkait dua kerentanan Remote Code Execution (RCE):

  • CVE-2026-109618: RCE melalui kerusakan state ketika terjadi kegagalan alokasi memori atau kondisi out-of-memory.
  • CVE-2026-109619: RCE melalui penggunaan kembali state global yang sudah tidak valid.

PHP 8.5.12 telah memperbaiki kedua kerentanan tersebut.

Namun, advisory lanjutan tanggal 23 Oktober 2026 merekomendasikan agar administrator sementara menonaktifkan fitur session upload progress untuk mengurangi risiko dari kondisi eksploitasi khusus yang terkait dengan CVE-2026-115560.

Gunakan konfigurasi:

session.upload_progress.enabled = Off

Konfigurasi ini tidak menonaktifkan proses upload file biasa melalui $_FILES atau move_uploaded_file().

Mitigasi harus diterapkan sebelum request diproses, misalnya melalui php.ini atau konfigurasi administratif PHP-FPM, kemudian seluruh worker PHP-FPM perlu direstart.

Hindari mengandalkan ini_set() atau .user.ini untuk mitigasi ini.

Referensi:

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

8. Hardening PHP-FPM Pool

PHP-FPM bertugas mengelola proses worker PHP yang menangani request dari web server.

Konfigurasi pool biasanya berada di:

/etc/php-fpm.d/www.conf

Pada server yang menghosting banyak website, penggunaan pool terpisah dapat membantu mengurangi risiko akses lintas aplikasi.

Contoh Konfigurasi PHP-FPM Pool

Berikut contoh konfigurasi untuk satu website:

[website1]

user = website1
group = website1

listen = /run/php-fpm/website1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

clear_env = yes
security.limit_extensions = .php

request_terminate_timeout = 120s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/website1-slow.log

php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_flag[session.upload_progress.enabled] = off

Contoh di atas mengasumsikan web server menggunakan user nginx. Jika menggunakan Apache, sesuaikan dengan user web server yang sebenarnya. Pastikan user website, direktori socket, dan direktori log telah disiapkan sebelum mengaktifkan pool.

user dan group

Menentukan identitas Linux yang menjalankan worker PHP.

Sebaiknya setiap website menggunakan user yang berbeda jika dibutuhkan isolasi antarwebsite.

listen

Menentukan Unix socket yang digunakan web server untuk berkomunikasi dengan PHP-FPM.

listen.owner, listen.group, dan listen.mode

Mengontrol permission akses terhadap socket PHP-FPM.

clear_env = yes

Membersihkan environment variable yang diwariskan worker, kecuali variabel yang secara eksplisit diizinkan.

security.limit_extensions = .php

Membatasi ekstensi script utama yang dapat dieksekusi oleh PHP-FPM.

request_terminate_timeout = 120s

Membatasi waktu eksekusi request tertentu. Nilainya harus disesuaikan dengan kebutuhan aplikasi.

request_slowlog_timeout = 10s

Membantu mengidentifikasi request yang membutuhkan waktu pemrosesan terlalu lama.

Catatan: Isolasi pool PHP-FPM tidak selalu berarti isolasi total. Pengaturan permission, SELinux, filesystem, dan mekanisme berbagi resource seperti OPcache juga perlu diperhatikan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

9. Hardening dan Optimasi OPcache

OPcache merupakan ekstensi PHP yang menyimpan bytecode hasil kompilasi script ke dalam memori.

Dengan OPcache, PHP tidak perlu melakukan kompilasi ulang script pada setiap request.

Selain meningkatkan performa, beberapa konfigurasi OPcache dapat membantu mengurangi risiko terkait validasi akses file dan perubahan filesystem.

Konfigurasi awal yang dapat digunakan:

opcache.enable = 1
opcache.enable_cli = 0

opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000

opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

opcache.validate_permission = 1
opcache.validate_root = 1

opcache.save_comments = 1

opcache.enable = 1

Mengaktifkan OPcache untuk eksekusi PHP melalui web server.

opcache.enable_cli = 0

Menonaktifkan OPcache untuk proses CLI biasa. Pengaturan ini dapat disesuaikan jika diperlukan.

opcache.memory_consumption = 128

Mengalokasikan 128 MB shared memory untuk cache bytecode.

Nilai ini merupakan contoh awal dan perlu disesuaikan dengan jumlah script serta penggunaan memori aktual.

opcache.validate_timestamps = 1

Memungkinkan OPcache memeriksa perubahan file PHP.

opcache.revalidate_freq = 2

Mengatur interval pemeriksaan timestamp file dalam detik ketika validasi timestamp diaktifkan.

opcache.validate_permission = 1

Mengaktifkan validasi permission file yang relevan saat menggunakan OPcache.

opcache.validate_root = 1

Menambahkan validasi root path yang berguna dalam lingkungan tertentu, termasuk penggunaan chroot.

opcache.save_comments = 1

Mempertahankan komentar dokumentasi PHP yang mungkin digunakan oleh framework atau library untuk metadata.

Untuk server production, opcache.validate_timestamps=1 merupakan pilihan praktis ketika file aplikasi diperbarui secara langsung.

Jika validasi timestamp dinonaktifkan, proses deployment harus memastikan cache di-reset atau worker direstart agar perubahan kode diterapkan.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.

10. Validasi Konfigurasi PHP

Setelah seluruh perubahan dilakukan, periksa konfigurasi PHP:

php -i | grep -E 'expose_php|disable_functions|open_basedir|allow_url_fopen|display_errors|log_errors'

Periksa konfigurasi session:

php -i | grep -E 'session.use_strict_mode|session.cookie_httponly|session.cookie_secure|session.upload_progress.enabled'

Periksa OPcache:

php -i | grep -E 'opcache.enable|opcache.validate_timestamps|opcache.validate_permission|opcache.validate_root'

Perintah php -i membaca konfigurasi PHP CLI. Konfigurasi efektif PHP-FPM dapat berbeda karena adanya pengaturan pool, sehingga pengujian juga perlu dilakukan melalui request web yang aman dan terbatas.

Validasi Konfigurasi PHP-FPM

Untuk menguji sintaks konfigurasi PHP-FPM:

php-fpm -t

Jika konfigurasi valid, restart PHP-FPM:

systemctl restart php-fpm

Kemudian periksa statusnya:

systemctl status php-fpm --no-pager

Hasil yang diharapkan:

Active: active (running)

Lakukan pengujian website setelah restart, terutama pada fitur login, upload, integrasi API, pembuatan dokumen, dan proses background.

11. Rekomendasi Keamanan Tambahan

Hardening PHP sebaiknya tidak berhenti pada konfigurasi php.ini.

Untuk meningkatkan keamanan server secara menyeluruh, administrator juga disarankan melakukan langkah berikut:

  1. Update PHP secara berkala. Gunakan versi yang masih didukung dan segera terapkan security update.
  2. Aktifkan SELinux. Gunakan mode Enforcing dengan policy yang sesuai kebutuhan aplikasi.
  3. Gunakan HTTPS. Pastikan seluruh halaman autentikasi dan session menggunakan koneksi terenkripsi.
  4. Batasi permission file. Hindari permission 777 dan pastikan direktori writable dibatasi sesuai kebutuhan.
  5. Pisahkan PHP-FPM pool. Gunakan user Linux berbeda untuk aplikasi yang membutuhkan isolasi.
  6. Amankan direktori upload. Cegah eksekusi script dari direktori penyimpanan file pengguna melalui konfigurasi web server.
  7. Lakukan monitoring. Pantau error log, penggunaan resource, aktivitas login, dan perubahan file aplikasi.
  8. Siapkan backup. Pastikan backup tersedia dan prosedur pemulihannya telah diuji.

Kesimpulan

Hardening PHP 8.5 pada AlmaLinux 9 merupakan langkah penting untuk memperkuat keamanan aplikasi web yang berjalan di lingkungan production.

Pengamanan dapat dimulai dengan menonaktifkan expose_php, membatasi fungsi PHP yang tidak diperlukan, mengendalikan akses filesystem, menyembunyikan pesan error, dan memperkuat konfigurasi session.

Pada lingkungan PHP-FPM, isolasi pool, permission Unix socket, dan pembatasan eksekusi script menjadi bagian penting dari strategi keamanan.

Sementara itu, OPcache perlu dikonfigurasi secara tepat agar peningkatan performa tetap berjalan tanpa mengabaikan validasi akses dan perubahan file.

Yang terpenting, hardening harus diterapkan secara bertahap dan diuji terhadap kebutuhan aplikasi. Tidak semua pengaturan yang paling ketat merupakan pilihan terbaik untuk setiap server.

Dengan kombinasi konfigurasi PHP yang tepat, pembaruan keamanan rutin, isolasi proses, dan monitoring, administrator dapat mengurangi risiko serangan sekaligus mempertahankan stabilitas layanan.

Referensi

Plasawebhost - Solusi Hosting dan Cloud VPS untuk kebutuhan website, aplikasi, dan infrastruktur server Anda.


Artikel Lain

Pencarian
Daftar Isi

Anda Binggung Cari Hosting Untuk Sekolah

Kelola VPS Mudah dengan Cyberpanel

WhatsApp Kami

Support : +6282138153600

Finance : +6285191239466