Désactiver TCPKeepAlive dans SSH (utiliser ClientAlive à la place)
Désactive le keepalive au niveau TCP (TCPKeepAlive no) afin que la vivacité d'une session ne dépende que des sondes ClientAliveInterval / ClientAliveCountMax. Les keepalives TCP circulent hors du canal chiffré et sont falsifiables : un attaquant sur le chemin peut les forger pour maintenir une session morte ou détournée comme étant vivante.
Vérifié sur l’état résolu en cours d’exécution (ex. sshd -T, sysctl, systemctl show), attrape les drop-ins et Include qu’une lecture de fichier raterait. Réserve : runtime ≠ persistance ; une valeur correcte maintenant peut ne pas survivre à un redémarrage.
Ce que vérifie Pavois
Pavois exécute sshd -T et exige la ligne résolue tcpkeepalive no. sshd -T affiche la configuration effective du démon, après toutes les directives Include et tous les drop-ins de /etc/ssh/sshd_config.d/, de sorte qu'un drop-in ultérieur rétablissant la valeur par défaut yes est détecté. Un contrôle basé sur le fichier /etc/ssh/sshd_config le manquerait.
describe command('sshd -T') do
its('stdout') { should match(/^tcpkeepalive\s+no$/i) }
endComment vérifier qu’elle est appliquée
Exécutez sshd -T | grep -iE '^(tcpkeepalive|clientalive)' en root. Sortie attendue, tcpkeepalive désactivé et les sondes chiffrées prenant le relais :
tcpkeepalive no
clientaliveinterval 300
clientalivecountmax 3
Les valeurs clientalive* relèvent de leurs propres règles Pavois ; cette règle n'exige que la première ligne.
Inspecter et investiguer
La directive elle-même ne produit aucune entrée de journal. Ce qui devient visible, c'est la fermeture pilotée par ClientAlive : lorsqu'un client cesse de répondre aux sondes chiffrées, sshd journalise dans /var/log/auth.log (ou journalctl -u ssh) :
sshd[1234]: Timeout, client not responding from user alice 203.0.113.10 port 51234
Avec TCPKeepAlive yes et sans sondes ClientAlive, cette même session morte subsisterait, silencieusement.
Remédiation
Le plan de durcissement Pavois utilise la ressource sshd_setting pour positionner la directive tcpkeepalive à no dans le drop-in Pavois sous /etc/ssh/sshd_config.d/. Le fichier est validé par sshd -t -f <fichier> avant d'être conservé, et tout changement déclenche un reload de ssh.service.
Pavois applique ceci avec son propre moteur harden, le plan ci-dessous, pas un script shell :
| directive | tcpkeepalive |
|---|---|
| notify | action: reload, service: ssh.service |
| resource | sshd_setting |
| value | no |
| verify | sshd -t -f %{path} |
pavois harden plan localoù la cible est local, un alias SSH user@hôte, ou un conteneur , Docs
Impact & précautions
Désactiver les keepalives TCP supprime les paquets qui maintiennent chaudes les entrées de NAT et de pare-feu à états. Si ClientAliveInterval n'est pas défini (ou dépasse le délai d'inactivité du pare-feu), de longues sessions inactives peuvent être coupées silencieusement par un équipement intermédiaire : réglez ClientAliveInterval en dessous de ce délai, ou faites utiliser ServerAliveInterval aux clients. À l'inverse, ne désactivez pas TCPKeepAlive en laissant ClientAlive inactif : le serveur ne détecterait alors jamais un pair mort et accumulerait des sessions orphelines. Le changement est appliqué par un reload : les sessions en cours ne sont pas affectées.