Cara Disable Exec Cmd Apache untuk Keamanan Server

Menonaktifkan eksekusi perintah atau fitur command execution pada web server Apache merupakan langkah krusial untuk mengamankan infrastruktur dari serangan Remote Code Execution (RCE). Secara default, Apache tidak mengeksekusi perintah sistem operasi secara langsung, tetapi modul seperti mod_cgid, mod_cgi, atau konfigurasi direktif tertentu yang mengizinkan eksekusi skrip eksternal sering kali menjadi celah keamanan jika tidak dikontrol dengan ketat.

Untuk menutup celah ini, administrator sistem perlu melakukan langkah-langkah mitigasi mulai dari menonaktifkan modul CGI yang tidak digunakan, membatasi hak akses direktori, hingga memperketat konfigurasi berkas httpd.conf atau apache2.conf.

Langkah 1: Menonaktifkan Modul CGI (mod_cgi / mod_cgid)

Modul CGI memungkinkan server web menjalankan skrip eksternal. Jika aplikasi Anda berbasis PHP murni atau bahasa modern lain yang berjalan via PHP-FPM atau mod_php tanpa membutuhkan CGI, modul ini wajib dimatikan.

Jalankan perintah berikut pada terminal Linux (Ubuntu/Debian):

sudo a2dismod cgi
sudo a2dismod cgid
sudo systemctl restart apache2

Untuk sistem berbasis RedHat/CentOS/AlmaLinux:

sudo sed -i 's/^LoadModule cgi_module/#LoadModule cgi_module/' /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd

Langkah 2: Konfigurasi Keamanan Direktori

Jika Anda harus mempertahankan direktori tertentu untuk eksekusi skrip, batasi izin aksesnya menggunakan blok <Directory> di dalam file konfigurasi Apache. Pastikan direktif ExecCGI dihapus dari opsi Options.

<Directory "/var/www/html">
    # Hapus ExecCGI dan ikuti simbolik jika tidak diperlukan
    Options -ExecCGI -Indexes -Includes
    AllowOverride None
    Require all granted
</Directory>

Tabel Parameter Konfigurasi Keamanan Apache

Direktif / Modul Fungsi Utama Status Rekomendasi Keamanan
mod_cgi / mod_cgid Menjalankan skrip CGI pada server Unix. Disable (Kecuali benar-benar dibutuhkan)
Options ExecCGI Mengizinkan eksekusi skrip CGI di direktori tertentu. Hapus atau beri tanda minus (-ExecCGI)
AllowOverride Menentukan direktif mana yang diizinkan dalam .htaccess. Set ke None untuk mencegah override lokal
ServerSignature Menampilkan versi Apache pada halaman error. Set ke Off untuk security through obscurity

Langkah 3: Mencegah Eksekusi Lewat PHP (disable_functions)

Seringkali perintah sistem dieksekusi bukan melalui fitur native Apache, melainkan melalui fungsi eksekusi PHP seperti exec(), shell_exec(), system(), atau passthru(). Pastikan Anda juga menutup celah ini pada berkas php.ini yang terhubung dengan Apache.

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

Setelah mengubah berkas php.ini, restart layanan web server atau PHP-FPM Anda agar perubahan diterapkan.

Troubleshooting & Verifikasi Lapangan

Setelah menerapkan konfigurasi di atas, lakukan pengujian untuk memastikan tidak ada error sintaks pada Apache dengan perintah:

sudo apache2ctl configtest

Jika muncul pesan Syntax OK, lanjutkan dengan merestart layanan. Periksa berkas log error Apache (biasanya di /var/log/apache2/error.log atau /var/log/httpd/error_log) untuk memastikan modul yang dinonaktifkan tidak memicu konflik pada aplikasi web yang sedang berjalan.