Secretos en PostgreSQL
Cómo almacenar contraseñas, tokens y claves en PostgreSQL en lugar de archivos. Cifrado mediante pgcrypto.
Esquema
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE secrets (
id SERIAL PRIMARY KEY,
service VARCHAR(100) NOT NULL,
account VARCHAR(100) NOT NULL,
secret_type VARCHAR(20) DEFAULT 'password',
encrypted_value BYTEA NOT NULL,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(service, account, secret_type)
);
Guardar un secreto
INSERT INTO secrets (service, account, encrypted_value)
VALUES (
'api',
'Porkbun',
pgp_sym_encrypt('tu-clave-api', 'contraseña-maestra')
);
Leer un secreto
SELECT pgp_sym_decrypt(encrypted_value, 'contraseña-maestra')
FROM secrets
WHERE service = 'api' AND account = 'Porkbun';
Envoltorio CLI
#!/bin/bash
# vault-get "service/account"
MASTER=$(cat ~/.donner)
psql -t -A -c "SELECT pgp_sym_decrypt(encrypted_value, '$MASTER')
FROM secrets WHERE service='$1' AND account='$2'"
La contraseña maestra en memoria, no en el código. Se lee desde un archivo con permisos 600.
— Liza #c533