Repository Public Research preview
1% ------------------------------------------------------------------------------2\section{Permissions, réglages et sécurité}3\label{sec:permissions}4% ------------------------------------------------------------------------------56\begin{enbref}7Quatre modes de permission (plan, default, accept edits, bypass), des règles fines par outil (\texttt{Bash(python3 *)} autorisé, \texttt{Read(./enonce/**)} interdit), trois fichiers de réglages (personnel, projet, local), le bac à sable, et les trois règles de sécurité du cours : un dossier par travail, jamais de mode automatique sur un travail noté, jamais Web et données sensibles dans la même session.8\end{enbref}910\subsection{Les modes}1112Le mode courant s'affiche dans la ligne d'état. On le change en cours de session avec \kbd{Maj}+\kbd{Tab}, ou dès le lancement par l'option \texttt{--permission-mode} (par exemple \texttt{claude --permission-mode plan}) \parencite{cc_iam}.1314{\small\Needspace{9\baselineskip}15\begin{tabularx}{\textwidth}{E{3.4cm}XL{4.4cm}}16\caption{Modes de permission de Claude Code et usage recommandé dans le cours}\label{tab:modes}\\17\rowcolor{uqoBleu} \hc{Mode} & \hc{Comportement} & \hc{Dans le cours} \\18\endfirsthead19\captionsuite{Modes de permission de Claude Code et usage recommandé dans le cours}20\rowcolor{uqoBleu} \hc{Mode} & \hc{Comportement} & \hc{Dans le cours} \\21\endhead22\suitepage{3}23\endfoot24\finTableau25\endlastfoot26\texttt{plan} & Lecture et raisonnement seulement ; toute écriture ou commande qui modifie est refusée ; l'agent propose un plan et demande la permission d'en sortir. & \feuvert~Toujours au début. Pour comprendre un gabarit ou un énoncé. \\27\rowcolor{uqoBgClair}28\texttt{default} & Lit sans demander ; demande votre accord avant chaque écriture et chaque commande shell. & \feuvert~Par défaut sur tout travail noté. \\29\texttt{acceptEdits} & Les modifications de fichiers passent sans question ; les commandes shell demandent encore. & \feujaune~Acceptable sur un brouillon ou un script d'analyse, avec copie datée du classeur. \\30\rowcolor{uqoBgClair}31\texttt{bypassPermissions}\newline{\footnotesize option \texttt{--dangerously-}\newline\texttt{skip-permissions}} & Rien n'est demandé. & \feurouge~Jamais sur un travail noté ni sur des données réelles. Réservé aux conteneurs sans données. \\32Mode automatique (classificateur) & Un modèle juge le risque de chaque action et ne vous consulte qu'en cas de doute. & \feurouge~Même règle : pas sur un travail noté. \\33\end{tabularx}34}3536\subsection{Les règles d'autorisation}3738Au-delà du mode, des règles disent, outil par outil, ce qui passe sans question (\emph{allow}), ce qui demande (\emph{ask}) et ce qui est interdit (\emph{deny}). Quand l'agent vous demande une permission, l'invite propose souvent « Oui, et ne plus demander pour cette commande » : c'est une règle \emph{allow} qui s'ajoute à vos réglages. Vous les voyez et les modifiez avec \texttt{/permissions} \parencite{cc_iam}.3940\begin{terminal}[La demande de permission, telle qu'elle apparaît]41\begin{Verbatim}[commandchars=§¡¿]42 §hi¡Bash¿(python3 verif_chaine.py)43 §gris¡Vérifie la chaîne du classeur et l'absence de valeurs collées¿4445 §ko¡Do you want to proceed?¿46 §tu¡› 1. Yes¿47 2. Yes, and don't ask again for: python3 verif_chaine.py §co¡← règle allow ajoutée¿48 3. No, and tell Claude what to do differently (esc)49\end{Verbatim}50\end{terminal}5152La syntaxe d'une règle est \texttt{Outil} ou \texttt{Outil(motif)}. Quelques exemples utiles pour un TP :5354{\small\Needspace{9\baselineskip}55\begin{tabularx}{\textwidth}{L{5.8cm}X}56\caption{Règles d'autorisation utiles dans un dossier de travail pratique}\label{tab:regles}\\57\rowcolor{uqoBleu} \hc{Règle} & \hc{Effet} \\58\endfirsthead59\captionsuite{Règles d'autorisation utiles dans un dossier de travail pratique}60\rowcolor{uqoBleu} \hc{Règle} & \hc{Effet} \\61\endhead62\suitepage{2}63\endfoot64\finTableau65\endlastfoot66\texttt{Bash(python3 verif\_chaine.py)} & Autorise exactement cette commande sans demander. \\67\rowcolor{uqoBgClair}68\texttt{Bash(python3 *)} & Autorise toute commande Python (à réserver à un dossier de brouillon). \\69\texttt{Bash(git status)}, \texttt{Bash(git diff *)} & Autorise les commandes Git de consultation. \\70\rowcolor{uqoBgClair}71\texttt{Read(./enonce/**)} en \emph{deny} & Interdit toute lecture du dossier \texttt{enonce/} (et donc toute modification). \\72\texttt{Edit(./gabarit.xlsx)} en \emph{deny} & Interdit de toucher à l'original du gabarit. \\73\rowcolor{uqoBgClair}74\texttt{WebFetch}, \texttt{WebSearch} en \emph{deny} & Coupe l'accès au Web pour ce dossier : recommandé dès qu'il contient des données réelles. \\75\texttt{Bash(rm *)}, \texttt{Bash(curl *)} en \emph{deny} & Interdit la suppression de fichiers et les téléchargements par commande. \\76\rowcolor{uqoBgClair}77\texttt{Read(\textasciitilde/.ssh/**)}, \texttt{Read(./.env)} en \emph{deny} & Protège clés et secrets, au cas où un tel fichier traînerait. \\78\end{tabularx}79}8081\subsection{Les fichiers de réglages}8283Les règles vivent dans des fichiers \texttt{settings.json}, à trois niveaux qui se combinent \parencite{cc_settings} : \texttt{\textasciitilde/.claude/settings.json} (vous, partout), \texttt{.claude/settings.json} dans le dossier du travail (partagé avec l'équipe, versionné), et \texttt{.claude/settings.local.json} (vous, dans ce dossier ; ignoré par Git). Une règle \emph{deny} l'emporte toujours sur une règle \emph{allow}.8485\begin{fichier}[TP2\_comparaison/.claude/settings.json --- réglages recommandés pour un TP noté]86\begin{Verbatim}[commandchars=§¡¿,numbers=left]87{88 §fk¡"permissions"¿: {89 §fk¡"defaultMode"¿: §fs¡"default"¿,90 §fk¡"allow"¿: [91 §fs¡"Bash(python3 verif_chaine.py)"¿,92 §fs¡"Bash(git status)"¿, §fs¡"Bash(git diff *)"¿, §fs¡"Bash(git log *)"¿93 ],94 §fk¡"deny"¿: [95 §fs¡"Read(./enonce/**)"¿, §fs¡"Edit(./enonce/**)"¿, §fs¡"Write(./enonce/**)"¿,96 §fs¡"Edit(./gabarit.xlsx)"¿, §fs¡"Write(./gabarit.xlsx)"¿,97 §fs¡"WebFetch"¿, §fs¡"WebSearch"¿,98 §fs¡"Bash(rm *)"¿, §fs¡"Bash(curl *)"¿, §fs¡"Bash(wget *)"¿99 ]100 },101 §fk¡"env"¿: { §fk¡"PYTHONDONTWRITEBYTECODE"¿: §fs¡"1"¿ }102}103\end{Verbatim}104\end{fichier}105106Le même fichier accepte d'autres clés que vous rencontrerez plus loin : \texttt{hooks} (§\ref{sec:hooks}), \texttt{model} (modèle par défaut), \texttt{outputStyle}, ou \texttt{cleanupPeriodDays} (durée de conservation des sessions). L'annexe~\ref{ann:settings} donne un fichier complet commenté.107108\subsection{Le bac à sable et la confiance dans un dossier}109110Au premier lancement dans un dossier, Claude Code demande si vous lui faites confiance : c'est parce qu'un dossier peut contenir un \texttt{CLAUDE.md}, des réglages ou des hooks écrits par quelqu'un d'autre, et que les exécuter revient à exécuter le code de cette personne \parencite{cc_security}. Répondez oui pour vos dossiers, non pour un dossier téléchargé que vous n'avez pas inspecté. Sur macOS et Linux, un bac à sable optionnel restreint en plus ce que les commandes shell peuvent atteindre (dossiers, réseau) ; il se règle dans \texttt{/permissions}.111112\subsection{Les trois règles de sécurité du cours}113114\begin{figure}[!htb]115\centering116\begin{tikzpicture}117 \def\r{1.85}118 \coordinate (A) at (90:1.15);119 \coordinate (B) at (210:1.15);120 \coordinate (C) at (-30:1.15);121 \fill[uqoBleu,opacity=0.18] (A) circle (\r);122 \fill[uqoOr,opacity=0.22] (B) circle (\r);123 \fill[uqoRouge,opacity=0.18] (C) circle (\r);124 \draw[uqoBleu,thick] (A) circle (\r);125 \draw[uqoOr!80!black,thick] (B) circle (\r);126 \draw[uqoRouge,thick] (C) circle (\r);127 \node[align=center,font=\small\sffamily\bfseries,text=uqoBleu] at ($(A)+(0,1.0)$) {\faIcon{lock}~Données\\ privées};128 \node[align=center,font=\small\sffamily\bfseries,text=uqoOr!70!black] at ($(B)+(-0.95,-0.65)$) {\faIcon{file-import}~Contenu\\ non fiable};129 \node[align=center,font=\small\sffamily\bfseries,text=uqoRouge] at ($(C)+(0.95,-0.65)$) {\faIcon{paper-plane}~Sortie vers\\ l'extérieur};130 \node[align=center,font=\footnotesize\sffamily\bfseries] at (0,0.05) {\faIcon{skull-crossbones}\\ exploitable};131 \node[etiq,text width=7.4cm,anchor=west,align=left] at (3.9,0.9) {132 \textbf{Dans Claude Code, concrètement}\\[3pt]133 \textcolor{uqoBleu}{\faIcon{lock}} lancer l'agent dans un dossier qui contient un bail réel, un courriel exporté, un classeur de clients\\[2pt]134 \textcolor{uqoOr!70!black}{\faIcon{file-import}} lui faire lire une page Web, un PDF téléchargé, un dépôt cloné, un connecteur MCP inconnu\\[2pt]135 \textcolor{uqoRouge}{\faIcon{paper-plane}} \texttt{WebFetch}, \texttt{curl}, un envoi de courriel, un connecteur qui écrit ailleurs\\[4pt]136 \textbf{Parade} : un dossier de TP sans données personnelles \textbf{+} \texttt{WebFetch}/\texttt{WebSearch} en \emph{deny} \textbf{=} deux cercles sur trois manquent.};137\end{tikzpicture}138\caption{Le trio dangereux appliqué à Claude Code : ne jamais réunir les trois dans une même session}139\label{fig:trio}140\end{figure}141142\begin{alertbox}[Les trois règles]143\begin{enumerate}[label=\textbf{\arabic*.},leftmargin=2em]144 \item \textbf{Un dossier par travail}, sans renseignement personnel ni document sous licence, et l'agent lancé \emph{dans} ce dossier. C'est la Loi 25 et le \emph{Guide IA} (chapitre 10) traduits en un geste.145 \item \textbf{Jamais de mode automatique} (\texttt{bypassPermissions}, mode classificateur) sur un travail noté ni sur des données réelles. Vous lisez chaque commande avant de l'approuver ; au dixième « oui » sans lire, arrêtez-vous.146 \item \textbf{Jamais Web et données sensibles dans la même session.} Une page lue par l'agent peut contenir des instructions cachées qu'il suivra (injection de requête) \parencite{willison2025}. Dans un dossier de TP, mettez \texttt{WebFetch} et \texttt{WebSearch} en \emph{deny} ; si vous devez chercher sur le Web, faites-le dans un autre dossier, vide.147\end{enumerate}148\end{alertbox}149150\begin{astuce}[Déclarer les règles au lieu de cliquer]151Plutôt que d'approuver dix fois la même commande de vérification, écrivez-la une fois dans \texttt{settings.json} (ligne 5 du fichier ci-dessus). Vous gardez le mode \texttt{default} pour tout le reste, et l'agent ne vous dérange que pour ce qui mérite un regard. C'est la fatigue d'approbation, pas la permission elle-même, qui fait faire des erreurs.152\end{astuce}153