diff --git a/README.md b/README.md index 511ae2c..e996fef 100644 --- a/README.md +++ b/README.md @@ -10,23 +10,21 @@ de conteneurisation. Liste des TP : -* TP 0 : [installation de QEMU/KVM et de Libvirt, sur un OS Ubuntu](tp/ubuntu/tp0-kvm-libvirt.md) ; -* TP 1 : [paramètres supplémentaires de libvirt](tp/ubuntu/tp1-kvm-libvirt.md) ; -* TP 2 : [installation de Vagrant](tp/ubuntu/tp2-vagrant.md) ; -* TP 3 : [Backports Debian](tp/debian/tp3-backports.md) ; -* TP 4 : [découverte de SSH](tp/debian/tp4-ssh-basique.md) ; -* TP 5 : [installation et paramétrage basique du serveur web Apache](tp/debian/tp5-apache-basique.md) ; -* TP 6 : [les virtual hosts dans Apache](tp/debian/tp6-apache-virtual-hosts.md); -* TP 7 : [découverte de mod_php](tp/debian/tp7-apache-mod_php.md) ; -* TP 8 : [MariaDB](tp/debian/tp8-mariadb.md) ; -* TP 9 : [PHPMyAdmin](tp/debian/tp9-phpmyadmin.md) ; +* TP 0 : [installation de QEMU/KVM et de Libvirt, sur un OS Ubuntu](tp/ubuntu/tp00-kvm-libvirt.md) ; +* TP 1 : [paramètres supplémentaires de libvirt](tp/ubuntu/tp01-kvm-libvirt.md) ; +* TP 2 : [installation de Vagrant](tp/ubuntu/tp02-vagrant.md) ; +* TP 3 : [Backports Debian](tp/debian/tp03-backports.md) ; +* TP 4 : [découverte de SSH](tp/debian/tp04-ssh-basique.md) ; +* TP 5 : [installation et paramétrage basique du serveur web Nginx](tp/debian/tp05-nginx-basique.md) ; +* TP 6 : [les virtual hosts dans Nginx](tp/debian/tp06-nginx-virtual-hosts.md); +* TP 7 : [Nginx et PHP-FPM](tp/debian/tp07-nginx-php-fpm.md) ; +* TP 8 : [MariaDB](tp/debian/tp08-mariadb.md) ; +* TP 9 : [PHPMyAdmin](tp/debian/tp09-phpmyadmin.md) ; * TP 10 : [WordPress](tp/debian/tp10-wordpress.md) ; -* TP 11 : [Nginx](tp/debian/tp11-nginx.md) ; -* TP 12 : [Nginx et PHP-FPM](tp/debian/tp12-nginx-php-fpm.md) ; -* TP 13 : [Conteneurs et Docker](tp/debian/tp13-docker.md) ; -* TP 14 : [sudo](tp/debian/tp14-sudo.md) ; -* TP 15 : [deux usages avancés d'OpenSSH](tp/debian/tp15-ssh_avance.md) ; -* TP 16 : [HTTPS sur Apache](tp/debian/tp16-https_apache.md) ; -* TP 17 : [HTTPS sur Nginx](tp/debian/tp17-https_nginx.md) ; -* TP 18 : Python et UWSGI ; -* TP 19 : sujets sécurité. +* TP 11 : [Conteneurs et Docker](tp/debian/tp11-docker.md) ; +* TP 12 : [Nginx en reverse-proxy](tp/debian/tp12-nginx-reverse-proxy.md) ; +* TP 13 : [sudo](tp/debian/tp13-sudo.md) ; +* TP 14 : [deux usages avancés d'OpenSSH](tp/debian/tp14-ssh_avance.md) ; +* TP 15 : [HTTPS sur Nginx](tp/debian/tp15-https_nginx.md) ; +* TP 16 : Python et UWSGI ; +* TP 17 : sujets sécurité. diff --git a/apache/server11.example.com.conf b/apache/server11.example.com.conf deleted file mode 100644 index e0a0429..0000000 --- a/apache/server11.example.com.conf +++ /dev/null @@ -1,11 +0,0 @@ -# Apache virtual host configuration - - ServerName server11.example.com - ServerAlias server11 - DocumentRoot /srv/www/server11.example.com/public - ErrorLog /srv/www/server11.example.com/log/error.log - LogLevel info - CustomLog /srv/www/server11.example.com/log/access.log vhost_combined - - -# vim: syntax=apache ts=3 sw=2 sts=2 sr noet diff --git a/apache/ssl_www11.example.com.conf b/apache/ssl_www11.example.com.conf deleted file mode 100644 index a3a9d52..0000000 --- a/apache/ssl_www11.example.com.conf +++ /dev/null @@ -1,22 +0,0 @@ -# Apache virtual host configuration - - - ServerName www11.example.com - ServerAlias www11 - DocumentRoot /srv/www/www11.example.com/public - ErrorLog /srv/www/www11.example.com/log/ssl_error.log - LogLevel info - CustomLog /srv/www/www11.example.com/log/ssl_access.log vhost_combined - - SSLEngine on - SSLCertificateFile /etc/apache2/selfcerts/www11.example.com.crt - SSLCertificateKeyFile /etc/apache2/selfcerts/www11.example.com.key - #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt - #SSLCACertificatePath /etc/ssl/certs/ - #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt - #SSLCARevocationPath /etc/apache2/ssl.crl/ - #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl - - - -# vim: syntax=apache ts=3 sw=2 sts=2 sr noet diff --git a/fpm/server13.conf b/fpm/server11.conf similarity index 99% rename from fpm/server13.conf rename to fpm/server11.conf index 5685c95..53f160c 100644 --- a/fpm/server13.conf +++ b/fpm/server11.conf @@ -1,7 +1,7 @@ -; Start a new pool named 'server13'. +; Start a new pool named 'server11'. ; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) -[server13] +[server11] ; Per pool prefix ; It only applies on the following directives: @@ -20,8 +20,8 @@ ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. -user = server13 -group = server13 +user = server11 +group = server11 ; The address on which to accept FastCGI requests. ; Valid syntaxes are: @@ -434,6 +434,6 @@ pm.max_spare_servers = 3 ; specified at startup with the -d argument ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com ;php_flag[display_errors] = off -php_admin_value[error_log] = /srv/www/server13.example.com/log/fpm-php.log +php_admin_value[error_log] = /srv/www/server11.example.com/log/fpm-php.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 64M diff --git a/nginx/server11.example.com.conf b/nginx/server11.example.com.conf new file mode 100644 index 0000000..eece9fd --- /dev/null +++ b/nginx/server11.example.com.conf @@ -0,0 +1,18 @@ +# JSON access log configuration + +log_format json_combined escape=json '{ "time_local": "$time_local", "remote_addr": "$remote_addr", "http_x_forwarded_for": "$http_x_forwarded_for", "request": "$request", "status": "$status", "body_bytes_sent": "$body_bytes_sent", "http_referer": "$http_referer", "http_user_agent": "$http_user_agent", "request_time": "$request_time" }'; + +# Nginx virtual host configuration + +server { + listen 80; + + root /srv/www/server11.example.com/public; + index index.html; + + server_name server11.example.com www.server11.example.com; + + # Logs + access_log /srv/www/server11.example.com/log/access.log json_combined; + error_log /srv/www/server11.example.com/log/error.log; +} diff --git a/tp/debian/tp3-backports.md b/tp/debian/tp03-backports.md similarity index 100% rename from tp/debian/tp3-backports.md rename to tp/debian/tp03-backports.md diff --git a/tp/debian/tp4-ssh-basique.md b/tp/debian/tp04-ssh-basique.md similarity index 99% rename from tp/debian/tp4-ssh-basique.md rename to tp/debian/tp04-ssh-basique.md index f0bd420..6e0d84f 100644 --- a/tp/debian/tp4-ssh-basique.md +++ b/tp/debian/tp04-ssh-basique.md @@ -274,5 +274,5 @@ passe à chaque clé. Attention !!! OpenSSH est très pratique sur de nombreux aspects, et possède de nombreuses options de configuration, qui peuvent abaisser la sécurité du -système. Il est recommandé de lire le document "[Usage sécurisé d'(Open)SSH]https://messervices.cyber.gouv.fr/guides/usage-securise-dopenssh()" +système. Il est recommandé de lire le document "[Usage sécurisé d'(Open)SSH](https://messervices.cyber.gouv.fr/guides/usage-securise-dopenssh)" avant de déployer une configuration en production. diff --git a/tp/debian/tp05-nginx-basique.md b/tp/debian/tp05-nginx-basique.md new file mode 100644 index 0000000..5965a2b --- /dev/null +++ b/tp/debian/tp05-nginx-basique.md @@ -0,0 +1,155 @@ +[Retour au sommaire](../../README.md) + +# TP 5 : Installation et paramétrage basique du serveur web Nginx + +Objectifs : + +- installer le serveur HTTP Nginx ; +- le démarrer, l'arrêter et l'activer au démarrage du serveur ; +- déposer du contenu et le rendre accessible ; +- personnaliser l'emplacement du contenu ; +- accéder aux fichiers de logs. + +## Introduction + +Nginx est un serveur HTTP, devenu il y a quelques années une référence côté +performances, car il fut le premier à résoudre le [problème des dix mille +connexions simultanées](https://fr.wikipedia.org/wiki/C10k_problem). + +Nginx est aussi capable d'agir comme mandataire inverse (reverse proxy en +anglais) pour HTTP(S), et pour certains protocoles de mail. Cela veut dire +qu'il se place en frontal d'un ou de plusieurs serveurs web existant (Nginx +aussi, ou d'autres comme Apache HTTP Server), et permet de mettre en place +différentes stratégies, parmi lesquelles : + +- rediriger du trafic vers un serveur ou en local ; +- mettre en cache pour servir du contenu plus rapidement ; +- effectuer de la répartition de charge entre plusieurs serveurs identiques ; +- effectuer un filtrage de sécurité. + +À noter que Nginx n'est pas développé par une fondation mais par une entreprise. +Le logiciel d'origine est libre, sous licence BSD à 2 clauses, mais il existe +une version commerciale, Nginx Plus, disposant de fonctions supplémentaire et +d'un support. + +## Étape 0 : installation + +Comme bon nombre de distributions Linux et BSD, Nginx est disponible via des +paquets binaires pré-compilés pour Debian. + +Se connecter sur server11, puis passer root. +Avant l'installaton, regarder quels sont les services réseau en fonctionnement +: `lsof -n -i`. Seul sshd devrait apparaître. Maintenant, installer Nginx : +`apt -y install nginx`. Relancer la commande d'avant. + +Question : est-ce que l'installation de Nginx a lancé celui-ci ? + +Se rendre via le navigateur de l'hôte sur http://10.13.37.11. Il est aussi +possible, depuis server11 ou depuis l'hôte, d'utiliser un requêteur HTTP en +ligne de commande comme `curl`. + +Vérifier la liste des paquets de Nginx installés via `dpkg --list | grep +nginx`. + +Question : quels sont les paquets installés ? + +## Étape 1 : démarrage, arrêt, et activation au démarrage + +Se connecter en ssh sur server11, puis passer root. +Vérifier grâce à la commande `pgrep nginx` si Nginx est toujours en fonctionnement. + +Questions : +- comment s'appelle le programme ? +- combien de processus correspondants sont en fonctionnement ? +- à quels utilisateurs appartiennent ces processus ? + +De nombreuses distributions Linux utilisent *systemd* comme système d'init. +Entre autres, *systemd* permet de gérer le lancement et l'activation au +démarrage de démons, appelés services. + +Lancer la commande `systemctl stop nginx`, puis vérifier via `pgrep nginx` que +celui-ci est bien arrêté. Lancer ensuite la commande `systemctl start nginx`, +et vérifier de la même façon que Nginx fonctionne. Ouvrir un deuxième terminal, +se connecter sur server11, puis passer root. Lancer la commande `top -u +www-data`. Depuis le premier terminal, lancer la commande `systemctl restart +nginx`, puis regarder les changements au niveau de `top`. + +Question : en utilisant `systemctl status nginx`, est-ce que Nginx est lancé +au démarrage du système ? + +Redémarrer server11 et s'assurer que Nginx a bien démarré sans action. +Utiliser ensuite `systemctl disable nginx` puis redémarrer, s'assurer +qu'il n'est pas lancé. Ré-activer Nginx (`systemctl enable nginx`) et le +démarrer. + +## Étape 2 : déposer du contenu + +Se connecter sur [http://10.13.37.11](http://10.13.37.11), et remarquer la page +d'accueil par défaut. Se connecter en ssh sur server11, et passer root. +se rendre dans `/var/www/html/`, et y créer un fichier `page2.html`. Insérer du +texte ou du code HTML dans ce fichier, peu importe tant que c'est visible. +Visiter l'URL http://10.13.37.11/page2.html et admirer le résultat. + +Question : à quel utilisateur appartient `page2.html`, et quels sont les droits +dessus ? + +Changer les droits sur `page2.html` de la façon suivante : `chmod 000 +page2.html`. Tenter à nouveau d'accéder à la page. Rechercher ensuite les +droits minimum pour que la page soit de nouveau accessible. + +Question : quels sont les droits minimum pour accéder à `page2.html` depuis le +serveur web ? En owner root ainsi qu'en owner www-data. + +## Étape 3 : personnaliser l'emplacement du contenu + +Par défaut, le contenu se trouve donc dans `/var/www/html`. Mais il est +possible de modifier cet emplacement. Se rendre dans +`/etc/nginx/sites-enabled/` et lire le fichier de configuration +`default`. + +Question : quelle est la directive qui permet de paramétrer l'emplacement du +contenu ? + +Créer un répertoire `/srv/www/html` puis ajouter à cet endroit un fichier +`index2.html` au contenu libre. Modifier la directive `root` pour y +utiliser `/srv/www/html`, puis redémarrer Nginx. Rafraîchir +http://10.13.37.11 . + +Question : qu'observe-t'on ? + +Ajouter au fichier `default`, dans la directive `index` l'option `index2.html`, avant tous les autes fichiers. Relancer Nginx. + +Question : que fait la directive `index` ? + +Astuce : il est possible de vérifier la validité de la syntaxe des fichiers de +configuration de Nginx avec la commande `nginx -t` en tant que root. + +## Étape 4 : les fichiers de logs (journaux) + +De nombreuses requêtes HTTP ont été réalisées dans les étapes précédentes, +certaines avec succès, d'autres générant une erreur. Il peut être utile de voir +ce qui se passe bien et ce qui se passe moins bien. Nginx permet entre autres +d'enregistrer des informations sur les requêtes dans des fichiers dits +journaux, ou log en anglais. Par convention, sous Unix, les logs se trouvent +dans le répertoire `/var/log`, et sous Debian, Nginx stocke ses logs dans +`/var/log/nginx` par défaut. Tout ceci est bien entendu configurable. + +Repérer dans `/etc/nginx/nginx.conf` les directives +`error_log` et `access_log`, et retrouver les fichiers correspondants dans +`/var/log/nginx`. + +Questions : +- quelles informations trouve-t-on dans `/var/log/nginx/access.log` ? +- quelles informations trouve-t-on dans `/var/log/nginx/error.log` ? + +Depuis un terminal, lancer la commande `tail -f /var/log/nginx/error.log` puis dans +un autre terminal, en tant que root, lancer la commande `systemctl restart +nginx`. + +Question : qu'observe-t-on ? + +Couper `tail`, puis lancer la commande `tail -f /var/log/nginx/access.log` puis +utiliser son navigateur pour visiter le site web, et tenter d'accéder à des +pages inexistantes. + +Question : qu'observe-t-on ? diff --git a/tp/debian/tp6-apache-virtual-hosts.md b/tp/debian/tp06-nginx-virtual-hosts.md similarity index 58% rename from tp/debian/tp6-apache-virtual-hosts.md rename to tp/debian/tp06-nginx-virtual-hosts.md index 4264289..7bf5dc5 100644 --- a/tp/debian/tp6-apache-virtual-hosts.md +++ b/tp/debian/tp06-nginx-virtual-hosts.md @@ -1,6 +1,6 @@ [Retour au sommaire](../../README.md) -# TP 6 : les virtual hosts dans Apache +# TP 6 : les virtual hosts dans Nginx Objectifs : @@ -21,14 +21,14 @@ Sur sa machine locale, ouvrir un terminal, et passer root. Editer le fichier de configuration `/etc/hosts` et ajouter la ligne suivante : ``` -10.13.37.11 server11.example.com server11 www11.example.com +10.11.37.11 server11.example.com server11 www11.example.com www11 wp11.example.com wp11 ``` Une fois le fichier sauvé, s'assurer que la machine server11 est bien accessible via les noms ajoutés ci-dessus, par exemple avec la commande `ping`. -Maintenant, vérifier qu'Apache répond lors de requête vers les noms ajoutés. +Maintenant, vérifier que Nginx répond lors de requête vers les noms ajoutés. -Question : qu'affiche Apache lors des requêtes ? +Question : qu'affiche Nginx lors des requêtes ? ## Etape 1 : création d'un virtual host @@ -44,8 +44,8 @@ Se connecter sur server11 et passer root. Créer l'arborescence suivante : Ajouter un fichier `index.html` au contenu libre dans le répertoire `public`. -Transférer le fichier `apache/server11.example.com.conf` de ce dépôt dans le -répertoire `/etc/apache2/sites-available/` de server11. +Transférer le fichier `nginx/server11.example.com.conf` de ce dépôt dans le +répertoire `/etc/nginx/sites-available/` de server11. À l'aide d'un navigateur, visiter les URLs suivantes : - http://server11 @@ -55,12 +55,12 @@ répertoire `/etc/apache2/sites-available/` de server11. Question : quel est le chemin du fichier HTML servi ? De quel fichier de configuration vient-il ? -Prendre note du contenu de `/etc/apache2/sites-enabled` et -`/etc/apache2/sites-available`. -Conformément à la documentation du fichier par défaut, utiliser la commande -`a2ensite server11.example.com` pour activer le fichier de virtual host ajouté, -et utiliser la commande `a2dissite 000-default` pour retirer le fichier de -virtual host par défaut. +Prendre note du contenu de `/etc/nginx/sites-enabled` et +`/etc/nginx/sites-available`. +Créer un lien symbolique `/etc/nginx/sites-enabled/server11.example.com.conf` +pointant vers `/etc/nginx/sites-available/server11.example.com.conf` pour +activer le fichier de server ajouté, puis supprimer le lien +`/etc/nginx/sites-enabled/default` qui contient le server par défaut. Visiter de nouveau les URL sus-mentionnées. Consulter le fichier activé et lire le contenu des fichiers de log paramétrés. @@ -68,7 +68,7 @@ le contenu des fichiers de log paramétrés. Question : quel est le chemin du fichier HTML servi ? De quel fichier de configuration vient-il ? -En utilisant le fichier de virtual host fourni comme modèle, créer un fichier +En utilisant le fichier de server fourni comme modèle, créer un fichier `www11.example.com.conf` ainsi qu'une arborescence et une page HTML répondant au site *www11.example.com*, puis vérifier que des requêtes sur server11.example.com et sur www11.example.com vont bien sur les sites @@ -76,17 +76,23 @@ respectifs, et dans les logs respectifs. ## Etape 2 : le format des logs -L'oeil averti aura remarqué que les contenus de `/var/log/apache2/access.log` +L'oeil averti aura remarqué que les contenus de `/var/log/nginx/access.log` et `/srv/www/server11.example.com/log/access.log` n'ont pas tout à fait le même format. -Rechercher dans les fichiers `/etc/apache2/conf-enabled/other-vhosts-access-log.conf` et -`/etc/apache2/sites-enabled/server11.example.com.conf` les lignes commençant -par *CustomLog* et remarquer que le format défini est différent. Retrouver les -deux définitions de format dans `/etc/apache2/apache2.conf`. +Rechercher dans les fichiers `/etc/nginx/sites-available/default` et +`/etc/nginx/sites-enabled/server11.example.com.conf` les lignes commençant +par *access_log* et remarquer que le format défini est différent. Retrouver les +deux définitions de format dans `/etc/nginx/nginx.conf`. Question : en s'aidant de la [documentation -officielle](https://httpd.apache.org/docs/2.4/fr/mod/mod_log_config.html#formats), +officielle](https://httpd.nginx.org/docs/2.4/fr/mod/mod_log_config.html#formats), à quoi correspondent les champs des deux formats définis ? Quelles sont les différences entre ces deux formats ? +## Etape 3 : copier-coller + +À partir de la configuration et de l'arborescence pour `server11.example.com`, +créer les arborescences et fichiers de configuration pour `www11.example.com` +et `wp11.example.com`. Chaque site devra contenir une page d'index indiquant le +nom du site. diff --git a/tp/debian/tp07-nginx-php-fpm.md b/tp/debian/tp07-nginx-php-fpm.md new file mode 100644 index 0000000..7dbe79e --- /dev/null +++ b/tp/debian/tp07-nginx-php-fpm.md @@ -0,0 +1,196 @@ +[Retour au sommaire](../../README.md) + +# TP 7 : Nginx et PHP-FPM + +Objectifs : + +- installer PHP ; +- faire fonctionner PHP sur notre serveur web Nginx, grâce à FPM ; +- configurer PHP depuis son fichier de configuration ; +- installer des extensions à PHP ; +- installer une application PHP. + +## Introduction + +PHP est un langage de script complet. Celui-ci est facile à appréhender grâce à +la simplicité d'installation de `mod_php` pour Apache, mais ce n'est pas la +seule possibilité. Il est possible d'installer et d'utiliser des scripts PHP de +la même façon que d'autres scripts (Bash ou Python par exemple), mais de le +faire communiquer avec un serveur web via un protocole standard comme CGI. + +Ce moyen de communication a laissé sa place à des moyens plus rapides et plus +efficaces, comme FastCGI et FPM (pour Fast Process Manager) et dernièrement PM, +mais FPM est sans doute le plus populaire actuellement. + +## Etape 0 : installation de PHP-FPM + +Se connecter sur server11 et passer root. Installer le paquet `php-fpm`. Un +nouveau service `php8.4-fpm` existe, vérifier qu'il est bien lancé. + +Dans le bloc server définissant `server11.example.com`, ajouter les directives +suivantes : + +``` +location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.4-fpm.sock; +} +``` + +Une fois cette modification effectuée, relancer le service `nginx`. + +Vérifier maintenant que PHP est bien activé. Dans le répertoire +`/srv/www/server11.example.com/public/`, créer un fichier `info.php` dont le +contenu est le suivant : + +``` + +``` + +PHP est maintenant installé et fonctionnel. La page "PHPinfo" permet +d'obtenir des informations sur la configuration et les modules installés. + +Se rendre ensuite à l'aide d'un navigateur sur +http://server11.example.com/info.php et vérifier que la page "PHPinfo" +s'affiche. + +Questions : +- à l'aide de la page "PHPinfo", quel est le chemin vers fichier de + configuration (`php.ini`) utilisé par `php-fpm` ? +- à l'aide de la page "PHPinfo", quelle est l'API utilisée pour la + communication entre Nginx et PHP ? +- à l'aide de la page "PHPinfo", quel est le fuseau horaire (timezone) par + défaut configuré dans `php-fpm` ? +- dans la page "PHPinfo", rechercher le tableau ayant pour titre "Environment", + sous quel utilisateur est lancé PHP ? Sous quel utilisateur est lancé Nginx ? + +Regarder le contenu des fichiers `/etc/nginx/fastcgi.conf` et +`/etc/nginx/snippets/fastcgi-php.conf`. Ces fichiers permettent de faire "la +glue" entre Nginx et PHP. + +## Etape 1 : configuration personnalisée de PHP-FPM + +Toujours sur server11, créer un utilisateur `server11` dont les +caractéristiques sont les suivantes : + +- son répertoire de départ est `/srv/www/server11.example.com/` ; +- son UID est 2011 ; +- il faut créer un groupe de même nom ; +- son shell est `/sbin/nologin`. + +Ensuite, transférer le fichier `fpm/server11.conf` dans le répertoire +`/etc/php/8.4/fpm/pool.d`. Avec la commande `usermod`, ajouter l'utilisateur `www-data` (utilisé par nginx) +au groupe `server11` afin d'autoriser l'accès en lecture et écriture au fichier +`server11.sock`. Relancer le service `php8.4-fpm`, puis vérifier que +celui-ci est bien relancé, via systemd. + +Questions : +- via systemd, combien de processus php sont lancés ? +- dans quels pools sont-ils ? + +Editer le fichier `/etc/php/8.4/fpm/pool.d/server11.conf` à la ligne 103, et +remplacer `pm = dynamic` par `pm = static`. Relancer le service `php8.4-fpm`, +et répondre de nouveau aux deux questions précédentes. + +Editer le fichier `/etc/nginx/sites-enabled/server11.example.com.conf`, et +remplacer la ligne `fastcgi_pass unix:/run/php/php8.4-fpm.sock;` par `fastcgi_pass unix:/run/php/server11.sock;`. Relancer Nginx, et regarder la page "PHPinfo". Remettre la valeur initiale de la directive, relancer Nginx et rafraîchir la page. + +Question : quels sont les changements entre les deux pools ? + +## Etape 2 : installation d'une application PHP + +[PluXml](https://pluxml.org/) est un moteur de blog et CMS en PHP, qui a la +particularité de ne pas nécessiter de base de données pour fonctionner. + +Comme pour l'étape 1, créer un utilisateur `www11` qui servira à un autre pool +FPM. Créer ensuite un pool FPM `www11` comme le pool `server11`, et s'assurer +que le pool démarre. Configurer le bloc `server` de `www11.example.com` pour +que ce site utilise le pool `www11`, en utilisant une page "phpinfo" pour le +vérifier. + +Installer PluXml dans le bloc `server` de `www11.example.com` et écrire une page +personnalisée, supprimer au besoin les fichiers existant dans +`/srv/www/www11.example.com/public/` + +Quelques points d'assistance : +- PluXml est distribué sous forme d'archive zip, il faudra donc installer le + paquet unzip sur server11 ; +- il est possible de télécharger directement l'archive de PluXml depuis + server11 grâce au logiciel wget ; +- PluXml a besoin des extensions PHP XML et GD ; +- il faut passer `cgi.fix_pathinfo` à 0 dans le fichier + `/etc/php/8.4/fpm/php.ini` (ligne 803). + +Dans le bloc server du fichier `www11.example.com.conf`, adaptez les +directives suivantes (source : [documentation officielle](https://wiki.pluxml.org/docs/install/nginx.html)): + +``` +index index.php; + +# client_header_buffer_size 1k; +# client_max_body_size 1m; +client_max_body_size 8m; # évite une erreur 413 si on upload un fichier + +## BASE + +# Règle principale +location / { + try_files $uri $uri/ @handler; +} + +# Réécriture vers l'index +location @handler { + rewrite ^/(.*)$ /index.php?^$1 last; +} + +# Parseur PHP +location ~ \.php$ { + fastcgi_split_path_info ^(.+\.php)(/.+)$; + # NOTE: Utilisez "cgi.fix_pathinfo = 0;" dans php.ini + include fastcgi.conf; + fastcgi_index index.php; + fastcgi_pass unix:/run/php/php8.4-fpm.sock; # À remplacer par le bon pool FPM +} + +## REDIRECTIONS + +# Flux RSS +location /feed/ { + rewrite ^/feed\/(.*)$ /feed.php?^$1 last; +} + +# Sitemap +location = /sitemap.xml { + rewrite .* /sitemap.php; +} + +## PROTECTION REPERTOIRES + +location ~ /(version|update|readme|data/configuration) { + deny all; +} + +## CACHING +# https://www.theodo.fr/blog/2016/06/improve-the-performance-of-your-webapp-configure-nginx-to-cache/ +# http://www.supinfo.com/articles/single/2843-implementer-cache-navigateur-avec-nginx + +# cache-control +location /data/ { + add_header Cache-Control public; + expires 12h; +} +location /core/ { + add_header Cache-Control public; + expires 12h; +} +location /plugins/ { + add_header Cache-Control public; + expires 12h; +} +location /themes/ { + add_header Cache-Control public; + expires 12h; +} +``` diff --git a/tp/debian/tp8-mariadb.md b/tp/debian/tp08-mariadb.md similarity index 98% rename from tp/debian/tp8-mariadb.md rename to tp/debian/tp08-mariadb.md index f383913..0076761 100644 --- a/tp/debian/tp8-mariadb.md +++ b/tp/debian/tp08-mariadb.md @@ -23,7 +23,7 @@ avertissement sur le retrait des liens de compatibilité MySQL <-> MariaDB. ## Etape 0 : installation Sur server12, installer le paquet `mariadb-server`. Pour la configuration -initiale, lancer la commande `mariadb-secure-installation `, puis répondre de la +initiale, lancer la commande `mariadb-secure-installation`, puis répondre de la façon suivante aux différentes questions posées : ``` diff --git a/tp/debian/tp9-phpmyadmin.md b/tp/debian/tp09-phpmyadmin.md similarity index 67% rename from tp/debian/tp9-phpmyadmin.md rename to tp/debian/tp09-phpmyadmin.md index 0d6bb50..f96ecc8 100644 --- a/tp/debian/tp9-phpmyadmin.md +++ b/tp/debian/tp09-phpmyadmin.md @@ -40,21 +40,49 @@ GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.13.37.11' IDENTIFIED BY 'remotepass' W ## Etape 1 : installation -Sur server11, installer le paquet `phpmyadmin`. Ensuite, activer la -configuration via la commande `a2enconf phpmyadmin`. Vérifier la présence d'un -lien symbolique `phpmyadmin.conf` dans `/etc/apache2/conf-enabled`, et -recharger Apache via `systemctl reload apache2`. +Sur server11, installer le paquet `phpmyadmin`. Lors de l'installation, il est +proposer de reconfigurer un serveur web automatiquement, n'en sélectionner +aucun. À la question "Configure database for phpmyadmin with dbconfig-common?", +répondre "No". -Accéder depuis la machine hôte aux URLs suivantes : -- http://server11.example.com/phpmyadmin/ ; -- http://www11.example.com/phpmyadmin/ ; -- http://10.13.37.11/phpmyadmin/. +Ensuite, créer un lien symbolique pour le fichier de configuration : `ln -sv +/etc/phpmyadmin/config.inc.php /usr/share/phpmyadmin/config.inc.php`. Éditer +`/etc/phpmyadmin/config-db.php`, et remplacer `'localhost';` par `'10.13.37.12';` pour se connecter à MariaDB sur server12. -Consulter le fichier `/etc/apache2/conf-enabled/phpmyadmin.conf`. +Ajouter ensuite la configuration suivante dans le bloc server de +`/etc/nginx/sites-enabled/server11.example.com.conf` : + +``` +location /phpmyadmin/ { + root /usr/share/; + index index.php; + location ~ ^/phpmyadmin/(.+\.php)$ { + try_files $uri =404; + root /usr/share/; + fastcgi_pass unix:/var/run/php/php8.4-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include /etc/nginx/fastcgi_params; + } + location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ { + root /usr/share/; + } + } +``` + +À quoi servent toutes ces directives ? Certaines viennent préciser où chercher +les fichiers de l'application afin d'être servies depuis le chemin +`/phpmyadmin/`, d'autres viennent permettre l'exécution dans PHP-FPM des +fichiers PHP. + +On remarquera les différences entre le bloc du TP PHP-FPM et celui ci-dessus +sur les variables de configuration FastCGI pour la configuration de PHP (en +particulier l'inclusion de fichiers différents). + +Accéder depuis la machine hôte à http://server11.example.com/phpmyadmin/ ; Questions : - où est installé PHPMyAdmin ? -- pourquoi les URLs ci-dessus fonctionnent ? Il faut encore paramétrer PHPMyAdmin. Sous Debian, il est possible de faire ce paramétrage dans le fichier `/etc/phpmyadmin/config-db.php`. Editer ce fichier diff --git a/tp/debian/tp10-wordpress.md b/tp/debian/tp10-wordpress.md index 47f38cd..6c83f09 100644 --- a/tp/debian/tp10-wordpress.md +++ b/tp/debian/tp10-wordpress.md @@ -22,9 +22,32 @@ fonctionnalités permise par ses plugins. Ce TP fait appel aux notions vues précédemment, les commandes ne seront donc pas détaillées. -## Etape 0 : virtual host +## Etape 0 : utilisateur dédié -Sur le serveur server11, créer un nouveau virtual host Apache, dont les +Sur le serveur server11, créer un nouvel utilisateur "blog" qui servira pour +PHP-FPM. Ses caractéristiques sont les suivantes : + +- son répertoire de départ est `/srv/www/blog.example.com/`; +- son UID est 3011 ; +- il faut créer un groupe du même nom ; +- son shell est `/usr/sbin/nologin'. + +Créer l'arborescence suivante (les répertoires appartiennent à l'utilisateur +`blog`) : + +``` +/srv/ +└── www + └── blog.example.com + ├── log + ├── public + ├── session + └── tmp +``` + +## Etape 1 : virtual host + +Sur le serveur server11, créer un nouveau bloc server Nginx, dont les paramètres seront : - nom du serveur : `blog.example.com` ; @@ -32,16 +55,76 @@ paramètres seront : - emplacement des fichiers : `/srv/www/blog.example.com/public` ; - emplacement du log d'erreur : `/srv/www/blog.example.com/log/error.log` ; - emplacement du log d'accès : `/srv/www/blog.example.com/log/access.log` ; -- format du log d'accès : `vhost_combined`. +- format du log d'accès : comme server11.example.com. -Créer les répertoires nécessaires sur server11. Ne pas oublier d'activer le -virtual host. Créer une page `index.html` au contenu minimal et la placer dans -l'emplacement des fichiers. +Créer les répertoires nécessaires sur server11. Créer une page `index.html` +au contenu minimal et la placer dans l'emplacement des fichiers. Il faudra +certainement réajuster les droits sur l'arborescence créée lors de l'étape +précédente. -Ajouter sur la machine hôte l'entrée "blog.example.com" dans `/etc/hosts`. +Sur la machine hôte, ajouter l'entrée "blog.example.com" dans `/etc/hosts`. Vérifier que le site est bien accessible et que les logs sont écrits. -## Etape 1 : téléchargement de WordPress +## Etape 2 : PHP-FPM + +Sur le serveur server11, créer un nouveau pool PHP-FPM, en se basant sur l'un +de ceux déjà présents dans `/etc/php/8.4/fpm/pool.d/`. Ses caractéristiques +seront les suivantes : + +- nom du pool : blog ; +- user : `$pool` (astuce pour éviter de copier-coller "blog" partout) +- group : `$pool` +- listen : `/run/php/$pool.sock` +- listen.owner : `$pool` +- listen.group : `www-data` +- listen.mode : `0660` +- pm : `ondemand` +- access.log : `/srv/www/blog.example.com/log/php_access>log` + +À la fin du fichier de pool PHP-FPM, ajouter les paramètres suivants : + +``` +env[TMP] = /srv/www/blog.example.com/tmp +env[TMPDIR] = /srv/www/blog.example.com/tmp +env[TEMP] = /srv/www/blog.example.com/tmp +php_admin_value[error_log] = /srv/www/blog.example.com/log/php_error.log +php_admin_value[open_basedir] = /srv/www/blog.example.com/public/:/tmp:/srv/www/blog.example.com/tmp +php_admin_value[session.save_path] = /srv/www/blog.example.com/session +php_admin_flag[log_errors] = on +php_admin_value[upload_tmp_dir] = /srv/www/blog.example.com/tmp +``` + +Rappel : pour Nginx comme pour PHP-FPM, la création ou la modification de +fichiers de configuration n'est pas prise en compte tant que le service n'a pas +redémarré. + +Retour à Nginx : ajouter une configuration pour PHP dans le bloc server du site +"blog.example.com" : + +``` +index index.php index.html; +location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/blog.sock; +} +``` + +Vérifier en créant un fichier `/srv/www/blog.example.com/public/info.php` +contenant un "PHPinfo" que PHP est bien relié à Nginx, et le visualiser dans un +navigateur. + +## Etape 3 : création d'un utilisateur et d'une base de données + +Ouvrir une session root dans PHPMyAdmin, et se rendre dans l'onglet "user +accounts". Créer un nouvel utilisateur nommé `blog`, pouvant se connecter +depuis n'importe où, et ayant pour mot de passe `myblog`. Avant la création, ne +pas oublier de cocher la case "Create database with same name and grant all +privileges". + +Vérifier en se déconnectant puis en se connectant à PHPMyAdmin que +l'utilisateur et la base sont fonctionnels. + +## Etape 4 : téléchargement de WordPress Télécharger la dernière version de WordPress depuis cette adresse : https://wordpress.org/latest.tar.gz . @@ -49,9 +132,9 @@ https://wordpress.org/latest.tar.gz . Copier l'archive sur server11, dans `/srv/www/blog.example.com/`. Décompresser l'archive dans `/srv/www/blog.example.com/public/`. Modifier récursivement le propriétaire des répertoires et fichiers, ils doivent appartenir à -l'utilisateur `www-data` et au groupe `www-data`. +l'utilisateur `blog` et au groupe `blog`. -## Etape 3 : installation de WordPress +## Etape 5 : installation de WordPress Se rendre sur http://blog.example.com, et effectuer l'installation. WordPress demandera à se connecter à la base de données située sur server12. @@ -62,4 +145,3 @@ manquants. Trouver les paquets Debian correspondant et les installer. Profiter du blog pour y écrire un contenu d'exemple, et surtout, profiter des compétences apprises jusqu'alors. Bravo ! - diff --git a/tp/debian/tp13-docker.md b/tp/debian/tp11-docker.md similarity index 98% rename from tp/debian/tp13-docker.md rename to tp/debian/tp11-docker.md index 5eb88e7..d7778ed 100644 --- a/tp/debian/tp13-docker.md +++ b/tp/debian/tp11-docker.md @@ -20,7 +20,7 @@ Pour aller plus loin : https://fr.wikipedia.org/wiki/Virtualisation#Isolateur Il existe plusieurs technologies de conteneurs, généralement attachées à un système d'exploitation donné (les zones pour Solaris, les jails pour FreeBSD). Sous Linux, la solution la plus populaire est -[Docker](https://www.docker.com/). Il en exsite d'autres, comme +[Docker](https://www.docker.com/). Il en existe d'autres, comme [LXC](https://linuxcontainers.org/lxc/) ou [podman](https://podman.io/). ## Etape 0 : installation de Docker @@ -152,8 +152,7 @@ Depuis l'hôte, se rendre sur http://10.13.37.13:8080/ Pour aller plus loin : à partir du Dockerfile fourni, récupérer le contenu [de ce dépôt](https://github.com/ahpnils/anotherhomepage.org/tree/main/content) et -le servir via Docker. En bonus ++, paramétrer Nginx sur server13 en tant que -reverse-proxy sur http://127.0.0.1:8080. +le servir via Docker. ## Etape 5 : stockage permanent, méthode 1 diff --git a/tp/debian/tp12-nginx-php-fpm.md b/tp/debian/tp12-nginx-php-fpm.md deleted file mode 100644 index e2254e5..0000000 --- a/tp/debian/tp12-nginx-php-fpm.md +++ /dev/null @@ -1,87 +0,0 @@ -[Retour au sommaire](../../README.md) - -# TP 12 : Nginx, et PHP-FPM - -Objectif : - -- faire fonctionner PHP sur notre serveur web Nginx, grâce à FPM ; -- configurer un virtual host de façon à faire fonctionner un ensemble de - processus PHP avec un utilisateur donné. - -## Introduction - -PHP est un langage de script complet. Celui-ci est facile à appréhender grâce à -la simplicité d'installation de `mod_php` pour Apache, mais ce n'est pas la -seule possibilité. Il est possible d'installer et d'utiliser des scripts PHP de -la même façon que d'autres scripts (Bash ou Python par exemple), mais de le -faire communiquer avec un serveur web via un protocole standard comme CGI. - -Ce moyen de communication a laissé sa place à des moyens plus rapides et plus -efficaces, comme FastCGI et FPM (pour Fast Process Manager) et dernièrement PM, -mais FPM est sans doute le plus populaire actuellement. - - -## Etape 0 : installation de PHP-FPM - -Se connecter sur server13 et passer root. Installer le paquet `php-fpm`. Un -nouveau service `php8.4-fpm` existe, vérifier qu'il est bien lancé. - -Dans le virtual host `server13.example.com`, ajouter dans le bloc de -configuration `location /` les directives suivantes : - -``` -location ~ \.php$ { - include snippets/fastcgi-php.conf; - fastcgi_pass unix:/run/php/php8.4-fpm.sock; - } -``` - -Une fois cette modification effectuée, relancer le service `nginx`. De la même -façon que dans le TP 7, étape 1, créer un fichier `info.php` dans -`/srv/www/server13.example.com/public` utilisant la fonction `phpinfo()`. Se -rendre ensuite à l'aide d'un navigateur sur -http://server13.example.com/info.php et vérifier que la page "PHPinfo" -s'affiche. - -Questions : -- dans la page "PHPinfo", rechercher le tableau ayant pour titre "Environment", - sous quel utilisateur est lancé PHP ? Sous quel utilisateur est lancé Nginx ? -- regarder la page "PHPinfo" de server11 et retrouver le même tableau ; a-t'il - les mêmes variables ? -- toujours en comparant les deux pages "PHPinfo", quel est le fichier de - configuration principal activé (`Loaded Configuration File `) ? - -## Etape 1 : configuration personnalisée de PHP-FPM - -Toujours sur server13, créer un utilisateur `server13` dont les -caractéristiques sont les suivantes : - -- son répertoire de départ est `/srv/www/server13.example.com/` ; -- son UID est 2013 ; -- il faut créer un groupe de même nom ; -- son shell est `/sbin/nologin`. - -Ensuite, transférer le fichier `fpm/server13.conf` dans le répertoire -`/etc/php/8.4/fpm/pool.d`. Avec la commande `usermod`, ajouter l'utilisateur `www-data` (utilisé par nginx) -au groupe `server13` afin d'autoriser l'accès en lecture et écriture au fichier -`server13.sock`. Relancer le service `php8.4-fpm`, puis vérifier que -celui-ci est bien relancé, via systemd. - -Questions : -- via systemd, combien de processus php sont lancés ? -- dans quels pools sont-ils ? - -Editer le fichier `/etc/php/8.4/fpm/pool.d/server13.conf` à la ligne 103, et -remplacer `pm = dynamic` par `pm = static`. Relancer le service `php8.4-fpm`, -et répondre de nouveau aux deux questions précédentes. - -Editer le fichier `/etc/nginx/sites-enabled/server13.example.com.conf`, et -remplacer la ligne `fastcgi_pass unix:/run/php/php8.4-fpm.sock;` par `fastcgi_pass unix:/run/php/server13.sock;`. Relancer Nginx, et regarder la page "PHPinfo". Remettre la valeur initiale de la directive, relancer Nginx et rafraîchir la page. - -Question : quels sont les changements entre les deux pools ? - -## Etape 2 : installation d'une application PHP - -À partir des modèles vus plus haut, créer un pool "www13" et permettre au -virtual host "www13.example.com" d'exécuter ce pool PHP. S'il reste du temps, -installer PluxML dans ce pool. diff --git a/tp/debian/tp11-nginx.md b/tp/debian/tp12-nginx-reverse-proxy.md similarity index 69% rename from tp/debian/tp11-nginx.md rename to tp/debian/tp12-nginx-reverse-proxy.md index ee41ed0..02ff6c3 100644 --- a/tp/debian/tp11-nginx.md +++ b/tp/debian/tp12-nginx-reverse-proxy.md @@ -1,12 +1,12 @@ [Retour au sommaire](../../README.md) -# TP 11 : À la découverte de Nginx +# TP 12 : Nginx en tant que reverse-proxy Objectifs : -- installer le serveur HTTP Nginx ; -- créer des virtual hosts ; -- l'utiliser en tant que mandataire inverse (reverse proxy). +- installer le serveur HTTP Nginx sur server13; +- l'utiliser en tant que mandataire inverse (reverse proxy) pour des conteneurs + Docker. ## Introduction @@ -34,10 +34,6 @@ Se connecter en ssh sur server13, puis passer root. Installer Nginx via la commande `apt install nginx`. Se rendre via le navigateur de l'hôte sur http://10.13.37.13 et vérfier que Nginx est bien lancé. -Consulter le répertoire `/etc/nginx/` et comparer par rapport à -`/etc/apache2/`, en particulier pour les répertoires des virtual hosts et des -modules. - ## Etape 1 : virtual hosts Sur sa machine locale, ouvrir un terminal, et passer root. Editer le fichier de @@ -63,23 +59,11 @@ Se connecter sur server13 et passer root. Créer l'aborescence suivante : Ajouter un fichier `index.html` au contenu libre dans le répertoire `public`. Transférer le fichier `nginx/server13.example.com.conf` de ce dépôt dans le -répertoire `/etc/nginx/sites-available/` de server13. - -Nginx ne possède pas de programme d'aide comme Apache pour simplifier la -création des liens. Se rendre dans `/etc/nginx/sites-enabled/`, puis créer un -lien symbolique du fichier de configuration récemment transféré : `ln -sv -/etc/nginx/sites-available/server13.example.com.conf ./`. Enfin, supprimer le -bloc server par défaut : `rm /etc/nginx/sites-enabled/default`. Nginx étant démarré -comme n'importe quel service, utiliser `systemctl restart nginx` pour le -redémarrer. +répertoire `/etc/nginx/sites-enabled/` de server13. Vérifier ensuite que http://server13.example.com fonctionne bien et renvoie vers notre virtual host, et que les bons fichiers de log sont écrits. -À partir ce modèle, créer une arborescence et un fichier de configuration pour -répondre à http://www13.example.com. - - ## Etape 2 : reverse proxy basique Toujours sur server13, en tant que root, ajouter la configuration suivante dans @@ -107,3 +91,37 @@ Sur server13; éditer le fichier de configuration `/etc/hosts/` et ajouter la li Puis, modifier la directive `proxy_pass` pour tenter d'accéder en particulier à server11.example.com puis à www11.example.com. Ne pas oublier de relancer Nginx à chaque modification du fichier de configuration. + +## Etape 3 : reverse proxy avancé + +Grâce aux commandes apprises lors de l'étape 2 du TP sur Docker, lancer un +conteneur docker [createleafcloud/echoip](https://github.com/leafcloudhq/echoip) et rendre +ce conteneur accessible sur le port 8080. Vérifier que le service est +disponible à l'URL http://10.13.37.13:8080 . + +Ajouter ensuite les directives suivantes dans le fichier de virtual host Nginx +pour server13 (dans le bloc `location /`) : + +``` +client_body_buffer_size 128k; +client_max_body_size 525M; +proxy_buffer_size 16k; +proxy_buffers 32 16k; +proxy_busy_buffers_size 64k; +proxy_cache_valid 200 302 5m; +proxy_cache_valid 404 1m; +proxy_connect_timeout 90s; +proxy_pass http://127.0.0.1:8080/; +proxy_pass_header Authorization; +proxy_read_timeout 90s; +proxy_send_timeout 90s; +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $connection_upgrade; +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +``` + +Relancer Nginx et visiter successivement http://server13.example.com et +http://server13.example.com:8080 . diff --git a/tp/debian/tp14-sudo.md b/tp/debian/tp13-sudo.md similarity index 100% rename from tp/debian/tp14-sudo.md rename to tp/debian/tp13-sudo.md diff --git a/tp/debian/tp15-ssh_avance.md b/tp/debian/tp14-ssh_avance.md similarity index 100% rename from tp/debian/tp15-ssh_avance.md rename to tp/debian/tp14-ssh_avance.md diff --git a/tp/debian/tp16-https_apache.md b/tp/debian/tp15-https_nginx.md similarity index 56% rename from tp/debian/tp16-https_apache.md rename to tp/debian/tp15-https_nginx.md index 9e09a2e..f39e086 100644 --- a/tp/debian/tp16-https_apache.md +++ b/tp/debian/tp15-https_nginx.md @@ -1,6 +1,6 @@ [Retour au sommaire](../../README.md) -# TP 16 : HTTPS avec Apache +# TP 17 : HTTPS avec Nginx Objectifs : @@ -19,19 +19,22 @@ Quelques points-clés sur HTTPS : - il faut impérativement une clé privée et un certificat ; - grâce à SNI (Server-Name Indicator), il est possible d'héberger plusieurs sites web (chacun ayant son certificat) sur une même adresse IP ; avant son - arrivée, chaque virtual host dans Apache devait avoir une adresse IP + arrivée, chaque virtual host devait avoir une adresse IP propre pour pouvoir faire du HTTPS. ## Etape 0 : prérequis -HTTPS est disponible dans Apache grâce au module `ssl_module`. Ce module est fort -heureusement disponible dans Debian avec la paquet `apache2`. Dans notre cas, -il est donc déjà installé sur `server11`. +Certains serveurs web "historiques" embarquent HTTPS comme module, désactivé +par défaut. Nginx embarque HTTPS nativement, et certaines versions récentes +permettent même d'obtenir un certificat très simplement (d'autres serveurs web +modernes le permettent aussi). Mais nous allons faire les choses "à l'ancienne" +dans ce TP. -Question : le module `ssl_module` est-il activé sur `server11` ? +//Bien souvent, en environnement de test, générer un certificat peut s'avérer +fastidieux. C'est pourquoi il existe un paquet Debian nommé `ssl-cert` qui +comporte, entre autres un certificat auto-signé. -Se connecter sur `server11`, activer le module avec la commande `a2enmod -ssl`, puis redémarrer Apache. Vérifier que le module est bien activé. +//Installer, si ce n'est pas déjà la cas, le paquet `ssl-cert` sur `server13` ## Etape 1 : générer un certificat autosigné @@ -61,31 +64,28 @@ Lancer (en tant que root sur `server11`) les commandes suivantes : ``` apt -y install openssl -mkdir -vp /etc/apache2/selfcerts -openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/apache2/selfcerts/www11.example.com.key -out /etc/apache2/selfcerts/www11.example.com.crt -subj '/C=FR/ST=IdF/L=Paris/O=Example Corp/OU=Dev/CN=example/CN=www11.example.com' +mkdir -vp /etc/nginx/selfcerts +openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/nginx/selfcerts/www13.example.com.key -out /etc/nginx/selfcerts/www13.example.com.crt -subj '/C=FR/ST=IdF/L=Paris/O=Example Corp/OU=Dev/CN=example/CN=www13.example.com' ``` Décortiquons la dernière commande : elle a créé et signé un certificat d'une durée de vie de 365 jours, la clé privée se trouve dans -`/etc/apache2/selfcerts/www11.example.com.key` et le certificat se trouve dans -`/etc/apache2/selfcerts/www11.example.com.crt`. Ce certificat est valable pour -le nom `www11.example.com`. +`/etc/nginx/selfcerts/www13.example.com.key` et le certificat se trouve dans +`/etc/nginx/selfcerts/www13.example.com.crt`. Ce certificat est valable pour +le nom `www13.example.com`. -## Etape 1 : configuration initiale HTTPS +## Etape 1 : configuration virtual host HTTPS La simple création d'un certificat ne suffit pas à avoir un site HTTPS. Il nous -faut aussi créer un virtual host. Dans le répertoire `apache` de ce dépôt se -trouve le fichier `ssl_www11.example.com.conf`. Le transférer sur `server11` -dans l'emplacement `/etc/apache2/sites-available`. Puis, activer la virtual -host via la commande `a2ensite ssl_www11.example.com` (en tant que root ou via -`sudo`). +faut aussi créer un virtual host. Dans le répertoire `nginx` de ce dépôt se +trouve le fichier `ssl_www13.example.com.conf`. Le transférer sur `server13` +dans l'emplacement `/etc/nginx/sites-enabled`. Redémarrer Nginx. -Visiter http://www11.example.com puis https://www11.example.com, en autorisant -le navigateur à s'y connecter. Puis regarder les deux fichiers de configuration -des virtual hosts. +Visiter http://server13.example.com puis https://server13.example.com, en +autorisant le navigateur à s'y connecter. -Question : quelles sont les directives supplémentaires dans -`ssl_www11.example.com.conf` ? Quel est leur usage ? +Question : quelles sont les directives supplémentaires du fichier de +configuration ajouté ? À quoi correspondent-elles ? Vérifier que les requêtes apparaissent bien dans les logs. @@ -93,22 +93,12 @@ Vérifier que les requêtes apparaissent bien dans les logs. Si un même site est disponible en HTTP et HTTPS, la redirection n'est pas automatique. Pour éviter que des utilisateurs restent sur le site HTTP, il est -possible d'ajouter une règle de redirection. Plusieurs manières de faire cette -redirection existent. L'une d'entre elles utilise un module nommé -`mod_rewrite`. - -Comme pour le module `ssl`, activer le module `rewrite` : `a2enmod rewrite`. -Redémarrer Apache. Ajouter ensuite dans la configuration du virtual host -`www11.example.com` les directives suivantes : +possible d'ajouter une règle de redirection. +Ajouter dans le virtual host de `server13.example.com` la ligne suivante : ``` - - RewriteEngine On - RewriteCond %{HTTPS} !=on - RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] - +return 301 https://$host$request_uri; ``` -Redémarrer de nouveau Apache, et se rendre sur http://www11.example.com. La +Redémarrer Nginx, et se rendre sur http://server13.example.com. La redirection devrait fonctionner. - diff --git a/tp/debian/tp17-https_nginx.md b/tp/debian/tp17-https_nginx.md deleted file mode 100644 index 4d29f2b..0000000 --- a/tp/debian/tp17-https_nginx.md +++ /dev/null @@ -1,50 +0,0 @@ -[Retour au sommaire](../../README.md) - -# TP 17 : HTTPS avec Nginx - -Objectifs : - -- configurer un virtual host HTTPS ; -- configurer la redirection HTTP vers HTTPS. - -## Introduction - -Comme Apache, Nginx gère HTTPS. Mais la syntaxe des directives diffère. - -## Etape 0 : prérequis - -Bien souvent, en environnement de test, générer un certificat peut s'avérer -fastidieux. C'est pourquoi il existe un paquet Debian nommé `ssl-cert` qui -comporte, entre autres un certificat auto-signé. - -Installer, si ce n'est pas déjà la cas, le paquet `ssl-cert` sur `server13` - -## Etape 1 : configuration virtual host HTTPS - -Comme pour Apache, ce dépôt contient un fichier de configuration déjà prêt. -Transférer le fichier `ssl_server13.example.com.conf` du répertoire `nginx/` de -ce dépôt sur `server13` dans le répertoire `/etc/nginx/sites-available/`. -Activer le site via un lien symbolique dans `/etc/nginx/sites-enabled/`, puis -redémarrer Nginx. - -Visiter http://server13.example.com puis https://server13.example.com, en -autorisant le navigateur à s'y connecter. - -Question : quelles sont les directives supplémentaires du fichier de -configuration ajouté ? À quoi correspondent-elles ? - -Vérifier que les requêtes apparaissent bien dans les logs. - -## Etape 2 : redirection HTTP vers HTTPS - -Si un même site est disponible en HTTP et HTTPS, la redirection n'est pas -automatique. Pour éviter que des utilisateurs restent sur le site HTTP, il est -possible d'ajouter une règle de redirection. - -Ajouter dans le virtual host de `server13.example.com` la ligne suivante : -``` -return 301 https://$host$request_uri; -``` - -Redémarrer Nginx, et se rendre sur http://server13.example.com. La -redirection devrait fonctionner. diff --git a/tp/debian/tp5-apache-basique.md b/tp/debian/tp5-apache-basique.md deleted file mode 100644 index 4cd876c..0000000 --- a/tp/debian/tp5-apache-basique.md +++ /dev/null @@ -1,161 +0,0 @@ -[Retour au sommaire](../../README.md) - -# TP 5 : Installation et paramétrage basique du serveur web Apache - -Objectifs : - -- installer le serveur HTTP Apache ; -- le démarrer, l'arrêter et l'activer au démarrage du serveur ; -- déposer du contenu et le rendre accessible ; -- personnaliser l'emplacement du contenu ; -- accéder aux fichiers de logs. - -## Introduction - -Apache HTTP Server (Apache) est un serveur HTTP, probablement le plus connu au -monde. Le nom complet est bien "Apache HTTP Server", mais souvent par abus de -langage, on le nomme en raccourci "Apache". Cela peut parfois porter à -confusion avec d'autres logiciels de la fondation éponyme, qui gère le -développement de ce serveur web mais aussi, entre autres, d'Open Office (suite -bureautique), Tomcat (serveur d'applications) et de nombreux logiciels utilisés -en environnement Java (comme log4j). - -## Étape 0 : installation - -Comme bon nombre de distributions Linux et BSD, Apache est disponible via des -paquets binaires pré-compilés pour Debian. Le nom du paquet varie selon les -distributions, ici il se nomme `apache2`. - -Se connecter sur server11, puis passer root. -Avant l'installaton, regarder quels sont les services réseau en fonctionnement -: `lsof -n -i`. Seul sshd devrait apparaître. Maintenant, installer Apache : -`apt -y install apache2`. Relancer la commande d'avant. - -Question : est-ce que l'installation d'Apache a lancé celui-ci ? - -Se rendre via le navigateur de l'hôte sur http://10.13.37.11. Il est aussi -possible, depuis server11 ou depuis l'hôte, d'utiliser un requêteur HTTP en -ligne de commande comme `curl`. La lecture de la page affichée est recommandée, -et contient des informations intéressantes pour les prochaines étapes et -prochains TP. - -## Étape 1 : démarrage, arrêt, et activation au démarrage - -Se connecter en ssh sur server11, puis passer root. -Vérifier grâce à l'outil `ps` si Apache est toujours en fonctionnement. - -Questions : -- comment s'appelle le programme ? -- combien de processus correspondants sont en fonctionnement ? -- à quels utilisateurs appartiennent ces processus ? - -Apache dispose d'un petit programme permettant de le contrôler. Sous Debian, il -est disponible via la commande `apachectl` ou `apache2ctl`. Il est possible -d'utiliser ce programme pour démarrer, arrêter et relancer Apache, entre -autres. - -Lancer la commande `apachectl stop`, puis vérifier via `ps` que celui-ci est -bien arrêté. Lancer ensuite la commande `apachectl start`, et vérifier de la -même façon qu'Apache fonctionne. Ouvrir un deuxième terminal, se connecter en -ssh sur server11, puis passer root. Lancer la commande `top -u www-data`. -Depuis le premier terminal, lancer la commande `apachectl restart`, puis -regarder les changements au niveau de `top`. - -Question : qu'a fait `apachectl restart` ? - -De nombreuses distributions Linux utilisent *systemd* comme système d'init. -Entre autres, *systemd* permet de gérer le lancement et l'activation au -démarrage de démons, appelés services. Refaire les actions précédentes en -utilisant `systemctl start|stop|restart apache2`. En plus de `top`, utiliser la -commande `systemctl status apache2` pour voir l'état de lancement d'Apache. - -Question : en utilisant `systemctl status apache2`, est-ce qu'Apache est lancé -au démarrage du système ? - -Redémarrer server11 et s'assurer qu'Apache a bien démarré sans action. -Utiliser ensuite `systemctl disable apache2` puis redémarrer, s'assurer -qu'Apache n'est pas lancé. Ré-activer Apache (`systemctl enable apache2`) et le -démarrer. - -## Étape 2 : déposer du contenu - -Si ce n'est pas fait, lire la documentation de la page par défaut disponible à -l'URL http://10.13.37.11. Se connecter en ssh sur server11, et passer root. -se rendre dans `/var/www/html/`, et y créer un fichier `page2.html`. Insérer du -texte ou du code HTML dans ce fichier, peu importe tant que c'est visible. -Visiter l'URL http://10.13.37.11/page2.html et admirer le résultat. - -Question : à quel utilisateur appartient `page2.html`, et quels sont les droits -dessus ? - -Changer les droits sur `page2.html` de la façon suivante : `chmod 000 -page2.html`. Tenter à nouveau d'accéder à la page. Rechercher ensuite les -droits minimum pour que la page soit de nouveau accessible. - -Question : quels sont les droits minimum pour accéder à `page2.html` depuis le -serveur web ? En owner root ainsi qu'en owner www-data. - -## Étape 3 : personnaliser l'emplacement du contenu - -Par défaut, le contenu se trouve donc dans `/var/www/html`. Mais il est -possible de modifier cet emplacement. Se rendre dans -`/etc/apache2/sites-enabled/` et lire le fichier de configuration -`000-default.conf`. - -Question : quelle est la directive qui permet de paramétrer l'emplacement du -contenu ? - -Créer un répertoire `/var/www/html2` puis ajouter à cet endroit un fichier -`index2.html` au contenu libre. Modifier la directive `DocumentRoot` pour y -utiliser `/var/www/html2`, puis redémarrer Apache. Rafraîchir -http://10.13.37.11 . - -Question : qu'observe-t'on ? - -Ajouter au fichier `000-default.conf` sous la directive `DocumentRoot` la -directive `DirectoryIndex index.html index2.html`. Relancer Apache. - -Question : que fait la directive `DirectoryIndex` ? - -Créer un répertoire `/srv/www/html` et y créer un fichier `index.html` au -contenu libre, puis modifier à nouveau la directive `DocumentRoot` pour y -insérer ce nouveau répertoire. Relancer Apache et rafraîchir la page dans le -navigateur. - -Question : quel est le résultat ? - -Éditer le fichier de configuration `/etc/apache2/apache2.conf` et retrouver la -directive ouvrante ``. En dessous se trouve une directive -similaire pour `/srv/`. Décommenter les directives et relancer Apache. - -## Étape 4 : les fichiers de logs (journaux) - -De nombreuses requêtes HTTP ont été réalisées dans les étapes précédentes, -certaines avec succès, d'autres générant une erreur. Il peut être utile de voir -ce qui se passe bien et ce qui se passe moins bien. Apache2 permet entre autres -d'enregistrer des informations sur les requêtes dans des fichiers dits -journaux, ou log en anglais. Par convention, sous Unix, les logs se trouvent -dans le répertoire `/var/log`, et sous Debian, Apache stocke ses logs dans -`/var/log/apache2` par défaut. Tout ceci est bien entendu configurable. - -Repérer dans `/etc/apache2/apache2.conf` la directive `ErrorLog`. Retrouver le -fichier correspondant dans `/var/log/apache2`. - -Repérer dans `/etc/apache2/sites-enabled/000-default.conf` les directives -`ErrorLog` et `CustomLog`, et retrouver les fichiers correspondants dans -`/var/log/apache2`. - -Questions : -- quelles informations trouve-t-on dans `/var/log/apache2/access.log` ? -- quelles informations trouve-t-on dans `/var/log/apache2/error.log` ? - -Depuis un terminal, lancer la commande `tail -f /var/log/apache2/error.log` puis dans -un autre terminal, en tant que root, lancer la commande `apachectl restart`. - -Question : qu'observe-t-on ? - -Couper `tail`, puis lancer la commande `tail -f /var/log/apache2/access.log` puis -utiliser son navigateur pour visiter le site web, et tenter d'accéder à des -pages inexistantes. - -Question : qu'observe-t-on ? diff --git a/tp/debian/tp7-apache-mod_php.md b/tp/debian/tp7-apache-mod_php.md deleted file mode 100644 index a2bcd0d..0000000 --- a/tp/debian/tp7-apache-mod_php.md +++ /dev/null @@ -1,144 +0,0 @@ -[Retour au sommaire](../../README.md) - -# TP 7 : découverte de mod_php - -Objectifs : - -- installer PHP en tant que module pour Apache ; -- configurer PHP depuis son fichier de configuration ; -- configurer PHP depuis un virtual host Apache ; -- installer des extensions à PHP ; -- installer une application PHP. - -## Introduction - -## Etape 0 : Apache et les modules - -Apache a un fonctionnement en modules, qui étendent ses fonctionnalités. -Certains modules sont compilés de façon statique, c'est-à-dire qu'ils sont -intégrés au fichier binaire `/usr/sbin/apache2`. D'autres modules sont compilés -en tant que bibliothèque partagée. - -Se connecter sur server11, puis passer root. Lancer la commande `apachectl -M` -et examiner le résultat. - -Question : est-ce que les modules "proxy", "mpm_event" et "log_config" sont -chargés ? De quel type de module s'agit-il ? - -Comme pour les virtual hosts, pour Debian, les modules Apache disposent d'une -organisation spécifique sur le système de fichiers. Dans la liste de la -question précédente, regarder si des fichiers correspondent à ces modules dans -`/etc/apache2/mods-available/` et dans `/etc/apache2/mods-enabled/`. - -Question : pour quel module il n'y a pas de fichier correspondant dans -`/etc/apache2/mods-enabled/` ? - -Lancer la commande `a2enmod ` en remplaçant `` par le nom du -module en question, et suivre les instructions de relance d'Apache. Vérifier -ensuite via la commande `apachectl -M` dans `/etc/apache2/mods-enabled/` que le -module est bien paramétré et activé. Lancer la commande `a2dismod` -correspondante pour désactiver le module et vérifier que c'est bien le cas via -les mêmes commandes. - -## Etape 1 : installation et configuration de mod_php - -Lancer la commande `apachectl -M` et garder de côté le résultat. - -Question : est-ce que le module "mpm_event" est toujours chargé ? - -Installer le paquet `libapache2-mod-php` et observer attentivement les -informations affichées à l'écran. - -Question : selon les informations affichées à l'écran, est-ce que le module -"mpm_event" est toujours chargé ? Est-ce que d'autres modules sont chargés ? - -Vérifier que les informations affichées à l'écran ne sont pas mensongères à -l'aide de `apachectl -M`, puis comparer cet affichage à celui du début de -l'étape. - -Vérifier maintenant que PHP est bien activé. Dans le répertoire -`/srv/www/server11.example.com/public/`, créer un fichier `info.php` dont le -contenu est le suivant : - -``` - -``` - -PHP est maintenant installé et fonctionnel. La page "PHPinfo" permet -d'obtenir des informations sur la configuration et les modules installés. - -Questions : - -- à l'aide de la page "PHPinfo", quel est le chemin vers fichier de - configuration (`php.ini`) utilisé par `mod_php` ? -- à l'aide de la page "PHPinfo", quel est le fuseau horaire (timezone) par - défaut configuré dans `mod_php` ? - -Editer de le fichier de configuration trouvé et trouver la directive -`date.timezone`. La décommenter, et, à l'aide de la documentation officielle -(http://php.net/date.timezone), configurer le fuseau horaire sur Paris. -Redémarrer Apache puis rafraîchir et vérifier dans la page "PHPinfo" que la -configuration a bien été prise en compte. - -Il est aussi possible de modifier la configuration depuis Apache. Ajouter dans -la configuration du virtual host pour server11.example.com la directive -suivante : `php_admin_value date.timezone "Europe/Warsaw"`. Redémarrer Apache, -puis rafraîchir la page "PHPinfo". - -Questions : -- est-ce que la page "PHPinfo" mentionne la nouvelle configuration de fuseau - horaire ? -- est-ce que la configuration "Europe/Paris" est toujours présente malgré tout - ? - -Renommer le fichier `info.php` en `index.php`. - -Question : qu'est-ce que http://server11.example.com/ affiche ? - -Ajouter dans la configuration du virtual host pour ce site la directive -`DirectoryIndex index.php`. Redémarrer Apache puis rafraîchir la page. - -Question : qu'est-ce que http://server11.example.com/ affiche maintenant ? - -Renommer `index.php` en `info.php` puis rafraîchir la page, et prendre note du -résultat. Ensuite, paramétrer la directive `DirectoryIndex` à la valeur -`index.php index.html`. Redémarrer Apache, rafraîchir la page, et prendre note -du résultat. Renommer de nouveau `info.php` en `index.php`. - -Question : quel est le comportement de `DirectoryIndex` ? - -## Etape 2 : ajout d'extensions - -PHP, comme Apache, est conçu de façon modulaire. Il est possible de lui ajouter -des fonctionnalités par le biais d'extensions. Bon nombre d'entre elles sont -disponibles sous la forme de paquets logiciels pour Debian, et l'installation -s'en trouve facilitée. - -Nous allons installer l'extension -[GD](https://www.php.net/manual/fr/book.image.php), qui permet de faire du -traitement d'images. Nous ne l'utiliserons pas tout de suite, -il s'agit d'un prérequis à l'étape suivante. - -Installer le paquet `php8.4-gd` puis rafraîchir la page "PHPinfo". Vérifier si -GD est activé. Relancer Apache puis rafraîchir la page "PHPinfo". Vérifier de -nouveau si GD est activé. - -## Etape 3 : installation d'une application PHP - -[PluXml](https://pluxml.org/) est un moteur de blog et CMS en PHP, qui a la -particularité de ne pas nécessiter de base de données pour fonctionner. - -Supprimer les fichiers `index.html` et `index.php`. - -Installer PluXml dans le virtual host `server11.example.com` et écrire une page -personnalisée. - -Quelques points d'assistance : -- PluXml est distribué sous forme d'archive zip, il faudra donc installer le - paquet unzip sur server11 ; -- il est possible de télécharger directement l'archive de PluXml depuis - server11 grâce au logiciel wget ; -- PluXml a besoin des extensions PHP XML et GD ; -- PluXml a besoin du module Apache "rewrite". diff --git a/tp/ubuntu/tp0-kvm-libvirt.md b/tp/ubuntu/tp00-kvm-libvirt.md similarity index 98% rename from tp/ubuntu/tp0-kvm-libvirt.md rename to tp/ubuntu/tp00-kvm-libvirt.md index 527f252..feb9e89 100644 --- a/tp/ubuntu/tp0-kvm-libvirt.md +++ b/tp/ubuntu/tp00-kvm-libvirt.md @@ -118,7 +118,7 @@ Cliquer sur Terminer. Le démarrage de la machine virtuelle commence. Pour se connecter sur l'OS invité, l'utilisateur est `root`, et il n'y a pas de mot de passe. Attention, le clavier est configuré en QWERTY (il est possible -d'utiliser la commande `setup-keyboard` pour y remédier), et lors du premier +d'utiliser la commande `setup-keymap` pour y remédier), et lors du premier clic dans l'écran de la machine virtuelle, un message à propos de la capture de la souris et du clavier sera affiché (on peut autoriser / allow sans risque). diff --git a/tp/ubuntu/tp1-kvm-libvirt.md b/tp/ubuntu/tp01-kvm-libvirt.md similarity index 100% rename from tp/ubuntu/tp1-kvm-libvirt.md rename to tp/ubuntu/tp01-kvm-libvirt.md diff --git a/tp/ubuntu/tp2-vagrant.md b/tp/ubuntu/tp02-vagrant.md similarity index 95% rename from tp/ubuntu/tp2-vagrant.md rename to tp/ubuntu/tp02-vagrant.md index 740b3e6..476ec74 100644 --- a/tp/ubuntu/tp2-vagrant.md +++ b/tp/ubuntu/tp02-vagrant.md @@ -5,7 +5,7 @@ Objectifs : - installer Vagrant ; -- déployer et gérer 3 machines virtuelles Debian 12 avec Vagrant. +- déployer et gérer 3 machines virtuelles Debian 13 avec Vagrant. ## Etape 0 : récupération du dépôt GitHub du projet @@ -60,7 +60,7 @@ Questions : quel est le nom de l'utilisateur une fois connecté ? Dispose-t'il des droits super-utilisateurs (aide : `sudo -i` ou `sudo -l`) ? Dans certains cas de figure, il se peut qu'il soit nécessaire de détruire une -VM. Pour cela, utiliser la cible `make clean VM_NAME` et valider +VM. Pour cela, utiliser la cible `make clean VM_NAME=` et valider via `make status` qu'elle est détruite. La cible `make clean` sans spécifier le nom de la VM permet de détruire tout