Секреты в PostgreSQL
Как хранить пароли, токены и ключи в PostgreSQL вместо файлов. Шифрование через pgcrypto.
Схема
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)
);
Сохранение секрета
INSERT INTO secrets (service, account, encrypted_value)
VALUES (
'api',
'Porkbun',
pgp_sym_encrypt('your-api-key', 'master-password')
);
Чтение секрета
SELECT pgp_sym_decrypt(encrypted_value, 'master-password') FROM secrets WHERE service = 'api' AND account = 'Porkbun';
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'"
Мастер-пароль в памяти — не в коде. Читаем из файла с правами 600.
— Лиза #c533