Aller au contenu
Les 31 fichesFREN中文
Fiches
Partie 3 · fiche 2 sur 4 Niveau : Costaud Durée de lecture : 20 min Plateformes : Linux et Mac

Sécuriser les accès

Une machine joignable de partout, qui exécute du code généré par une IA : la sécurité n'est pas optionnelle. Clés SSH, pare-feu, secrets, permissions de l'agent. Comment ne pas faire n'importe quoi.

Sur cette fiche
  1. 011. SSH : des clés, jamais de mot de passe
  2. 022. Le pare-feu : tout fermé, sauf l’essentiel
  3. 033. Les secrets : jamais en clair, jamais dans le code
  4. 044. Encadrer l’agent : il exécute, vous décidez
  5. 055. Tenir la machine à jour (sans y penser)
  6. 066. Le filet de sécurité : les sauvegardes
  7. 07Questions fréquentes

En bref

Pour sécuriser un mini-PC joignable de partout et piloté par un agent IA : SSH par clés uniquement (mots de passe coupés, root interdit), pare-feu ufw fermé par défaut, aucun service brut exposé sur Internet (Tailscale pour le privé, Cloudflare Tunnel pour le public) et des secrets rangés hors de git, dans un fichier .env en chmod 600. L'agent tourne sous votre utilisateur, sans sudo automatique, dans le dossier du projet, avec ses règles de permission ou son bac à sable activés. Ajoutez les mises à jour de sécurité automatiques et des sauvegardes dont vous avez testé la restauration.

À faire avant : Installer l'agent (très tôt)

Récapitulons ce que vous avez construit : une machine qui tourne 24/7, joignable depuis votre téléphone, qui expose des services sur Internet, et qui exécute des commandes proposées par une IA. C’est génial. C’est aussi une surface d’attaque qu’il faut prendre au sérieux, pas par paranoïa, par hygiène.

La bonne nouvelle : 90 % de la sécurité tient en quelques gestes simples, faits une fois. Cette fiche, c’est ces gestes. Aucun n’est compliqué. Les sauter, en revanche, peut transformer votre atelier en relais de spam ou pire.

1. SSH : des clés, jamais de mot de passe

L’accès à distance passe par SSH. Un mot de passe SSH exposé, c’est l’attaque numéro un sur Internet, des bots testent des millions de combinaisons par jour. La parade est définitive : on désactive l’authentification par mot de passe et on passe aux clés.

Une clé SSH, c’est une paire : une partie privée qui reste sur votre laptop (jamais ailleurs), une partie publique que vous déposez sur la machine. Sans la clé privée, impossible d’entrer, même en connaissant votre nom d’utilisateur.

0 étape sur 3 faite Vos cases cochées restent dans ce navigateur.

  1. Générez une clé sur votre ordinateur (pas sur le mini-PC)

    # Sur votre laptop. Ed25519 = moderne, court, solide.
    ssh-keygen -t ed25519 -C "laptop-vers-minipc"
    

    Laissez le chemin par défaut, mettez une passphrase (c’est la dernière barrière si on vous vole le laptop).

  2. Déposez la clé publique sur la machine

    ssh-copy-id ulrich@adresse-de-la-machine
    

    Testez la connexion : ssh ulrich@adresse-de-la-machine doit entrer sans demander de mot de passe.

  3. Coupez les mots de passe

    Sur le mini-PC, éditez /etc/ssh/sshd_config (votre agent peut le faire, montrez-lui ce que vous voulez) :

    PasswordAuthentication no
    PermitRootLogin no
    

    Puis rechargez : sudo systemctl restart ssh. Gardez une session ouverte le temps de vérifier qu’une nouvelle connexion par clé fonctionne, au cas où.

    Un piège : sur Ubuntu, sshd_config commence par inclure les fichiers de /etc/ssh/sshd_config.d/, et la première valeur lue l’emporte. Un fichier posé là, comme le 50-cloud-init.conf que laisse parfois l’installation d’Ubuntu Server, peut donc réactiver les mots de passe dans votre dos. Vérifiez la configuration réellement appliquée :

    # Doit afficher « passwordauthentication no » et « permitrootlogin no »
    sudo sshd -T | grep -Ei '^(passwordauthentication|permitrootlogin) '
    

