REVOKE ALL ON SCHEMA public FROM PUBLIC;CREATE ROLE app_reader; CREATE ROLE app_writer;GRANT USAGE ON SCHEMA app TO app_reader, app_writer;GRANT SELECT ON ALL TABLES IN SCHEMA app TO app_reader;GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO app_writer;GRANT app_reader TO app_writer;
6. Securing PostgreSQL Configuration
Setting
Recommendation
listen_addresses
Bind to internal IPs only
port
Non-default if exposed
password_encryption
scram-sha-256
ssl
on, TLS 1.2+
log_connections / log_disconnections
on
row_security
on (default)
7. Restricting Network Access
# pg_hba.confhostssl all all 10.0.0.0/24 scram-sha-256host all all 0.0.0.0/0 reject
8. Using SSL Certificates
# mTLShostssl all alice 10.0.0.0/24 cert clientcert=verify-full
9. Implementing Data Masking
CREATE VIEW customers_masked ASSELECT id, regexp_replace(email,'(?<=.{2}).(?=.*@)','*','g') AS email FROM customers;REVOKE SELECT ON customers FROM support;GRANT SELECT ON customers_masked TO support;-- Or use anon extension for production-grade masking
10. Monitoring Security Events
SELECT * FROM pg_stat_ssl;SELECT * FROM pg_stat_activity WHERE backend_type='client backend' AND ssl IS NOT TRUE;-- Plus: parse pgaudit log lines into a SIEM