P23 - Protocoles HTTP et FTP
Objectif
Comprendre ce qui circule réellement entre un navigateur et un serveur web (requête, réponse, codes, en-têtes), et savoir monter un serveur FTP sécurisé (ProFTPd en FTPS) quand on ne peut pas utiliser SFTP.
Source
Fiche rédigée à partir de la seconde partie de cours de lidstah (HTTP et FTP).
1. HTTP en clair : on peut le taper à la main
HTTP est un protocole texte. On peut parler à un serveur web avec telnet ou curl :
telnet www.perdu.com 80
GET / HTTP/1.1
Host: www.perdu.com
# (ligne vide = fin de la requête, appuyer deux fois sur Entrée)
# plus simple, avec curl : -v affiche la requête (>) et la réponse (<)
curl -v http://www.perdu.com
curl -I https://skyh.fr # seulement les en-têtes de la réponsesequenceDiagram participant N as Navigateur participant S as Serveur web N->>S: GET /index.html HTTP/1.1<br/>Host: skyh.fr<br/>User-Agent: Firefox S-->>N: HTTP/1.1 200 OK<br/>Content-Type: text/html<br/>(ligne vide)<br/>contenu de la page
Une requête = une ligne MÉTHODE /chemin VERSION + des en-têtes + une ligne vide (+ un corps pour POST). L’en-tête Host est obligatoire depuis HTTP/1.1 : c’est lui qui permet d’héberger plusieurs sites sur une seule IP (virtual hosts).
| Méthode | Rôle |
|---|---|
| GET | Lire une ressource |
| HEAD | Comme GET mais seulement les en-têtes |
| POST | Envoyer des données (formulaire) |
| PUT / PATCH | Remplacer / modifier une ressource |
| DELETE | Supprimer |
| OPTIONS | Demander les méthodes autorisées |
2. Les codes de réponse
| Famille | Sens | Les plus courants |
|---|---|---|
| 1xx | Information | 101 (passage en WebSocket) |
| 2xx | Succès | 200 OK, 201 Created, 204 No Content |
| 3xx | Redirection | 301 permanente (http → https), 302 temporaire, 304 pas modifié |
| 4xx | Erreur du client | 400 requête invalide, 401 non authentifié, 403 interdit, 404 introuvable |
| 5xx | Erreur du serveur | 500 erreur interne, 502 Bad Gateway (le proxy n’atteint pas le serveur), 503 indisponible, 504 délai dépassé |
Diagnostic rapide
4xx → regarder ce qu’on demande (URL, identifiants, droits). 5xx → regarder les journaux du serveur (
/var/log/apache2/error.log,journalctl -u nginx). 502 derrière HAProxy ou Caddy → le serveur applicatif derrière est arrêté.
3. Les en-têtes utiles
| En-tête | Côté | Rôle |
|---|---|---|
Host | Client | Nom du site demandé |
User-Agent | Client | Logiciel utilisé (navigateur, curl, robot) |
Accept, Accept-Language | Client | Formats et langues acceptés |
Referer | Client | Page d’où vient le visiteur |
Content-Type | Serveur | Type MIME du contenu : text/html; charset=utf-8, application/json, image/png |
Content-Length | Serveur | Taille en octets |
Last-Modified, Expires, Cache-Control | Serveur | Gestion du cache |
Location | Serveur | Adresse de redirection (avec 301/302) |
X-Forwarded-For | Proxy | Vraie IP du client quand un reverse proxy est devant (voir SV03 - HAProxy (reverse proxy et répartition de charge)) |
MIME vient du courrier électronique : il indique la nature d’un contenu et son encodage pour que chacun l’affiche correctement (accents compris).
Sécurisation : authentification basic (identifiants en base64 = lisibles, uniquement sous HTTPS) ou digest ; HTTPS = HTTP dans un tunnel TLS (port 443) avec un certificat (Let’s Encrypt). Versions : HTTP/1.1 (1997), HTTP/2 (multiplexage), HTTP/3 (sur QUIC/UDP).
4. FTP
| Point | Explication |
|---|---|
| Ports | 21 (commandes) + un port de données séparé |
| Mode actif | Le serveur se connecte au client pour les données (bloqué par le NAT et les pare-feu) |
| Mode passif | Le serveur indique un port, le client s’y connecte (le mode à utiliser aujourd’hui) |
| Binaire / ASCII | Binaire = fichier tel quel ; ASCII = conversion des fins de ligne (texte seulement) |
| Sécurité | FTP envoie identifiants et fichiers en clair → FTPS (FTP + TLS) ou mieux SFTP (sur SSH, voir L08 - SSH, SCP et SFTP) |
Serveur ProFTPd limité et chiffré
sudo apt install proftpd-basic
# un utilisateur FTP sans shell (il ne peut pas ouvrir de terminal)
sudo useradd -m -s /bin/false ftpclient
sudo passwd ftpclient
sudo addgroup ftpgroup
sudo usermod -aG ftpgroup ftpclientDans /etc/proftpd/proftpd.conf :
# jamais root en FTP
RootLogin off
# accepter les comptes sans shell
RequireValidShell off
# enfermer chacun dans son dossier (chroot)
DefaultRoot ~
# seul le groupe ftpgroup peut se connecter
<Limit LOGIN>
DenyGroup !ftpgroup
</Limit>
Activer TLS (certificat auto-signé pour le labo) :
sudo mkdir /etc/proftpd/certs
sudo openssl req -new -x509 -days 365 -nodes \
-keyout /etc/proftpd/certs/proftpd.key.pem -out /etc/proftpd/certs/proftpd.crt.pem
sudo chmod 600 /etc/proftpd/certs/*
# dans /etc/proftpd/tls.conf : TLSEngine on, TLSRequired on, TLSProtocol TLSv1.2 TLSv1.3,
# TLSRSACertificateFile et TLSRSACertificateKeyFile vers les deux fichiers
# puis décommenter « Include /etc/proftpd/tls.conf » dans proftpd.conf
sudo systemctl restart proftpdTest avec FileZilla : protocole FTP – Exiger FTP explicite sur TLS.
Exercices
- Un site renvoie 403. Un autre renvoie 503. Où chercher dans chaque cas ?
- Pourquoi l’en-tête
Hostpermet-il d’avoir plusieurs sites sur un seul serveur ? - Le client FTP se connecte mais la liste des fichiers ne s’affiche jamais. Hypothèse ?
Correction
- 403 : problème de droits (fichiers, configuration
Require, authentification). 503 : le service derrière est indisponible (application, base de données arrêtée) : journaux du serveur.- Toutes les requêtes arrivent sur la même IP et le même port ; le serveur lit
Hostpour choisir quel site (virtual host) répondre.- La connexion de données est bloquée : passer en mode passif et ouvrir la plage de ports passifs sur le pare-feu.
Voir aussi
- SV01 - Apache, PHP et MariaDB · SV03 - HAProxy (reverse proxy et répartition de charge) · L08 - SSH, SCP et SFTP · O06 - Wireshark
- Cours complet : cours de lidstah · cours de lidstah
- Retour : P00 - Programme pas encore vu