Secret Manager
Par défaut, les credentials sensibles (mots de passe, clés API, tokens OAuth) sont stockés dans la base de données, dans le champ config JSONB de la table remotes.
Pour les déploiements production, tu peux les déporter vers un Secret Manager externe. Le backend choisit alors automatiquement entre 7 providers selon la variable SECRET_MANAGER_PROVIDER.
Pourquoi
- Audit : qui a accédé à quel secret, quand
- Rotation : changer un secret sans toucher à la BDD
- Séparation : la BDD ne contient plus que des données métier
- IAM : les permissions de lecture/écriture sont gérées par le provider
Comment ça marche
Au démarrage du backend :
- Si
SECRET_MANAGER_PROVIDERest défini, le backend instancie le provider correspondant - Il scanne tous les remotes existants et migre automatiquement leurs champs sensibles vers le Secret Manager, puis les retire de la BDD
- À chaque execution rclone, les secrets sont récupérés depuis le SM et fusionnés avec la config publique pour générer le fichier
rclone.conftemporaire
Le mapping remote_id → secret est :
| Provider | Nom du secret |
|---|---|
| Scaleway | <remote_id> dans le path /rclone-ui |
| AWS | rclone-ui/<remote_id> |
| Azure Key Vault | rclone-ui-<remote_id> |
| GCP | rclone-ui-<remote_id> |
| Vault | secret/data/rclone-ui/<remote_id> |
| Infisical | RCLONE_UI_<UUID_SNAKE_CASE> |
| Doppler | RCLONE_UI_<UUID_NO_DASH> |
La valeur stockée est un JSON {"<field_name>": "<value>", ...} avec uniquement les champs marqués sensibles.
Champs considérés sensibles
Par type de remote :
| Type | Champs |
|---|---|
s3 |
secret_access_key |
sftp / ftp / smb |
pass |
azureblob |
key, sas_url |
sharepoint |
client_secret |
drive |
service_account_credentials, client_secret, token |
dropbox |
token, client_secret |
b2 |
key |
| Types avancés | détection heuristique sur le nom (pass, secret, token, key, auth, sas_url, credential) |
Édition d’un remote avec secrets stockés
Quand tu ouvres un remote existant en édition, les champs sensibles affichent un placeholder •••••• (laisser vide pour conserver) :
- Laisse vide : le secret stocké reste inchangé
- Remplis-le : le nouveau secret remplace l’ancien dans le SM
Configuration par provider
Scaleway Secret Manager
- Console Scaleway → Secret Manager → activer dans le projet (région
fr-parrecommandée) - IAM → créer une API key avec le permission set
SecretManagerFullAccess - Variables d’env :
SECRET_MANAGER_PROVIDER=scaleway
SCW_SECRET_KEY=<la secret key, UUID>
SCW_PROJECT_ID=<UUID du projet>
SCW_DEFAULT_REGION=fr-par
SCW_SECRET_PATH=/rclone-ui
AWS Secrets Manager
- Console AWS → IAM → créer une policy avec :
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:CreateSecret", "secretsmanager:PutSecretValue", "secretsmanager:DeleteSecret" ], "Resource": "arn:aws:secretsmanager:*:*:secret:rclone-ui/*" }] } - Attache cette policy à un utilisateur IAM ou un rôle (EC2/ECS/EKS/IRSA)
- Variables d’env :
SECRET_MANAGER_PROVIDER=aws
AWS_REGION=eu-west-1
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_SECRET_PREFIX=rclone-ui/
Azure Key Vault
- Azure Portal → Key Vaults → créer un vault
- App Registrations → créer une app, noter le
tenant_idetclient_id - Certificates & secrets → créer un Client Secret
- Sur le Key Vault, Access policies → autoriser l’app pour
Get / Set / Deletesur les secrets - Variables d’env :
SECRET_MANAGER_PROVIDER=azure
AZURE_TENANT_ID=...
AZURE_CLIENT_ID=...
AZURE_CLIENT_SECRET=...
AZURE_VAULT_URL=https://myvault.vault.azure.net
Google Cloud Secret Manager
- Console GCP → API Library → activer Secret Manager API
- IAM → créer un Service Account avec le rôle
Secret Manager Admin - Télécharger la clé JSON et l’exposer via
GOOGLE_APPLICATION_CREDENTIALS - Variables d’env :
SECRET_MANAGER_PROVIDER=gcp
GCP_PROJECT_ID=mon-projet-gcp
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
HashiCorp Vault
Vault doit avoir le secrets engine KV v2 activé (par défaut sur secret/).
- Crée un token avec une policy autorisant
create/read/update/deletesursecret/data/rclone-ui/* - Variables d’env :
SECRET_MANAGER_PROVIDER=vault
VAULT_ADDR=http://vault.local:8200
VAULT_TOKEN=hvs.CAES...
VAULT_MOUNT_PATH=secret
VAULT_PATH_PREFIX=rclone-ui
Infisical
- Crée un projet sur infisical.com (ou self-host)
- Access Control → Identities → créer une Universal Auth identity
- Note
clientIdetclientSecret - Variables d’env :
SECRET_MANAGER_PROVIDER=infisical
INFISICAL_HOST=https://app.infisical.com
INFISICAL_CLIENT_ID=...
INFISICAL_CLIENT_SECRET=...
INFISICAL_PROJECT_ID=...
INFISICAL_ENVIRONMENT=prod
INFISICAL_SECRET_PATH=/rclone-ui
Doppler
- Crée un projet sur doppler.com
- Access → Service Tokens → créer un token sur le config voulu (
prd,dev, etc.) - Variables d’env :
SECRET_MANAGER_PROVIDER=doppler
DOPPLER_TOKEN=dp.st.prd...
DOPPLER_PROJECT=mon-projet
DOPPLER_CONFIG=prd
Désactiver
Mets SECRET_MANAGER_PROVIDER=none (ou retire la variable). Les nouveaux remotes stockeront leurs credentials en BDD. Attention : les secrets déjà migrés restent dans le SM et le backend ne saura plus les retrouver tant que tu ne réactives pas le provider.