25 Konfigurasi Keamanan PHP Terbaik Untuk Sysadmin

PHP adalah bahasa scipting server-side open source yang digunakan secara luas. Web server Apache menyediakan akses ke konten dan file melalui HTTP ATAU protokol HTTPS. Sebuah bahasa scripting server-side yang terkonfigurasi dapat menimbulkan berbagai macam masalah. Oleh karena itu PHP harus digunakan dengan hati-hati. Berikut 10 praktik terbaik konfigurasi untuk keamanan PHP.
Contoh Konfigurasi Untuk Kemanana PHP:

  1. DocumentRoot: / var / www / html
  2. Standar Web server: Apache (Anda dapat menggunakan Lighttpd atau Nginx bukan Apache)
  3. Default file konfigurasi PHP: /etc/php.ini
  4. Default direktori ekstensi config PHP  : /etc/php.d/
  5. Contoh file konfigurasi kemananan PHP  /etc/php.d/security.ini (Anda harus membuat file ini menggunakan editor teks)
  6. Sistem operasi: RHEL / CentOS / Fedora Linux (petunjuk harus bekerja sesuai dengan distribusi Linux lainnya seperti Debian / Ubuntu atau lainnya Unix seperti sistem operasi OpenBSD / FreeBSD / HP-UX).
  7. Default php Server TCP / UDP port: none

Sebagian besar tindakan yang tercantum dalam posting ini ditulis dengan asumsi akan dieksekusi oleh user dengan hak akses root dengan menjalankan bash atau shell modern lainnya:
$ php -v

Contoh output:
PHP 5.3.3 undefinedcli) undefinedbuilt: Oct 24 2011 08:35:41)
Copyright undefinedc) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright undefinedc) 1998-2010 Zend Technologies

System operasi yang digunakan dalam demonstrasi ini:
$ cat /etc/redhat-release

Output
Red Hat Enterprise Linux Server release 6.1 (Santiago)

1. Mengenal Jenis Serangan PHP

Aplikasi berbasis PHP dapat menghadapi berbagai jenis serangan. Contohnya seperti yang terlihat berikut ini:

  1. XSS - Cross-site scripting adalah kerentanan dalam aplikasi web php, yang dapat dimanfaatkan penyerang untuk mencuri informasi pengguna. Anda dapat mengkonfigurasi Apache dan menulis skrip PHP dengan lebih aman dengan cara memvalidasi semua input pengguna untuk menghindari serangan XSS.
  2. SQL injection - Merupakan sebuah teknik yang menyalahgunakan sebuah celah keamanan yang terjadi dalam lapisan basis data sebuah aplikasi. Celah ini terjadi ketika masukan pengguna tidak disaring secara benar dari karakter-karakter pelolos bentukan string yang diimbuhkan dalam pernyataan SQL atau masukan pengguna tidak bertipe kuat dan karenanya dijalankan tidak sesuai harapan. Ini sebenarnya adalah sebuah contoh dari sebuah kategori celah keamanan yang lebih umum yang dapat terjadi setiap kali sebuah bahasa pemrograman atau skrip diimbuhkan di dalam bahasa yang lain.
  3. File Upload - Hal ini memungkinkan pengunjung untuk menempatkan file (file upload) pada server Anda. Hal ini dapat mengakibatkan berbagai masalah keamanan seperti menghapus file-file diserber, menghapus database, mendapatkan rincian pengguna dan masih banyak lagi. Anda dapat menonaktifkan file upload dengan menggunakan php atau menulis script keamanan (seperti memvalidasi input pengguna dan hanya memungkinkan jenis file gambar seperti png atau gif).
  4. Termasuk file lokal dan remote server- Seorang penyerang dapat membuka file dari server remote dan mengeksekusi kode PHP. Hal ini memungkinkan mereka untuk mengupload file, menghapus file dan menginstal backdoors. Anda dapat mengkonfigurasi php untuk menonaktifkan eksekusi file dari jarak jauh.
  5. eval() - Mengevaluasi string sebagai kode PHP. Sering digunakan oleh penyerang untuk menyembunyikan kode dan tools mereka pada server itu sendiri. Anda dapat mengkonfigurasi php untuk menonaktifkan eval().
  6. Sea Surf Attack (CSRF) - Mungkin kita sudah pernah dengan apa itu CSRF (Cross Site Request Forgery) adalah sebuah serangan pada website yang dieksekusi atas wewenang korban, tanpa dikehendakinya. Celah keamanan CSRF (baca “sea-surf) telah dikenal sejak 1990-an dalam beberapa kasus eksploitasi, dan tetap mengancam sampai saat ini, seiring dengan semakin menjamurnya berbagai website dengan teknologi dan fiturnya masing-masing. CSRF merupakan pemalsuan request yang berasal dari site yang berbeda, tetapi dari sisi client tidak mengubah alamat IP karena memang dieksekusi oleh korban. Penyerang mengirimkan link atau halaman berisi request tersembunyi pada pengguna (korban), yang dieksekusi oleh penggunan tersebut ke website target. Dalam menyusun serangan, penyusun akan mempelajari terlebih dahulu kelemahan-kelemahan website target yang dapat dimanfaatkan dengan teknik CSRF.

