Axiso

Notes

Installation d’un serveur d’hébergement Linux – Debian

Serveur — janvier 2016

Apache

aptitude install -y apache2 apache2-utils apache2-mpm-prefork libapache2-modsecurity

Contrôler en se rendant sur le domaine serveur-prod.example.com avec un navigateur.

It works !

Quelques sécurités et premiers paramétrages de base avec l’activation de modules et la préparation des configurations et erreurs communes :

a2enmod auth_digest
a2enmod cgi
a2enmod expires
a2enmod headers
a2enmod mod-security
a2enmod rewrite
a2enmod ssl
echo Timeout 120 > /etc/apache2/conf.d/main.local.conf
echo -e 'ServerTokens Major

<Directory "/usr/share/apache2/icons">
  Options None
  AllowOverride None
  Order Deny,Allow
  Deny from all
</Directory>' > /etc/apache2/conf.d/security.local.conf
cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sed -i 's:#SecDebugLog /opt/modsecurity/var/log/debug.log:SecDebugLog /var/log/apache2/modsec_debug.log:' /etc/modsecurity/modsecurity.conf
echo -e '<IfModule security2_module>
  Include /etc/modsecurity/*.conf
</IfModule>' >> /etc/apache2/conf.d/mod-security.local.conf

Configuration commune

Certains paramètres s’appliquent pour l’ensemble des domaines. Ils seront activés par défaut dans conf.d/ ou inclus avec chaque hôte virtuel.

echo "ServerName $SERVER_DOMAIN
ServerAdmin $EXTERNAL_EMAIL
AddHandler cgi-script .cgi
AddHandler cgi-script .pl

Options -Indexes

SetEnvIf Request_URI /favicon\.ico no_log" > /etc/apache2/conf.d/common.local.conf

Un fichier de configuration par défaut pour chaque requête directe sur l’IP, afin de ne pas servir le premier hôte virtuel et afficher une erreur :

echo "NameVirtualHost $SERVER_IP:80
<VirtualHost $SERVER_IP:80>
  ServerName $SERVER_IP
  DocumentRoot /var/www
</VirtualHost>" > /etc/apache2/sites-available/0-default_$SERVER_IP.conf
touch /var/www/favicon.ico
echo "User-agent: *" > /var/www/robots.txt
a2ensite 0-default_$SERVER_IP.conf
a2ensite default-ssl
apache2ctl restart

PHP

aptitude install -y php5 php5-apc php5-cli php5-curl php5-gd php5-intl php5-mcrypt php5-mysql php-pear php5-xsl

Configuration basique de PHP :

sed -i "s:^memory_limit =.*:memory_limit = 256M:" /etc/php5/apache2/php.ini
sed -i 's:^[;]error_log = syslog:;error_log = syslog\nerror_log = ../../log/php/php_errors.log:' /etc/php5/apache2/php.ini
sed -i 's:^[;]error_log = syslog:;error_log = syslog\nerror_log = ../../log/php/php_errors.log:' /etc/php5/cli/php.ini
sed -i 's:^[;]date.timezone =.*:date.timezone = "Europe/Paris":' /etc/php5/apache2/php.ini
sed -i 's:^[;]date.timezone =.*:date.timezone = "Europe/Paris":' /etc/php5/cli/php.ini
a2enmod php5
apache2ctl graceful

Awstats

aptitude install -y awstats

Désactiver la configuration par défaut et créer un groupe et un utilisateur ayant accès à l’interface Awstats :

mv /etc/awstats/awstats.conf /etc/awstats/awstats.conf.original
htdigest -c /etc/virtual/authusers Stats stats

Choisir son passe et ajouter l’utilisateur à un groupe :

echo 'admin: stats' >> /etc/virtual/authgroups

Ajout d’un accès pour consulter l’ensemble des statistiques :

<VirtualHost IP:80>
  ServerName stats.example.com
  DocumentRoot /home/web/example/web/web

  Alias /awstatsclasses "/usr/share/awstats/lib/"
  Alias /awstats-icon/ "/usr/share/awstats/icon/"
  Alias /awstatscss "/usr/share/doc/awstats/examples/css"
  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  ScriptAlias /awstats/ /usr/lib/cgi-bin/
  Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
</VirtualHost>" > /etc/apache2/sites-available/example.conf

Ajout de la configuration pré-définie qu’il sera possible d’inclure pour chaque site nécessitant Awstats :

echo "RewriteRule awstats/$ awstats/awstats.pl [QSA,L,R=301]
Alias /awstats '/usr/lib/cgi-bin/'
Alias /awstats-icon '/usr/share/awstats/icon/'" > /etc/apache2/common-conf/awstats

De même pour les sites dont la consultation des statistiques devra être protégée :

echo "<Directory '/usr/lib/cgi-bin/'>
  AuthName 'Stats'
  AuthType Digest
  AuthDigestProvider file
  AuthUserFile /etc/virtual/authusers
  AuthGroupFile /etc/virtual/authgroups
  Require group admin
</Directory>" > /etc/apache2/common-conf/awstats-security

Compression des journaux d’accès

Quotidiennement les journaux de la veille sont compressés.

nano /etc/logrotate.d/apache2-sites
/home/web/*/log/apache/*.log {   daily   missingok   rotate 1   compress   create 644 root root   sharedscripts   size 0   postrotate     if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then       apache2ctl graceful > /dev/null     fi   endscript   lastaction     yesterday=$(date -d yesterday +%Y%m%d)     for directory in /home/web/*; do       if [ -d $directory ]; then         for file in $directory/log/apache/*.log.1.gz; do           if [ -f $file ]; then             rename 's/log\.1\.gz/log-'$yesterday'\.gz/' $file           fi         done       fi     done   endscript }
nano /etc/logrotate.d/php
/var/log/php/php_errors.log {   weekly   missingok   rotate 4   notifempty   create }
service cron reload