feat(ops): off-box копия рантайм-конфига — зашифрованной, иначе никак #3146
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3146
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/2203-env-offbox-copy"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Закрывает четвёртый (последний) пункт приёмки #2203.
Зачем
В дампах есть колонки под
pgp_sym_encrypt. Ключ к ним лежит на самой машине и никуда не уезжает. Дампы в S3 ежедневно, ключ — нигде: потеря машины означает «дампы есть, расшифровать нечем». Ради этой связки шифрование в базе и заводилось, и именно она сегодня не работает.Куда кладём и почему именно туда
В тот же S3, отдельным префиксом
env/, и только зашифрованным. Что рассматривал:Permission denied (publickey)) — пришлось бы расширить периметр ровно тогда, когда #3075 его сужаетВыбран единственный исполнимый без расширения доступа: шифротекст в S3, парольная фраза — вне S3.
Fail-closed
Без парольной фразы скрипт не выгружает файл открытым — падает с явным сообщением и алертом в канал.
Это не перестраховка. Молчаливая выгрузка ключа в бакет, где лежат дампы, хуже отсутствия копии: отсутствие видно, а ложное чувство защищённости — нет.
Ещё два свойства, каждое из-за конкретной цены ошибки:
Фраза уходит через дескриптор, а не аргументом.
--passphrase '<фраза>'в командной строке видна вpsлюбому пользователю машины.После шифрования файл проверяется обратной расшифровкой. Без этого можно годами возить в S3 нечитаемый мусор и узнать об этом ровно в тот момент, когда он понадобился.
Прогон на хосте
Подставной исходник, боевой файл не трогался (его и не читал — на это в репозитории стоит хук, и правильно):
Один шаг за владельцем, и он неустраним
Парольная фраза обязана жить там, где переживёт смерть машины — иначе копия бесполезна, расшифровать будет нечем. Сгенерировать её здесь и оставить на хосте нельзя по построению: погибнет вместе с тем, ради спасения от чего всё делается.
meta/00_credentials.md) — это отдельная система на другой машине./etc/default/gendesign-backup:До этого шага скрипт будет ежедневно падать с понятным сообщением — намеренно громко, чтобы пункт не забылся.
Тесты
Пять, каждый сторожит свойство, ради которого всё сделано: скрипт вызывается из cron (страховка от мёртвого кода), отказ без фразы, шифрование до выгрузки, фраза не в аргументах, проверка обратным чтением между шифрованием и выгрузкой.
Refs #2203