2. Melihat Built-in Modul PHP

Untuk melihat set modul compiled-in PHP ketik perintah berikut:
# php -m
Output:
[PHP Modules]
apc
bcmath
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
imap
json
libxml
mbstring
memcache
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
suhosin
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib
[Zend Modules]
Suhosin
Disarankan menggunakan modul-modul PHP seminimal mungkin untuk meningkatkan performa kinerja dan keamanan PHP itu sendiri. Sebagai contoh, Anda dapat menonaktifkan modul sqlite3 dengan menghapus file konfigurasi, ATAU mengubah nama (memindahkan) file bernama /etc/php.d/sqlite3.ini sebagai berikut:
# rm /etc/php.d/sqlite3.ini
ATAU
# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable
Compiled-in modul PHP lainnya hanya dapat dihapus oleh instalasi ulang PHP dengan mengurangi file konfigurasi yang tidak diperlukan. Anda dapat men-download kode sumber php dari php.net dan kompilasi sebagai berikut dengan GD, FastCGI, dan dukungan MySQL:
./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr \
--bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \
--includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var \
--sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info \
--cache-file=../config.cache --with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d  --enable-fastcgi \
--enable-force-cgi-redirect

3. Batasi Ekspos Informasi PHP

Nonaktifkan expose_php untuk membatasi informasi dasar PHP. Edit /etc/php.d/security.ini dan mengatur direktif berikut:
expose_php=Off

Ketika expose_php diaktifkan, akan mengekspos informasi secara terbuka bahwa pada server ini menggunakan PHP, yang menampilkan informasi penting berupa versi PHP di header HTTP (misalnya, X-Powered-By: PHP / 5.3.3). Logo guids logo PHP (lihat contoh) juga terkena, sehingga menambahkan mereka ke URL dari situs PHP diaktifkan akan menampilkan logo yang sesuai. Ketika expose_php diaktifkan Anda dapat melihat versi php menggunakan perintah berikut:
$ curl -I http://www.cyberciti.biz/index.php
Output:
HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.3
Content-type: text/html; charset=UTF-8
Vary: Accept-Encoding, Cookie
X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session
Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT
...

4. Minimalkan loadable Modul PHP (Dynamic Extensions)

PHP mendukung "Dynamic Extensions". Secara default, RHEL memuat (loads) semua beban ekstensi modul yang ada dalam direktori /etc/php.d/. Untuk mengaktifkan atau menonaktifkan modul tertentu, Anda hanya perlu dengan mencari file konfigurasi di direktori /etc/php.d/ dan tandai nama modul tersebut sebagai komentar. Anda juga dapat mengubah nama atau menghapus file modul konfigurasi. Untuk kinerja dan kemamanan PHP terbaik, Anda hanya harus mengaktifkan ekstensi webapps yang dibutuhkan. Misalnya, untuk menonaktifkan ekstensi gd, ketik perintah berikut:
# cd /etc/php.d/
# mv gd.{ini,disable}
# /sbin/service httpd restart
Untuk mengaktifkan modul gd, masukkan:
# Gd mv. {Menonaktifkan, Suami}
# / Sbin / service httpd restart

