Pengukuhan Apache Virtual Hosts

Artikal Asal oleh Mohd Nazri Ahmad

how_to_create_a_virtual_hostShared web hosting walau pun tanpa pengukuhan Apache Virtual Hosts dilaksanakan, server dipasang dengan privilege pengguna biasa bagi tujuan keselamatan.

Sebagai contoh, akaun pengguna ‘apache’ digunakan oleh Apache dalam sistem pengoperasian Linux berasaskan RedHat dan CentOS manakala  ‘www-data’ digunakan oleh Ubuntu.  Konfigurasi pemasangan seperti ini adalah pada fail-fail konfigurasi  dengan direktif seperti berikut:

CentOS 6.x dan ke atas:

/etc/httpd/conf/httpd.conf

#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
#  . On SCO (ODT 3) use "User nouser" and "Group nogroup".
#  . On HPUX you may not be able to use shared memory as nobody, and the
#    suggested workaround is to create a user www and use that user.
#  NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
#  when the value of (unsigned)Group is above 60000;
#  don't use Group #-1 on these systems!
#
User apache
Group apache

Ubuntu Linux 12.x dan ke atas:

/etc/apache2/apache2.conf

…
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

/etc/apache2/envvars

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

 

Konfigurasi ini membolehkan proses Apache web server dijalankan dengan privilege akaun pengguna seperti yang dipasang di atas.  Seterusnya, fail-fail laman web juga perlu dipunyai oleh pengguna yang sama bagi membolehkan server menyediakan sumber laman web kepada pengguna.  Keseluruhan pemasangan dan konfigurasi adalah seperti di gambarajah berikut:

Tujuan utama pemasangan sebegini adalah bagi mengurangkan impak jika web server berjaya diceroboh.  Penceroboh hanya boleh menggunakan privilege pengguna ini sahaja tetapi tidak sebagai ‘root’ atau penyelenggara sistem yang boleh digunakan untuk mengawal keseluruhan  sistem pengoperasian.

Walau bagaimana pun, pemasangan seperti ini boleh mendatangkan masalah bagi penggunaan shared web hosting bagi menghoskan lebih dari satu laman web dalam satu server (Rujuk artikel Pasang Apache Virtual Hosts di Ubuntu 14.x dan ke Atas).

Masalah utamanya adalah web server dan fail-fail pelbagai laman web dipasang dengan menggunakan satu privilege pengguna sahaja seperti berikut:

Berdasarkan di atas,  kedua-dua fail laman web1.com dan web2.com dipunyai oleh pengguna dan privilege yang sama.

Apabila penceroboh berjaya menceroboh laman web1.com, laman web2.com juga terdedah kepada ancaman yang sama walaupun kelemahan (vulnerability) hanya dikesan pada laman web1.com.  Ini bermakna, jika terdapat 20 laman web dalah satu server, kesemua laman web dengan konfigurasi virtual hosts seperti ini adalah terdedah kepada ancaman pencerobohan walau pun hanya satu laman web sahaja yang mempunyai kelemahan.

Berdasarkan pengalaman, keadaan ini telah menyebabkan pelbagai kes mass web defacement telah berlaku kepada banyak organisasi yang menggunakan konfigurasi seperti ini.

Masalah ini boleh diatasi dengan menjalankan proses web server dan memasang fail-fail laman web dengan dengan ID pengguna yang berbeza antara satu sama lain.  Ini boleh dilakukan dengan memasang Apache web server server dengan modul fcgid (mod_fcgid) dan SuEXEC (mod_suexec) seperti berikut:

Pemasangan modul-modul ini membolehkan proses web server dijalankan dengan ID yang berbeza.  Begitu juga dengan fail-fail laman web yang boleh dimiliki dengan pengguna yang berasingan.  Pemasangan ini boleh menghalang penceroboh yang menceroboh salah satu laman web dari menceroboh laman web yang lain.  Berikut merupakan komponen-komponen yang terlibat dalam dokumen ini:

No. Komponen Keterangan
1 Web Server Apache Server paling popular bagi menghoskan laman web berasaskan sumber terbuka yang boleh dimuat turun secara percuma di Internet.  Apache boleh dipasang dalam pelbagai sistem pengoperasian moden seperti UNIX, Linux dan Microsoft Windows.  Laman web rasmi Apache adalah di http://httpd.apache.org
2 Modul suEXEC Membolehkan program atau modul luaran Apache (seperti CGI dan modul PHP) dijalankan dengan privilege lain (atau privilege separation)
3 Modul FCGID (mod_fcgid) Evolusi CGI yang membenarkan proses CGI dijalankan dengan lebih pantas.  Modul ini akan menjalankan modul php secara CGI.
4 Modul PHP Modul bahasa pegaturcaraan berasaskan skrip (scripting language) bagi membangun aplikasi  laman web yang lebih dinamik.  Modul yang dijalankan adalah php-cgi dan bukannya mod_php.

