Закрой базу от интернета - БД не должна слушать 0.0.0.0 без нужды. Открывай доступ только из подсети приложения (VPC, private network).
Используй принцип наименьших прав - отдельный пользователь на каждое приложение, только нужные SELECT/INSERT/UPDATE, без SUPER/OWNER.
Пароли и секреты - длинные, уникальные, храни в Secret Manager/.env вне репозитория, регулярно ротируй.
Шифрование - включи TLS для соединений, шифруй бэкапы и диски (at-rest).
Обновления - патчи БД и ОС ставь регулярно, отключай лишние расширения и фичи.
Защита от SQL-инъекций - только параметризованные запросы, никакой конкатенации строк в SQL.
Логи и аудит - включи логирование входов, ошибок, подозрительных запросов, алерты на “подбор паролей”.
Бэкапы + проверка восстановления - делай бэкапы и обязательно тестируй restore, иначе это не бэкап.
Ограничь опасные команды - запрети DROP/ALTER в проде для app-юзеров, разнеси миграции и рантайм доступ.
Rate limiting и защита периметра - firewall/SG, fail2ban/pgbouncer limits, VPN/bastion для админки.
Postgres hardening (quick example)
ufw allow from 10.0.0.0/8 to any port 5432
psql -c "CREATE ROLE app LOGIN PASSWORD 'STRONG';"
psql -c "REVOKE ALL ON DATABASE prod FROM PUBLIC;"
psql -c "GRANT CONNECT ON DATABASE prod TO app;"
psql -c "ALTER SYSTEM SET ssl=on;"
psql -c "ALTER SYSTEM SET log_connections=on;"
psql -c "ALTER SYSTEM SET password_encryption='scram-sha-256';"
systemctl reload postgresql