5. Catat (Logs) Semua Error PHP

Jangan mengekspos pesan kesalahan PHP untuk pengunjung situs yaitu denga mengedit /etc/php.d/security.ini dan mengatur direktif berikut:
display_errors = Off
Pastikan Anda mencatat (log) semua kesalahan php ke file log:
log_errors = On
script error_log = / var / log / httpd / php error.log

6. Tolak Uploading File

Edit /etc/php.d/security.ini untuk mengatur direktif berikut untuk menonaktifkan file upload:
file_uploads = Off
Pengguna aplikasi Anda perlu meng-upload file, aktifkan fitur ini dengan membatasi upload_max_filesize yaitu membatasi ukuran maksimum file yang akan diterima PHP melalui upload:
file_uploads = On
# Pengguna hanya dapat meng-upload upto 1MB via php
upload_max_filesize = 1M

7. Nonaktifkan eksekusi kode PHP secara remote.

Jika diaktifkan, allow_url_fopen memungkinkan fungsi PHP File - seperti file_get_contents () dan include
dan statement reuire - yang dapat mengambil data dari lokasi tertentu dengan cara remote, seperti dengan FTP atau situs web.

Pilihan allow_url_fopen memungkinkan fungsi PHP File - seperti file_get_contents () dan include dan statement reuire - yang dapat mengambil data dari lokasi tertentu dengan cara remote menggunakan ftp atau http protokol.

Programmer sering melupakan ini dan tidak melakukan filter yang tepat terhadap input pengguna ketika menerima data pengguna yang disediakan untuk fungsi-fungsi ini, hal ini menyebabkan kerentanan untuk kode injeksi. Sejumlah besar kerentanan kode injeksi dilaporkan dalam aplikasi web berbasis PHP disebabkan oleh kombinasi yang memungkinkan allow_url_fopen dan oleh fiter input yang tidak baik. Edit /etc/php.d/security.ini dan atur direktif berikut:
allow_url_fopen = Off
Direkomendasikan juga untuk menonaktifkan allow_url_include:
allow_url_include = Off

8. Aktifkan Safe Mode SQL

Edir /etc/php.d/security.ini lalu atur direktif berikut:
sql.safe_mode = On

Jika ternyata On, mysql_connect () dan mysql_pconnect () akan mengabaikan argumen yang dilewatkan. Harap dicatat bahwa Anda mungkin harus membuat beberapa perubahan pada kode Anda. Pihak ketiga dan aplikasi open source seperti WordPress, dan lain-lain mungkin tidak berfungsi sama sekali ketika sql.safe_mode diaktifkan. Direkomendasikan juga bahwa Anda menonaktifkan magic_quotes_gpc untuk semua php 5.3.x sebagai filter keamanan. Rubah fungsi filter mysql_escape_string () 
magic_quotes_gpc = Off

9. Kontrol Ukuran Request POST

Metode request HTTP POST digunakan ketika klien (browser atau pengguna) harus mengirim data ke web server Apache sebagai bagian dari request, seperti ketika meng-upload file atau mengirimkan formulir yang telah diisi. Penyerang mungkin mencoba untuk mengirim request POST berukuran besar untuk konsumsi sumber daya sistem Anda. Anda dapat membatasi request POST ukuran maksimum yang akan diproses PHP. Edit /etc/php.d/security.ini dan atur direktif berikut:
; tentukan nilai realistis di sini
post_max_size = 1K
1K merupakan ukuran maksimal dari data post diperbolehkan oleh aplikasi php. Pengaturan ini juga mempengaruhi file upload. Untuk meng-upload file besar, nilai ini harus lebih besar dari upload_max_filesize. Saya juga menyarankan agar Anda membatasi metode yang tersedia menggunakan web server Apache. Edit, httpd.conf dan atur direktif berikut untuk DocumentRoot/var/www/html:
<Directory /var/www/html>
     <LimitExcept GET POST>
         Agar memungkinkan, menyangkal
     </LimitExcept>