Artikel ini akan menerangkan langkah-langkah pemasangan konfigurasi Apache2, SuEXEC, PHP dan mod_fcgid.  Pemasangan dan konfigurasi  adalah bagi menghoskan 2 laman web contoh dalam satu server iaitu web1.com dan web2.com seperti artikel yang telah ditulis sebelum ini. Alamat bagi laman web1.com dan web2.com adalah seperti berikut:

  • Web1 – http://web1.com dengan akaun pengguna/privilege web1
  • Web2 – http://web2.com dengan akaun pengguna/privilege web2

Pengukuhan Apache Virtual Hosts diteruskan dengan Bahagian ke-dua (2).  Contoh pengukuhan ini menggunakan sistem pengoperasian Linux Ubuntu 14.04 dan ke atas.  Berikut merupakan langkah-langkah pengukuhan yang dilaksanakan:

1. Persediaan Awal

Login ke server sebagai user biasa dan aktifkan capaian sebagai ‘root’:

sudo su

Tukar konfigurasi shell /bin/sh kepada /bin/bash dan masukan “No” pada prompt yang diminta:

dpkg-reconfigure dash

Install dash as /bin/sh?  No

Matikan fungsi keselamatan AppArmor supaya tidak mengganggu proses pemasangan:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

2. Pemasangan Apache 2, PHP, SuEXEC dan mod_fcgid

Pemasagan Apach2, PHP, SuEXEC dan mod_fcgid boleh dilaksanakan dengan arahan berikut:

apt-get install apache2 apache2-suexec libapache2-mod-fcgid php5-cgi

Jika mod_php telah terpasang sepabagi modul Apache, matikan fungsi:

a2dismod php5

Aktifkan modul-modul baru yang dipasang:

a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid

3. Konfigurasi Apache 2, PHP dan mod_fcgid

Pasang konfigurasi seperti dengan membuka fail “php.ini”:

vi /etc/php5/cgi/php.ini

Buang komen pada direktif cgi.fix_pathinfo = 1:


[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]

Pasang konfigurasi mod_fcgid pada fail /etc/apache2/mods-available/fcgid.conf:

vi /etc/apache2/mods-available/fcgid.conf 

Masukan direktif PHP_Fix_Pathinfo_Enable 1 dalam fail ini:

<IfModule mod_fcgid.c>
   AddHandler    fcgid-script .fcgi
   FcgidConnectTimeout 20
   PHP_Fix_Pathinfo_Enable 1
</IfModule>

Restart perkhidmatan Apache:

/etc/init.d/apache2 restart

4. Konfigurasi Virtual Host

Pemasangan dan konfigurasi seterusnya adalah membina laman web1.com dan web2.com di dalam server.  Proses laman web1 dan web2 akan dijalankan mengikut privilege pengguna masing-masing.

ID pengguna ‘web1’ dan ‘web2’ serta kumpulan (group) masing-masing dan perlu diwujudkan seperti berikut:

groupadd web1
groupadd web2
useradd -s /bin/false -d /var/www/web1.com -m -g web1 web1
useradd -s /bin/false -d /var/www/web2.com -m -g web2 web2

Bina folder bagi document root bagi kedua-dua laman web1 dan web2.  Folder-folder ini perlu dimiliki oleh pengguna web1 dan web2 masing-masing:

mkdir -p /var/www/web1.com/html
chown web1:web1 /var/www/web1.com -R
mkdir -p /var/www/web2.com/html
chown web2:web2 /var/www/web2.com -R

Modul PHP akan dijalankan dengan menggunakan SuEXEC.  Document root bagi SuEXEC ini boleh dilihat melalui arahan:

/usr/lib/apache2/suexec –V

Document root bagi SuEXEC adalah “/var/www” melalui output bagi arahan seperti berikut:

[root@server1 ~]# /usr/lib/apache2/suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="www-data"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

