Check-serveur-Debian-Supprimer-Port80

Check-serveur-Debian-Supprimer-Port80

Notes › _DIFFUSION

scripts ou application pour "check" complet serveur debian Pour un check complet d’un serveur Debian, je recommande cette combinaison :
  • Lynis : audit général de sécurité et configuration.
  • Smartmontools : état S.M.A.R.T. des disques.
  • Debsecan : vulnérabilités liées aux paquets installés.
  • AIDE : détection de modifications de fichiers.
  • auditd : journalisation et audit système.
  • sysstat : CPU, mémoire, disque et réseau.
  • rkhunter ou chkrootkit : recherche d’éléments suspects, avec résultats à interpréter prudemment.

Installation des outils

1
2
3
4
5
6
7
sudo apt update
sudo apt install -y \
  lynis \
  needrestart \
  smartmontools \
  curl \
  ca-certificates

Compléments

1
2
3
4
5
6
7
8
9
sudo apt update
sudo apt install -y \
  debsecan \
  aide \
  auditd \
  audispd-plugins \
  sysstat \
  rkhunter \
  chkrootkit

Activez les services utiles :

1
2
sudo systemctl enable --now auditd
sudo systemctl enable --now sysstat

needrestart

needrestart inspecte les processus en cours d’exécution et détecte ceux qui utilisent d’anciennes versions de bibliothèques (glibc, OpenSSL, etc.) après une mise à jour. Il peut :

  • Lister les daemons à redémarrer (-l)
  • Redémarrer automatiquement certains services (-r a ou via configuration)
  • S’intégrer avec apt/dpkg pour proposer un redémarrage après mise à jour

Pour redémarrage automatiquement des services concernés, éditer /etc/needrestart/needrestart.conf et activer l’option de redémarrage automatique (par exemple $nrconf{restart} = 'a';)

Une fois installé, on exécute :

1
sudo needrestart

pour voir quels services doivent être redémarrés après des mises à jour de bibliothèques

Audit principal avec Lynis

1
sudo lynis audit system

Pour enregistrer le rapport :

1
2
3
4
sudo lynis audit system \
  --no-colors \
  --quiet \
  > /var/log/lynis-audit.txt

Le rapport détaillé se trouve généralement ici :

1
2
/var/log/lynis.log
/var/log/lynis-report.dat

Commencez par corriger les éléments marqués Warning, puis consultez les recommandations :

1
sudo grep -E "warning|suggestion" /var/log/lynis.log

Vérifications rapides système

1
2
3
4
5
6
7
8
9
10
hostnamectl
uptime
uname -a
cat /etc/debian_version
systemctl --failed
df -hT
df -ih
free -h
ip -br addr
ss -tulpn

Processus et ressources :

1
2
3
top
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20

Paquets et mises à jour :

1
2
3
apt list --upgradable
dpkg --audit
sudo debsecan --suite "$(dpkg --print-architecture)"

Vérifiez aussi les dépôts configurés :

1
grep -RhvE '^\s*#|^\s*$' /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null

Réseau et services exposés

1
2
3
sudo ss -tulpn
sudo systemctl list-units --type=service --state=running
sudo systemctl --type=service --state=failed

Depuis une autre machine, utilisez éventuellement :

1
nmap -sV -Pn ADRESSE_IP

Ne lancez pas de scan agressif sur une infrastructure qui ne vous appartient pas.

Disques et stockage

Identifiez les disques :

1
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL

Pour un disque SATA ou NVMe, adaptez le périphérique :

1
2
sudo smartctl -a /dev/sda
sudo smartctl -a /dev/nvme0

Test court :

1
sudo smartctl -t short /dev/sda

Consultez ensuite le résultat :

1
sudo smartctl -a /dev/sda

Sur une machine virtuelle, S.M.A.R.T. peut ne pas être disponible.

Intégrité et rootkits

Après avoir mis à jour les signatures :

1
2
3
sudo rkhunter --update
sudo rkhunter --propupd
sudo rkhunter --check --skip-keypress --report-warnings-only

Puis :

1
sudo chkrootkit

Attention : ces outils génèrent régulièrement des faux positifs. Vérifiez chaque alerte avant de supprimer ou modifier quoi que ce soit.

Initialiser AIDE

À faire seulement après avoir vérifié que le serveur est sain :

1
2
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Contrôle ultérieur :

1
sudo aide --check

Script de contrôle simple

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env bash
set -u

REPORT="/var/log/server-check-$(date +%F-%H%M%S).log"