## Tambahkan sisa config berjalan di sini ... ##
</Directory>

10. Resource Control (DoS Control)

Anda dapat mengatur waktu eksekusi maksimum setiap script php, dalam hitungan detik. Pilihan rekomendasi yang Lain adalah untuk menetapkan jumlah maksimum waktu setiap script yang dihabiskan untuk request parsing data, dan jumlah maksimum script memori yang mungkin dikonsumsi. Edit /etc/php.d/security.ini dan atur arahan berikut:
# Diatur dalam detik
max_execution_time = 30
max_input_time = 30
memory_limit = 40M

11. Instal Suhosin Advanced Protection System untuk PHP

Suhosin adalah sistem perlindungan canggih untuk instalasi PHP. Dirancang untuk melindungi server dan pengguna dari kelemahan baik dikenal maupun tidak dikenal dalam aplikasi PHP dan inti PHP. Suhosin hadir dalam dua bagian independen, yang dapat digunakan secara terpisah atau dengan kombinasi. Bagian pertama adalah patch kecil terhadap inti PHP, yang mengimplementasikan beberapa perlindungan tingkat rendah terhadap buffer overflows dan format string kerentanan dan bagian kedua adalah ekstensi PHP yang kuat yang mengimplementasikan semua perlindungan lainnya.

12. Nonaktifkan Fungsi PHP Berbahaya

PHP memiliki banyak fungsi yang dapat digunakan untuk mneghancurkan server Anda jika tidak digunakan dengan benar. Anda dapat mengatur daftar fungsinya di /etc/php.d/security.ini dengan menggunakan direktif disable_functions:
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
 

13. Direktif PHP FastCGI / CGI - cgi.force_redirect

PHP bekerja dengan FastCGI. Fascgi mengurangi jejak memori server web Anda, tapi masih memberi Anda kecepatan dan kekuatan seluruh script PHP. Anda dapat mengkonfigurasi Apache2 + PHP + FastCGI atau cgi seperti dijelaskan di sini. Konfigurasi direktif cgi.force_redirect mencegah orang dari memanggil fungsi PHP langsung dengan URL seperti http://www.example.com/cgi-bin/php/hackerdir/backdoor.php. Aktifkan cgi.force_redirect. Edit /etc/php.d/security.ini
dan atur direktif berikut:
; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
cgi.force_redirect=On

14. PHP User dan Group ID

mod_fastcgi adalah cgi-modul untuk web server Apache yang dapat terhubung ke server FastCGI eksternal. Anda perlu memastikan php dijalankan sebagai user non-root. Jika eksekusi PHP dilakukan sebagai sebagai root atau UID di bawah 100, dapat mengakses dan atau memanipulasi file sistem. Anda harus menjalankan PHP CGIS sebagai pengguna non-privileged istimewa yang menggunakan Apache suexec atau mod_suPHP. Fitur suexec menyediakan pengguna Apache kemampuan untuk menjalankan program CGI di bawah ID pengguna, pengguna ID yang berbeda dari panggilan web server. Dalam contoh ini, php_cgi saya berjalan sebagai user phpcgi dan apache berjalan sebagai user apache.
# ps aux | grep php-cgi
Ouput:
phpcgi      6012  0.0  0.4 225036 60140 ?        S    Nov22   0:12 /usr/bin/php-cgi
phpcgi      6054  0.0  0.5 229928 62820 ?        S    Nov22   0:11 /usr/bin/php-cgi
phpcgi      6055  0.1  0.4 224944 53260 ?        S    Nov22   0:18 /usr/bin/php-cgi
phpcgi      6085  0.0  0.4 224680 56948 ?        S    Nov22   0:11 /usr/bin/php-cgi
phpcgi      6103  0.0  0.4 224564 57956 ?        S    Nov22   0:11 /usr/bin/php-cgi
phpcgi      6815  0.4  0.5 228556 61220 ?        S    00:52   0:19 /usr/bin/php-cgi
phpcgi      6821  0.3  0.5 228008 61252 ?        S    00:55   0:12 /usr/bin/php-cgi
phpcgi      6823  0.3  0.4 225536 58536 ?        S    00:57   0:13 /usr/bin/php-cgi
Anda dapat menggunakan tool seperti spawn-fcgi untuk memilah proses FastCGI remote dan local sebagai user phpcgi (pertama, tambahkan user phpcgi ke sistem):
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
Sekarang, Anda dapat mengkonfigurasi Apache, Lighttpd, dan web server Nginx untuk menggunakan external PHP FastCGI yang berjalan pada port 9000 di alamat IP 127.0.0.1

