Depuis quelques jours, je suis l’heureux locataire d’un serveur Kimusfi 16G, qui vient remplacer mon ancien Kimsufi 8G : 10€ de moins par mois pour deux fois plus de RAM et un CPU deux fois plus puissant, difficile de résister… J’en profite donc pour vous proposer un petit guide de configuration et de sécurisation pour pouvoir exploiter sereinement une telle machine.
Attention, je précise quand même que par « sécurisation », je n’ai pas la prétention de dire que la machine sera à toute épreuve. Les quelques réglages de sécurité que je vous propose ici sont à voir comme un strict minimum à mettre en place, pour un serveur n’hébergeant pas de sites commerciaux. Une sécurité plus poussée est recommandée pour des usages commerciaux, notamment en isolant chaque site avec un utilisateur « virtuel » (n’ayant pas d’accès shell) dédié.
Dans de futurs articles, je vous proposerais également divers scripts utiles pour la gestion quotidienne du serveur.
Les paramétrages à effectuer nécessitent souvent d’aller modifier des fichiers de configuration. Dans cet article, je vous indiquerais autant que possible dès commandes permettant d’aller effectuer directement ces modifications, sans ouvrir manuellement les fichiers concernés.
Choix de l’OS
La première étape de l’installation (au moment de la commande, mais ça peut être changé par la suite) est le choix de l’OS. Sur mes premiers serveurs dédiés, en 2006, j’utilisais des systèmes faits pour de l’hébergement de site web, avec une interface web permettant de déclarer des sites, des comptes FTP, de créer des comptes mails, etc… Mais depuis qu’une faille dans un de ces outils (VHCS2) a été le point d’entrée d’un pirate pour effacer tout le contenu de mon serveur, je suis plutôt devenu un adepte des distributions « nues », quitte à faire les choses un peu moins proprement sur certains points (par exemple, je ne crée plus un accès FTP par site, je transfère mes fichiers via un accès SCP/SFTP, et je n’héberge plus mes mails sur le même serveur). Je trouve également l’administration d’une distribution « nue » plus intéressante, car plus souple, même si en contrepartie c’est un peu plus chronophage.
Ce guide s’adresse essentiellement à ceux qui auront également opté pour une distribution « nue ».
Parmi la quinzaine de distributions proposées par OVH, mon choix s’est porté sur une Ubuntu 12.04 LTS, comme sur mon serveur précédent, par habitude. Si vous préférez une autre distribution, les grandes lignes de ce guide s’appliqueront tout de même, mais pourront nécessiter quelques adaptations (par exemple, pour les chemins d’accès des fichiers de configuration).
Création d’un compte utilisateur
Par défaut, le serveur est livré avec simplement un compte root. Pour éviter de se connecter en root quand les droits ne sont pas nécessaires, créez un compte utilisateur :
1 |
root@serveur:~$ adduser <login> |
Ajoutez le ensuite au groupe admin, ce qui lui donnera le droit d’utiliser sudo pour exécuter des commandes avec les droits root :
1 |
root@serveur:~$ usermod -a -G admin <login> |
Si le groupe admin n’existe pas, vous pouvez le créer avec cette commande :
1 |
root@serveur:~$ groupadd admin |
Installation de LAMP
La base classique d’un serveur Linux destiné à héberger des sites web, c’est le trio Apache–MySQL–PHP. Personnellement, j’ai décidé depuis quelques temps de remplacer MySQL par MariaDB. Il s’agit d’un fork non contrôlé par Oracle de MySQL, entièrement compatible avec ce dernier.
Installation de MariaDB
Par défaut, Ubuntu est prévu pour utiliser MySQL. Pour installer MariaDB, il faut donc tout d’abord ajouter à APT un dépôt contenant MariaDB :
1 2 3 4 5 6 7 |
root@serveur:~$ echo "# MariaDB repository list - created 2012-07-11 21:37 UTC # http://downloads.mariadb.org/mariadb/repositories/ deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntu precise main deb-src http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntu precise main" > /etc/apt/sources.list.d/MariaDB.list root@serveur:~$ apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db root@serveur:~$ aptitude update root@serveur:~$ apt-cache policy mysql-common |
Si tout va bien, la dernière commande devrait vous avoir répondu quelque chose comme ça :
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql-common: Installé : (aucun) Candidat : 5.5.32+maria-1~precise Table de version : 5.5.32+maria-1~precise 0 500 http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntu/ precise/main amd64 Packages 100 /var/lib/dpkg/status 5.5.32-0ubuntu0.12.04.1 0 500 http://ubuntu.mirrors.ovh.net/ftp.ubuntu.com/ubuntu/ precise-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu/ precise-security/main amd64 Packages 5.5.22-0ubuntu1 0 500 http://ubuntu.mirrors.ovh.net/ftp.ubuntu.com/ubuntu/ precise/main amd64 Packages |
Il n’y a alors plus qu’à procéder à l’installation avec apt-get :
1 |
root@serveur:~$ apt-get install libmariadbclient-dev libmariadbclient18 libmariadbd-dev libmysqlclient18 mariadb-client mariadb-client-5.5 mariadb-client-core-5.5 mariadb-common mariadb-server mariadb-server-5.5 mariadb-server-core-5.5 mariadb-test mariadb-test-5.5 mysql-common |
Installation d’Apache 2
En plus du serveur Apache de base, je vous recommande d’installer le module suEXEC. Celui-ci permet de demander à Apache d’exécuter les scripts CGI d’un utilisateur avec les droits de cet utilisateur plutôt qu’avec les droits standards d’Apache, pour améliorer un peu la sécurité.
1 |
root@serveur:~$ apt-get install apache2 apache2-suexec |
Installation de PHP5
Il existe une version de PHP optimisée pour une meilleur sécurité, baptisée Suhosin. La plupart des applications PHP fonctionnent sans problème avec cette version, donc sauf besoin particulier, installez Suhosin plutôt que le PHP standard. Installez également les extensions MySQL, XCache (pour améliorer les performances) et toutes les extensions dont vous pourriez avoir besoin. Par exemple, j’installe également cURL, qui permet d’effectuer des requêtes vers des serveurs distants et GD, pour manipuler des images. Ces deux extensions sont très couramment nécessaires pour les CMS en PHP.
1 |
root@serveur:~$ apt-get install php5 php5-suhosin php5-mysql php5-curl php5-gd php5-xcache php5-tidy |
Outils de sécurité
Outre la sécurisation « passive » de votre serveur, qui se fait via une configuration adaptée, une sécurisation « active » ne peut pas faire de mal. Pour ce faire, installez Fail2ban et RKHunter :
1 |
root@serveur:~$ apt-get install rkhunter fail2ban |
RKHunter est un scanner anti-malware, qui vérifie de nombreux fichiers systèmes pour y traquer des anomalies.
Fail2ban se charge pour sa part de surveiller différents fichiers journaux pour bloquer les attaques en bruteforce. Il peut par exemple détecter qu’une IP distante fait de nombreuses tentatives de connexion SSH, et il bloquera alors cette IP au niveau du pare-feu iptables.
Si cette installation déclenche l’installation de postfix, laissez le en configuration par défaut (Internet site).
Autres outils
En vrac, quelques autres outils utiles que j’installe sur mes serveurs :
1 |
root@serveur:~$ apt-get install heirloom-mailx proftpd optipng jpegoptim yui-compressor p7zip-full links dos2unix debian-goodies daemon |
Aucun de ces outils n’est lié à la sécurité.
mailx permet d’envoyer des mails en ligne de commande (je l’utilise pour l’envoi de rapports avec certains de mes scripts d’administration).
ProFTPD est un serveur FTP. J’utilise principalement SCP/SFTP pour mes transferts de fichiers, mais FTP peut parfois être nécessaire (par exemple, depuis un réseau bloquant le SSH, ou encore pour les mises à jours et les installations d’extensions dans WordPress).
OptiPNG et jpegoptim sont utilisés par mon script d’optimisation du poids des images.
YUI Compressor est utilisé par mon script d’optimisation du poids des fichiers JS et CSS.
7-Zip me sert notamment pour la création de backups compressés.
dos2unix permet de convertir les retours à la ligne CR/LF d’un fichier texte au format DOS en retours à la ligne LF au format Unix.
links est un navigateur web en mode texte.
Sécurisation de SSH
La configuration par défaut de SSH manque souvent un peu de sécurité… Voici quelques règles à appliquer pour la renforcer.
- Interdire la connexion directe en root.
ATTENTION : n’interdisez pas la connexion en root si vous n’avez pas encore créé d’autre compte utilisateur !
Pour ce faire, passez la valeur de PermitRootLogin à no dans /etc/ssh/sshd_config :
1 |
root@serveur:~$ sed -i /etc/ssh/sshd_config -e "s/^PermitRootLogin .*$/PermitRootLogin no/" |
- Modifier le port par défaut (22). Pour ce faire, modifiez la valeur de Port dans /etc/ssh/sshd_config (222 dans cet exemple) :
1 |
root@serveur:~$ sed -i /etc/ssh/sshd_config -e "s/^Port .*$/Port 222/" |
Pour encore plus de sécurité, vous pouvez également générer des clés d’authentification et désactiver l’authentification par mot de passe, mais sauf gros impératif de sécurité, je ne vous le conseille pas, car cette solution est parfois un peu trop contraignante (impossible de vous connecter depuis un autre ordinateur que le votre si vous n’avez pas pensé à emmener votre clé avec vous…). Si vous y tenez quand même, je vous laisse chercher comment faire dans votre moteur de recherche favori 🙂
Une fois la configuration effectuée, redémarrez le serveur SSH, mais NE VOUS DÉCONNECTEZ PAS. Il est en effet important de tester si la nouvelle configuration fonctionne correctement avant de vous déconnecter, sinon vous risquez de perdre l’accès au serveur.
1 |
root@serveur:~$ service ssh restart |
Pour vérifier que tout fonctionne correctement, ouvrez simplement une autre session SSH. Si vous y arrivez, vous pouvez sereinement fermer la première.
Configuration et sécurisation d’Apache
Note : ce paragraphe traite uniquement de la configuration globale du serveur, je traiterais plus loin la configuration d’un site.
Par défaut, Apache indique dans les en-têtes des réponses qu’il renvoie aux clients diverses informations, dont son numéro de version (Server: Apache/2.0.0 (Ubuntu)). Ces informations peuvent aider un pirate à mieux cibler ses attaques, en visant les failles connues pour une version donnée. Pour remplacer ces informations par un simple Apache, sans plus de précision, passez la valeur de ServerTokens à Prod dans /etc/apache2/conf.d/security :
1 |
root@serveur:~$ sed -i /etc/apache2/conf.d/security -e "s/^ServerTokens.*/ServerTokens Prod/" |
Désactivez également la signature en bas des pages d’erreur 404 et cie, en passant la valeur de SeverSignature à Off dans ce même fichier :
1 |
root@serveur:~$ sed -i /etc/apache2/conf.d/security -e "s/^ServerSignature.*/ServerSignature Off/" |
Pour finir, activez les modules suEXEC et rewrite. Ils serviront plus tard pour la configuration des sites.
1 2 3 |
root@serveur:~$ a2enmod suexec root@serveur:~$ a2enmod rewrite root@serveur:~$ a2enmod headers |
Configuration et sécurisation de PHP
PHP Suhosin est normalement suffisamment sûr dans sa configuration de base, si ce n’est que, comme Apache, il est un peu bavard dans les en-têtes HTTP (X-Powered-By: PHP/5.0.0-1ubuntu1.0). Faites le taire en passant expose_php à Off dans /etc/php5/apache2/php.ini :
1 |
root@serveur:~$ sed -i /etc/php5/apache2/php.ini -e "s/^expose_php.*$/expose_php = Off/" |
Il peut également être utile de modifier trois paramètres de PHP dont les valeurs par défaut sont parfois un peu faibles :
- la taille maximale d’une instance de script (memory_limit, 128 Mo par défaut) en mémoire. Les 128 Mo peuvent être insuffisants pour certaines applications un peu lourdes (n’est ce pas Ptit_boeuf ? :p).
- la taille maximale d’un fichier uploadé (upload_max_size, 2 Mo). Vraiment trop petit si vous hébergez par exemple un CMS sur lequel vous publiez des photos en haute qualité.
- la taille maximale des données passées en POST (post_max_size, 2 Mo). Comme les fichiers uploadés passent par la méthode POST, post_max_size doit valoir au moins autant que upload_max_size.
Pour ma part, je les positionne respectivement à 512 Mo, 32 Mo et 32 Mo :
1 2 3 |
root@serveur:~$ sed -i /etc/php5/apache2/php.ini -e "s/^memory_limit.*$/memory_limit = 512M/" root@serveur:~$ sed -i /etc/php5/apache2/php.ini -e "s/^post_max_size.*$/post_max_size = 32M/" root@serveur:~$ sed -i /etc/php5/apache2/php.ini -e "s/^upload_max_filesize.*$/upload_max_filesize = 32M/" |
Il faut également créer pour PHP un répertoire temporaire appartenant à www-data, qui servira notamment pour les uploads de fichier, puis renseigner son emplacement dans upload_tmp_dir :
1 2 3 4 |
root@serveur:~$ mkdir -p /usr/share/php/tmp root@serveur:~$ chown www-data:www-data /usr/share/php/tmp root@serveur:~$ chmod 775 /usr/share/php/tmp root@serveur:~$ sed -i /etc/php5/apache2/php.ini -e "s/^[#;]\?upload_tmp_dir.*$/upload_tmp_dir = \/usr\/share\/php\/tmp/" |
Pour aller encore un peu plus loin, on pourrait également installer le module Apache suPHP, qui permet de spécifier le couple utilisateur/groupe sous lequel vont s’exécuter les scripts PHP, mais l’impact de cette solution est non négligeable (PHP ne s’exécute alors plus en tant que module Apache, mais en tant que CGI) et me semble personnellement un peu lourd compte tenu de mon usage.
Sécurisation de ProFTPd
Par défaut, ProFTPd donne à chaque utilisateur l’accès à l’ensemble du système de fichier, dans la limite des droits Unix définis à ce niveau. Il est préférable de restreindre chaque utilisateur à son répertoire home. Ça se passe du côté de /etc/proftpd/proftpd.conf en dé-commentant la ligne DefaultRoot :
1 |
root@serveur:~$ sed -i /etc/proftpd/proftpd.conf -e "s/^# DefaultRoot/DefaultRoot/" |
Voir aussi cette page pour vous prémunir d’une faille de sécurité avec la configuration par défaut de ProFTPd sous Ubuntu.
Configuration de RKHunter
Au niveau de RKHunter, il n’y a pas grand chose à faire. Commencez par mettre à jour sa base de signatures :
1 |
root@serveur:~$ rkhunter --propupd |
Cette opération devra être effectuée après chaque installation ou mise à jour de paquet.
Ensuite, modifiez simplement le fichier /etc/default/rkhunter pour activer l’exécution quotidienne (CRON_DAILY_RUN), la mise à jour hebdomadaire de la base de données (CRON_DB_UPDATE) et l’adresse mail de destination des rapports (REPORT_EMAIL) :
1 2 3 |
root@serveur:~$ sed -i /etc/default/rkhunter -e "s/^CRON_DAILY_RUN.*/CRON_DAILY_RUN=\"yes\"/" root@serveur:~$ sed -i /etc/default/rkhunter -e "s/^CRON_DB_UPDATE.*/CRON_DB_UPDATE=\"yes\"/" root@serveur:~$ sed -i /etc/default/rkhunter -e "s/^REPORT_EMAIL.*/REPORT_EMAIL=\"nom@domaine.tld\"/" |
En configuration par défaut, RKHunter produira systématiquement quelques warning, que vous pouvez éliminer en ajoutant quelques lignes à /etc/rkhunter.conf :
1 2 3 4 5 |
root@serveur:~$ echo " SCRIPTWHITELIST=/usr/bin/unhide.rb ALLOWHIDDENDIR=\"/etc/.java\" ALLOWHIDDENDIR=\"/dev/.udev\" " >> /etc/rkhunter.conf |
Configuration de Fail2ban
La configuration de Fail2ban se fait dans le fichier /etc/fail2ban/jail.conf. Il faut y activer les « jail » que vous souhaitez. De mon côté, j’ai activé les jail ssh, ssh-ddos, apache, apache-noscript, apache-overflows et proftpd. Pour activer ces jail, cherchez leur nom entre crochets dans le fichier jail.conf et assurez vous que la section correspondante contient une ligne « enabled = true« . Pensez également à modifier le paramètre port des jails ssh et ssh-ddos, pour y mettre le numéro de port que vous avez affecté à votre serveur SSH.
Je vous recommande également de changer l’adresse mail de destination des rapports et d’activer l’envoi systématique de rapports détaillé lorsqu’un comportement suspect est bloqué (c’est toujours bien de savoir ce qu’il se passe, et au pire, si vous trouvez que ça vous fait trop de mail, vous pourrez toujours le désactiver plus tard). L’adresse mail se règle avec le paramètre destemail et l’action par défaut avec le paramètre action (%(action_)s pour un simple ban sans mail, %(action_mw)s pour un mail simple et %(action_mwl)s pour un mail contenant en plus l’extrait de fichier journal qui a déclenché le ban).
1 2 |
root@serveur:~$ sed -i /etc/fail2ban/jail.conf -e "s/^destemail.*/destemail = nom@domaine.tld/" root@serveur:~$ sed -i /etc/fail2ban/jail.conf -e "s/^action.*/action = %(action_mwl)s/" |
Configuration du firewall
Ça peut paraitre surprenant, mais par défaut, les pares-feu iptables (IPv4) et ip6tables (IPv6) ne bloquent absolument rien, et ses règles de filtrage sont perdues à chaque redémarrage de la machine.
Pour le configurer, il faut donc créer un script exécutant toutes les commandes nécessaires à la mise en place des filtres. Voici le script que j’utilise (inspiré de celui de Zemanta) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#!/bin/bash SSH_PORT=222 function iptables_v4_v6 { iptables "$@" ip6tables "$@" } # Réinitialisation d'iptables if [ "$1" == "reset" ]; then iptables_v4_v6 -F iptables_v4_v6 -X iptables_v4_v6 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables_v4_v6 -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables_v4_v6 -t mangle -F iptables_v4_v6 -t mangle -X iptables_v4_v6 -P INPUT ACCEPT iptables_v4_v6 -P FORWARD ACCEPT iptables_v4_v6 -P OUTPUT ACCEPT exit fi # Si les règles sont déjà appliquées, on ne rejoue le script que si le paramètre force est passé iptables -L | grep ACCEPT | grep ${SSH_PORT} > /dev/null if [ "$?" == "0" ] && [ "$1" != "force" ]; then exit fi # Reset des filtres iptables_v4_v6 -t filter -F iptables_v4_v6 -t filter -X # Blocage général pour les nouvelles connexions iptables_v4_v6 -t filter -P INPUT DROP iptables_v4_v6 -t filter -P FORWARD DROP iptables_v4_v6 -t filter -P OUTPUT DROP iptables_v4_v6 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables_v4_v6 -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Autorisation de tout le traffic sur l'interface loopback iptables_v4_v6 -t filter -A INPUT -i lo -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -o lo -j ACCEPT # Autorisation du ping iptables_v4_v6 -t filter -A INPUT -p icmp -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p icmp -j ACCEPT # Autorisation du SSH entrant et sortant iptables_v4_v6 -t filter -A INPUT -p tcp --dport ${SSH_PORT} -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport ssh -j ACCEPT # Autorisation du DNS sortant iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport domain -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p udp --dport domain -j ACCEPT # Autorisation du NTP sortant iptables_v4_v6 -t filter -A OUTPUT -p udp --dport ntp -j ACCEPT # Autorisation du HTTP/HTTPS entrant et sortant iptables_v4_v6 -t filter -A INPUT -p tcp --dport http -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport http -j ACCEPT iptables_v4_v6 -t filter -A INPUT -p tcp --dport https -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport https -j ACCEPT # Autorisation du FTP entrant et sortant iptables_v4_v6 -t filter -A INPUT -p tcp --dport ftp-data -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport ftp-data -j ACCEPT iptables_v4_v6 -t filter -A INPUT -p tcp --dport ftp -j ACCEPT iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport ftp -j ACCEPT # Autorisation du SMTP sortant iptables_v4_v6 -t filter -A OUTPUT -p tcp --dport smtp -j ACCEPT |
Copiez le dans un fichier iptables.sh (en modifiant éventuellement le port SSH à la seconde ligne) puis exécutez le :
1 2 |
root@serveur:~$ chmod +x iptables.sh root@serveur:~$ ./iptables.sh |
Ouvrez une nouvelle session SSH (sans fermer la première !) pour vous assurer que la connexion fonctionne. Si ce n’est pas le cas, revenez à la première session et réinitialisez iptables :
1 |
root@serveur:~$ ./iptables.sh reset |
Si ça ne marche toujours pas, pas de panique : comme iptables perd les règles au démarrage, il suffit de faire un hard reboot de la machine depuis la console de gestion de votre hébergeur.
Une fois que vous aurez un fichier de règles pleinement fonctionnel, il ne vous restera plus qu’à configurer son activation en cas de redémarrage de la machine. Pour ce faire, il y a deux possibilités :
- l’exécuter automatiquement au démarrage :
1 2 |
root@serveur:~$ cp -p iptables.sh /etc/init.d/iptables.sh root@serveur:~$ update-rc.d iptables.sh defaults |
- l’exécuter automatiquement à intervalles régulier via cron (les règles ne seront appliquées que si elles ne l’ont pas encore été) :
1 |
root@serveur:~$ crontab -e |
Puis ajoutez cette ligne, pour une exécution toutes les heures :
1 |
0 * * * * /root/iptables.sh |
La première solution est bien entendu la plus propre et la plus sûre, puisque le serveur démarre directement avec le firewall actif. Par contre, en cas de problème, il faudra démarrer le serveur en mode rescue pour aller éditer le fichier…
La seconde solution permet de se contenter d’un simple hard reboot, car après le démarrage les règles n’entreront pas en vigueur immédiatement.
Une fois le fichier en place, vous pourrez également l’enrichir au fil du temps, par exemple pour bloquer « définitivement » une IP au comportement indésirable. Voici les commandes à exécuter puis ajouter au fichier pour bloquer respectivement une IPv4 et une IPv6 :
1 2 |
root@serveur:~$ iptables -I INPUT -s 88.190.22.223 -j DROP root@serveur:~$ ip6tables -I INPUT -s 2a01:e0b:1000:22:be30:5bff:fed4:2e54 -j DROP |
Voilà, normalement si vous êtes arrivés jusque là, vous avez désormais un serveur prêt à héberger vos sites avec un minimum de sécurité. Il ne reste donc plus qu’à configurer votre Apache pour vos sites.
Configurer un site dans Apache
Pour ce faire, commencez par créer un répertoire pour chacun des sites que vous comptez héberger. Par exemple, vous pouvez créer dans le répertoire home de votre utilisateur un dossier www qui contiendra un sous-dossier pour chaque site hébergé :
1 2 3 |
user@serveur:~$ cd ~ user@serveur:~$ mkdir www user@serveur:~$ mkdir www/site1 www/site2 www/site3 |
Pour chaque site, créez un fichier dans /etc/apache2/sites-available sur le modèle suivant, à adapter éventuellement si vous avez des besoins spécifiques :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<VirtualHost *:80> <IfModule suexec_module> SuexecUserGroup user user </IfModule> ServerAdmin webmaster@monpremiersite.fr DocumentRoot /home/user/www/site1 ServerName monpremiersite.fr ServerAlias *.monpremiersite.fr <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} !^www.monpremiersite.fr$ [NC] RewriteRule ^(.*) http://www.monpremiersite.fr/$1 [L,R] </IfModule> <Directory /home/user/www/site1> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> <IfModule mod_php5.c> php_admin_value open_basedir "/home/user/www/site1/:/usr/share/php/" </IfModule> </VirtualHost> |
Ce fichier permet de déclarer un VirtualHost associé à un nom de domaine ou de sous-domaine (ServerName) et dont les scripts seront exécutés avec les droits de user.
L’instruction ServerAlias permet d’accepter également les sous-domaine du ServerName. Dans cet exemple, le site sera accessible aussi bien via http//monpremiersite.fr que via http://www.monpremiersite.fr ou http://nimporteque.monpremiersite.fr (à condition bien sûr que la configuration DNS de ces sous-domaines pointe vers l’IP du serveur).
Le bloc suivant utilise le module rewrite pour rediriger les accès faits via tous les domaines autorisés par ServerName et ServerAlias vers une adresse principale. Un utilisateur se rendant sur http://nimporteque.monpremiersite.fr sera automatiquement redirigé vers http://www.monpremiersite.fr. Ceci permet d’éviter que le contenu de votre site soit référencé par des moteurs de recherche sous les deux adresses différentes, ce qui pourrait être néfaste pour le classement (le moteur pouvant considérer qu’il s’agit de contenu dupliqué).
Le bloc Directory définit les droits pour les accès aux fichiers du site. Dans cet exemple, on interdit le listing des répertoires (se rendre sur http://www.monpremiersite.fr/dossier/ renverra une erreur 403 si dossier ne contient pas de fichier index.php ou index.html, au lieu de lister le contenu de dossier), on autorise les liens symboliques, on interdit la surcharge des options (les fichiers .htaccess ne seront pas pris en compte, si vous en avez besoin utilisez AllowOverride All, mais ceci réduit légèrement les performances) et on autorise l’accès à tous les fichiers.
Enfin le dernier bloc permet de restreindre les droits d’accès des scripts PHP, pour ne les autoriser à ouvrir que des fichiers présents dans l’arborescence du site ou dans l’arborescence partagée de PHP.
Une fois les fichiers de tous les sites en place, activez les :
1 2 3 4 |
user@serveur:~$ sudo a2ensite <nom_fichier_site_1> user@serveur:~$ sudo a2ensite <nom_fichier_site_2> user@serveur:~$ sudo a2ensite <nom_fichier_site_3> user@serveur:~$ sudo service apache2 reload |
Voilà, c’est tout pour ajourd’hui. Merci à vous si vous d’être allé jusqu’au bout de cet article et rendez-vous pour la suite (mes scripts en tous genres pour la gestion du serveur) dans les prochains jours ou semaines.
beau travail, comment fait-on pour ajouter un bloc wordpress svp?
Avec le serveur tel que configuré dans cet article, tous les prérequis pour WordPress sont installés, donc il y a juste à suivre la doc d’installation officielle : http://fr.wordpress.org/txt-install/