How to Configure Postgres Access

How to Configure Postgres Access PostgreSQL, commonly known as Postgres, is one of the most powerful, open-source relational database systems in use today. Renowned for its reliability, extensibility, and standards compliance, it powers everything from small web applications to enterprise-scale data platforms. However, like any critical infrastructure component, its security and accessibility must

Oct 30, 2025 - 12:48
Oct 30, 2025 - 12:48
 1

How to Configure Postgres Access

PostgreSQL, commonly known as Postgres, is one of the most powerful, open-source relational database systems in use today. Renowned for its reliability, extensibility, and standards compliance, it powers everything from small web applications to enterprise-scale data platforms. However, like any critical infrastructure component, its security and accessibility must be carefully managed. Configuring Postgres access correctly ensures that authorized users and applications can connect efficiently while preventing unauthorized access, data breaches, and performance degradation.

This guide provides a comprehensive, step-by-step walkthrough on how to configure Postgres access from initial setup to advanced authentication methods and network-level controls. Whether you're a developer setting up a local environment, a DevOps engineer managing cloud deployments, or a database administrator securing production systems, this tutorial will equip you with the knowledge to configure Postgres access securely and efficiently.

By the end of this guide, youll understand how to:

  • Modify key configuration files to control remote and local connections
  • Implement user authentication using password, MD5, SCRAM, and certificate-based methods
  • Restrict access by IP address and network interface
  • Use SSL/TLS to encrypt connections
  • Apply best practices for least privilege and auditability
  • Diagnose and resolve common connection errors

Properly configured Postgres access is not optional its foundational to data integrity, regulatory compliance, and system resilience. Lets begin.

Step-by-Step Guide

Step 1: Locate and Understand Postgres Configuration Files

PostgreSQLs access control is governed primarily by two configuration files:

  • postgresql.conf Controls server-wide settings, including listening addresses and port
  • pg_hba.conf Defines Host-Based Authentication rules, determining who can connect and how

To locate these files, connect to your Postgres server and run:

SHOW config_file;

This returns the path to postgresql.conf. The pg_hba.conf file is typically in the same directory. If youre unsure, use:

SHOW hba_file;

Always back up both files before making changes:

cp /path/to/postgresql.conf /path/to/postgresql.conf.bak

cp /path/to/pg_hba.conf /path/to/pg_hba.conf.bak

Step 2: Configure Listening Addresses in postgresql.conf

By default, Postgres listens only on localhost (127.0.0.1), meaning remote connections are blocked. To allow external access, modify the listen_addresses parameter in postgresql.conf.

Open the file and locate:

listen_addresses = 'localhost'

Change it to:

listen_addresses = '*'  

Allows connections from any IP

Alternatively, for tighter control, specify allowed IPs or networks:

listen_addresses = '127.0.0.1, 192.168.1.10, 10.0.0.0/24'

Use * only in trusted environments. In production, restrict this to specific IPs or subnets to reduce attack surface.

Also ensure the port is correctly set (default is 5432):

port = 5432

After making changes, restart the Postgres service:

sudo systemctl restart postgresql

On macOS using Homebrew:

brew services restart postgresql

Step 3: Configure Host-Based Authentication in pg_hba.conf

The pg_hba.conf file defines which clients can connect, from which IP addresses, using which authentication method, and as which database user.

Each line in pg_hba.conf follows this format:

type  database  user  address  method

Heres a breakdown of each field:

  • type: Connection type local (Unix socket), host (TCP/IP), hostssl (encrypted TCP/IP)
  • database: Database name use all, specific names, or comma-separated lists
  • user: PostgreSQL username all or specific users
  • address: Client IP address or CIDR range e.g., 192.168.1.0/24
  • method: Authentication method trust, password, md5, scram-sha-256, cert, etc.

Example entries:

Allow local connections via Unix socket with peer authentication

local all all peer

Allow local TCP connections with password authentication

host all all 127.0.0.1/32 scram-sha-256

Allow internal network (192.168.1.x) to connect to 'app_db' with password

host app_db app_user 192.168.1.0/24 scram-sha-256

Allow a specific external IP to connect to all databases with certificate

hostssl all admin 203.0.113.5/32 cert

Deny all other connections (implicit by default)

Important: Order matters. Postgres evaluates rules top-down and uses the first matching entry. Place more specific rules before broader ones.

For example, if you place:

host    all             all             0.0.0.0/0               trust

at the top of the file, no other rules will be evaluated and anyone can connect without a password. This is a critical security risk.

After editing pg_hba.conf, reload the configuration no full restart is needed:

