4 242
modifications
(54 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Category:serveur]] | [[Category:serveur]] | ||
[[Category:debian]] | [[Category:debian]] | ||
[[Category:wheezy]] | |||
[[Category:toupdate]] | |||
Au niveau dns, <code> | '''<span style="color: red;">Tuto plus vraiment à jour</span>''' | ||
<code>www. | |||
[[Installation_de_configuration_du_serveur_web_Apache_2.4_sous_Debian_Jessie|Nouveau wiki à jour (mais incomplet pour le moment)]] | |||
Ce howto va vous montrer comment mettre en place un serveur web apache2 gérant les domaines virtuels et l'ipv6 sous debian '''squeeze'''. | |||
Nous allons mettre en place trois sites : <code>srv.domain.tld</code>, <code>www.domain.tld</code> et <code>webmail.domain.tld</code>. | |||
<code>srv.domain.tld</code> sera le site par défaut sur lequel tombera toute personne effectuant une requête http ne désignant aucun autre domaine virtuel. | |||
<code>www.domain.tld</code> et <code>webmail.domain.tld</code> sont ce qu'on peut appeler des domaines virtuels : ils sont sur la même ip que <code>srv.domain.tld</code> mais servent des domaines différents. Ces deux domaines disposeront d'un chiffrement ssl/tls actif. | |||
Au niveau dns, <code>srv.domain.tld</code> est le domaine identifiant la machine. Il possède l'adresse ipv4 <code>213.186.47.110</code> et l'adresse ipv6 <code>2001:41d0:1:d6e::110</code>. | |||
<code>www.domain.tld</code> et <code>webmail.domain.tld</code> sont des alias pour <code>srv.domain.tld</code>. | |||
Les changements de permissions effectués dans ce howto supposent que vous êtes en <code>umask 0027</code> | Les changements de permissions effectués dans ce howto supposent que vous êtes en <code>umask 0027</code> | ||
Ligne 13 : | Ligne 22 : | ||
=Champs dns= | =Champs dns= | ||
La première étape est de mettre en place les champs dns pour les différents domaines qu'on va gérer. Éditez la zone dns de votre domaine (<code>/srv/http/ | La première étape est de mettre en place les champs dns pour les différents domaines qu'on va gérer. Éditez la zone dns de votre domaine (<code>/srv/http/domain.tld.host</code> dans mon cas) et ajoutez ou modifiez les lignes suivantes : | ||
<pre> | <pre> | ||
domain.tld. IN A 213.186.47.110 | |||
domain.tld. IN AAAA 2001:41d0:1:d6e::110 | |||
srv.domain.tld. IN A 213.186.47.110 | |||
srv.domain.tld. IN AAAA 2001:41d0:1:d6e::110 | |||
www IN CNAME | www IN CNAME srv.domain.tld. | ||
webmail IN CNAME | webmail IN CNAME srv.domain.tld | ||
</pre> | </pre> | ||
Ligne 53 : | Ligne 62 : | ||
Listen 213.186.47.110:443 | Listen 213.186.47.110:443 | ||
Listen 127.0.0.1:80 | Listen 127.0.0.1:80 | ||
Listen ::1:80 | Listen [::1]:80 | ||
Listen 2001:41d0:1:d6e::110:80 | Listen [2001:41d0:1:d6e::110]:80 | ||
Listen 2001:41d0:1:d6e::110:443 | Listen [2001:41d0:1:d6e::110]:443 | ||
User www-data | User www-data | ||
Ligne 61 : | Ligne 70 : | ||
PidFile /var/run/apache2.pid | PidFile /var/run/apache2.pid | ||
ServerAdmin root@ | ServerAdmin root@domain.tld | ||
ServerName www. | ServerName www.domain.tld | ||
HostnameLookups Off | HostnameLookups Off | ||
Ligne 70 : | Ligne 79 : | ||
NameVirtualHost 213.186.47.110:80 | NameVirtualHost 213.186.47.110:80 | ||
NameVirtualHost 213.186.47.110:443 | NameVirtualHost 213.186.47.110:443 | ||
NameVirtualHost 2001:41d0:1:d6e::110:80 | NameVirtualHost [2001:41d0:1:d6e::110]:80 | ||
NameVirtualHost 2001:41d0:1:d6e::110:443 | NameVirtualHost [2001:41d0:1:d6e::110]:443 | ||
#NameVirtualHost 127.0.0.1:80 | #NameVirtualHost 127.0.0.1:80 | ||
Ligne 166 : | Ligne 175 : | ||
############################# | ############################# | ||
Include vhosts/ | Include vhosts/srv.domain.tld.conf.default | ||
Include vhosts/ | Include vhosts/domain.tld.conf.default | ||
Include vhosts/*.conf | Include vhosts/*.conf | ||
</nowiki></pre> | </nowiki></pre> | ||
Ligne 252 : | Ligne 261 : | ||
Ajoutez la ligne suivante avant la directive <code>Include vhosts/*.conf</code> dans le fichier <code>/etc/apache2/apache2.conf</code>. Il est nécessaire de la placer avant afin d'avoir une sorte de "catch all" récupérant toutes les requêtes ne correspondant à aucune vhost. | Ajoutez la ligne suivante avant la directive <code>Include vhosts/*.conf</code> dans le fichier <code>/etc/apache2/apache2.conf</code>. Il est nécessaire de la placer avant afin d'avoir une sorte de "catch all" récupérant toutes les requêtes ne correspondant à aucune vhost. | ||
<pre>Include vhosts/ | <pre>Include vhosts/srv.domain.tld.conf.default</pre> | ||
Créez le fichier <code>/etc/apache2/vhosts/ | Créez le fichier <code>/etc/apache2/vhosts/srv.domain.tld.conf.default</code> et ajoutez y les lignes suivantes : | ||
<pre><nowiki> | <pre><nowiki> | ||
<VirtualHost 213.186.47.110> | <VirtualHost 213.186.47.110:80> | ||
ServerName | ServerName srv.domain.tld | ||
Include sites/ | Include sites/srv.domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost [2001:41d0:1:d6e::110]> | <VirtualHost [2001:41d0:1:d6e::110]:80> | ||
ServerName | ServerName srv.domain.tld | ||
Include sites/ | Include sites/srv.domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
</nowiki></pre> | </nowiki></pre> | ||
La configuration de cette vhost est défini pour être dans <code>/etc/apache2/sites/ | Étant donné que nous n'avons pas précisé le port à la directive <code>servername</code> du fichier <code>/etc/apache/apache2.conf</code>, il est nécessaire de préciser le port pour chaque déclaration <code>virtualhost</code>. | ||
La configuration de cette vhost est défini pour être dans <code>/etc/apache2/sites/srv.domain.tld.conf</code>. Créez ce fichier et ajoutez-y les lignes suivantes : | |||
<pre>DocumentRoot /srv/http/default/</pre> | <pre>DocumentRoot /srv/http/default/</pre> | ||
Ligne 282 : | Ligne 293 : | ||
=Mise en place d'un site sécurisé en ssl= | =Mise en place d'un site sécurisé en ssl= | ||
Nous allons maintenant mettre en place les deux sites sécurisés en ssl : <code>www. | ---- | ||
---- | |||
'''Attention, cette rubrique n'est pas à jour''' | |||
'''le module ssl de Apache supporte désormais SNI (http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI) ce qui permet d'utiliser plusieurs certificats ssl sur une seule et même ip.''' | |||
Il faudra dans ce cas préciser le certificat ssl à utiliser dans chaque vhost où ssl est activé. Le premier certificat ssl chargé sera utilisé en tant que fallback si le client ne supporte pas SNI. | |||
---- | |||
---- | |||
Nous allons maintenant mettre en place les deux sites sécurisés en ssl : <code>www.domain.tld</code> et <code>webmail.domain.tld</code>. | |||
Étant donné qu'on ne dispose que d'une seule adresse ipv4 on ne va pouvoir utiliser qu'un seul certificat ssl. C'est une limitation obligatoire du protocole https car la connexion sécurisée est établie avant l'envoi du header spécifiant quel site apache2 doit afficher (et donc quel certificat ssl utiliser). | Étant donné qu'on ne dispose que d'une seule adresse ipv4 on ne va pouvoir utiliser qu'un seul certificat ssl. C'est une limitation obligatoire du protocole https car la connexion sécurisée est établie avant l'envoi du header spécifiant quel site apache2 doit afficher (et donc quel certificat ssl utiliser). | ||
Il est cependant possible de sécuriser plusieurs sites différents avec le même certificat ssl en utilisant la directive <code>subjectAltName</code> lors de la génération du certificat. Cela règlera les problèmes d'alertes sur tous les navigateur conforme à la RFC 2818 ("HTTP Over TLS"). | Il est cependant possible de sécuriser plusieurs sites différents avec le même certificat ssl en utilisant la directive <code>subjectAltName</code> lors de la génération du certificat. Cela règlera les problèmes d'alertes sur tous les navigateur conforme à la RFC 2818 ("HTTP Over TLS"). | ||
Ligne 293 : | Ligne 315 : | ||
<pre> | <pre> | ||
[APACHE] | [APACHE] | ||
nsComment = " | nsComment = "SRV Apache Server" | ||
subjectKeyIdentifier = hash | subjectKeyIdentifier = hash | ||
authorityKeyIdentifier = keyid,issuer:always | authorityKeyIdentifier = keyid,issuer:always | ||
issuerAltName = issuer:copy | issuerAltName = issuer:copy | ||
subjectAltName = DNS:www. | subjectAltName = DNS:www.domain.tld, DNS:webmail.domain.tld | ||
basicConstraints = critical,CA:FALSE | basicConstraints = critical,CA:FALSE | ||
keyUsage = digitalSignature, nonRepudiation, keyEncipherment | keyUsage = critical,digitalSignature, nonRepudiation, keyEncipherment | ||
nsCertType = server | nsCertType = server | ||
extendedKeyUsage = serverAuth | extendedKeyUsage = serverAuth | ||
Ligne 308 : | Ligne 330 : | ||
<pre> | <pre> | ||
cd /etc/ssl/core_ca | cd /etc/ssl/core_ca | ||
openssl req -config /etc/ssl/openssl.cnf -newkey rsa:2048 -keyout www. | openssl req -config /etc/ssl/openssl.cnf -newkey rsa:2048 -keyout www.domain.tld.key -out www.domain.tld.req | ||
openssl ca -config /etc/ssl/openssl.cnf -name core_ca -extensions APACHE -in www. | openssl ca -config /etc/ssl/openssl.cnf -name core_ca -extensions APACHE -in www.domain.tld.req -out www.domain.tld.pem | ||
chmod -R 600 /etc/ssl/core_ca/ | chmod -R 600 /etc/ssl/core_ca/ | ||
</pre> | </pre> | ||
Si vous ne souhaitez pas chiffrer le certificat avec une passphrase ajoutez l'argument <code>-nodes</code> à la première ligne. | Si vous ne souhaitez pas chiffrer le certificat avec une passphrase ajoutez l'argument <code>-nodes</code> à la première ligne. | ||
Répondez aux différentes questions posées par openssl. La plupart sont assez triviales. Attention toutefois : <code>Common Name</code> doit être l'adresse principale de votre site (<code>www. | Répondez aux différentes questions posées par openssl. La plupart sont assez triviales. Attention toutefois : <code>Common Name</code> doit être l'adresse principale de votre site (<code>www.domain.tld</code> dans mon cas). | ||
Il est préférable de déplacer le certificat dans le dossier root de apache2: | Il est préférable de déplacer le certificat dans le dossier root de apache2: | ||
<pre> | <pre> | ||
mkdir /etc/apache2/ssl/ | mkdir /etc/apache2/ssl/ | ||
mv www. | mv www.domain.tld.* /etc/apache2/ssl/ | ||
chown -R root:root /etc/apache2/ssl/ | chown -R root:root /etc/apache2/ssl/ | ||
chmod -R 600 /etc/apache2/ssl/ | chmod -R 600 /etc/apache2/ssl/ | ||
</pre> | </pre> | ||
Enfin, nous allons créer un fichier contenant la chaine de certification : | Enfin, nous allons créer un fichier contenant la chaine de certification (de préférence en partant de la CA la plus proche de certificat serveur en remontant vers la root) : | ||
<pre> | <pre> | ||
cat /etc/ssl/ | cat /etc/ssl/core_ca/core_ca.pem /etc/ssl/root_ca/root_ca.pem > /etc/apache2/ssl/ca_chain.pem | ||
</pre> | </pre> | ||
Apache enverra ce fichier aux clients souhaitant se connecter en https. Ainsi, même si le navigateur du client n'a que le certificat root_ca.pem dans sa liste de confiance, le certificat établit pour apache sera validé car le client recevra tous les certificats de la chaine (root_ca.pem > core_ca.pem > www. | Apache enverra ce fichier aux clients souhaitant se connecter en https. Ainsi, même si le navigateur du client n'a que le certificat root_ca.pem dans sa liste de confiance, le certificat établit pour apache sera validé car le client recevra tous les certificats de la chaine (root_ca.pem > core_ca.pem > www.domain.tld.pem) : le client sera certain que la chaine est complètement valide. | ||
==Mise en place des sites== | ==Mise en place des sites== | ||
Ligne 336 : | Ligne 358 : | ||
<pre>a2enmod ssl</pre> | <pre>a2enmod ssl</pre> | ||
Ajoutez la ligne suivante dans <code>/etc/apache2/apache2.conf<code> après <code>Include vhosts/ | Ajoutez la ligne suivante dans <code>/etc/apache2/apache2.conf<code> après <code>Include vhosts/srv.domain.tld.conf.default</code> mais avant <code>Include vhosts/*.conf</code> : | ||
<pre>Include vhosts/ | <pre>Include vhosts/domain.tld.conf.default</pre> | ||
Cette ligne doit a tout prix être placé à cet endroit. C'est la vhost ssl par défaut dans laquelle on charge le certificat ssl. Si elle est placée après le <code>Include</code> chargeant les autres vhosts, si l'une de ces vhosts est configuré en ssl, apache2 ne démarrera pas. | Cette ligne doit a tout prix être placé à cet endroit. C'est la vhost ssl par défaut dans laquelle on charge le certificat ssl. Si elle est placée après le <code>Include</code> chargeant les autres vhosts, si l'une de ces vhosts est configuré en ssl, apache2 ne démarrera pas. | ||
Créez le fichier <code>/etc/apache2/vhosts/ | Créez le fichier <code>/etc/apache2/vhosts/domain.tld.conf.default</code> et ajoutez y ceci : | ||
<pre><nowiki> | <pre><nowiki> | ||
#Certificat SSL | #Certificat SSL | ||
#SSLCACertificateFile | #SSLCACertificateFile | ||
SSLCertificateChainFile /etc/apache2/ssl/ca_chain.pem | SSLCertificateChainFile /etc/apache2/ssl/ca_chain.pem | ||
SSLCertificateFile /etc/apache2/ssl/www. | SSLCertificateFile /etc/apache2/ssl/www.domain.tld.pem | ||
SSLCertificateKeyFile "/etc/apache2/ssl/www. | SSLCertificateKeyFile "/etc/apache2/ssl/www.domain.tld.key" | ||
<VirtualHost 213.186.47.110:80> | <VirtualHost 213.186.47.110:80> | ||
ServerName www. | ServerName www.domain.tld | ||
ServerAlias | ServerAlias domain.tld | ||
Include sites/ | Include sites/domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost [2001:41d0:1:d6e::110]:80> | <VirtualHost [2001:41d0:1:d6e::110]:80> | ||
ServerName www. | ServerName www.domain.tld | ||
ServerAlias | ServerAlias domain.tld | ||
Include sites/ | Include sites/domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 213.186.47.110:443> | <VirtualHost 213.186.47.110:443> | ||
SSLEngine on | SSLEngine on | ||
SSLProtocol All | SSLProtocol All -SSLv2 -SSLv3 | ||
SSLCipherSuite | SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4" | ||
ServerName www. | ServerName www.domain.tld | ||
ServerAlias | ServerAlias domain.tld | ||
Include sites/ | Include sites/domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost [2001:41d0:1:d6e::110]:443> | <VirtualHost [2001:41d0:1:d6e::110]:443> | ||
SSLEngine on | SSLEngine on | ||
SSLProtocol All | SSLProtocol All -SSLv2 -SSLv3 | ||
SSLCipherSuite | SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4" | ||
ServerName www. | ServerName www.domain.tld | ||
ServerAlias | ServerAlias domain.tld | ||
Include sites/ | Include sites/domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
</nowiki></pre> | </nowiki></pre> | ||
La directive <code>ServerAlias</code> défini | Notez que les directives <code>SSLCertificate*</code> ne sont situés en dehors des bloques <code>VirtualHost</code> du port 443 uniquement parce que nous allons utiliser le même certificat pour plusieurs sites sur la même ip. | ||
Créez ensuite <code>/etc/apache2/sites/ | Si vous disposez de plusieurs adresses IPs, vous devrez indiquer le certificat ssl correspondant dans chaque bloque <code>VirtualHost</code> correspondant (donc deux fois pour chaque site si vous utilisez IPv4 et IPv6). | ||
La directive <code>ServerAlias</code> défini domain.tld comme un alias pour <code>www.domain.tld</code> | |||
Créez ensuite <code>/etc/apache2/sites/domain.tld.conf</code> et ajoutez y les lignes suivantes: | |||
<pre> | <pre> | ||
DocumentRoot /srv/http/ | DocumentRoot /srv/http/domain.tld/domain.tld/ | ||
ServerAdmin admin@ | ServerAdmin admin@domain.tld | ||
</pre> | </pre> | ||
Bien sur il faut que <code>/srv/http/ | Bien sur il faut que <code>/srv/http/domain.tld/domain.tld/</code> existe et soit accessible par apache2: | ||
<pre> | <pre> | ||
mkdir -p /srv/http/ | mkdir -p /srv/http/domain.tld/domain.tld/ | ||
chown -R root:www-data /srv/http/ | chown -R root:www-data /srv/http/domain.tld/ | ||
</pre> | </pre> | ||
Pour que l'ajout soit pris en compte il faut reloader apache2: | Pour que l'ajout soit pris en compte il faut reloader apache2: | ||
Ligne 399 : | Ligne 424 : | ||
Si vous avez chiffré votre clé avec une passphrase il est important de modifier votre script logrotate car par défaut, il lance un restart de apache qui ne pourra pas se relancer tout seul du fait de la passphrase. Éditez le fichier <code>/etc/logrotate.d/apache2</code> et modifiez la ligne <code>/etc/init.d/apache restart</code> en <code>/etc/init.d/apache reload</code> | Si vous avez chiffré votre clé avec une passphrase il est important de modifier votre script logrotate car par défaut, il lance un restart de apache qui ne pourra pas se relancer tout seul du fait de la passphrase. Éditez le fichier <code>/etc/logrotate.d/apache2</code> et modifiez la ligne <code>/etc/init.d/apache restart</code> en <code>/etc/init.d/apache reload</code> | ||
Pour le site <code>webmail. | Pour le site <code>webmail.domain.tld</code> créez le fichier <code>/etc/apache2/vhosts/webmail.domain.tld.conf</code> et ajoutez y les lignes suivantes : | ||
<pre><nowiki> | <pre><nowiki> | ||
<VirtualHost 213.186.47.110:443> | <VirtualHost 213.186.47.110:443> | ||
ServerName webmail. | SSLEngine on | ||
Include sites/webmail. | SSLProtocol All -SSLv2 -SSLv3 | ||
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4" | |||
ServerName webmail.domain.tld | |||
Include sites/webmail.domain.tld.conf | |||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost 213.186.47.110:80> | <VirtualHost 213.186.47.110:80> | ||
ServerName webmail. | ServerName webmail.domain.tld | ||
Include sites/webmail. | Include sites/webmail.domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost [2001:41d0:1:d6e::110]:80> | <VirtualHost [2001:41d0:1:d6e::110]:80> | ||
ServerName webmail. | ServerName webmail.domain.tld | ||
Include sites/webmail. | Include sites/webmail.domain.tld.conf | ||
</VirtualHost> | </VirtualHost> | ||
<VirtualHost [2001:41d0:1:d6e::110]:443> | <VirtualHost [2001:41d0:1:d6e::110]:443> | ||
ServerName webmail. | SSLEngine on | ||
Include sites/webmail. | SSLProtocol All -SSLv2 -SSLv3 | ||
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4" | |||
ServerName webmail.domain.tld | |||
Include sites/webmail.domain.tld.conf | |||
</VirtualHost> | </VirtualHost> | ||
</nowiki></pre> | </nowiki></pre> | ||
Créez ensuite le fichier <code>/etc/apache2/sites/webmail. | Créez ensuite le fichier <code>/etc/apache2/sites/webmail.domain.tld.conf</code> et ajoutez y les lignes suivantes : | ||
<pre> | <pre> | ||
DocumentRoot /srv/http/ | DocumentRoot /srv/http/domain.tld/webmail.domain.tld/ | ||
ServerAdmin admin@ | ServerAdmin admin@domain.tld | ||
</pre> | </pre> | ||
Comme précédemment, <code>/srv/http/ | Comme précédemment, <code>/srv/http/domain.tld/webmail.domain.tld/</code> doit exister et être accessible par apache2. | ||
=Installer le module php= | =Installer le module php= | ||
Ligne 454 : | Ligne 485 : | ||
Comme vous le voyez, on peut spécifier plusieurs chemins pour les zones autorisées en les séparant par des "deux points" (:). | Comme vous le voyez, on peut spécifier plusieurs chemins pour les zones autorisées en les séparant par des "deux points" (:). | ||
Il faut entrer des chemins absolus et toujours terminer les chemins par le / final, sinon apache va interpréter le chemin comme étant path*. Par exemple /srv/http/pof correspondra a /srv/http/pof, mais aussi à /srv/http/pofpof alors que /srv/http/pof/ ne correspondra que au dossier /srv/http/pof/ | Il faut entrer des chemins absolus et toujours terminer les chemins par le / final, sinon apache va interpréter le chemin comme étant path*. Par exemple /srv/http/pof correspondra a /srv/http/pof, mais aussi à /srv/http/pofpof alors que /srv/http/pof/ ne correspondra que au dossier /srv/http/pof/ | ||
Généralement, entrer le <code>DocumentRoot</code> comme path est largement suffisant. Voici l'exemple pour la vhost www. | Généralement, entrer le <code>DocumentRoot</code> comme path est largement suffisant. Voici l'exemple pour la vhost www.domain.tld (/etc/apache2/sites/domain.tld.conf: | ||
<pre>php_admin_value open_basedir /srv/http/ | <pre>php_admin_value open_basedir /srv/http/domain.tld/domain.tld/</pre> | ||
Et voila, maintenant, lorsque notre méchant pirate viendra s'attaquer à notre petit script php bugué, il ne pourra qu'accéder aux fichiers du vhost correspondant. Les autres sites hébergés sur d'autres vhosts resteront en sécurité. | Et voila, maintenant, lorsque notre méchant pirate viendra s'attaquer à notre petit script php bugué, il ne pourra qu'accéder aux fichiers du vhost correspondant. Les autres sites hébergés sur d'autres vhosts resteront en sécurité. | ||
Ligne 470 : | Ligne 501 : | ||
UserDir public_html | UserDir public_html | ||
UserDir disabled root | UserDir disabled root | ||
<Directory /home/*/public_html> | <Directory /home/*/public_html> | ||
php_admin_value open_basedir ./ | php_admin_value open_basedir ./ | ||
AllowOverride FileInfo AuthConfig Limit | AllowOverride FileInfo AuthConfig Limit Indexes | ||
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec | Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec | ||
<Limit GET POST OPTIONS> | |||
Order allow,deny | |||
Allow from all | |||
</Limit> | |||
<LimitExcept GET POST OPTIONS> | |||
Order deny,allow | |||
Deny from all | |||
</LimitExcept> | |||
</Directory> | </Directory> | ||
</IfModule> | </IfModule> | ||
</nowiki></pre> | </nowiki></pre> | ||
Pour plus d'information : http://wiki.apache.org/httpd/SecuringPHP | Pour plus d'information : http://wiki.apache.org/httpd/SecuringPHP | ||
===SuExec=== | |||
<pre> | |||
aptitude install apache2-suexec | |||
a2enmod suexec | |||
/etc/init.d/apache2 restart | |||
</pre> | |||
<pre> | |||
<VirtualHost *:80> | |||
DocumentRoot /home/user/www | |||
ServerName domain.tld | |||
SuExecUserGroup user group | |||
</pre> | |||
Les scripts a executer devront être dans /var/www (sinon utilisez apache2-suexec-custom) | |||
===SuPHP=== | ===SuPHP=== | ||
Ligne 491 : | Ligne 549 : | ||
<pre>a2enmod suphp</pre> | <pre>a2enmod suphp</pre> | ||
Le fichier de configuration SuPHP de apache 2 est <code>/etc/apache2/mods-enabled/suphp.conf</code>. Le fichier de configuration de SuPHP est <code>/etc/suphp/suphp.conf</code>. Dans ce dernier fichier, adaptez la ligne <code>docroot=</code> afin qu'elle pointe sur le répertoire contenant le <code>DocumentRoot</code> de toutes les vhosts qui utiliseront SuPHP ( | Le fichier de configuration SuPHP de apache 2 est <code>/etc/apache2/mods-enabled/suphp.conf</code>. <br /> | ||
Le fichier de configuration de SuPHP est <code>/etc/suphp/suphp.conf</code>. Dans ce dernier fichier, adaptez la ligne <code>docroot=</code> afin qu'elle pointe sur le répertoire contenant le <code>DocumentRoot</code> de toutes les vhosts qui utiliseront SuPHP. Depuis debian squeeze, il est possible de spécifier un docroot correspondant au home respectif de chaque utilisateurs : | |||
<pre> | |||
docroot=${HOME}/ | |||
</pre> | |||
Notez que depuis debian squeeze, il est possible d'indiquer plusieurs docroot en les séparant par deux-points (:). | |||
Vous pouvez aussi y modifier l'umask (cela défini avec quels permissions les fichiers seront créés) en 0027. | |||
Modifiez le fichier <code>/etc/apache2/mods-enabled/php5.conf</code> comme suit : | Modifiez le fichier <code>/etc/apache2/mods-enabled/php5.conf</code> comme suit afin de n'activer le module php que dans <code>/srv/http/</code> : | ||
<pre><nowiki> | <pre><nowiki> | ||
<IfModule mod_php5.c> | <IfModule mod_php5.c> | ||
#Désactivé car casse la compatibilité avec suphp (petit bug de debian ;)) | |||
# <FilesMatch "\.ph(p3?|tml)$"> | |||
# SetHandler application/x-httpd-php | |||
# </FilesMatch> | |||
# <FilesMatch "\.phps$"> | |||
# SetHandler application/x-httpd-php-source | |||
# </FilesMatch> | |||
#Fix 1 pour réactiver php, mais ne fonctionne plus pour phpsysinfo | |||
# AddType application/x-httpd-php .php .phtml .php3 | |||
# AddType application/x-httpd-php-source .phps | |||
php_flag engine off | |||
#fix fonctionnant avec phpsysinfo | |||
<Directory /usr/share> | |||
<FilesMatch "\.ph(p3?|tml)$"> | |||
SetHandler application/x-httpd-php | |||
</FilesMatch> | |||
<FilesMatch "\.phps$"> | |||
SetHandler application/x-httpd-php-source | |||
</FilesMatch> | |||
</Directory> | |||
<Directory /srv/http> | <Directory /srv/http> | ||
php_flag engine on | php_flag engine on | ||
</Directory> | </Directory> | ||
</IfModule> | </IfModule> | ||
</nowiki></pre> | </nowiki></pre> | ||
Ligne 534 : | Ligne 623 : | ||
SuPHP ne permet pas l'utilisation de <code>php_admin_value</code> et il est donc impossible de définir open_basedir de cette manière pour les vhosts de /home. Pourtant, il peut-être pratique de limiter les fichiers accessibles en php (même si théoriquement, le principe de suPHP est largement suffisant). | SuPHP ne permet pas l'utilisation de <code>php_admin_value</code> et il est donc impossible de définir open_basedir de cette manière pour les vhosts de /home. Pourtant, il peut-être pratique de limiter les fichiers accessibles en php (même si théoriquement, le principe de suPHP est largement suffisant). | ||
Pour contourner ce problème, il faut définir un fichier de configuration php propre pour chaque vhost utilisant SuPHP. Il suffit d'ajouter dans le fichier de configuration de la vhost la directive <code>suPHP_ConfigPath</code> suivie du répertoire dans lequel le fichier <code>php.ini</code> personnalisé est présent. | Pour contourner ce problème, il faut définir un fichier de configuration php propre pour chaque vhost utilisant SuPHP. Il suffit d'ajouter dans le fichier de configuration de la vhost la directive <code>suPHP_ConfigPath</code> suivie du répertoire dans lequel le fichier <code>php.ini</code> personnalisé est présent. | ||
Par exemple, si le fichier de configuration de la vhost <code>blah. | Par exemple, si le fichier de configuration de la vhost <code>blah.domain.tld</code> ayant comme <code>documentroot /home/blah/www/</code> est <code>/home/blah/php.ini</code> il faut ajouter la directive <code>suPHP_ConfigPath /home/blah</code> (sans le / final !) dans le fichier de configuration de la vhost. | ||
Ce php.ini personnalisé peut être une copie conforme de <code>/etc/php5/cgi/php.ini</code> mais dans lequel vous pouvez définir <code>open_basedir = /home/blah/www/</code> par exemple. Si vous ne voulez pas que les utilisateurs puissent modifier leurs directives php, placez le fichier php.ini personnalisé dans un dossier auquel ils n'ont pas accès (n'oubliez pas que l'utilisateur www-data doit toujours pouvoir lire ce fichier). | Ce php.ini personnalisé peut être une copie conforme de <code>/etc/php5/cgi/php.ini</code> mais dans lequel vous pouvez définir <code>open_basedir = /home/blah/www/</code> par exemple. Si vous ne voulez pas que les utilisateurs puissent modifier leurs directives php, placez le fichier php.ini personnalisé dans un dossier auquel ils n'ont pas accès (n'oubliez pas que l'utilisateur www-data doit toujours pouvoir lire ce fichier). | ||
Ligne 546 : | Ligne 635 : | ||
</nowiki></pre> | </nowiki></pre> | ||
Notez que si vous utilisez <code>mod_userdir</code> il sera impossible d'exécuter les scripts php à cause de la directive <code>check_vhost_docroot=true</code> de SuPHP. Vous pouvez ajouter la directive <code>suPHP_Engine off</code> dans le fichier de configuration de <code>mod_userdir</code>. | Notez que si vous utilisez <code>mod_userdir</code> il sera impossible d'exécuter les scripts php à l'aide de suphp à cause de la directive <code>check_vhost_docroot=true</code> de SuPHP. Vous pouvez ajouter la directive <code>suPHP_Engine off</code> dans le fichier de configuration de <code>mod_userdir</code> : | ||
<pre> | |||
<IfModule mod_userdir.c> | |||
UserDir public_html | |||
UserDir disabled root | |||
<Directory /home/*/public_html> | |||
php_admin_value open_basedir ./ | |||
suPHP_Engine off | |||
N'oubliez pas de relancer apache2 après tout | AllowOverride FileInfo AuthConfig Limit Indexes | ||
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec | |||
<Limit GET POST OPTIONS> | |||
Order allow,deny | |||
Allow from all | |||
</Limit> | |||
<LimitExcept GET POST OPTIONS> | |||
Order deny,allow | |||
Deny from all | |||
</LimitExcept> | |||
</Directory> | |||
</IfModule> | |||
</pre> | |||
Si vous avez vraiment besoin de php avec mod_userdir, il faudra soit y activer le module php5, soit le module suphp en désactivant la vérification du docroot de suphp. | |||
N'oubliez pas de relancer apache2 après tout cela : | |||
<pre>/etc/init.d/apache2 restart</pre> | <pre>/etc/init.d/apache2 restart</pre> | ||
==suhosin== | |||
Depuis debian wheezy, les fonctionnalités de suhosin ont été mergées directement dans le coeur de php, le packet n'est par conséquent plus disponible. | |||
Sous debian squeeze, les modules php de apache (que ce soit mod_php5 ou mod_suphp) sont fournis par défaut avec le module de sécurité [http://www.hardened-php.net/suhosin/ suhosin] activé. Dans la majorité des cas, vous ne devriez pas en ressentir la présence. Si vous remarquez cependant des comportements anormaux (variable php perdus, ...), jetez un œil au fichier <code>/etc/php5/conf.d/suhosin.ini</code> qui contient la configuration par défaut de suhosin. Vous y trouverez peut-être votre bonheur. | |||
Dans le cadre de l'utilisation de suphp et si vous devez modifier des variables de suhosin, je vous recommande vivement de ne pas les modifier directement dans <code>/etc/php5/conf.d/suhosin.ini</code>, mais de copier les directives qui vous intéressent dans le fichier de configuration php personnalisé de la vhost qui pose problème. | |||
=Lancer les virtualhost selon un uid spécifique= | |||
Attention cette méthode n'est pas compatible avec suphp ! Il vous faudrautiliser le module php5 classique. | |||
<pre>aptitude install apache2-mpm-itk</pre> | |||
Puis dans chaque virtualhost : | |||
<pre>AssignUserId user group</pre> | |||
Dans le cas présent, vous n'aurez plus besoin d'ajouter les utilisateurs au groupe <code>www-data</code> | |||
Il n'est cependant pas possible de définir un fichier de configuration php par vhost (y compris avec phpinidir). Vous devrez donc passer par php_admin_value. | |||
=Contrôle d'accès via .htaccess, .htpasswd et .htgroup= | =Contrôle d'accès via .htaccess, .htpasswd et .htgroup= | ||
Ligne 556 : | Ligne 690 : | ||
C'est le monde d'authentification le plus fréquemment utilisé. Dans ce mode, le login et le mot-de-passe transitent en clair sur le réseau. | C'est le monde d'authentification le plus fréquemment utilisé. Dans ce mode, le login et le mot-de-passe transitent en clair sur le réseau. | ||
Nous allons voir comment sécuriser le dossier <code>/srv/http/admin. | Nous allons voir comment sécuriser le dossier <code>/srv/http/admin.domain.tld/</code> qui correspond à la vhost <code>http://admin.domain.tld/</code>. | ||
L'outil <code>htpasswd</code> permet de créer le fichier contenant les mot-de-passes. | L'outil <code>htpasswd</code> permet de créer le fichier contenant les mot-de-passes. | ||
Nous allons commencer par créer le fichier avec un utilisateur par défaut nommé pfoo : | Nous allons commencer par créer le fichier avec un utilisateur par défaut nommé pfoo : | ||
<pre> | <pre> | ||
$ htpasswd -cs /srv/http/admin. | $ htpasswd -cs /srv/http/admin.domain.tld/.htpasswd pfoo | ||
Adding password for pfoo | Adding password for pfoo | ||
New password: | New password: | ||
Ligne 569 : | Ligne 703 : | ||
Une fois le fichier créé, vous pouvez ajouter des utilisateurs ou modifier des utilisateurs existant avec la même commande mais sans l'option -c : | Une fois le fichier créé, vous pouvez ajouter des utilisateurs ou modifier des utilisateurs existant avec la même commande mais sans l'option -c : | ||
<pre> | <pre> | ||
$ htpasswd -s /srv/http/admin. | $ htpasswd -s /srv/http/admin.domain.tld/.htpasswd plop | ||
Adding user plop | Adding user plop | ||
New password: | New password: | ||
Ligne 581 : | Ligne 715 : | ||
</pre> | </pre> | ||
Il faut ensuite créer le fichier <code>/srv/http/admin. | Il faut ensuite créer le fichier <code>/srv/http/admin.domain.tld/.htaccess</code>. | ||
* Pour que tous les utilisateurs valides (qui sont présent dans le <code>.htpasswd</code>) aient accès au dossier : | * Pour que tous les utilisateurs valides (qui sont présent dans le <code>.htpasswd</code>) aient accès au dossier : | ||
<pre><nowiki> | <pre><nowiki> | ||
AuthUserFile /srv/http/admin. | AuthUserFile /srv/http/admin.domain.tld/.htpasswd | ||
AuthGroupFile /dev/null | AuthGroupFile /dev/null | ||
AuthName "Accès Restreint" | AuthName "Accès Restreint" | ||
AuthType Basic | AuthType Basic | ||
require valid-user | |||
</nowiki></pre> | </nowiki></pre> | ||
* Accès pour l'utilisateur pfoo uniquement : | * Accès pour l'utilisateur pfoo uniquement : | ||
<pre><nowiki> | <pre><nowiki> | ||
AuthUserFile /srv/http/admin. | AuthUserFile /srv/http/admin.domain.tld/.htpasswd | ||
AuthGroupFile /dev/null | AuthGroupFile /dev/null | ||
AuthName "Accès Restreint" | AuthName "Accès Restreint" | ||
AuthType Basic | AuthType Basic | ||
require user pfoo | |||
</nowiki></pre> | </nowiki></pre> | ||
* Accès au groupe admin uniquement : | * Accès au groupe admin et uniquement pour les GET et POST : | ||
<pre><nowiki> | <pre><nowiki> | ||
AuthUserFile /srv/http/admin. | AuthUserFile /srv/http/admin.domain.tld/.htpasswd | ||
AuthGroupFile /srv/http/admin. | AuthGroupFile /srv/http/admin.domain.tld/.htgroup | ||
AuthName "Accès Restreint" | AuthName "Accès Restreint" | ||
AuthType Basic | AuthType Basic | ||
Ligne 619 : | Ligne 749 : | ||
Pour palier à ce problème de sécurité il existe l'authentification digest. Ce type d'authentification utilise l'algorithme de hash md5 ce qui rend impossible de remonter aux informations de départ (à savoir, le login et le mot-de-passe). Afin d'éviter qu'un pirate puisse réutiliser le login/password hashé, un "nonce" est transmit par le serveur puis ajouté par le client au hashé lors de la réponse ce qui rend ainsi le hashé unique. | Pour palier à ce problème de sécurité il existe l'authentification digest. Ce type d'authentification utilise l'algorithme de hash md5 ce qui rend impossible de remonter aux informations de départ (à savoir, le login et le mot-de-passe). Afin d'éviter qu'un pirate puisse réutiliser le login/password hashé, un "nonce" est transmit par le serveur puis ajouté par le client au hashé lors de la réponse ce qui rend ainsi le hashé unique. | ||
Pour utiliser cette fonction, les modules <code>auth_digest</code> et <code>authn_file</code> de apache doivent être activés | Pour utiliser cette fonction, les modules <code>auth_digest</code> et <code>authn_file</code> de apache doivent être activés : | ||
<pre>a2enmod authn_file auth_digest</pre> | |||
L'outil <code>htdigest</code> permet de créer un fichier <code>.htpasswd</code> utilisant cette méthode d'authentification. | L'outil <code>htdigest</code> permet de créer un fichier <code>.htpasswd</code> utilisant cette méthode d'authentification. | ||
Pour créer un tel fichier : | Pour créer un tel fichier : | ||
<pre>htdigest -c /srv/http/admin. | <pre>htdigest -c /srv/http/admin.domain.tld/.htpasswd realm username</pre> | ||
Comme avant, si le fichier existe déjà, supprimez l'argument -c | Comme avant, si le fichier existe déjà, supprimez l'argument -c | ||
Ligne 634 : | Ligne 765 : | ||
AuthDigestDomain / | AuthDigestDomain / | ||
AuthDigestProvider file | AuthDigestProvider file | ||
AuthUserFile /srv/http/admin. | AuthUserFile /srv/http/admin.domain.tld/.htpasswd | ||
AuthGroupFile /srv/http/admin. | AuthGroupFile /srv/http/admin.domain.tld/.htgroup | ||
Require valid-user | Require valid-user | ||
</pre> | </pre> | ||
Comme vous pouvez le voir, <code>AuthName</code> doit correspondre au <code>realm</code> fourni avec <code>htdigest</code>. | Comme vous pouvez le voir, <code>AuthName</code> doit correspondre au <code>realm</code> fourni avec <code>htdigest</code>. | ||
=Monitorer apache avec apachetop= | |||
<code>apachetop</code> permet d'analyser facilement les requêtes servies par votre serveur apache en analysant les fichiers de log. | |||
<pre>aptitude install apachetop</pre> | |||
Par défaut, <code>apachetop</code> utilise les données de <code>/var/log/apache/access.log</code>. Vous pouvez spécifier un autre fichier de log avec l'option <code>-f</code>. |