Modul PHP yang terletak di /usr/lib/cgi-bin/php tidak boleh dijalankan oleh SuEXEC kerana ianya terletak di luar dari /var/www.  Masalah ini boleh di atasi dengan membina folder dan fail skrip ringkas berikut bagi kedua-dua laman web:

mkdir -p /var/www/php-fcgi-scripts/web1
mkdir -p /var/www/php-fcgi-scripts/web2

Edit fail /var/www/php-fcgi-scripts/web1/php-fcgi-starter:

 vi /var/www/php-fcgi-scripts/web1/php-fcgi-starter

Masukkan:

#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Edit fail /var/www/php-fcgi-scripts/web2/php-fcgi-starter:

vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter 

Masukkan:

#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Fail-fail skrip perlu dimiliki oleh pengguna web1 dan web2:

chmod 755 /var/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /var/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /var/www/php-fcgi-scripts/web1
chown -R web2:web2 /var/www/php-fcgi-scripts/web2

Bina konfigurasi VirtualHost bagi web1:

 vi /etc/apache2/sites-available/web1.conf

Masukan konfigurasi berikut:

<VirtualHost *:80>
  ServerName www.web1.com
  ServerAlias web1.com
  ServerAdmin webmaster@web1.com
  DocumentRoot /var/www/web1.com/html/
  <IfModule mod_fcgid.c>
    SuexecUserGroup web1 web1
    <Directory /var/www/web1.com/html/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/web1/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  ErrorLog /var/log/apache2/web1_error.log
  CustomLog /var/log/apache2/web1_access.log combined
  ServerSignature Off
</VirtualHost>

Aktifkan konfigurasi VirtualHost bagi web1:

 a2ensite web1

Bina konfigurasi VirtualHost bagi web2:

 vi /etc/apache2/sites-available/web2.conf

Masukan konfigurasi berikut:

<VirtualHost *:80>
  ServerName www.web2.com
  ServerAlias web2.com
  ServerAdmin webmaster@web2.com
  DocumentRoot /var/www/web2.com/html/
  <IfModule mod_fcgid.c>
    SuexecUserGroup web2 web2
    <Directory /var/www/web2.com/html/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/web2/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  ErrorLog /var/log/apache2/web2_error.log
  CustomLog /var/log/apache2/web2_access.log combined
  ServerSignature Off
</VirtualHost>

Aktifkan konfigurasi VirtualHost bagi web2:

 a2ensite web2

Restart perkhidmatan Apache:

/etc/init.d/apache2 restart

5. Konfigurasi PHP bagi Virtual Host yang berlainan

Konfigurasi PHP yang berlainan boleh dibina jika terdapat laman web yang memerlukan sebarang konfigurasi khas.  Ini dibina dengan menyalin fail konfigurasi “php.ini” ke folder tertentu dan dipanggil melalui skrip php-fcgi-starter.  Contoh berikut adalah bagi memasang konfigurasi PHP khas bagi laman web2.

Salin fail “php.ini” ke folder laman web2:

cp /etc/php5/cgi/php.ini /var/www/web2.com/
chown web2:web2 /var/www/web2.com/php.ini

Edit fail “php.ini” mengikut keperluan laman web yang berkaitan.

Edit skirp php-fcgi-starter bagi laman web2:

 vi /var/www/php-fcgi-scripts/web2/php-fcgi-starter

Tukar direktif PHPRC dalam fail skrip:

#!/bin/sh
PHPRC=/var/www/web2.com/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Restart perkhidmatan Apache:

/etc/init.d/apache2 restart

 Penutup

Pemasangan Apache web server dengan konfigurasi virtual hosting membolehkan pelbagai laman web dihoskan dalam satu server.  Walau bagaimana pun, konfigurasi default virtual hosting ini mendedahkan kesemua laman web yang dipasang kepada aktiviti pencerobohan.  Terdapat banyak kes di mana insiden pencerobohan dengan mass web defacement berlaku ke atas konfigurasi seperti ini.  Sehubungan dengan itu, web server yang digunakan untuk menghoskan pelbagai laman web perlu diperkukuhkan dengan memasang komponen tambahan SuEXEC dan mod_fcgid bagi mengatasi masalah ini.  Pemasangan komponen tambahan ini membolehkan setiap proses web server dan laman web yang dihoskan diasingkan mengikut ID pengguna dan privilige masing-masing.

Artikel Asal :-

http://mdnazri.com/2015/02/pengukuhan-apache-virtual-hosts-bahagian-1/

http://mdnazri.com/2015/02/pengukuhan-apache-virtual-hosts-bahagian-2/