2. Le pare-feu : tout fermé, sauf l’essentiel

Par défaut, on bloque tout ce qui entre, et on ouvre au compte-gouttes. ufw rend ça trivial.

sudo ufw default deny incoming      # on refuse tout par défaut
sudo ufw default allow outgoing     # la machine peut sortir
sudo ufw allow 22/tcp               # SSH (ou rien si vous passez par Tailscale)
sudo ufw enable
sudo ufw status verbose             # vérifie

Deux commandes pour savoir où vous en êtes :

# qui écoute sur toutes les interfaces, donc joignable de l'extérieur de la machine
sudo ss -ltnp | grep -E "0\.0\.0\.0:|\[::\]:"

# ufw filtre-t-il bien l'IPv6 ? (doit afficher IPV6=yes)
grep IPV6 /etc/default/ufw

3. Les secrets : jamais en clair, jamais dans le code

Clés API, jetons, mots de passe de service : ce sont des secrets. La règle est absolue : un secret ne vit jamais en clair dans le code, ni dans un fichier versionné par git.

0 étape sur 3 faite Vos cases cochées restent dans ce navigateur.

  1. Rangez les secrets dans un fichier .env hors de git

    # Un fichier .env à la racine du projet
    echo "ANTHROPIC_API_KEY=sk-..." >> .env
    # Et SURTOUT, on l'exclut de git
    echo ".env" >> .gitignore
    

    Le code lit la variable d’environnement, il ne contient jamais la valeur.

  2. Verrouillez les permissions des fichiers sensibles

    chmod 600 .env ~/.ssh/id_ed25519   # lisible par vous seul
    
  3. Faites tourner ce qui a fuité

    Si un secret a traîné quelque part (un commit, un copier-coller, un screenshot), considérez-le comme compromis et régénérez-le. Une clé API se révoque et se recrée en deux clics. Mieux vaut une rotation pour rien qu’une fuite ignorée.

Où stocker vos clés, vraiment

Le fichier .env suffit pour démarrer, mais dès que vous accumulez des clés (API d’IA, tokens GitHub, accès à des services), posez-vous la question du bon coffre. Il y a une petite hiérarchie, du plus simple au plus solide :

  • Le fichier .env par projet : le point de départ. Hors de git, en chmod 600. Parfait pour un projet perso. Sa limite : le secret est en clair sur le disque, et il se duplique de projet en projet.
  • Le trousseau / gestionnaire de mots de passe : pour votre réserve personnelle de clés (la source de vérité), un vrai gestionnaire (Bitwarden, 1Password, KeePassXC…) chiffré vaut mille fichiers texte éparpillés. Vous y piochez pour remplir un .env quand vous en avez besoin.
  • Un coffre chiffré au repos : pour stocker des secrets dans un dépôt sans les exposer, des outils comme sops + age ou pass chiffrent les valeurs : le fichier peut être versionné, seul celui qui a la clé de déchiffrement le lit. L’étape pro quand un projet grandit ou se partage.
  • Un gestionnaire de secrets dédié : pour du sérieux multi-machines (Vault, Infisical, Doppler…), un service centralise, audite et fait tourner les secrets. Probablement au-delà de vos besoins au début, mais c’est là que mène le chemin.

4. Encadrer l’agent : il exécute, vous décidez

C’est la partie spécifique à notre setup, et la plus importante. Un agent de code est puissant **parce qu’**il peut lancer des commandes. C’est aussi ce qui le rend dangereux s’il file sans surveillance. Quelques règles de bon sens :

  • Jamais d’agent en root, jamais en sudo automatique. Il tourne sous votre utilisateur normal. Quand une commande a besoin de sudo, vous voulez la voir et l’approuver à la main. Une commande destructrice lancée en root ne pardonne pas.
  • Le mode « auto-approve » se mérite. Les agents proposent souvent un mode où ils exécutent sans vous demander. Génial pour itérer sur des tests ; à proscrire pour tout ce qui touche au réseau, aux secrets, aux suppressions de fichiers (rm), ou à la prod.
  • Travaillez dans un dossier de projet, pas dans ~ ou /. Limitez le rayon d’action de l’agent au dossier du projet. S’il déraille, les dégâts restent confinés.
  • Le code généré se relit avant de tourner en prod. Un agent peut introduire une faille sans le vouloir (une requête SQL mal échappée, une permission trop large). Une relecture, par vous, ou par un second agent en « revue », n’est pas un luxe.
  • git est votre filet. Commits fréquents. Vous pouvez toujours revenir en arrière si l’agent a fait une bêtise. Un projet sans historique git, c’est un trapéziste sans filet.

