Un role de lecture seule dont le mot de passe se genere et ne s affiche pas
Le proprietaire releve, a juste titre, que ma commande precedente lui demandait de CHOISIR un mot de passe — trois messages apres lui avoir explique qu un secret se genere et ne se choisit pas. Contradiction corrigee par un script. creer-role-lecture.sh cree le role evcs_lecture en lecture seule, tire son mot de passe avec openssl et le depose directement dans le .env a la racine du depot, sans jamais l afficher : rien a recopier entre deux endroits, donc rien a exposer dans une capture. Il est rejouable — si le role existe et que son mot de passe est deja dans le fichier, il ne fait rien. Deux raisons de ne pas analyser avec le compte evcs : une memoire dont tout l interet est de ne pas etre reecrite ne se consulte pas avec un compte qui peut ecrire, et un mot de passe range dans un fichier lisible par un autre compte ne doit pas etre celui qui gouverne la base. Les privileges par defaut couvrent les tables futures, et un REVOKE explicite ferme l ecriture par ceinture. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -92,6 +92,25 @@ Le bon créneau est le milieu de matinée.
|
||||
À faire après l'étape 1 — n8n a besoin que la base existe pour qu'on y crée
|
||||
l'identifiant de connexion.
|
||||
|
||||
## Accès en lecture pour l'analyse
|
||||
|
||||
```sh
|
||||
sudo bash creer-role-lecture.sh
|
||||
```
|
||||
|
||||
Crée le rôle `evcs_lecture` en **lecture seule** et dépose son mot de passe dans
|
||||
le `.env` à la racine du dépôt. Le mot de passe est généré, jamais choisi, et
|
||||
**n'est pas affiché** : il va du générateur au fichier, donc rien à recopier et
|
||||
rien à exposer dans une capture.
|
||||
|
||||
Deux raisons de ne pas analyser avec le compte `evcs` : une mémoire dont tout
|
||||
l'intérêt est de ne pas être réécrite ne se consulte pas avec un compte qui peut
|
||||
écrire, et un mot de passe rangé dans un fichier lisible ne doit pas être celui
|
||||
qui gouverne la base.
|
||||
|
||||
Le script est rejouable : si le rôle existe déjà et que son mot de passe est
|
||||
dans le `.env`, il ne fait rien.
|
||||
|
||||
## Ce qu'aucune des deux ne fait
|
||||
|
||||
Elles ne remontent pas dans le passé. La mémoire commence le jour où on les
|
||||
|
||||
72
deploy/historisation/creer-role-lecture.sh
Executable file
72
deploy/historisation/creer-role-lecture.sh
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/bin/bash
|
||||
# Crée le rôle PostgreSQL en LECTURE SEULE dont Claude se sert pour analyser la
|
||||
# mémoire de mesures, et dépose son mot de passe dans le .env à la racine du
|
||||
# dépôt — celui que ce compte-là sait lire.
|
||||
#
|
||||
# Pourquoi un rôle séparé plutôt que le compte `evcs` : une mémoire dont tout
|
||||
# l'intérêt est de ne pas être réécrite ne se consulte pas avec un compte qui
|
||||
# peut écrire. Et un mot de passe d'analyse qui traîne dans un fichier lisible
|
||||
# ne doit pas être celui qui gouverne la base.
|
||||
#
|
||||
# Le mot de passe est GÉNÉRÉ, jamais choisi, et n'est PAS affiché : il va
|
||||
# directement du générateur au fichier. Rien à recopier, donc rien à exposer
|
||||
# dans une capture d'écran.
|
||||
#
|
||||
# Usage, depuis 10.10.10.22 :
|
||||
# cd /volume2/projects/EVCS/EVCS/deploy/historisation
|
||||
# sudo bash creer-role-lecture.sh
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
ENV_DEPOT="../../.env"
|
||||
|
||||
if [ ! -f "$ENV_DEPOT" ]; then
|
||||
echo "REFUS : $ENV_DEPOT introuvable. Lancer ce script depuis le dépôt."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
EXISTE=$(docker compose exec -T postgres psql -U evcs -d evcs -tAc \
|
||||
"SELECT 1 FROM pg_roles WHERE rolname='evcs_lecture'" 2>/dev/null || true)
|
||||
|
||||
if [ "$EXISTE" = "1" ]; then
|
||||
echo "Le rôle evcs_lecture existe déjà."
|
||||
if grep -q '^PG_LECTURE_PASSWORD=' "$ENV_DEPOT"; then
|
||||
echo "Et son mot de passe est déjà dans $ENV_DEPOT. Rien à faire."
|
||||
exit 0
|
||||
fi
|
||||
echo "Mais son mot de passe est absent de $ENV_DEPOT — il va être RÉINITIALISÉ."
|
||||
fi
|
||||
|
||||
MDP="$(openssl rand -hex 24)"
|
||||
|
||||
docker compose exec -T postgres psql -U evcs -d evcs -v ON_ERROR_STOP=1 <<EOF
|
||||
DO \$\$
|
||||
BEGIN
|
||||
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'evcs_lecture') THEN
|
||||
ALTER ROLE evcs_lecture LOGIN PASSWORD '$MDP';
|
||||
ELSE
|
||||
CREATE ROLE evcs_lecture LOGIN PASSWORD '$MDP';
|
||||
END IF;
|
||||
END
|
||||
\$\$;
|
||||
|
||||
GRANT CONNECT ON DATABASE evcs TO evcs_lecture;
|
||||
GRANT USAGE ON SCHEMA public TO evcs_lecture;
|
||||
GRANT SELECT ON ALL TABLES IN SCHEMA public TO evcs_lecture;
|
||||
-- Pour que les tables créées plus tard soient lisibles sans repasser ici.
|
||||
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO evcs_lecture;
|
||||
-- Ceinture : aucune écriture, même par héritage d'un privilège public.
|
||||
REVOKE INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA public FROM evcs_lecture;
|
||||
EOF
|
||||
|
||||
# Dépose (ou remplace) la ligne dans le .env du dépôt, sans jamais l'afficher.
|
||||
if grep -q '^PG_LECTURE_PASSWORD=' "$ENV_DEPOT"; then
|
||||
sed -i "s|^PG_LECTURE_PASSWORD=.*|PG_LECTURE_PASSWORD=$MDP|" "$ENV_DEPOT"
|
||||
else
|
||||
printf '\n# Role PostgreSQL en lecture seule sur la memoire de mesures\n# (10.10.10.22:5433, base evcs, utilisateur evcs_lecture)\nPG_LECTURE_PASSWORD=%s\n' "$MDP" >> "$ENV_DEPOT"
|
||||
fi
|
||||
|
||||
echo "✓ Rôle evcs_lecture créé, lecture seule."
|
||||
echo "✓ Mot de passe déposé dans $ENV_DEPOT — non affiché, rien à recopier."
|
||||
echo
|
||||
echo "Contrôle (doit renvoyer une erreur de permission) :"
|
||||
echo " docker compose exec -T postgres psql -U evcs_lecture -d evcs -c \"DELETE FROM mesure\""
|
||||
Reference in New Issue
Block a user