Le serveur MCP et le contrôleur lisent des variables d'environnement préfixées SECREVIEW_, ou
un fichier .env dans le répertoire courant (voir .env.example). Les variables sont groupées
ci-dessous selon le processus qui les lit : les deux, le
serveur MCP (security-review-mcp), le contrôleur
(security-review-controller) ou les clients.
Certains réglages se définissent aussi dans l'interface web :
langue des rapports, proxy sortant, connexion OIDC et serveur syslog du journal d'audit. Une variable définie est toujours
prioritaire sur la valeur de l'interface, qui ne s'applique que si la variable n'est pas
définie (l'écran verrouille alors le champ).
URL SQLAlchemy de la base, partagée par les deux processus
SECREVIEW_DATABASE_ECHO
false
Journalise les requêtes SQL
SECREVIEW_DB_AUTO_UPGRADE
true
Migre le schéma au démarrage du contrôleur, du serveur MCP stdio et des commandes CLI ; à false, ils vérifient seulement qu'il est à jour (voir migrations). Le serveur MCP HTTP ne migre jamais
Reverse proxies (adresses IP ou plages CIDR séparées par des virgules, * pour tous) dont l'en-tête X-Forwarded-For donne l'adresse du client, utilisée par la limitation des connexions, les limites d'enrôlement et les journaux ; sans elle, la valeur par défaut d'uvicorn (variable FORWARDED_ALLOW_IPS, sinon 127.0.0.1). À définir derrière un Ingress ou un reverse proxy, sinon tous les clients partagent l'adresse du proxy
Tant qu'aucun jeton n'existe, accepte toute requête sur /mcp même si le serveur n'écoute pas sur localhost (par défaut il reste alors fermé, voir Jetons Bearer) ; à réserver aux tests sur un réseau isolé
SECREVIEW_ENROLLMENT
true
Enrôlement : un client sans jeton peut demander son projet (serveur MCP restreint, POST /api/v1/enroll), qu'un utilisateur portant projects.create valide sur le contrôleur ; aucun jeton n'est créé, l'utilisateur crée un jeton MCP personnel dans l'interface web
SECREVIEW_WEB_URL
—
URL publique de l'interface web (https://…/ui), donnée aux clients sans jeton valide (réponse de l'enrôlement, 401 de /mcp) pour que l'utilisateur sache où se connecter et créer un jeton MCP personnel ; sans elle, aucun lien n'est donné
SECREVIEW_REPORT_LANGUAGE
—
Langue des rapports demandée par les prompts de revue (French, fr...) quand l'argument report_language est absent ; définie (même vide : l'agent choisit), elle est prioritaire sur la langue choisie dans l'écran Langue des rapports
SECREVIEW_MAX_CONTENT_CHARS
200000
Taille maximale du contenu passé à scan_code, et de chaque texte d'un rapport (summary, scope, description, evidence, recommendation)
SECREVIEW_MAX_MCP_REQUEST_MB
16
Taille maximale d'une requête d'un client MCP authentifié sur /mcp (413 au-delà) ; un client sans jeton, dirigé vers le serveur d'enrôlement, est borné à 64 Kio
Nom du premier administrateur, créé au premier démarrage tant qu'aucun compte n'existe (groupe administrators), avec un mot de passe aléatoire jamais journalisé : définissez-le avec security-review-controller user reset-password
SECREVIEW_SECRET_KEY
—
Secret de signature des sessions de l'interface web (comptes et OIDC), 32 caractères au moins, identique sur toutes les répliques ; non défini : un secret aléatoire à chaque démarrage (les sessions se terminent au redémarrage)
SECREVIEW_SESSION_HOURS
8
Durée d'une session de l'interface web (1 à 24 heures)
SECREVIEW_WEB_UI
true
Sert l'interface web sur /ui ; à false, seulement l'API REST
SECREVIEW_WEB_UI_DIR
—
Dossier d'une autre build de l'interface web
SECREVIEW_SWAGGER_ENABLED
false
Servir la documentation Swagger (/api/docs) et le schéma OpenAPI (/api/openapi.json), depuis les fichiers de la build de l'interface web
SECREVIEW_UPDATE_CHECK_ENABLED
false
La page À propos cherche une nouvelle version sur GitHub (HTTPS, par le proxy sortant, mise en cache 6 heures, voir la sécurité)
Active la connexion OIDC OpenID Connect à l'interface web. Toutes les variables SECREVIEW_OIDC_* sauf SECREVIEW_OIDC_CAFILE et SECREVIEW_OIDC_ONLY se définissent aussi dans l'écran OIDC, dont les valeurs enregistrées s'appliquent quand la variable n'est pas définie (configurer le OIDC dans l'interface)
SECREVIEW_OIDC_ISSUER
—
URL de l'émetteur (HTTPS ; HTTP seulement sur localhost), dont /.well-known/openid-configuration est lu
SECREVIEW_OIDC_CLIENT_ID
—
Identifiant du client déclaré chez le fournisseur
SECREVIEW_OIDC_CLIENT_SECRET
—
Secret du client ; vide pour un client public (PKCE seul)
SECREVIEW_OIDC_REDIRECT_URI
—
URL publique de /api/v1/auth/oidc/callback, déclarée chez le fournisseur
SECREVIEW_OIDC_SCOPE
openid profile email
Scopes demandés (doit contenir openid)
SECREVIEW_OIDC_ROLES_CLAIM
groups
Claim des groupes ou rôles, chemin pointé accepté (realm_access.roles) ; ses valeurs sont comparées aux noms des groupes ouverts au OIDC
SECREVIEW_OIDC_ADMIN_GROUPS
—
Groupes OIDC, séparés par des virgules, créés ouverts au OIDC avec le rôle admin à la première connexion de l'un de leurs membres (premier administrateur)
SECREVIEW_OIDC_DEFAULT_GROUP
—
Groupe que tout utilisateur OIDC rejoint à chaque connexion, quel que soit son claim (vide : aucun)
SECREVIEW_OIDC_USERNAME_CLAIM
preferred_username
Claim qui nomme le compte OIDC (comparaison exacte, sans repli) ; label de session oidc:<valeur>
SECREVIEW_OIDC_AUTO_CREATE_USERS
false
Crée le compte OIDC à sa première connexion si ses groupes lui donnent un rôle ; à false, un administrateur crée chaque compte OIDC dans Utilisateurs
SECREVIEW_OIDC_DISPLAY_NAME
OIDC
Nom affiché sur le bouton de connexion (40 caractères au plus)
SECREVIEW_OIDC_CAFILE
—
Bundle de CA pour joindre le fournisseur (CA interne) ; le proxy est celui de HTTPS_PROXY
SECREVIEW_OIDC_ONLY
false
Avec le OIDC activé, refuse la connexion par mot de passe des comptes locaux (OIDC seul) ; une variable uniquement, jamais modifiée dans l'interface
Variable standard, sans le préfixe SECREVIEW_ (nom en minuscules accepté) : proxy HTTP des connexions sortantes du contrôleur, téléchargement OSV et fournisseur OIDC (http://[utilisateur:mot de passe@]hôte:port, hôte:port valant http://hôte:port) ; sans elle, la connexion est directe, ou passe par le proxy choisi dans l'écran Proxy sortant. Définie (non vide), elle est prioritaire sur cet écran
NO_PROXY
—
Variable standard : hôtes joints sans le proxy, séparés par des virgules : domaines (sous-domaines compris), adresses IP, * (pas de plages CIDR) ; la boucle locale est toujours directe. Définie (non vide), elle est prioritaire sur la liste de l'écran Proxy sortant
Âge en jours au-delà duquel serve supprime les rapports sans findings ; 0 conserve tous les rapports
SECREVIEW_MAX_DISMISSAL_DAYS
365
Validité maximale en jours d'une décisionaccepted ou false_positive : sa date d'expiration ne peut pas être plus lointaine
SECREVIEW_PERMANENT_ACCEPTANCE_ENABLED
true
Une personne peut accepter un risqueSans expiration : l'acceptation dure jusqu'à ce que quelqu'un rouvre le finding. false : toute acceptation exige une date d'expiration. Un faux positif en exige toujours une
SECREVIEW_RISK_ACCEPTANCE_MIN_SEVERITY
medium
Gravité minimale (critical, high, medium, low, info) dont l'acceptation de risque exige un motif et une date d'expiration. Un finding moins grave est accepté par une simple validation, qui le ferme sans motif ni date. Vide : toute acceptation les exige
SECREVIEW_TOKEN_MAX_DAYS
0
Validité maximale en jours d'un jeton Bearer créé ou renouvelé (CLI, interface web), qui est aussi sa validité par défaut ; 0 : les jetons n'expirent pas, sauf validité demandée
SECREVIEW_PERSONAL_TOKENS_PER_USER
1
Jetons personnels qu'un utilisateur web peut détenir de chaque rôle, API REST et MCP, de 1 à 10 : révoquez-en un pour en créer un autre
Âge en jours au-delà duquel serve supprime les événements du journal d'audit ; 0 conserve tous les événements
SECREVIEW_AUDIT_MAX_EVENTS
0
Nombre d'événements d'audit conservés au plus par la même purge quotidienne (les plus anciens sont supprimés) ; 0 : sans limite
SECREVIEW_AUDIT_SYSLOG_ADDRESS
—
Envoie les événements d'audit à syslog : udp://hôte:port, tcp://hôte:port ou unix:///dev/log (ni TLS ni proxy) ; désactivé si absent ; sans elle, le serveur défini sur la page Journal d'audit s'applique. Définie (non vide), elle est prioritaire sur cette page
SECREVIEW_AUDIT_SYSLOG_FACILITY
local0
Facility syslog de ces messages (local0 à local7, auth, authpriv, daemon...) ; définie, elle est prioritaire sur celle choisie sur la page Journal d'audit
SECREVIEW_METRICS_ENABLED
true
Sert les métriques Prometheus sur /metrics (jeton metrics ou admin) ; à false, /metrics répond 404
Lues par les commandes clientes (security-review-mcp scan-deps, security-review-ci), jamais par les serveurs.
Variable
Défaut
Rôle
SECREVIEW_MCP_URL
—
URL du serveur MCP partagé utilisé par security-review-mcp scan-deps (valeur par défaut de --url) ; jamais utilisée par les serveurs
SECREVIEW_TOKEN
—
Jeton Bearer envoyé par scan-deps à ce serveur, et par security-review-ci au contrôleur (jeton ci) ; jamais utilisé par les serveurs
SECREVIEW_CONTROLLER_URL
—
URL du contrôleur utilisée par security-review-ci (valeur par défaut de --url) ; lue dans l'environnement uniquement, jamais dans .env
Les jetons Bearer ne se configurent pas par variable : ils sont stockés en base et gérés avec
security-review-controller token (voir Serveur HTTP, authentification et TLS).
Les règles internes non plus : elles sont stockées en base et gérées avec
security-review-controller rules (voir Règles internes).
SQLite par défaut, dans le dossier de données de l'utilisateur :
$XDG_DATA_HOME/security-review-mcp/security_reports.db, soit
~/.local/share/security-review-mcp/security_reports.db quand XDG_DATA_HOME n'est pas défini.
Le fichier est le même quel que soit le dossier de lancement du serveur, et son dossier est créé
privé (0700), car les rapports citent le code relu. La version 1.0 utilisait
./security_reports.db dans le dossier courant : si ce fichier existe et que
SECREVIEW_DATABASE_URL n'est pas défini, un avertissement donne le réglage qui permet de
continuer à l'utiliser (sqlite:////chemin/absolu/security_reports.db).
Le schéma est géré par des migrations Alembic embarquées dans le paquet :
security-review-controller db upgrade crée ou migre la base et amorce les règles par défaut,
db status affiche la révision (code 1 si elle n'est pas à jour). Voir
Migrations du schéma.
Une revue propre (rapport sans aucun finding) prouve seulement que rien n'a été trouvé à cette
date. Le contrôleur supprime ces rapports dès qu'ils ont plus de
SECREVIEW_EMPTY_REPORT_RETENTION_DAYS jours (90 par défaut) : au démarrage de serve, puis
chaque jour. Le dernier rapport de chaque projet est toujours conservé, si bien qu'un projet ne
disparaît jamais de la liste, et un rapport avec des findings n'est jamais supprimé, quel que
soit leur statut. 0 désactive la purge.
La même purge peut être lancée à la demande, par exemple depuis une tâche planifiée quand le
contrôleur ne tourne pas :
security-review-controllerdbprune# conservation de SECREVIEW_EMPTY_REPORT_RETENTION_DAYS
security-review-controllerdbprune--days30# une autre durée, pour cette exécution seulement# {"retention_days": 30, "deleted": 4}