sudo systemctl reload postgresql

Or using the SQL command:

SELECT pg_reload_conf();

Step 4: Create and Manage Database Users

Postgres uses roles to manage access. A role can be a user (login-capable) or a group (non-login, used for permissions).

To create a new user with login privileges:

CREATE USER username WITH PASSWORD 'strongpassword123';

To create a superuser (use sparingly):

CREATE USER admin WITH SUPERUSER PASSWORD 'secureadminpass';

To create a role without login rights (for grouping permissions):

CREATE ROLE read_only;

Grant permissions to roles:

GRANT CONNECT ON DATABASE myapp TO read_only;

GRANT USAGE ON SCHEMA public TO read_only;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only;

Assign the role to a user:

GRANT read_only TO app_user;

Always use strong, unique passwords. Avoid default or simple passwords like password or admin.

Step 5: Enable SSL/TLS for Encrypted Connections

Encrypting connections prevents eavesdropping and man-in-the-middle attacks, especially over public networks.

To enable SSL, first ensure you have a certificate and private key. You can generate a self-signed certificate for testing:

openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key

chmod 600 server.key

mv server.crt server.key /var/lib/postgresql/data/

On Ubuntu/Debian, the data directory is typically /var/lib/postgresql/[version]/main.

In postgresql.conf, set:

ssl = on

ssl_cert_file = 'server.crt'

ssl_key_file = 'server.key'

Optional: ssl_ca_file = 'root.crt' for client certificate validation

Restart the server after making these changes.

To enforce SSL connections for specific users or IPs, use hostssl instead of host in pg_hba.conf:

hostssl all             app_user        203.0.113.10/32         scram-sha-256

Client applications must also be configured to use SSL. For example, in a Node.js app using pg:

const client = new Client({

host: 'your-server.com',

port: 5432,

user: 'app_user',

password: 'password',

database: 'myapp',

ssl: {

rejectUnauthorized: true

}

});

For production, use certificates issued by a trusted Certificate Authority (CA) rather than self-signed ones.

Step 6: Test Your Configuration

After configuring access, test connectivity from both local and remote machines.

Local test:

psql -h localhost -U username -d database_name

Remote test (from another machine):

psql -h your-server-ip -U username -d database_name

If connection fails, check:

  • Firewall settings (e.g., ufw allow 5432 on Ubuntu)
  • Cloud provider security groups (AWS Security Groups, GCP Firewall Rules)
  • Whether the Postgres service is running: systemctl status postgresql
  • Logs in /var/log/postgresql/postgresql-[version]-main.log

Common error messages and fixes:

  • "no pg_hba.conf entry" The client IP/user/database combination isnt allowed in pg_hba.conf
  • "password authentication failed" Incorrect password or method mismatch (e.g., client sends MD5 but server expects SCRAM)
  • "connection refused" Postgres isnt listening on the IP/port, or a firewall is blocking it
  • "SSL connection has been closed unexpectedly" SSL misconfiguration on server or client

Step 7: Configure Connection Limits and Pooling

Excessive concurrent connections can degrade performance or crash the server. Limit connections in postgresql.conf:

max_connections = 100

superuser_reserved_connections = 3

For high-traffic applications, use a connection pooler like PgBouncer or PgPool-II to reduce overhead and manage connections efficiently.

Install PgBouncer:

sudo apt install pgbouncer

Configure /etc/pgbouncer/pgbouncer.ini:

[databases]

myapp = host=localhost port=5432 dbname=myapp

[pgbouncer]

listen_port = 6432

listen_addr = 127.0.0.1

auth_type = md5

auth_file = /etc/pgbouncer/userlist.txt

pool_mode = transaction

max_client_conn = 100

default_pool_size = 20

Then restart PgBouncer and update your application to connect to port 6432 instead of 5432.

Best Practices

Use the Principle of Least Privilege

Never grant superuser access to application users. Create dedicated roles with minimal permissions:

  • Application users should have only CONNECT, USAGE, and specific SELECT/INSERT/UPDATE permissions
  • Use schemas to isolate application data
  • Revoke public schema privileges: REVOKE CREATE ON SCHEMA public FROM PUBLIC;

Disable Trust Authentication in Production

The trust method allows any user to connect without a password if they match the IP and user. This is acceptable only on isolated, internal networks never on public-facing servers.

Replace trust with scram-sha-256 the modern, secure default since Postgres 10.

Use SCRAM-SHA-256 Over MD5

MD5 is deprecated and vulnerable to rainbow table attacks. SCRAM-SHA-256 provides salted, challenge-response authentication that prevents password exposure even if the database is compromised.