{
    echo "===== INFORMATIONS SYSTÈME ====="
    date
    hostnamectl
    uptime
    uname -a

    echo
    echo "===== DISQUES ====="
    df -hT
    df -ih
    lsblk

    echo
    echo "===== MÉMOIRE ====="
    free -h

    echo
    echo "===== SERVICES EN ÉCHEC ====="
    systemctl --failed || true

    echo
    echo "===== PORTS EN ÉCOUTE ====="
    ss -tulpn || true

    echo
    echo "===== PROCESSUS CPU ====="
    ps aux --sort=-%cpu | head -15

    echo
    echo "===== PROCESSUS MÉMOIRE ====="
    ps aux --sort=-%mem | head -15

    echo
    echo "===== MISES À JOUR ====="
    apt list --upgradable 2>/dev/null || true

    echo
    echo "===== AUDIT LYNIS ====="
    lynis audit system --no-colors --quiet || true
} 2>&1 | tee "$REPORT"

echo "Rapport enregistré dans : $REPORT"

Enregistrez-le puis exécutez-le :

1
2
3
sudo nano /usr/local/sbin/server-check.sh
sudo chmod 750 /usr/local/sbin/server-check.sh
sudo /usr/local/sbin/server-check.sh

Pour une solution plus professionnelle et centralisée, ajoutez Prometheus + Node Exporter + Grafana pour la supervision continue. Pour un contrôle ponctuel complet, Lynis + Smartmontools + Debsecan + AIDE constitue une très bonne base.

Serveur debian a les ports ouverts 53/tcp (technitium) 443 (ssl/nginx) et 80 (nginx) Utilisation "acme" pour renouvellement certificats du domaine Je souhaite fermer le port 80, possible ou comment identifier qui utilise le port 80? Vous pouvez fermer le port **80**, mais vérifiez d’abord le type de challenge ACME utilisé pour le renouvellement.
  • HTTP-01 : nécessite que le port 80/TCP soit accessible depuis Internet.
  • TLS-ALPN-01 : utilise le port 443/TCP.
  • DNS-01 : utilise un enregistrement TXT DNS et ne nécessite ni le port 80 ni le port 443 pour le challenge.

Si votre client ACME utilise HTTP-01, fermer le port 80 fera échouer les renouvellements, sauf si vous passez à TLS-ALPN-01 ou DNS-01.

Identifier le processus qui utilise le port 80

Sur le serveur :

1
sudo ss -ltnp 'sport = :80'

ou :

1
sudo lsof -nP -iTCP:80 -sTCP:LISTEN

ou :

1
sudo fuser -v 80/tcp

Vous devriez obtenir quelque chose comme :

1
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

Pour connaître le service associé au PID :

1
2
ps -fp 1234
sudo systemctl status nginx

Vérifiez également les sockets IPv6 :

1
sudo ss -ltnp | grep -E '(:80[[:space:]]|:80,)'

Vérifier la configuration Nginx

Recherchez toutes les directives utilisant le port 80 :

1
sudo nginx -T 2>/dev/null | grep -nE 'listen .*80|acme|well-known'

Exemples fréquents :

1
2
listen 80;
listen [::]:80;

Le répertoire ACME est souvent exposé ainsi :

1
2
3
location /.well-known/acme-challenge/ {
    root /var/www/html;
}

Si Nginx écoute sur 80 uniquement pour rediriger vers HTTPS, ceci ne ferme pas le port :

1
return 301 https://$host$request_uri;

Le port reste ouvert tant qu’un bloc contient listen 80.

Fermer le port 80 dans Nginx

Après avoir confirmé que le renouvellement n’utilise pas HTTP-01 :

  1. Modifiez les fichiers de configuration :
1
2
sudo grep -RInE 'listen .*80|acme-challenge' \
  /etc/nginx/sites-enabled /etc/nginx/conf.d /etc/nginx/nginx.conf
  1. Supprimez ou commentez les lignes du type :
1
2
listen 80;
listen [::]:80;
  1. Testez la configuration :
1
sudo nginx -t
  1. Rechargez Nginx :
1
sudo systemctl reload nginx
  1. Vérifiez :
1
sudo ss -ltnp | grep ':80'

Aucune sortie ne devrait apparaître.

Fermer uniquement avec le pare-feu

Pour bloquer les connexions entrantes tout en laissant éventuellement Nginx écouter localement :

Avec UFW :

1
2
3
4
sudo ufw status verbose
sudo ufw delete allow 80/tcp
sudo ufw deny 80/tcp
sudo ufw reload

Avec nftables, exemple :

1
sudo nft add rule inet filter input tcp dport 80 drop

Cette règle nftables doit être ajoutée à votre configuration persistante, sinon elle peut disparaître au redémarrage.

Vérifiez aussi le pare-feu ou le groupe de sécurité du fournisseur VPS/cloud. Un test externe est utile :