15. Batas PHP Akses File System

Direktif open_basedir berfungsi mengatur direktori PHP yang diperbolehkan untuk mengakses file dengan menggunakan fungsi seperti fopen(), dan lain-lain. Jika file berada di luar jalur yang ditetapkan oleh open_basedir, PHP akan menolak untuk membukanya. Anda tidak dapat menggunakan link simbolik sebagai solusi. Misalnya hanya memungkinkan akses ke direktori /var/www/html dan tidak juga /var/www, atau /tmp atau /etc:
; Limits the PHP process from accessing files outside 
; of specifically designated directories such as /var/www/html/
open_basedir="/var/www/html/"
; ------------------------------------
; Multiple dirs example 
; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"
; ------------------------------------

16. Session Path

Session Path di PHP merupakan cara untuk meneruskan data tertentu di akses berikutnya. Hal ini memungkinkan Anda untuk membangun aplikasi yang lebih mudah untuk disesuaikan untuk meningkatkan daya tarik situs web Anda. Cara ini didefinisikan dalam file /etc/php.ini dan semua data yang terkait dengan sesi tertentu akan disimpan dalam file di direktori yang ditentukan oleh option session save_path. Defaultnya di bawah RHEL/CentOS/ Fedora Linux adalah sebagai berikut :
session.save_path="/var/lib/php/session"
; Set the temporary directory used for storing files when doing file upload
upload_tmp_dir="/var/lib/php/session"
Pastikan path /var/www/html dan tidak dapat dibaca atau ditulis oleh pengguna sistem lainnya:
# ls -Z /var/lib/php/
Contoh output:
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
Note: Opsi Z untuk perintah ls menampilkan konteks keamanan SELinux seperti file mode, user, group, security context dan file name.

17. Menjaga agar PHP, Software, Dan OS tetap Up to Date

Menerapkan patch keamanan merupakan bagian penting untuk memelihara Linux, Apache, PHP, dan MySQL server. Semua pembaruan keamanan php harus ditinjau dan diterapkan sesegera mungkin dengan menggunakan salah satu dari tool berikut (jika Anda menginstal PHP melalui paket manajer):
# yum update
Atau
# apt-get update && apt-get upgrade
Anda dapat mengkonfigurasi topi Red hat/CentOS/Fedora Linux untuk mengirim notifikasi yum packed update melalui email. Pilihan lain adalah dengan menerapkan semua pembaruan keamanan melalui cron. Di bawah Debian/Ubuntu Linux Anda dapat menggunakan apticron untuk mengirim notifikasi keamanan.

18. Membatasi Berkas dan Direktori Access

Pastikan Anda menjalankan Apache sebagai user non-root seperti Apache atau www. Semua file dan direktori harus dimiliki oleh pengguna non-root (atau user apache) di bawah /var/www/html:

Note: Periksa php.net untuk rilis terbaru untuk instalasi kode sumber.
# chown -R apache:apache /var/www/html/
/var/www/html/ adalah subdirektori dan DocumentRoot yang dimodifikasi oleh pengguna lain karena root tidak pernah mengeksekusi file, dan tidak dibolehkn membuat (create) file.

Pastikan hak akses file ditetapkan dengan 0444 (read-only) di bawah /var/www/html/:
# chmod -R 0444 /var/www/html/
Pastikan semua hak akses direktori ditetapkan dengan 0445 di bawah /var/www/html/:
# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}

