Managing Roles and Privileges

    Greenplum Database manages database access permissions using roles. The concept of roles subsumes the concepts of users and groups. A role can be a database user, a group, or both. Roles can own database objects (for example, tables) and can assign privileges on those objects to other roles to control access to the objects. Roles can be members of other roles, thus a member role can inherit the object privileges of its parent role.

    Every Greenplum Database system contains a set of database roles (users and groups). Those roles are separate from the users and groups managed by the operating system on which the server runs. However, for convenience you may want to maintain a relationship between operating system user names and Greenplum Database role names, since many of the client applications use the current operating system user name as the default.

    In Greenplum Database, users log in and connect through the master instance, which then verifies their role and access privileges. The master then issues commands to the segment instances behind the scenes as the currently logged in role.

    Roles are defined at the system level, meaning they are valid for all databases in the system.

    In order to bootstrap the Greenplum Database system, a freshly initialized system always contains one predefined superuser role (also referred to as the system user). This role will have the same name as the operating system user that initialized the Greenplum Database system. Customarily, this role is named . In order to create more roles you first have to connect as this initial role.

    Parent topic: Managing Greenplum Database Access

    • Secure the gpadmin system user. Greenplum requires a UNIX user id to install and initialize the Greenplum Database system. This system user is referred to as gpadmin in the Greenplum documentation. This gpadmin user is the default database superuser in Greenplum Database, as well as the file system owner of the Greenplum installation and its underlying data files. This default administrator account is fundamental to the design of Greenplum Database. The system cannot run without it, and there is no way to limit the access of this gpadmin user id. Use roles to manage who has access to the database for specific purposes. You should only use the gpadmin account for system maintenance tasks such as expansion and upgrade. Anyone who logs on to a Greenplum host as this user id can read, alter or delete any data; including system catalog data and database access rights. Therefore, it is very important to secure the gpadmin user id and only provide access to essential system administrators. Administrators should only log in to Greenplum as gpadmin when performing certain system maintenance tasks (such as upgrade or expansion). Database users should never log on as gpadmin, and ETL or production workloads should never run as gpadmin.
    • Assign a distinct role to each user that logs in. For logging and auditing purposes, each user that is allowed to log in to Greenplum Database should be given their own database role. For applications or web services, consider creating a distinct role for each application or service. See Creating New Roles (Users).
    • Limit users who have the SUPERUSER role attribute. Roles that are superusers bypass all access privilege checks in Greenplum Database, as well as resource queuing. Only system administrators should be given superuser rights. See .

    Creating New Roles (Users)

    A user-level role is considered to be a database role that can log in to the database and initiate a database session. Therefore, when you create a new user-level role using the CREATE ROLE command, you must specify the LOGIN privilege. For example:

    A database role may have a number of attributes that define what sort of tasks that role can perform in the database. You can set these attributes when you create the role, or later using the ALTER ROLE command. See for a description of the role attributes you can set.

    A database role may have a number of attributes that define what sort of tasks that role can perform in the database.

    You can set these attributes when you create the role, or later using the command. For example:

    1. =# ALTER ROLE jsmith WITH PASSWORD 'passwd123';
    2. =# ALTER ROLE admin VALID UNTIL 'infinity';
    3. =# ALTER ROLE jsmith LOGIN;
    4. =# ALTER ROLE jsmith RESOURCE QUEUE adhoc;
    5. =# ALTER ROLE jsmith DENY DAY 'Sunday';

    A role can also have role-specific defaults for many of the server configuration settings. For example, to set the default schema search path for a role:

    1. =# ALTER ROLE admin SET search_path TO myschema, public;

    It is frequently convenient to group users together to ease management of object privileges: that way, privileges can be granted to, or revoked from, a group as a whole. In Greenplum Database this is done by creating a role that represents the group, and then granting membership in the group role to individual user roles.

    Use the CREATE ROLE SQL command to create a new group role. For example:

    1. =# CREATE ROLE admin CREATEROLE CREATEDB;
    1. =# GRANT admin TO john, sally;
    2. =# REVOKE admin FROM bob;

    For managing object privileges, you would then grant the appropriate permissions to the group-level role only (see Table 2). The member user roles then inherit the object privileges of the group role. For example:

    The role attributes LOGIN, SUPERUSER, CREATEDB, CREATEROLE, CREATEEXTTABLE, and RESOURCE QUEUE are never inherited as ordinary privileges on database objects are. User members must actually SET ROLE to a specific role having one of these attributes in order to make use of the attribute. In the above example, we gave CREATEDB and CREATEROLE to the admin role. If sally is a member of admin, then sally could issue the following command to assume the role attributes of the parent role:

    1. => SET ROLE admin;

    Managing Object Privileges

    When an object (table, view, sequence, database, function, language, schema, or tablespace) is created, it is assigned an owner. The owner is normally the role that executed the creation statement. For most kinds of objects, the initial state is that only the owner (or a superuser) can do anything with the object. To allow other roles to use it, privileges must be granted. Greenplum Database supports the following privileges for each object type:

    Object TypePrivileges
    Tables, Views, SequencesSELECT
    INSERT
    UPDATE
    DELETE
    RULE
    ALL
    External TablesSELECT
    RULE
    ALL
    DatabasesCONNECT
    CREATE
    TEMPORARY or TEMP
    ALL
    FunctionsEXECUTE
    Procedural LanguagesUSAGE
    SchemasCREATE
    USAGE
    ALL
    Custom ProtocolSELECT
    INSERT
    UPDATE
    DELETE
    RULE
    ALL

    Note: Privileges must be granted for each object individually. For example, granting ALL on a database does not grant full access to the objects within that database. It only grants all of the database-level privileges (CONNECT, CREATE, ) to the database itself.

    Use the GRANT SQL command to give a specified role privileges on an object. For example:

      To revoke privileges, use the REVOKE command. For example:

      1. =# REVOKE ALL PRIVILEGES ON mytable FROM jsmith;

      You can also use the DROP OWNED and REASSIGN OWNED commands for managing objects owned by deprecated roles (Note: only an object’s owner or a superuser can drop an object or reassign ownership). For example:

      1. =# REASSIGN OWNED BY sally TO bob;
      2. =# DROP OWNED BY visitor;

      Simulating Row and Column Level Access Control

      Row-level or column-level access is not supported, nor is labeled security. Row-level and column-level access can be simulated using views to restrict the columns and/or rows that are selected. Row-level labels can be simulated by adding an extra column to the table to store sensitivity information, and then using views to control row-level access based on this column. Roles can then be granted access to the views rather than the base table.

      Greenplum Database is installed with an optional module of encryption/decryption functions called pgcrypto. The pgcrypto functions allow database administrators to store certain columns of data in encrypted form. This adds an extra layer of protection for sensitive data, as data stored in Greenplum Database in encrypted form cannot be read by anyone who does not have the encryption key, nor can it be read directly from the disks.

      Note: The pgcrypto functions run inside the database server, which means that all the data and passwords move between pgcrypto and the client application in clear-text. For optimal security, consider also using SSL connections between the client and the Greenplum master server.

      To use pgcrypto functions, run the installation script $GPHOME/share/postgresql/contrib/pgcrypto.sql in each database where you want the ability to query other databases:

      See pgcrypto in the PostgreSQL documentation for more information about individual functions.

      Protecting Passwords in Greenplum Database

      In its default configuration, Greenplum Database saves MD5 hashes of login users’ passwords in the pg_authid system catalog rather than saving clear text passwords. Anyone who is able to view the pg_authid table can see hash strings, but no passwords. This also ensures that passwords are obscured when the database is dumped to backup files.

      • CREATE USER name WITH ENCRYPTED PASSWORD 'password'
      • CREATE ROLE name WITH LOGIN ENCRYPTED PASSWORD 'password'
      • ALTER USER name WITH ENCRYPTED PASSWORD 'password'
      • ALTER ROLE name WITH ENCRYPTED PASSWORD 'password'

      The ENCRYPTED keyword may be omitted when the password_encryption system configuration parameter is on, which is the default value. The password_encryption configuration parameter determines whether clear text or hashed passwords are saved when the ENCRYPTED or UNENCRYPTED keyword is not present in the command.

      Note: The SQL command syntax and password_encryption configuration variable include the term encrypt, but the passwords are not technically encrypted. They are hashed and therefore cannot be decrypted.

      The hash is calculated on the concatenated clear text password and role name. The MD5 hash produces a 32-byte hexadecimal string prefixed with the characters md5. The hashed password is saved in the rolpassword column of the pg_authid system table.

      Although it is not recommended, passwords may be saved in clear text in the database by including the UNENCRYPTED keyword in the command or by setting the password_encryption configuration variable to off. Note that changing the configuration value has no effect on existing passwords, only newly created or updated passwords.

      To set password_encryption globally, execute these commands in a shell as the gpadmin user:

      1. $ gpconfig -c password_encryption -v 'off'
      2. $ gpstop -u

      To set password_encryption in a session, use the SQL SET command:

      1. =# SET password_encryption = 'on';

      Passwords may be hashed using the SHA-256 hash algorithm instead of the default MD5 hash algorithm. The algorithm produces a 64-byte hexadecimal string prefixed with the characters sha256.

      Note:

      Although SHA-256 uses a stronger cryptographic algorithm and produces a longer hash string, it cannot be used with the MD5 authentication method. To use SHA-256 password hashing the authentication method must be set to password in the pg_hba.conf configuration file so that clear text passwords are sent to Greenplum Database. Because clear text passwords are sent over the network, it is very important to use SSL for client connections when you use SHA-256. The default md5 authentication method, on the other hand, hashes the password twice before sending it to Greenplum Database, once on the password and role name and then again with a salt value shared between the client and server, so the clear text password is never sent on the network.

      To enable SHA-256 hashing, change the password_hash_algorithm configuration parameter from its default value, md5, to sha-256. The parameter can be set either globally or at the session level. To set password_hash_algorithm globally, execute these commands in a shell as the gpadmin user:

      1. $ gpconfig -c password_hash_algorithm -v 'sha-256'

      To set password_hash_algorithm in a session, use the SQL SET command:

      1. =# SET password_hash_algorithm = 'sha-256';

      Greenplum Database enables the administrator to restrict access to certain times by role. Use the or ALTER ROLE commands to specify time-based constraints.

      For details, refer to the Greenplum Database Security Configuration Guide.