1
nmap -Pn -p 80,443 votre-domaine.example

Vérifier le mode ACME

Identifiez le client et sa configuration :

1
systemctl list-timers --all | grep -Ei 'acme|cert|letsencrypt|certbot'
1
ps aux | grep -Ei 'acme|certbot|letsencrypt' | grep -v grep

Cherchez les configurations :

1
2
3
sudo find /etc -maxdepth 3 -type f \
  \( -iname '*acme*' -o -iname '*certbot*' -o -iname '*letsencrypt*' \) \
  2>/dev/null

Consultez les journaux :

1
2
sudo journalctl --since "30 days ago" | \
  grep -Ei 'acme|certbot|letsencrypt|http-01|tls-alpn|dns-01'

Si vous voyez http-01, le port 80 est requis. Si vous voyez dns-01 ou tls-alpn-01, vous pouvez normalement le fermer, après avoir effectué un renouvellement de test.

Pour Certbot, un test ressemble à :

1
sudo certbot renew --dry-run

Pour un client ACME différent, utilisez son option de simulation équivalente.

La séquence recommandée est donc : identifier le processus → identifier le challenge ACME → effectuer un renouvellement de test → retirer listen 80 de Nginx → bloquer également le port 80 au pare-feu → vérifier depuis l’extérieur.

acme DNS01 Nextcloud nginx 632: location ^~ /.well-known { 633: location = /.well-known/carddav { return 301 /remote.php/dav/; } 634: location = /.well-known/caldav { return 301 /remote.php/dav/; } 635: location /.well-known/acme-challenge { try_files $uri $uri/ =404; } 636: location /.well-known/pki-validation { try_files $uri $uri/ =404; } Avec ACME DNS-01, le renouvellement des certificats ne nécessite pas le port 80. Vous pouvez donc le fermer.

Cependant, ne supprimez pas entièrement le bloc /.well-known : Nextcloud utilise carddav et caldav, qui doivent rester accessibles via HTTPS sur le port 443.

Votre configuration :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
location ^~ /.well-known {
    location = /.well-known/carddav {
        return 301 /remote.php/dav/;
    }

    location = /.well-known/caldav {
        return 301 /remote.php/dav/;
    }

    location /.well-known/acme-challenge {
        try_files $uri $uri/ =404;
    }

    location /.well-known/pki-validation {
        try_files $uri $uri/ =404;
    }
}

Avec DNS-01, vous pouvez supprimer les deux locations suivantes si elles ne servent pas à autre chose :

1
2
3
4
5
6
7
location /.well-known/acme-challenge {
    try_files $uri $uri/ =404;
}

location /.well-known/pki-validation {
    try_files $uri $uri/ =404;
}

Conservez :

1
2
3
4
5
6
7
8
9
location ^~ /.well-known {
    location = /.well-known/carddav {
        return 301 /remote.php/dav/;
    }

    location = /.well-known/caldav {
        return 301 /remote.php/dav/;
    }
}

Avant de modifier, vérifiez dans quel bloc ces lignes se trouvent :

1
sudo nginx -T 2>/dev/null | nl -ba | sed -n '610,650p'

Puis identifiez tous les listen :

1
sudo nginx -T 2>/dev/null | grep -nE 'listen .*(:80|80;)'

Si vous trouvez un bloc comme celui-ci :

1
2
3
4
5
6
7
server {
    listen 80;
    listen [::]:80;

    server_name cloud.example.com;
    ...
}

Vous pouvez soit le supprimer/désactiver, soit retirer ses directives listen 80 et listen [::]:80. Ne retirez pas le bloc HTTPS contenant :

1
listen 443 ssl;

Après modification :

1
2
sudo nginx -t
sudo systemctl reload nginx

Vérifiez ensuite que Nginx n’écoute plus sur 80 :

1
sudo ss -ltnp | grep ':80'

Puis bloquez également le port au pare-feu. Avec UFW :

1
2
3
4
sudo ufw status numbered
sudo ufw delete allow 80/tcp
sudo ufw deny 80/tcp
sudo ufw reload

Si vous avez un pare-feu chez votre hébergeur ou une security group cloud, supprimez aussi la règle entrante TCP/80.

Testez que Nextcloud continue à fournir les redirections DAV via HTTPS :

1
2
curl -I https://cloud.example.com/.well-known/caldav
curl -I https://cloud.example.com/.well-known/carddav

Vous devez obtenir une redirection vers :

1
/remote.php/dav/

Enfin, testez le renouvellement ACME :

1
sudo certbot renew --dry-run

ou utilisez la commande de simulation propre à votre client ACME. Le point important est de confirmer que la configuration utilise bien DNS-01 et non un fallback automatique vers HTTP-01.