Dans cet article, nous allons voir comment mettre en place Apache et PHP de manière sécurisé pour héberger vos sites Web.

Nous allons également voir comment configurer PHP pour partager les sessions entre les différents serveurs grâce à MemCached. Cette configuration est nécessaire pour mettre en place une architecture HA.

Sommaire

Préambule

Liens utilies

Apache

Installation

aptitude update  
aptitude install apache2-mpm-worker  
mkdir /data/web  
chown -R www-data:www-data /data/web  
a2enmod rewrite  

Configuration

nano /etc/apache2/ports.conf  

Mettez le contenu suivant :

NameVirtualHost *:80  
Listen 80

<IfModule mod_ssl.c>  
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>  
    Listen 443
</IfModule>  

Puis éditez le fichier suivant :

nano /etc/apache2/sites-available/default  

Mettez le contenu suivant :

<VirtualHost *:80>  
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>


        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>  

Pour finir, rechargez la configuration :

/etc/init.d/apache2 force-reload

Sécurisation

nano /etc/apache2/conf.d/security-hardened  

Mettez le contenu suivant :

# Hardened security configurations.

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is Full which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

#
# Limit access to SVN informations.
#
<DirectoryMatch ".*\.svn">  
    Order allow,deny
    Deny from all
    Satisfy All
</DirectoryMatch>

#
# Block bad user agents.
#
<Directory />  
  <IfModule mod_rewrite.c>
    SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT
    SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT
    Deny from env=HTTP_SAFE_BADBOT
  </ifModule>
</Directory>  

Pour finir, rechargez la configuration :

/etc/init.d/apache2 force-reload

Optimisation

nano /etc/apache2/apache2.conf  

Mettez le contenu suivant :

Timeout 300  
KeepAlive On  
MaxKeepAliveRequests 150  
KeepAliveTimeout 2

<IfModule mpm_prefork_module>  
    StartServers          10
    MinSpareServers       40
    MaxSpareServers       100
    MaxClients            200
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>  
    StartServers          10
    MinSpareServers       40
    MaxSpareServers       100
    MaxClients            200
    MaxRequestsPerChild   0
</IfModule>

HostnameLookups Off  
LogLevel warn  

Pour finir, rechargez la configuration :

/etc/init.d/apache2 force-reload

PHP

Installation

nano /etc/apt/sources.list  

Mettez le contenu suivant :

#DotDeb
deb http://packages.dotdeb.org jessie all  
deb-src http://packages.dotdeb.org jessie all  

Puis lancez les commandes suivantes :

wget 'http://www.dotdeb.org/dotdeb.gpg' --quiet --output-document=- | command apt-key add -  
aptitude update  
aptitude install php5-fpm php5 php5-mysql php5-pgsql php5-mcrypt  
mv /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/apache2.conf  
/etc/init.d/php5-fpm restart

Ensuite, éditez le fichier suivant :

nano /etc/logrotate.d/php5-fpm  

Mettez le contenu suivant :

/var/log/php5-fpm.log {
  rotate 12
  weekly
  missingok
  notifempty
  compress
  delaycompress
  postrotate
    invoke-rc.d php5-fpm force-reload > /dev/null
  endscript
}

Configuration

nano /etc/php5/conf.d/security-hardened.ini  

Mettez le contenu suivant :

; Harden PHP5 security

; Disable PHP exposure
expose_php = Off

;Dangerous : disable system functions. This can break some administration softwares.
disable_functions = symlink,shell_exec,exec,proc_close,proc_open,popen,system,dl,passthru,escapeshellarg,escapeshellcmd  

Ensuite éditez le fichier suivant :

nano /etc/php5/conf.d/mbstring.ini  

Mettez le contenu suivant :

; Set mbstring defaults to UTF-8
mbstring.language=UTF-8  
mbstring.internal_encoding=UTF-8  
mbstring.http_input=UTF-8  
mbstring.http_output=UTF-8  
mbstring.detect_order=auto  

Puis éditez le fichier suivant :

nano /etc/php5/conf.d/timezone.ini  

Mettez le contenu suivant :

; PHP settings for strtotime
date.timezone = "Europe/Paris"  

Exécutez les commandes suivantes :

