Exercices Projets guidés Securite et permissions
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Securite et permissions

Un assistant IA qui peut lire et ecrire des fichiers, executer du code, c'est puissant. Mais c'est aussi un risque enorme si on ne met pas de garde-fous. Imagine un LLM qui decide de lire ton fichier .env avec tes cles API, ou qui ecrit dans /etc/passwd.

Le vrai Claude Code a un systeme de permissions sophistique. Il demande confirmation pour les actions dangereuses, il ne sort jamais du dossier du projet, et il loggue toute action pour pouvoir auditer ce qui s'est passe.

Ecris une classe GestionnaireSecurite qui controle ce que l'agent a le droit de faire.

La classe prend a la construction un dossier_autorise (le dossier de travail) et une liste optionnelle fichiers_interdits (patterns de fichiers a ne jamais toucher).

Methodes :

verifier_chemin(chemin) : verifie qu'un chemin est dans le dossier autorise. Renvoie {"autorise": True} ou {"autorise": False, "raison": "..."}.

verifier_fichier_interdit(chemin) : verifie que le fichier ne matche aucun pattern interdit. Par defaut, les fichiers interdits incluent .env, .git/, les cles privees (*.pem, *.key).

demander_confirmation(action, details) : enregistre une action en attente de confirmation. Renvoie un dict avec un identifiant unique.

confirmer(identifiant) : confirme une action en attente.

loguer(action, details, resultat) : enregistre une action dans le journal.

obtenir_journal() : renvoie la liste de toutes les actions loguees.

Patterns interdits par defaut : ".env", ".git/", "*.pem", "*.key", "*credentials*", "*secret*"

Pour verifier les patterns, utilise une comparaison simple :
Si le pattern commence par *, verifie si le fichier se termine par le reste du pattern.
Sinon, verifie si le pattern apparait dans le chemin.

Format du journal :

[{"action": "lire_fichier", "details": {"chemin": "app.py"}, "resultat": "autorise", "timestamp": "..."}]

Exemple :

sec = GestionnaireSecurite("/home/user/projet")

sec.verifier_chemin("/home/user/projet/app.py")
renvoie {"autorise": True}

sec.verifier_chemin("/etc/passwd")
renvoie {"autorise": False, "raison": "Chemin hors du dossier autorise"}

sec.verifier_fichier_interdit(".env")
renvoie {"autorise": False, "raison": "Fichier interdit : .env"}

sec.verifier_fichier_interdit("app.py")
renvoie {"autorise": True}

Tests (4/5)

Chemin autorise et interdit
sec = GestionnaireSecurite("/home/user/projet")
r1 = sec.verifier_chemin("/home/user/projet/app.py")
assert r1["autorise"] == True, "Un fichier dans le dossier autorise doit etre accepte"

r2 = sec.verifier_chemin("/etc/passwd")
assert r2["autorise"] == False, "Un fichier hors du dossier autorise doit etre refuse"
Fichiers interdits par defaut
sec = GestionnaireSecurite("/home/user/projet")
r1 = sec.verifier_fichier_interdit(".env")
assert r1["autorise"] == False, ".env doit etre interdit par defaut"

r2 = sec.verifier_fichier_interdit("cle.pem")
assert r2["autorise"] == False, "*.pem doit etre interdit"

r3 = sec.verifier_fichier_interdit("app.py")
assert r3["autorise"] == True, "app.py doit etre autorise"
Demander et confirmer une action
sec = GestionnaireSecurite("/home/user/projet")
demande = sec.demander_confirmation("ecrire", {"chemin": "app.py"})
assert "identifiant" in demande
assert demande["status"] == "en_attente"

confirmation = sec.confirmer(demande["identifiant"])
assert confirmation["succes"] == True
Journal des actions
sec = GestionnaireSecurite("/home/user/projet")
sec.loguer("lire_fichier", {"chemin": "app.py"}, "autorise")
sec.loguer("ecrire_fichier", {"chemin": "test.py"}, "refuse")
journal = sec.obtenir_journal()
assert len(journal) == 2
assert journal[0]["action"] == "lire_fichier"
assert journal[1]["resultat"] == "refuse"
assert "timestamp" in journal[0]

+ 0 tests cachés

Indices (3 disponibles)

solution.py