Postgres security best practices
1. Secure Installation and Initial Configuration
Minimal Installation: Only install the extensions and tools you need. Unused packages can increase the attack surface.
Keep PostgreSQL Updated: Use the latest stable release to benefit from security patches. Subscribe to PostgreSQL security announcements.
Initial Hardening Checklist:
- Change the default
postgressuperuser password immediately after installation. - Set
listen_addressesinpostgresql.confto specific IPs instead of*. - Disable the
trustmethod inpg_hba.conf, especially in production. - Revoke unnecessary privileges from the
publicschema.
2. Authentication and User Management
Role and User Management:
- Apply the principle of least privilege.
- Avoid shared accounts; create unique roles for each user and application.
Password Policies:
- Use strong, complex passwords.
- Store passwords using SCRAM-SHA-256 rather than MD5.
- Integrate with LDAP or PAM for centralized authentication.
Two-Factor Authentication (2FA):
While PostgreSQL doesnโt natively support 2FA, you can implement it at the network or OS layer using SSH, VPN, or identity providers.
Restrict Superuser Access:
- Use the
postgresrole only for critical maintenance. - Monitor all superuser activity.
3. Authorization and Access Control
Role-Based Access Control (RBAC):
- Use
GRANTandREVOKEto assign only necessary permissions. - Organize roles into groups for easier management.
Schema and Table Permissions:
- Lock down access to sensitive tables with
REVOKE. - Use
SECURITY DEFINERfunctions with caution and never as superuser.
Row-Level Security (RLS):
- Implement RLS to enforce per-user or per-tenant access policies.
- Use
CREATE POLICYandALTER TABLE ENABLE ROW LEVEL SECURITY.
Public Schema:
- Revoke default access with:
REVOKE ALL ON SCHEMA public FROM public;
4. Data Encryption
Encryption in Transit:
- Enable SSL/TLS in
postgresql.conf:ssl = on - Require SSL for clients:
sslmode=require - Rotate certificates regularly.
Encryption at Rest:
- Use OS-level encryption (e.g., LUKS, EBS encryption).
- Consider PostgreSQL extensions like
pgcryptofor column-level encryption. - Evaluate third-party Transparent Data Encryption (TDE) solutions if compliance requires it.
5. Network Security
Restrict Access:
- Use firewall rules or security groups to allow only trusted IP ranges.
- Never expose PostgreSQL directly to the public internet.
Configure pg_hba.conf Carefully:
- Prefer
scram-sha-256ormd5, never trust in production. - Limit IP ranges per user or role.
Additional Hardening:
- Use a VPN or SSH tunnel for remote access.
- Change the default port (5432) to reduce visibility to automated scans.
6. Auditing and Monitoring
Enable Detailed Logging:
log_connections = onlog_disconnections = onlog_statement = 'ddl'log_duration = on
Use Audit Tools:
- Install
pgAuditfor fine-grained auditing. - Export logs to centralized systems (e.g., ELK, Splunk).
Intrusion Detection:
- Monitor for failed login attempts and role escalations.
- Set up alerts for suspicious activity.
7. Patching and Maintenance
Apply Security Updates Promptly:
- Use automated patch management when available.
- Test patches in staging environments.
Stay Informed:
- Subscribe to
pgsql-announcefor security updates. - Monitor CVEs related to PostgreSQL and dependencies.
8. Backup and Disaster Recovery
Encrypted Backups:
- Use
pg_dumpor base backups with encrypted storage. - Protect backup access credentials.
Restore Testing:
- Regularly test your restore process.
- Automate backup integrity checks.
Disaster Recovery Planning:
- Define RTO (Recovery Time Objective) and RPO (Recovery Point Objective).
- Store backups offsite and use redundant storage solutions.
9. Advanced Security Techniques
OS-Level Protections:
- Use AppArmor or SELinux to restrict PostgreSQL process capabilities.
Connection Throttling:
- Deploy
pgbouncerto pool and limit abusive connections.
Security Extensions:
- Leverage
pgcryptofor encryption - Consider
sepgsqlfor mandatory access control
10. Common Mistakes and Vulnerabilities
- Using trust authentication in production.
- Leaving the postgres role with default settings.
- Failing to restrict access to the public schema.
- Not using parameterized queries (risk of SQL injection).
- Ignoring patch announcements.
Bytebase enhances database security by streamlining access controls, data masking, audit trails, and ensuring data integrity across all changes.