if [ -e '/etc/php5/fpm/pool.d/apache2.conf' ]; then  
  command sed -i \
      -e 's|^listen =.*$|listen = /var/run/php-fpm-apache2.sock|' \
      -e 's|^;*request_terminate_timeout.*|request_terminate_timeout = 605|' \
      -e 's|^;*pm.status_path.*|pm.status_path = /php-fpm-status|' \
      -e 's|^;*ping.path.*|ping.path = /php-fpm-ping|' \
      '/etc/php5/fpm/pool.d/apache2.conf'
fi


test -x /etc/init.d/php5-fpm && /etc/init.d/php5-fpm restart  
test -x /etc/init.d/apache2 && /etc/init.d/apache2 force-reload  

Modules compélmentaires

APC

aptitude install php5-apc  

Puis editez le fichier suivant :

nano /etc/php5/conf.d/apc-config.ini  

Mettez le contenu suivant :

; APC Configuration
apc.enabled = 1  
; Memory allocated to APC. Use Munin or APC Info to see if more is needed.
apc.shm_size="96M"  
; rfc1867 allow file upload progression display.
apc.rfc1867 = on  

Puis éditez le fichier suivant :

nano /etc/php5/conf.d/apc-fpm.ini  

Mettez le contenu suivant :

; Enable APC ressources sharing.
apc.mmap_file_mask=/apc.shm.XXXXXX  

Puis exécutez les commandes suivantes :

test -x /etc/init.d/php5-fpm && /etc/init.d/php5-fpm restart  
test -x /etc/init.d/apache2 && /etc/init.d/apache2 force-reload  

FastCGI

aptitude install libapache2-mod-fastcgi  

Ensuite vérifier le contenu du fichier suivant :

nano /etc/apache2/mods-available/php5-fpm.load  
# PHP-FPM configuration.
# dummy file, see /etc/apache2/mods-available/php5-fpm.conf

Puis modifiez le fichier suivant :

nano /etc/apache2/mods-available/php5-fpm.conf  

Mettez le contenu suivant :

# PHP-FPM configuration
<IfModule mod_fastcgi.c>  
  Alias /php5.fastcgi /var/lib/apache2/fastcgi/php5.fastcgi
  AddHandler php-script .php
  FastCGIExternalServer /var/lib/apache2/fastcgi/php5.fastcgi -socket /var/run/php-fpm-apache2.sock -idle-timeout 610
  Action php-script /php5.fastcgi virtual

  # Forbid access to the fastcgi handler.
  <Directory /var/lib/apache2/fastcgi>
    <Files php5.fastcgi>
      Order deny,allow
      Allow from all
    </Files>
  </Directory>

  # FPM status page.
  <Location /php-fpm-status>
    SetHandler php-script
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 ::1
  </Location>

  # FPM ping page.
  <Location /php-fpm-ping>
    SetHandler php-script
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 ::1
  </Location>
</IfModule>  

Memcached

Voici la procédure pour héberger les sessions de PHP dans Memcached. Bien entendu, vous devez déja avoir un ou plusieurs serveur Memcached de configuré.

Si vous faite de la répartition de charge entre plusieurs serveurs LAMP, vérifié bien qu'ils sont tous à la même heure. Vous devez absolument configurer NTP sur le même serveur de temps.

Modifiez le fichier suivant :

nano /etc/php5/fpm/php.ini  

Mettez le contenu suivant dans la section session :

dans cette configuration, nous avons 2 serveurs Memcached

  • serveur 1 : 192.168.0.2
  • serveur 2 : 192.168.0.3
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
session.save_handler = memcache

session.save_path = "tcp://192.168.0.2:11211persistent=1&weight=1&timeout=1&retry_interval=15,tcp:/192.168.0.3:11211?persistent=1&weight=1&timeout=1&retry_interval=$memcache.hash_strategy = consistent  
memcache.allow_failover = 1  
memcache.session_redundancy=3  

Gestion d'Apache

Installation de a2tools

wget "https://raw.github.com/biapy/howto.biapy.com/master/apache2/a2tools" --quiet --no-check-certificate --output-document="/usr/bin/a2tools"  
chmod +x "/usr/bin/a2tools"  

Ajouter un Vhost

a2tools "blog.webcenter.fr" "/data/web/blog"