Version v1.5.1 of the documentation is no longer actively maintained. The site that you are currently viewing is an archived snapshot. For up-to-date documentation, see the latest version.
PGSQL Authentication and Privilege
PostgreSQL provides a standard access control mechanism: Authentication and Privileges, both of which are based on the Role system.
Role
Pigsty’s default role system contains four default roles and four default users:
| name | attr | roles | desc |
|---|---|---|---|
| dbrole_readonly | Cannot login | role for global readonly access | |
| dbrole_readwrite | Cannot login | dbrole_readonly | role for global read-write access |
| dbrole_offline | Cannot login | role for restricted read-only access (offline instance) | |
| dbrole_admin | Cannot login Bypass RLS |
pg_monitor pg_signal_backend dbrole_readwrite |
role for object creation |
| postgres | Superuser Create role Create DB Replication Bypass RLS |
system superuser | |
| replicator | Replication Bypass RLS |
pg_monitor dbrole_readonly |
system replicator |
| dbuser_monitor | 16 connections | pg_monitor dbrole_readonly |
system monitor user |
| dbuser_dba | Bypass RLS Superuser |
dbrole_admin | system admin user |
Default Roles
Pigsty has four default roles:
- Read-only role (
dbrole_readonly): Has read-only access to all data tables. - Read-write role (
dbrole_readwrite): Has to write access to all data tables, inheritsdbrole_readonly. - Admin role (
dbrole_admin): Can execute DDL changes, inheritsdbrole_readwrite. - Offline role (
dbrole_offline): A special read-only role for executing slow queries/ETL/interactive queries, only allowed access to specific instances.
The definition is shown below.
Common users should not change the name of the default role.
Default Users
Pigsty has four default users.
- superuser (
postgres), the owner and creator of the database, the same as the OS user. - Replication user (
replicator), the system user used for primary-replica. - Monitor user (
dbuser_monitor), a user used to monitor database and connection pool metrics. - Admin user (
dbuser_dba), the admin user who performs daily operations and database changes.
The definitions are shown below:
In Pigsty, four important default usernames and passwords are controlled and managed by separate parameters.
It is not recommended to set a password or allow remote access for the default superuser postgres, so there is no dedicated dbsu_password option.
If there is such a need, you can set a password for the dbsu in pg_default_roles.
Be sure to change the passwords of all default users.
In addition, users can define cluster-specific business users in pg_users in the same way as pg_default_roles.
It is recommended to remove the dborle_readony role from dbuser_monitor if there is a higher data security requirement. Some of the monitoring system features will not be available.
Authentication
Pigsty uses md5 password authentication by default and provides access control based on the PostgreSQL HBA mechanism.
HBA(Host Based Authentication)can be treated as an IP blocklist and allowlist.
Config: HBA
In Pigsty, the HBA of all instances is generated from the config file, and HBA rules vary depending on the instance’s role (pg_role).
The following variables control pigsty’s HBAs.
pg_hba_rules: Environmentally uniform HBA rulespg_hba_rules_extra: HBA rules for a specific instance or clusterpgbouncer_hba_rules: HBA rules used for connection poolingpgbouncer_hba_rules_extra: HBA rules for a specific instance or cluster connection pooling
Each variable is an array consisting of the following rules.
Role-Based HBA
The HBA rule set with role = common is installed to all instances,(role: primary) are only installed to instances with pg_role = primary.
As a special case, the HBA rule for the role: offline will be installed to instances with pg_role == 'offline' as well as to instances with pg_offline_query == true.
The rendering priority rules for HBA are:
hard_coded_rulesGlobal hard-coded rulespg_hba_rules_extra.commonCluster common rulespg_hba_rules_extra.pg_roleCluster role rulespg_hba_rules.pg_roleGlobal role rulespg_hba_rules.offlineCluster offline rulespg_hba_rules_extra.offlineGlobal offline rulespg_hba_rules.commonGlobal common rules
Default HBA Rules
Under the default config, the primary and replica will use the following HBA rules:
- Superuser access with local OS auth.
- Other users can access it with a password from local.
- Replica users can access via password from the LAN segment.
- Monitor users can access it locally.
- Everyone can access it with a password on the meta node.
- Admin users can access via password from the LAN.
- Everyone can access the intranet with a password.
- Read and write users (production business users) can be accessed locally (Connection Pool).
- On the replica: read-only users (individuals) can access from the local (Connection Pool).
- On instances with
pg_role == 'offline'or withpg_offline_query == true, HBA rules that allow access todbrole_offlinegrouped users are added.
Default HBA rule information
Change HBA Rules
Users can modify and apply the new HBA rules through a playbook after the cluster/instance is created and running.
When the database cluster directory is destroyed and rebuilt, the new copy will have the same HBA rules as the cluster primary. You can use the above command to perform HBA repair for a specific instance.
Pgbouncer HBA
In Pigsty, Pgbouncer also uses HBA for access control. The usage is the same as Postgres HBA:
pgbouncer_hba_rules: HBA rules used by the connection poolpgbouncer_hba_rules_extra: Instance- or cluster-specific connection pooling HBA rules
The default Pgbouncer HBA rules allow password access from local and intranet.
Privilege
Pigsty’s default privilege model is related to the default role. When using the Pigsty access control, all newly created business users should belong to one of the four default roles, which have the privileges shown below:
- All users have access to all schemas.
- Read-only users can read all tables.
- Read-write users can perform DML operations (INSERT, UPDATE, DELETE).
- Admin users can perform DDL change operations (CREATE, USAGE, TRUNCATE, REFERENCES, TRIGGER).
- Offline and read-only users are only allowed to access instances of
pg_role == 'offline'orpg_offline_query = true.
| Owner | Schema | Type | Access privileges |
|---|---|---|---|
| username | schema | postgres=UC/postgres | |
| dbrole_readonly=U/postgres | |||
| dbrole_offline=U/postgres | |||
| dbrole_admin=C/postgres | |||
| username | sequence | postgres=rwU/postgres | |
| dbrole_readonly=r/postgres | |||
| dbrole_readwrite=wU/postgres | |||
| dbrole_offline=r/postgres | |||
| username | table | postgres=arwdDxt/postgres | |
| dbrole_readonly=r/postgres | |||
| dbrole_readwrite=awd/postgres | |||
| dbrole_offline=r/postgres | |||
| dbrole_admin=Dxt/postgres | |||
| username | function | =X/postgres | |
| postgres=X/postgres | |||
| dbrole_readonly=X/postgres | |||
| dbrole_offline=X/postgres |
Privilege Maintenance
PostgreSQL’s ALTER DEFAULT PRIVILEGES ensures default access to database objects.
All objects created by {{ dbsu }}, {{ pg_admin_username }}, {{ dbrole_admin }} will have the default privileges.
PostgreSQL’s ALTER DEFAULT PRIVILEGE only takes effect for “objects created by specific users” objects created by superuser postgres, and dbuser_dba have default privileges. Suppose you want to give business users privileges to execute DDL besides giving the dbrole_admin role to business users. You should also remember that you should first run the following command when executing DDL changes.
Database Privileges
The database has three privileges: CONNECT, CREATE, TEMP, and a special genus OWNERSHIP. The parameter pg_database controls the definition of the database. A complete database definition is shown below:
If the database is not configured with an owner, dbsu will be the default OWNER of the database. Otherwise, it will be the specified user.
All users have the CONNECT privilege to the newly created database; set revokeconn == true if you wish to reclaim this privilege. Only the default user (dbsu|admin|monitor|replicator) with the database’s owner is explicitly given the CONNECT privilege. Also, admin|owner will have GRANT OPTION for the CONNECT privilege and can transfer the CONNECT privilege to others.
If you implement access isolation between different databases, you can create a business user as the owner for each database and set the revokeconn option for all of them.
A sample database for privilege isolation
Create Privilege
Pigsty revokes the PUBLIC user’s privilege to CREATE a new schema under the database for security reasons.
It also revokes the PUBLIC user’s privilege to create new relationships in the PUBLIC schema.
The database superuser and admin user are not subject to this restriction.
Privileges to create objects in the database are independent of whether the user is the database owner or not. It only depends on whether the user was given admin privileges when it was created.