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
Voir aussi
http://www.devshed.com/c/a/Apache/Secure-Installation-and-Configuration/7/
http://damstux.free.fr/wiki/index.php?title=Mod-security2
http://www.mogilowski.net/lang/en-us/2008/12/03/secure-apache-2-with-mod-security-2-on-debian-lenny/
http://www.modsecurity.org/blog/archives/2007/02/weekly_sans_ris_1.html
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