To migrate existing users:

ALTER USER username WITH PASSWORD 'newpassword';

Postgres automatically upgrades passwords to SCRAM when changed.

Regularly Audit Access Rules

Periodically review pg_hba.conf and user permissions. Remove unused roles and restrict IP ranges as networks change.

Use this query to list all users and their privileges:

\du+

Or in SQL:

SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin

FROM pg_roles

ORDER BY rolname;

Enable Logging for Security Monitoring

In postgresql.conf, enable connection and authentication logging:

log_connections = on

log_disconnections = on log_statement = 'none'

or 'ddl' / 'mod' for audit

log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '

These logs help detect brute-force attacks, unauthorized access attempts, and misconfigurations.

Restrict Access via Firewall

Postgres configuration is not a substitute for network security. Always use a firewall:

  • On Linux: ufw allow from 192.168.1.0/24 to any port 5432
  • On AWS: Configure Security Groups to allow only specific IPs or VPCs
  • On GCP: Use VPC Service Controls and Firewall Rules

Block all public access unless absolutely necessary. Use VPNs or private networks for internal services.

Rotate Credentials and Certificates

Implement a policy to rotate passwords and SSL certificates every 90180 days. Automate this using scripts or secrets management tools like HashiCorp Vault or AWS Secrets Manager.

Use SSH Tunneling for Secure Remote Access

If direct database exposure is unnecessary, use SSH tunneling to securely forward a local port to the remote Postgres instance:

ssh -L 5433:localhost:5432 user@your-server.com

Then connect locally:

psql -h localhost -p 5433 -U username -d database_name

This method avoids opening Postgres to the public internet entirely.

Tools and Resources

Command-Line Tools

  • psql The standard Postgres interactive terminal. Essential for testing and administration.
  • pg_dump / pg_restore For backup and restore operations with access control in mind.
  • pg_isready Checks if the server is accepting connections. Useful in automation scripts.

GUI Tools

  • pgAdmin The most popular web-based administration tool. Supports connection profiles with SSL and authentication settings.
  • DBeaver Universal database tool with strong Postgres support and SSH tunneling.
  • TablePlus Modern, native macOS/Windows/Linux client with clean UI and secure connection options.

Monitoring and Security Tools

  • pg_stat_statements Extension to monitor query performance and detect abuse.
  • pgAudit Provides detailed audit logging of database activity for compliance.
  • Fail2Ban Can be configured to block repeated failed login attempts from IP addresses.
  • Logstash + Elasticsearch + Kibana Centralized log analysis for detecting suspicious access patterns.

Official Documentation and References

Automated Configuration Tools

  • Ansible Use roles like geerlingguy.postgresql to automate deployment and configuration.
  • Terraform Provision cloud-based Postgres instances (e.g., AWS RDS, Google Cloud SQL) with secure access policies.
  • Docker Compose Define secure Postgres containers with environment variables and volume-mounted config files.

Real Examples

Example 1: Securing a Web Application Database

Scenario: Youre deploying a Django app on a Linux server with Postgres as the backend. The app server and database server are on the same private network (192.168.1.0/24).

Goal: Allow only the app server to connect, using encrypted connections and minimal privileges.

Steps:

  1. On the database server, edit postgresql.conf:
    listen_addresses = '192.168.1.20'

  2. Edit pg_hba.conf:
    hostssl appdb django_user 192.168.1.10/32 scram-sha-256

  3. Enable SSL with a CA-signed certificate.
  4. Create the user:
    CREATE USER django_user WITH PASSWORD 'J9

    mP2xL$wQ8' NOSUPERUSER NOCREATEDB NOCREATEROLE;

  5. Grant permissions:
    GRANT CONNECT ON DATABASE appdb TO django_user;
    

    GRANT USAGE ON SCHEMA public TO django_user;

    GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO django_user;

  6. Update Django settings:
    DATABASES = {
    

    'default': {

    'ENGINE': 'django.db.backends.postgresql',

    'NAME': 'appdb',

    'USER': 'django_user', 'PASSWORD': 'J9

    mP2xL$wQ8',

    'HOST': '192.168.1.20',

    'PORT': '5432',

    'OPTIONS': {

    'sslmode': 'require'

    }

    }

    }

Example 2: Secure Remote Access for a Data Analyst

Scenario: A data analyst needs read-only access to a production database from their home IP (203.0.113.45).

Goal: Allow secure, encrypted, read-only access without granting any write permissions.