Tentang Menyiapkan Hak Akses File Dengan Benar

Chown dan perintah chmod memastikan bahwa dibawah DocumentRoot atau file yang terdapat dalam DocumentRoot tidak dapat ditulis oleh server Web pengguna apache. Harap dicatat bahwa Anda perlu mengatur hak akses yang paling masuk akal untuk model pengembangan website Anda, sehingga merasa aman untuk menggunakan perintah chown dan chmod untuk disesuaikan dengan kebutuhan Anda. Dalam contoh ini, server Apache dijalankan sebagai user apache, dikonfigurasi dengan arahan Pengguna dan Grup dalam file httpd.conf Anda. Pengguna apache perlu membaca akses ke segala sesuatu di bawah DocumentRoot tetapi tidak harus memiliki akses tulis apa pun.

Pastikan httpd.conf memiliki arahan berikut untuk konfigurasi keamanan yang ketat:
<Directory / >
    Options None
    AllowOverride None
    Order allow,deny
</Directory>
Anda hanya harus memberikan akses tulis (writeable) ketika diperlukan saj. Beberapa aplikasi web seperti wordpress dan lain-lain mungkin memerlukan sebuah caching direktori. Anda dapat memberikan hak akses tulis ke direktori caching menggunakan perintah berikut:
# chmod a+w /var/www/html/blog/wp-content/cache
### block access to all ###
# echo 'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess

19. Proteksi File Konfigurasi Apache, PHP, dan MySQL

Proteksi file konfigurasi Apache, PHP dan MySQL sehingga tidak akan dapat dihapus ataupun dirubah dengan perintah apapun.
Gunakan perintah chattr sebagai berikut:
# chattr +i /etc/php.ini
# chattr +i /etc/php.d/*
# chattr +i /etc/my.ini
# chattr +i /etc/httpd/conf/httpd.conf
# chattr +i /etc/
Perintah chattr juga dapat digunakan untuk melindungi file-file di dalam direktori /var/www/html:
# chattr +i /var/www/html/file1.php
# chattr +i /var/www/html/

20. Gunakan Ekstensi Security Linux (seperti SELinux)

Linux hadir dengan berbagai patch keamanan yang dapat digunakan untuk menjaga program server terhadap kesalahan konfigurasi atau yang membahayakan. Bila mungkin, gunakan SELinux dan ekstensi Security Linux lainnya untuk mengatasi keterbatasan pada jaringan dan program lainnya. Sebagai contoh, SELinux menyediakan berbagai kebijakan keamanan untuk kernel Linux dan web server Apache. Untuk melihat semua variabel proteksi Apache SELinux, masukkan:
# getsebool -a | grep httpd
Output:
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
Untuk menonaktifkan Apache cgi Support, masukkan:
# setsebool -P httpd_enable_cgi off
Untuk informasi lebih lanjut lihat Red Hat SELinux Guide

21. Instal mod_security

Mod_security merupakan intrusion detection open source dan prevention engine untuk aplikasi web. Anda dapat dengan mudah menginstal mod_security di Linux dan melindungi aplikasi apache dan php berdasarkan XSS dan berbagai serangan lainnya:
## A few Examples ##
# Do not allow to open files in /etc/
SecFilter /etc/
 
# Stop SQL injection
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"

22. Jika Mungkin Jalankan Apache/PHP di Chroot Environment

Menempatkan PHP/Apache di chroot dapat meminimalkan potensial kerusakan yang ditimbulkan oleh break-in yaitu dengan mengisolasi filesystem server web ke dalam bagian kecil.

23. Gunakan Firewall Untuk Membatasi Outgoing Connection