5. Tenir la machine à jour (sans y penser)

Une faille corrigée n’en est plus une, à condition d’installer le correctif. On automatise les mises à jour de sécurité :

sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades   # réponds "Oui"

La machine applique désormais seule les correctifs de sécurité. Pour le reste (montées de version), un sudo apt update && sudo apt upgrade de temps en temps suffit, votre agent peut vous le rappeler.

6. Le filet de sécurité : les sauvegardes

La sécurité, ce n’est pas que bloquer les intrus. C’est aussi survivre à votre propre erreur, à un disque qui lâche, à un agent trop zélé. Sauvegardez ce qui compte (vos projets, vos configs, vos .env, chiffrés) ailleurs que sur la machine : un autre disque, un NAS, un stockage distant. Une sauvegarde que vous n’avez jamais testé de restaurer n’est pas une sauvegarde.

Questions fréquentes

Pourquoi SSH accepte-t-il encore les mots de passe alors que je les ai désactivés ?

Sur Ubuntu, sshd_config commence par inclure les fichiers du dossier /etc/ssh/sshd_config.d/, et la première valeur lue l'emporte. Un fichier posé là, comme le 50-cloud-init.conf que laisse parfois l'installation d'Ubuntu Server, peut réactiver les mots de passe dans votre dos. Vérifiez la configuration réellement appliquée avec sudo sshd -T, qui doit afficher passwordauthentication no et permitrootlogin no.

Le pare-feu ufw protège-t-il les conteneurs Docker ?

Non. Quand vous publiez un port avec -p 8080:8080, Docker écrit ses propres règles en amont de celles d'ufw, et le conteneur reste joignable depuis tout le réseau local, même pare-feu actif. Le remède tient dans l'adresse d'écoute : avec -p 127.0.0.1:8080:8080, le service n'est plus joignable que depuis la machine.

Mon mini-PC est-il exposé sur Internet en IPv6 ?

Il peut l'être. En IPv6, il n'y a pas de NAT : la machine a sa propre adresse publique, et un service qui écoute sur [::] peut être joint directement depuis Internet. Ce qui vous protège alors, c'est le pare-feu IPv6 de la box, actif par défaut sur la plupart des modèles. Vérifiez aussi qu'ufw filtre l'IPv6 : le fichier /etc/default/ufw doit contenir IPV6=yes.

Où ranger ses clés API quand on commence à en accumuler ?

Le fichier .env par projet, hors de git et en chmod 600, suffit pour démarrer. Pour votre réserve personnelle de clés, un gestionnaire de mots de passe chiffré comme Bitwarden, 1Password ou KeePassXC sert de source de vérité. Pour versionner des secrets dans un dépôt, sops avec age ou pass les chiffrent, et sur plusieurs machines un gestionnaire dédié comme Vault, Infisical ou Doppler centralise et fait tourner les secrets.

Peut-on donner une clé API à son agent en la collant dans le chat ?

Mieux vaut l'éviter : un secret qui transite dans une conversation est un secret de plus à surveiller. Apprenez plutôt à l'agent à lire la clé dans une variable d'environnement, et ajoutez une règle dans votre CLAUDE.md ou AGENTS.md pour qu'il n'écrive jamais de secret en clair. Si une clé a déjà traîné quelque part, considérez-la comme compromise et régénérez-la.

Les termes de cette fiche : SSHClé SSHClé APIGitAPITokenAgentCommit

Une erreur ?

Une commande ne marche plus, un prix a changé ?

Les outils bougent tous les mois. Dites-moi ce qui cloche dans cette fiche, je corrige et je redate.

Seuls la page, votre message et le contact éventuel sont gardés. Rien d’autre.

Fiche 16 sur 31 · partie 3 aucune fiche lue pour l’instant Ouvrir le sommaire des fiches