Steps:

  1. Create a role:
    CREATE ROLE analyst_read ONLY;

  2. Grant read-only access:
    GRANT CONNECT ON DATABASE sales TO analyst_read;
    

    GRANT USAGE ON SCHEMA public TO analyst_read;

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO analyst_read;

  3. Create the user:
    CREATE USER jane_doe WITH PASSWORD 'StrongPass!2024' IN ROLE analyst_read;

  4. Add to pg_hba.conf:
    hostssl sales jane_doe 203.0.113.45/32 scram-sha-256

  5. Ensure SSL is enabled on the server.
  6. Provide Jane with a connection string:
    psql "host=prod-db.company.com port=5432 dbname=sales user=jane_doe sslmode=require"

Example 3: Cloud Deployment with AWS RDS

Scenario: Youre using Amazon RDS for PostgreSQL. You need to restrict access to an EC2 instance and a CI/CD pipeline.

Steps:

  1. In the AWS Console, navigate to your RDS instance.
  2. Under Connectivity & security, edit the associated security group.
  3. Add an inbound rule:
    • Type: PostgreSQL
    • Protocol: TCP
    • Port: 5432
    • Source: Security group of your EC2 instance (e.g., sg-12345678)
    • Source: Security group of your CI/CD runner (e.g., sg-87654321)

  4. Disable public access (set Publicly accessible to No).
  5. Use IAM database authentication (optional but recommended for enhanced security).
  6. Configure your application to use the RDS endpoint and a strong password.

FAQs

Can I connect to Postgres without a password?

Yes, using the trust authentication method in pg_hba.conf. However, this is extremely insecure and should only be used in development environments or isolated networks. Never use it in production.

Whats the difference between host and hostssl in pg_hba.conf?

host allows unencrypted TCP connections. hostssl requires SSL/TLS encryption. Always prefer hostssl for remote connections to protect data in transit.

Why is my connection being rejected even though I added the IP to pg_hba.conf?

Common causes:

  • Incorrect order of rules a more general rule above is matching first
  • Typo in IP address or CIDR notation
  • Postgres is not listening on the correct interface (check listen_addresses)
  • Firewall or cloud security group is blocking the port
  • Client is connecting via Unix socket but you configured TCP rules

How do I know which authentication method my client is using?

Check the client library documentation. For example, Pythons psycopg2 defaults to SCRAM if the server supports it. You can force a method by setting the password parameter and ensuring the server supports the method.

Can I use LDAP or Kerberos with Postgres?

Yes. Postgres supports external authentication via LDAP, Kerberos, PAM, and RADIUS. Configure these in pg_hba.conf using ldap, kerberos, or pam as the method. This is common in enterprise environments with centralized identity systems.

How do I reset a forgotten Postgres password?

If you have OS-level access to the server:

  1. Stop the Postgres service.
  2. Start Postgres in single-user mode: pg_ctl -D /var/lib/postgresql/data -o "-c listen_addresses=''" -o "-p 5432" -o "-c auth_method=trust"
  3. Connect via psql and run: ALTER USER username WITH PASSWORD 'newpassword';
  4. Restart the service normally.

Is it safe to expose Postgres to the internet?

No. Exposing Postgres directly to the public internet is strongly discouraged. Even with strong passwords, its a high-value target for automated attacks. Always use VPNs, SSH tunnels, or private networks. If you must expose it, use strict IP whitelisting, SSL, and intrusion detection systems.

How often should I rotate Postgres passwords?

Best practice is every 90 days for production systems. Automate this process using secrets management tools and scripts that update both the database and application configuration files.

Conclusion

Configuring Postgres access is a critical task that balances usability with security. Misconfigurations can lead to data breaches, compliance violations, or service outages but when done correctly, they ensure your database remains a secure, reliable foundation for your applications.

This guide has walked you through the entire process: from locating and modifying configuration files, to implementing secure authentication methods, enabling encryption, and applying industry best practices. Youve seen real-world examples of how to secure access for web apps, analysts, and cloud deployments.

Remember: security is not a one-time setup. It requires ongoing attention regular audits, credential rotation, log monitoring, and updates to reflect evolving threats and infrastructure changes.

As you continue to manage Postgres systems, prioritize depth over convenience. Use SCRAM-SHA-256, enforce SSL, restrict IPs, and grant minimal privileges. Leverage tools like PgBouncer, pgAudit, and SSH tunneling to enhance both performance and security.

PostgreSQL is powerful and with proper access configuration, it can be both secure and scalable. Apply these principles consistently, and youll build systems that are resilient, compliant, and trusted.