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éponse
sequenceDiagram
  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éthodeRôle
GETLire une ressource
HEADComme GET mais seulement les en-têtes
POSTEnvoyer des données (formulaire)
PUT / PATCHRemplacer / modifier une ressource
DELETESupprimer
OPTIONSDemander les méthodes autorisées

2. Les codes de réponse

FamilleSensLes plus courants
1xxInformation101 (passage en WebSocket)
2xxSuccès200 OK, 201 Created, 204 No Content
3xxRedirection301 permanente (http → https), 302 temporaire, 304 pas modifié
4xxErreur du client400 requête invalide, 401 non authentifié, 403 interdit, 404 introuvable
5xxErreur du serveur500 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êteCôtéRôle
HostClientNom du site demandé
User-AgentClientLogiciel utilisé (navigateur, curl, robot)
Accept, Accept-LanguageClientFormats et langues acceptés
RefererClientPage d’où vient le visiteur
Content-TypeServeurType MIME du contenu : text/html; charset=utf-8, application/json, image/png
Content-LengthServeurTaille en octets
Last-Modified, Expires, Cache-ControlServeurGestion du cache
LocationServeurAdresse de redirection (avec 301/302)
X-Forwarded-ForProxyVraie 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

PointExplication
Ports21 (commandes) + un port de données séparé
Mode actifLe serveur se connecte au client pour les données (bloqué par le NAT et les pare-feu)
Mode passifLe serveur indique un port, le client s’y connecte (le mode à utiliser aujourd’hui)
Binaire / ASCIIBinaire = 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 ftpclient

Dans /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 proftpd

Test avec FileZilla : protocole FTP – Exiger FTP explicite sur TLS.

Exercices

  1. Un site renvoie 403. Un autre renvoie 503. Où chercher dans chaque cas ?
  2. Pourquoi l’en-tête Host permet-il d’avoir plusieurs sites sur un seul serveur ?
  3. Le client FTP se connecte mais la liste des fichiers ne s’affiche jamais. Hypothèse ?

Voir aussi