apt-get update && apt-get install apache2
Après l'installation le serveur est fonctionnel. Si tout s'est bien passé, en tapant dans son navigateur ''http://192.168.x.xx/'', il doit s'afficher ceci:
It works!
This is the default web page for this server.
The web server software is running but no content has been added, yet.
===Comment apache est-il configuré ? ===
Afin de comprendre la mise en place d'un site web avec apache2, on va détailler la configuration par défaut d'apache.\\
* Le répertoire /etc/apache2
L'installation d'apache a mis en place sur le système plusieurs sous-répertoires de /etc/apache2.
cd /etc/apache2/ && ls
cd /etc/apache2/sites-available/ && less default
cd /var/www && ls
less index.html
This is the default web page for this server.
The web server software is running but no content has been added, yet.
cd /etc/apache2/sites-enabled/ && ls
ls -l /etc/apache2/sites-enabled/000-default
mkdir -p /var/www/monsite.com/public_html
* On attribue à root les fichiers nouvellement créés :
chown -R $USER:$USER /var/www/monsite.com/public_html
* On change les droits pour que le site puisse être lu par tous :
chmod -R 755 /var/www
* On crée sa première page index.html
vim /var/www/monsite.com/public_html/index.html
Contenant par exemple le code suivant:
La mise en place d'un Virtualhost est réussie !
cp /etc/apache2/sites-available/default /etc/apache2/sites-available/monsite.com
vim /etc/apache2/sites-available/monsite.com
On inscrit ceci :
a2ensite monsite.com
* Prendre en compte les modifications effectuées en redémarrant Apache :
service apache2 reload
* Vérification :
Dans le navigateur : **''http://192.168.x.xx/monsite.com''**
Index of /monsite.com
[ICO] Name Last modified Size Description
[DIR] Parent Directory -
[DIR] public_html/ 19-Sep-2014 16:38 -
Apache/2.2.22 (Debian) Server at 192.168.x.xx Port 80
Si on clique sur ''public_html/'' on voit un problème d'encodage :
Bravo !
La mise en place d'un Virtualhost est réussie !
Cela va être vite corrigé !
====Solutionner le problème d'encodage ====
On va forcer l'encodage au niveau du serveur apache. Il suffit que tous les fichiers utilisent le même encodage utf8.
* Mais avant vérifions les locales générées sur le système.
Elles apparaissent quand on tape la commande :
grep -v "^#" /etc/locale.gen
vim /etc/apache2/conf.d/charset
On dé-commente la ligne ''#AddDefaultCharset UTF-8''
AddDefaultCharset UTF-8
Et on enregistre !
* Corriger le fichier /etc/apache2/envvars :
vim /etc/apache2/envvars
Pour dé-commanter la ligne ''. /etc/default/locale''
## Uncomment the following line to use the system default locale instead:
. /etc/default/locale
* Faire prendre en compte les modifications à apache2 :
service apache2 reload
* Vider le cache du navigateur :
Par exemple, avec iceweasel :\\
''Historique -> Supprimer l'historique récent''
Et quand on recharge la page le problème est réglé :
Bravo !
La mise en place d'un Virtualhost est réussie !
===== Installer le module php=====
===Installer libapache2-mod-php5 ===
Ce paquet casse le MPM worker(([[http://httpd.apache.org/docs/2.2/mod/worker.html]])) et engendre l'installation du MPM prefork(([[http://httpd.apache.org/docs/2.2/mod/prefork.html]])).\\
apt-get install libapache2-mod-php5
Une fois l'installation effectuée on peut vérifier que php5 est apparu dans /etc/apache2/mod-available.
ls -l /etc/apache2/mods-available/php5*
apt-get install php5 libapache2-mod-php5
Et si cela n'est pas suffisant, suivre les directives de ce lien :
* http://digitizor.com/2012/09/03/how-to-fix-module-php5-does-not-exist-error-in-apache-linux/
a2enmod php && /etc/init.d/apache2 restart
ls -l /etc/apache2/mods-enabled/php5*
a2enmod php5
Si on active ou désactive un module ne pas oublier après l'opération de réactiver apache : ''service apache2 restart''
====Créer la page de test ====
mv /var/www/index.html /var/www/index.php
vim /var/www/index.php
This is the default web page for this server.
service apache2 restart
* Tester en tapant dans le navigateur :
''http://ip-du-serveur/''
It works!
This is the default web page for this server.
La date du jour est 20/09/2014!
Tous les outils sont en place pour apprendre les langages html et php ! 8-)
=====Sécuriser son site web=====
====Sécuriser Apache2 ====
Ce n'est là qu'un minimum et non une sécurisation optimale.
====Diffuser le minimum d'information sur apache ====
* Éditer le fichier /etc/apache2/conf.d/security.
vim /etc/apache2/conf.d/security
Modifier ceci :\\
>La ligne "ServerTokens service apache2 restart
====Modifier certaines options a2dissite default
* Désactiver le site "monsite.com" :
a2dissite monsite.com
* Ensuite on va modifier les directives du site "/etc/apache2/sites-available/monsite.com" :
On édite "/etc/apache2/sites-available/monsite.com" :
vim /etc/apache2/sites-available/monsite.com
adduser --system web --ingroup www-data
* On lui crée un mot de passe système :
passwd web
* On crée les fichiers du site web, "monsite.com" dans /home/web/:
cd /home/web/
mkdir -p monsite.com/public_html
* On édite un index pour le dossier /home/web/monsite.com/public_html/ :
Le module php5 est en place et a été testé, donc on peut créer un "index.php".
vim /home/web/monsite.com/public_html/index.php
Site en cours de réalisation !
cd /usr/local/ && ls
mkdir -p apache/passwd && cd apache/passwd
* Il faut générer des mots de passe pour l'utilisateur apache2:
La commande ''htpasswd'' va créer un fichier qui contiendra utilisateur apache /mot de passe.
htpasswd -c passwords web
htpasswd -D /usr/local/apache/passwd/passwords utilisateur
vim groups
goupe1: web
====Modifier les fichiers des sites actifs de /etc/apache2/sites-available ====
Pour restreindre l'accès à "monsite.com", il faut modifier d'abord le virtualhost "/etc/apache2/sites-available/default"
===Pour "/etc/apache2/sites-available/default" ===
Cela est nécessaire pour restreindre l'accès du site qui est développé dans le répertoire de l'utilisateur /home/web/monsite.com qu'on a créé.
* On modifie "/etc/apache2/sites-available/default" comme ceci :
vim /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/monsite.com
cd /var/www/
rm -r monsite.com
===On crée un lien symbolique à la place===
Le nom symbolique doit avoir pour nom celui du site ("monsite.com") et il faut le placer dans /var/www/ et le faire pointer vers les répertoires et fichiers où le site est développé (/home/web/monsite.com/) :
ln -s /home/web/monsite.com/ /var/www/monsite.com
====Vérifier l'appartenance et les droits des fichiers utilisés par "apache"====
===Modifier le groupe de /var/www ===
Le groupe www-data ne doit pas être propriétaire de /var/www/ mais ce répertoire peut appartenir au groupe www-data. L'idée est ainsi de diminuer au maximum les droits du groupe www-data, tout en laissant possible la consultation du site web.
chown -R root:www-data /var/www/*
===On vérifie les droits POSIX de /var/www/ ===
-rw-r----- 1 root www-data 4096 sept. 22 11:47 index.php
On utilise les droits suivants :
* __Sur les fichiers réguliers__ : pour l'utilisateur root, droits en lecture chmod -R 755 /var/www/ /home/web/
* **Pour les fichiers d'index :**
chmod -R 644 /var/www/index.php /home/web/monsite.com/public_html/index.php
* **Pour les propriétaires des fichiers d'index** :
chown root:www-data /var/www/index.php\
/home/web/monsite.com/public_html/index.php
* **Pour le lien symbolique /var/www/monsite.com** : on ne peut pas modifier ces droits mais ce n'est pas grave. Ce qui compte c'est le fichier vers lequel pointe un lien symbolique.
===On vérifie depuis son navigateur===
* On ré-active le site "default"
a2ensite default
* On ré-active le site "monsite.com"
a2ensite monsite.com
* On recharge apache2 :
service apache2 reload
Enfin depuis son navigateur :\\ ''http://ip-serveur/monsite.com/''\\
{{https://debian-facile.org/images/file-Rd261d8788afa0161885b61b7d3781fd0.png}} -> {{https://debian-facile.org/images/file-R87c7669842e3eac120b8a4a78bd2221e.png}}
8-) **Le login du compte apache (nom de l'utilisateur du système Linux) est demandé ainsi que son mot de passe et on peut accéder à ses pages d'index !**
====La journalisation (Logging) ====
Il faut consulter régulièrement au moins deux : Les logs d'erreur et les logs d'accès au serveur.
===Paramétrer la journalisation ===
Le niveau de consignation souhaité dépend de la directive ''LogLevel'', dans le fichier de configuration par défaut ''/etc/apache2/apache2.conf'' qui est réglé par défaut sur :
LogLevel warn
**Ainsi paramétrer apache inscrit les événements anormaux dans l'un des fichiers du répertoire /var/log/apache2/error.log.**
On peut mettre l'un des neuf niveau d'alerte, pour être alerter de la moindre information jusqu'au alerte grave :\\
-''trace'' : traçage des informations de différents niveaux (produit une grande quantité d'informations);\\
- ''debug'' : informations de débogage qui peut être utile pour repérer où un problème ;\\
- ''info'': message d'information qui pourrait être bon à savoir;\\
- ''notice'' : signal un événement normal, mais à noter;\\
- ''warn'' : signal un événement anormal, mais pas très préoccupant;\\
- ''error'' : signal que quelque chose a échoué;\\
- ''crit'' : problèmes importants qui doivent être pris en compte;\\
- ''alert'' : situation grave qui nécessite rapidement une action;\\
- ''emerg'' : urgence de la situation, le système est dans un état inutilisable.\\
-> Par défaut, on est informé à partir du niveau choisi jusqu'au niveau le plus grave.\\
===Comment le système de journalisation est-il configuré ? ===
Dans le fichier général **/etc/apache2/apache2.conf** une ligne indique le fichier où sont consigné les logs :
ErrorLog ${APACHE_LOG_DIR}/error.log
> Cette directive nomme le fichier où Apache tiendra ses messages d'erreur. Comme vous pouvez le voir, il utilise une variable d'environnement appelée "APACHE_LOG_DIR" pour obtenir le préfixe du chemin de répertoire.
> Pour savoir vers quel fichier renvoie cette variable d'environnement il faut consulter le fichier **''/etc/apache2/envvars''**
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
> Cela signifie que lorsqu'il est combiné avec la directive (variable "SUFFIX") dans le fichier "apache2.conf", **Apache enregistre les logs d'erreur dans un fichier appelé ''/var/log/apache2/error.log''**.
ls /var/log/apache2
access.log error.log other_vhosts_access.log
===Les logs d'accès au serveur ===
Très important pour la sécurisation du serveur. On peut savoir s'il y a eu des tentatives de piratage.\\
Ces logs sont consignés par défaut dans le fichier **''/var/log/apache2/access.log''**.\\
Le paramétrage des logs d'accès n'est pas dans le fichier de configuration générale /etc/apache2/apache2.conf, mais dans le fichier de l'hôte par défaut.\\
La déclaration du journal d'accès se trouve donc dans : **''/etc/apache2/sites-available/default''**.
Nous pouvons y trouver trois valeurs distinctes concernant l'exploitation des logs d'accès.\\
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
La définition du journal des erreurs (ErrorLog et Loglevel) correspond à celle dans le fichier de configuration par général. Il n'est pas nécessaire d'avoir cette ligne dans les deux fichiers, mais ce doublon permet à modifier ici l'emplacement des logs pour celui qu'on souhaite.
===Paramétrer la directive "CustomLog" pour améliorer la sécurité ===
CustomLog ${APACHE_LOG_DIR}/access.log combined
Elle est constituée de deux partie :
* ${APACHE_LOG_DIR}/access.log : localisation des logs d'accès
* ''combined'' : le format des logs par défaut\\ il s'agit d'une étiquette qui renvoie à la directive ''LogFormat'' ( personnalisable) dans le fichier de configuration par général **''/etc/apache2/apache2.conf''**.
===La directive "LogFormat" : /etc/apache2/apache2.conf ===
Par défaut :
LogFormat "%h %l %u %t \"%r\" %>s %O \"{Referer}i\" \"%{User-Agent}i\"" combined
Pour comprendre chacune de ces variables [[http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats|voir la documentation d'apache]].
* Voici par exemple ma configuration :
vim /etc/apache2/apache2.conf
LogFormat "%h %l %u %t \"%r\" %s %b" common
> ''%h'' : sera remplacée par le nom de l'hôte distant
> %l : sera remplacée par logname a distance. Il faut que [[http://httpd.apache.org/docs/2.2/en/mod/mod_ident.html|le module "mod_ident"]] soit présent et que [[http://httpd.apache.org/docs/2.2/en/mod/mod_ident.html#identitycheck|la directive "IdentityCheck"]] soit activé ("On").
> u% : sera remplacée par utilisateur distant.
> %t : sera remplacée par moment où la demande a été reçue (format standard anglais)
> \"%r\" : sera remplacée par la ligne de demande.
> %s : sera remplacée par le statut de la demande.
> %b : sera remplacée par la taille de la réponse en octets, à l'exception des en-têtes HTTP. Dans le format CLF, I.S. un «-» plutôt que d'un 0 si aucune octets sont envoyés.
Pour aller plus loin, par exemple pour la rotation des journaux voir [[http://httpd.apache.org/docs/trunk/fr/logs.html]]
=====OpenSSL : créer un certificat avec apache2 =====
===Le protocole ssl ===
Le protocole ssl (Secure Socket Layer) permet la sécurisation des communications entre un serveur et un client, au moyen :
-d'une authentification mutuelle ;
-d'une vérification de l'intégrité des communication par signature digitale
-par un chiffrement par clés asymétriques afin que la communication soit privée
* Le port par défaut est 443 :\\
* Son utilisation se fait pour apache2 via OpenSSL, avec le module mod_ssl:
Il est installé par défaut mais il n'est pas chargé.
===À quoi sert ssl ? ===
Il permet la signature et la mise en place de certificat au moyen de chiffrement par clés asymétriques.
* Chiffrement par clé asymétrique :
On crée deux clés, une publique qu'on donne à l'utilisateur Tout_le_monde. Cette clé chiffre les informations que l'utilisateur Tout_le_monde veut nous envoyer. La deuxième clé, la clé privée, qu'on garde précieusement secrète, permet de déchiffrer les informations que l'utilisateur Tout_le_monde a chiffré avec la clé publique qu'on lui a donné.
* La signature :
À l'inverse du chiffrement, avec notre clé privée ont va cette fois, non pas déchiffrer ce qu'on envoie, mais chiffrer un document avec cette clé privée. La clé qui permet de déchiffrer ce qu'on va chiffrer avec notre clé privée pourra être déchiffrer par tous ceux qui ont notre clé publique. Et c'est le but de la signature, qui n'est faite pour rendre secret quoique ce soit, mais pour certifier qu'on est l'auteur du document qu'on a chiffré avec notre clé privée.
Pour ce faire, on prend nos données à certifier, un effectue un hashage sur nos données, puis on fait un chiffrement du hashage (cela s'appelle la signature).
Ainsi pour être sûr que notre document est authentique, l'utilisateur Tout_le_monde va appliquer sur notre document le même algorithme de hashage qu'on a utilisé et compare ce résultat avec celui issu du déchiffrement qu'il obtient sur ce même document au moyen de la clé publique qu'on lui a donné.\\ Si les deux sont identiques, alors l'auteur du document est authentifié ; il est aussi garanti d'être intacte du point de vue de son contenu.
===Certificat ===
Il faut encore que la clé publique que reçoit l'utilisateur Tout_le_monde, soit garantie comme étant bien la mienne. Pour éviter que quelqu'un se fasse passer pour moi auprès de l'utilisateur Tout_le_monde, j'ai recours à un certificat.
Quand un certificat est mis en place, l'utilisateur Tout_le_monde peut alors se renseigner auprès de l'organisme de certification((par exemple gandi.net, tustico (peu cher mais reconnu par les navigateur) ou startSSL qui est gratuit (peu fiable bien bien pour essayer).)) que je suis bien l'auteur la clé publique qu'il a reçue. Cela garantit à l'utilisateur Tout_le_monde qui est bien sur mon serveur quand il s'y connecte, y télécharge des fichiers, etc...
Pour faire certifier une clé publique, il faut qu'une organisation appelé "Autorité de certification" (CA) me vende ((certaines en fournissent gratitement voir [[http://www.planet-libre.org/index.php?post_id=16507&go=external]])) une signature pour mon certificat.
**Concrètement mon serveur apache2 crée un certificat en même temps que la paire de clés, et je fais signer ce certificat par une autorité de certification.**
ls /etc/apache2/mods-available | grep ssl.*
Il doit y avoir ''ssl.conf'' et ''ssl.load''. Sinon il faut **installer** (ne pas l'activer tout de suite).\\
====Création des clé et certificat====
Pour cela on va se servir de l'utilitaire openssl.
* Création du répertoire où l'on rangera sa clé privée :
cd /etc/apache2/ && mkdir ssl
* Création de la clé privée et du certificat :
openssl req -x509 -nodes -days 365\
-newkey rsa:1024 -keyout /etc/apache2/ssl/apache.key\
-out /etc/apache2/ssl/apache.crt
> -x509 -nodes : type de certificat
> -days 365 : durée de vie du certificat (en jours)
> - newkey rsa:1024 : clé rsa de 1024 bits
> -out /chemin/fichier/certificat : crée le fichier du certificat
> -keyout /chemin/fichier/clé : chemin du fichier de sa clé privée
chmod 400 /etc/apache2/ssl/apache.key
====Créer un site accessible en ssl ====
Cette fois on va mettre en place une méthode plus directe que précédemment. Par exemple un site s'appelant pegaseous.com
On va se servir des fichiers par défaut.\\
On commence par désactiver les deux fichiers /etc/apache2/sites-available/default et /etc/apache2/sites-available/default-ssl avec la commande ''a2dissite''.
On crée ensuite les répertoires et fichiers où développer son site.\\
* Par exemple dans le répertoire d'un autre utilisateur.
mkdir -p /home/hypathie/www/pegaseous.com/public_html
* On crée un index dans /home/hypathie/www/
mv /var/www/index.html /home/hypathie/www/
On peut le modifier :
vim /home/hypathie/www/index.html
Voici ma page d'index.
YEP ! Déployée dans mon répertoire personnel !
Le serveur web apache2 fonctionne.
vim /home/hypathie/www/pegaseous.com/public_html/index.php
Site en cours de réalisation !
chmod -R 755 /home/hypathie/www/
chmod 644 /home/hypathie/www/index.html\
/home/hypathie/www/pegaseous.com/public_html/index.php
chown root:www-data /home/hypathie/www/
===Le virtualhost "defaut" ===
On doit d'abord s'occuper du fichier /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/default
a2ensite default
* On édite /etc/apache2/ports.conf
Pour s'éviter d'avoir au redémarrage d'apache2 le message suivant :
service apache2 reload
[....] Reloading web server config: apache2[Thu Sep 25 09:33:25 2014]
[warn] NameVirtualHost 192.168.0.13:80 has no VirtualHosts
vim /etc/apache2/ports.conf
a2enmod ssl
* On édite vim /etc/apache2/sites-available/default-ssl pour ajouter clé et certificat ainsi que le site déclarer dans le fichier default" :
vim /etc/apache2/sites-available/default-ssl
a2ensite default-ssl
On peut maintenant accéder au site "pegaseous.com" en tapant dans le navigateur : ''https://192.168.0.13/pegaseous.com/''.
Il est normal que le navigateur demande une acception pour accéder au site.