* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
17 KiB
Compliance & Audit (Français)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Source de référence :
src/lib/compliance/,src/app/api/compliance/Dernière mise à jour : 2026-06-28 — v3.8.40
OmniRoute enregistre les actions administratives, les événements d’authentification, les modifications du cycle de vie des identifiants des fournisseurs et les invocations d’outils MCP dans des tables d’audit basées sur SQLite. Cette page décrit les éléments journalisés, leur emplacement, leur durée de conservation, la manière dont les clés API peuvent désactiver la journalisation et la façon d’interroger les données.
L’implémentation se trouve dans src/lib/compliance/index.ts (T-43 — « Contrôles de conformité ») et src/lib/compliance/providerAudit.ts. Les écritures d’audit ne lèvent jamais d’exception : en cas d’échec, l’appel est silencieusement ignoré afin que la journalisation d’audit ne puisse pas interrompre le flux principal de la requête.
Éléments journalisés
Événements d’audit administratifs (audit_log)
Chaque appel à logAuditEvent({ action, actor, target, details, ... }) produit une ligne. Les chaînes d’action suivent un modèle domain.verb (ou domain.verb.outcome). Les types d’actions confirmés dans l’arborescence du code comprennent :
| Action | Source |
|---|---|
auth.login.success |
src/app/api/auth/login/route.ts |
auth.login.failed |
src/app/api/auth/login/route.ts |
auth.login.locked |
src/app/api/auth/login/route.ts |
auth.login.error |
src/app/api/auth/login/route.ts |
auth.login.misconfigured |
src/app/api/auth/login/route.ts |
auth.login.setup_required |
src/app/api/auth/login/route.ts |
auth.logout.success |
src/app/api/auth/logout/route.ts |
provider.credentials.created |
src/app/api/providers/route.ts |
provider.credentials.updated |
src/app/api/providers/[id]/route.ts |
provider.credentials.revoked |
src/app/api/providers/[id]/route.ts |
provider.credentials.batch_revoked |
src/app/api/providers/route.ts |
sync.token.created |
src/app/api/sync/tokens/route.ts |
sync.token.revoked |
src/app/api/sync/tokens/[id]/route.ts |
compliance.cleanup |
src/lib/compliance/index.ts |
Chaque entrée enregistre action, actor (valeur par défaut : "system"), target, details/metadata (JSON), ip_address, resource_type, status, request_id et timestamp. Les clés sensibles (apiKey, accessToken, refreshToken, password, tout élément correspondant à *token/*secret/*apikey, etc.) sont récursivement expurgées et remplacées par "[redacted]" avant l’écriture de la ligne.
Appels d’outils MCP (mcp_tool_audit)
Chaque invocation d’un outil MCP écrit une ligne par l’intermédiaire de open-sse/mcp-server/audit.ts. Schéma (provenant de src/lib/db/migrations/002_mcp_a2a_tables.sql) :
| Colonne | Remarques |
|---|---|
id |
incrémentation automatique |
tool_name |
identifiant de l’outil MCP |
input_hash |
sha256 de l’entrée (aucune charge utile stockée) |
output_summary |
résumé court et tronqué |
duration_ms |
temps écoulé |
api_key_id |
appelant (peut être nul) |
success |
1 / 0 |
error_code |
code d’erreur terminal en cas d’échec |
created_at |
horodatage ISO |
Journaux des requêtes et de l’utilisation
Il s’agit de données de télémétrie opérationnelle (et non, à proprement parler, d’un audit administratif), mais elles partagent le même pipeline de conservation :
usage_history— agrégat d’utilisation par requêtecall_logs— journal complet par requête (soumis à une limite de lignes, voir ci-dessous)proxy_logs— journal du trafic du proxy (soumis à une limite de lignes)request_detail_logs— ancien journal détaillé des requêtes (toujours purgé s’il est présent)
Schéma de stockage
audit_log est créée à la demande par ensureAuditLogSchema() lors de la première utilisation :
CREATE TABLE IF NOT EXISTS audit_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL DEFAULT (datetime('now')),
action TEXT NOT NULL,
actor TEXT NOT NULL DEFAULT 'system',
target TEXT,
details TEXT,
ip_address TEXT,
resource_type TEXT,
status TEXT,
request_id TEXT,
metadata TEXT
);
Des index sont créés sur timestamp, action, actor, resource_type,
status et request_id. Les colonnes manquantes dans les anciennes bases de données sont ajoutées via
ALTER TABLE à la demande.
Conservation et nettoyage
Deux périodes de conservation distinctes sont appliquées :
| Variable d'environnement | Valeur par défaut | S'applique à |
|---|---|---|
APP_LOG_RETENTION_DAYS |
7 |
audit_log, mcp_tool_audit |
CALL_LOG_RETENTION_DAYS |
7 |
usage_history, call_logs, proxy_logs, request_detail_logs |
CALL_LOGS_TABLE_MAX_ROWS |
100000 |
Réduction au nombre maximal de lignes pour call_logs |
PROXY_LOGS_TABLE_MAX_ROWS |
100000 |
Réduction au nombre maximal de lignes pour proxy_logs |
cleanupExpiredLogs() exécute le processus de conservation. Elle est appelée au démarrage du serveur
depuis src/instrumentation-node.ts. Chaque exécution journalise un
événement d'audit compliance.cleanup avec le nombre de suppressions par table. La réduction des journaux
de proxy et d'appels est effectuée par lots (BATCH_SIZE = 5000) afin d'éviter les verrouillages prolongés en écriture.
Le nettoyage manuel de l'historique des requêtes est distinct de la conservation. La page des journaux de requêtes
appelle POST /api/settings/purge-request-history, qui supprime call_logs,
l'ancienne table request_detail_logs et les artefacts locaux des requêtes sous
${DATA_DIR}/call_logs/.
Les valeurs par défaut sont définies dans src/lib/logEnv.ts
(DEFAULT_APP_LOG_RETENTION_DAYS = 7, DEFAULT_CALL_LOG_RETENTION_DAYS = 7).
Désactivation noLog (par clé API)
Les clés API peuvent être marquées afin que le trafic de leurs appels en aval ne soit pas journalisé. Le
marqueur est stocké dans la table api_keys (no_log INTEGER DEFAULT 0) et est répliqué
dans un ensemble en mémoire pour permettre des recherches rapides sur les chemins critiques.
# Créer une clé sans journalisation (authentification de gestion requise)
curl -X POST http://localhost:20128/api/keys \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{"name": "Privacy key", "noLog": true}'
Fonctions utilitaires (src/lib/compliance/index.ts) :
setNoLog(apiKeyId, true|false)— active ou désactive l'entrée en mémoireisNoLog(apiKeyId)— vérifiée sur le chemin de la requête ; utilise en dernier recours une lecture deapi_keys.no_logmise en cache pendant 30 sNO_LOG_API_KEY_IDS(variable d'environnement, valeurs séparées par des virgules) — préchargée dans l'ensemble en mémoire au démarrage ; utile lorsque vous ne pouvez pas modifier directement la colonne
Les événements d'audit administratifs (connexion, modifications des fournisseurs, appels d'outils MCP, etc.)
ne sont pas affectés par noLog — seule la journalisation du trafic par requête est
désactivée.
API REST
| Point de terminaison | Méthode | Description | Authentification |
|---|---|---|---|
/api/compliance/audit-log |
GET |
Entrées paginées du journal d’audit administrateur avec filtres | management |
/api/mcp/audit |
GET |
Entrées paginées du journal d’audit des outils MCP | (open-sse) |
/api/mcp/audit/stats |
GET |
Statistiques agrégées de l’audit MCP | (open-sse) |
Aucun point de terminaison d’exportation CSV n’est actuellement fourni — effectuez l’exportation depuis le tableau de bord ou interrogez directement la base de données SQLite.
Interrogation de /api/compliance/audit-log
Paramètres de requête pris en charge (tous facultatifs ; les filtres textuels
utilisent tous la correspondance LIKE %value%) :
action,actor,target,resourceType(ouresource_type),status,requestId(ourequest_id)from/since,to/until— horodatages ISOlimit(50par défaut, minimum1, maximum500)offset(0par défaut, maximum10_000)
La réponse est un tableau JSON. Les métadonnées de pagination sont renvoyées dans les en-têtes :
x-total-count, x-page-limit, x-page-offset.
curl "http://localhost:20128/api/compliance/audit-log?action=provider.credentials&from=2026-05-01" \
-H "Cookie: auth_token=..."
Tableau de bord
Le tableau de bord expose les données d’audit à l’adresse /dashboard/audit
(src/app/(dashboard)/dashboard/audit/page.tsx). La page comporte deux onglets :
- Conformité (
ComplianceTab.tsx) — événements d’audit administrateur provenant de/api/compliance/audit-log. Filtrage par type d’événement, niveau de gravité (information / avertissement / critique, dérivé de l’action et du statut) et plage de dates. Le niveau de gravité est calculé côté client à partir des chaînes d’action et de statut. - MCP (
McpAuditTab.tsx) — audit des outils MCP provenant de/api/mcp/audit, avec des filtres par nom d’outil et par réussite/échec.
Les deux onglets utilisent une pagination avec des tailles de page de 50 (conformité) et de 25 (MCP).
Utilitaires d’audit des identifiants de fournisseur
src/lib/compliance/providerAudit.ts fournit des utilitaires de mise en forme utilisés par les
routes de gestion des fournisseurs lorsqu’elles émettent des événements relatifs aux identifiants :
summarizeProviderConnectionForAudit(connection)— supprimeapiKey,accessToken,refreshToken,idTokenetproviderSpecificData.consoleApiKeyavant que l’instantané de connexion ne soit écrit dansdetails.getProviderAuditTarget(connection)— compose une chaîne stable"<provider>:<name|id>"pour le champtarget.extractProviderWarnings(...payloads)— analyse les réponses du fournisseur à la recherche d’avertissements de politique/sécurité ([sanitizer],prompt injection detected,content has been filtered,safety filter,policy violation) et remonte jusqu’à 5 occurrences, chacune étant tronquée à 400 caractères.
Bonnes pratiques
- Marquez avec
noLog: trueles clés d’API traitant des données personnelles identifiables (juridiques, médicales, etc.). - Ajustez
APP_LOG_RETENTION_DAYS/CALL_LOG_RETENTION_DAYSafin de respecter votre politique de conservation. Les valeurs par défaut de 7 jours sont prudentes. - Exportez la table d’audit hors de la plateforme (
sqlite3 dump) selon la fréquence requise par votre programme de conformité — aucun mécanisme d’archivage intégré n’existe. - Suivez le nombre d’événements
auth.login.failedetauth.login.lockedafin de détecter les attaques par force brute. - Lors de l’ajout de nouveaux points de terminaison administrateur, appelez
logAuditEvent({ ... })avec une chaîne d’action stabledomain.verb.outcomeet transmettez le contexte de la requête viagetAuditRequestContext(request)afin que l’adresse IP et lerequestIdsoient capturés automatiquement.
Voir aussi
docs/security/GUARDRAILS.md— masquage des données personnelles, injection de promptdocs/frameworks/MCP-SERVER.md— catalogue des outils MCP et portéesdocs/reference/ENVIRONMENT.md— référence complète des variables d’environnement- Source :
src/lib/compliance/,src/app/api/compliance/,src/app/api/mcp/audit/,src/lib/logEnv.ts