Penyerang akan men-download file secara lokal pada web-server Anda menggunakan alat seperti wget. Gunakan iptables untuk memblokir koneksi keluar dari user apache. Modul ipt_owner dapat digunakan untuk mencocokkan beberapa karakteristik dari pembuat paket, untuk paket lokal yang dihasilkan. Hal ini hanya berlaku dalam rangkaian OUTPUT. Dalam contoh berikut, mengizinkan user jonie untuk terhubung keluar menggunakan port 80 (berguna untuk RUN atau centos repo access):
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner jonie -p tcp --dport 80 -m state --state NEW,ESTABLISHED  -j ACCEPT
Berikut merupakan contoh lain yang memblokir semua koneksi keluar dari user apache kecuali ke server smtp kita sendiri, dan spam validation API service:
# ....  
/sbin/iptables --new-chain apache_user
/sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user
# allow apache user to connec to our smtp server 
/sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN
# Allow apache user to connec to api server for spam validation
/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.62 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.61 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.89 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.88 --dport 80 -j RETURN
#########################
## Add more rules here ##
#########################
# No editing below
# Drop everything for apache outgoing connection
/sbin/iptables --append apache_user -j REJECT

24. Pantau Logs & Lakukan Audit

Cek file log Apache:
# tail -f /var/log/httpd/error_log
# grep 'login.php' /var/log/httpd/error_log
# egrep -i "denied|error|warn" /var/log/httpd/error_log
Cek file log PHP:
# tail -f /var/log/httpd/php_scripts_error.log
# grep "...etc/passwd" /var/log/httpd/php_scripts_error.log
Log file memberikan gambaran beberapa pemahaman tentang jenis serangan yang dilakukan terhadap server dan memungkinkan Anda untuk mengaudit sehingga dapat diambil keputusan tingkat keamanan yang diperlukan. Service auditd tersedia untuk sistem audit. Aktifkan auditd untuk mengaudit SELinux events, authetication events, file modifications, account modification dan sebagainya. Direkomendasikan juga untuk menggunakan "Linux System Monitoring Tools" standar untuk memantau web-server Anda.

25. Jalankan Service Per System atau VM Instance

Untuk instalasi system yang besar dianjurkan untuk menjalankan, database, statis, dan konten dinamis dari server yang berbeda.
///////////////
/ ISP/Router /
//////////////
  \
   |
   Firewall
     \
      |
     +------------+
     | LB01       |
     +------------+                 +------------------------+
                  |                 | static.lan.example.com |
    +-----------------+--------------------------+
                                    | phpcgi1.lan.example.com|
                                    +------------------------+
                                    | phpcgi2.lan.example.com|
                                    +------------------------+
                                    | mysql1.lan.example.com |
                                    +------------------------+
                                    | mcache1.lan.example.com|
                                    +------------------------+
Menjalankan Service Pada Server terpisah)

Jalankan network service yang berbeda pada server terpisah atau VM Instances akan membatasi jumlah layanan lainnya yang dapat membahayakan. Sebagai contoh, jika seorang penyerang berhasil mengeksploitasi perangkat lunak seperti alur Apache, dia akan memperoleh akses ke seluruh server termasuk service lain yang berjalan pada server yang sama (seperti MySQL, server e-mail dan sebagainya). Namun, dalam contoh di atas konten yang disajikan adalah sebagai berikut:

  1. static.lan.example.com - Gunakan lighttpd atau nginx server untuk static assets such seperti js/css/images.
  2. phpcgi1.lan.example.com dan phpcgi2.lan.example.com - Apache web-server dengan php digunakan untuk mengenerate dynamic content.
  3. mysql1.lan.example.com - MySQL database server.
  4. mcache1.lan.example.com - Memcached server merupakan caching system yang sangat cepat untuk MySQL. Menggunakan libevent vs epoll (Linux runtime) untuk skala ke sejumlah koneksi terbuka dan menggunakan non-blocking jaringan I/O.
  5. LB01 - nginx web dan reverse proxy server di antar muka Apache Web server. Semua koneksi yang datang dari internet ditujukan kepada salah satu server Web yang disalurkan melalui nginx proxy server, yang mungkin baik untuk menangani permintaan sendiri atau lulus permintaan keseluruhannya atau sebagian ke server web utama. LB01 menyediakan load-balancing sederhana.

Lihat juga Install modul php-tidy di Centos / RHEL

Shares


Top