暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快来学PostgreSQL用户角色与权限

呆呆的私房菜 2024-07-22
221
    Whoami:5年+金融、政府、医疗领域工作经验的DBA
    Certificate:OCP、PCP
    Skill:Oracle、Mysql、PostgreSQL
    Platform:CSDN、墨天伦、公众号(呆呆的私房菜)



    阅读本文可以了解到PostgreSQL用户与角色相关的内容,包括概念、权限管理等内容。




    01

    用户角色概述
    • 数据库用户和操作系统用户不同,但是可以通过文件做映射。

    • Postgre用户分为普通用户和普通用户。

    • PostgreSQL通过role来管理数据库访问权限,role是一系列相关权限的集合。

    • role在整个集簇是全局性的,即同个集簇里边的不同database,看到的用户是相同的。


    • 用户:拥有login登录数据库权限的role

    • 角色:可以拥有数据库对象、如表、索引、也可以把这些对象上的权限赋予其他角色,以控制哪些用户对哪些对象拥有哪些权限。

    • :不拥有replication、noreplication、connection limit属性的role。

      注意:PostgreSQL8.1之前,user与group是不同类型的实体,现在可以看作是role,任意一个role均可以自由地在user和group之间转换。


    02

    用户角色管理
    • 1. 创建用户、角色

      ## 1. 系统命令行创建
      createuser username with option xxx;


      ## 2. 在psql命令行创建用户
      create user username with option xxx;
      option可以是:
      SUPERUSER | NOSUPERUSER
      | CREATEDB | NOCREATEDB
      | CREATEROLE | NOCREATEROLE
      | CREATEUSER | NOCREATEUSER
      | INHERIT | NOINHERIT #角色是其他角色的成员,这些子句决定新角色是否从那些角色中“继承”特权
      | LOGIN | NOLOGIN
      | REPLICATION | NOREPLICATION
      | BYPASSRLS | NOBYPASSRLS #决定是否一个角色可以绕过每一条行级安全性(RLS)策略。
      | CONNECTION LIMIT connlimit
      | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...]
      | IN GROUP role_name [, ...]
      | ROLE role_name [, ...]
      | ADMIN role_name [, ...] #ADMIN子句与ROLE相似,让它们能够把这个角色中的成员关系授予给其他人。
      | USER role_name [, ...]
      | SYSID uid


      ## 在psql命令行创建角色
      create role rolename with option xxx;
      option可以是:
      SUPERUSER | NOSUPERUSER
      | CREATEDB | NOCREATEDB
      | CREATEROLE | NOCREATEROLE
      | CREATEUSER | NOCREATEUSER
      | INHERIT | NOINHERIT
      | LOGIN | NOLOGIN
      | REPLICATION | NOREPLICATION
      | CONNECTION LIMIT connlimit
      | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...]
      | IN GROUP role_name [, ...]
      | ROLE role_name [, ...]
      | ADMIN role_name [, ...]
      | USER role_name [, ...]
      | SYSID uid
      基本•语法 支持参数参数含义
      create user UserNamesuperuser  nosuperuser该用户是否为超级用户,缺省否
      createdb nocreatedb该用户是否能创建数据库,缺省不能
      createrole nocreaterole该用户是否能创建新角色,缺省不能
      createuser nocreateuser该用户是否能创建新用户,缺省不能
      inherit noinherit该用户是否集成父角色的权限,缺省不能
      login nologin该用户是否能登陆数据库,缺省能
      replication noreplication该用户是否能作为流复制用户,缺省不能
      bypassrls nobypassrls该用户能否绕过行级安全策略,缺省否
      connection limit该用户的最大并发连接数,缺省-1无限制
      [encrypted noencrypted] password 'passwords'该用户的密码,及是否加密存储在系统表里
      valid until该用户的密码失效时间
      in role该用户所属的父角色
      in group 同in  role,但属于过去式语法
      role该用户作为角色时,所拥有的子成员
      admin同role,但具有with admin option权限
      user同role,但术语过去式语法
      sysid UID该选项主要是为了向下兼容
      • 2. 查看用户、角色

        ## 显示用户和角色属性
        \du


        postgres=# \d pg_roles
        View "pg_catalog.pg_roles"
        Column | Type | Collation | Nullable | Default
        ----------------+--------------------------+-----------+----------+---------
        rolname | name | | |
        rolsuper | boolean | | |
        rolinherit | boolean | | |
        rolcreaterole | boolean | | |
        rolcreatedb | boolean | | |
        rolcanlogin | boolean | | |
        rolreplication | boolean | | |
        rolconnlimit | integer | | |
        rolpassword | text | | |
        rolvaliduntil | timestamp with time zone | | |
        rolbypassrls | boolean | | |
        rolconfig | text[] | C | |
        oid | oid | | |


        postgres=# \d pg_user
        View "pg_catalog.pg_user"
        Column | Type | Collation | Nullable | Default
        --------------+--------------------------+-----------+----------+---------
        usename | name | | |
        usesysid | oid | | |
        usecreatedb | boolean | | |
        usesuper | boolean | | |
        userepl | boolean | | |
        usebypassrls | boolean | | |
        passwd | text | | |
        valuntil | timestamp with time zone | | |
         useconfig    | text[]                   | C         |          |
        • 3. 修改用户、角色

          ## 修改用户、角色属性
          alter role username with option;
          ## 重命名
          alter user oldname rename to newname;
          ## 设置用户参数
          alter user username set parametername to value;
          ## 重置配置参数
          alter user username reset parametername all;
          • 4. 删除用户、角色

            ## 1. 系统命令行删除
            dropuser username


            ## 2.在psql命令行删除
            drop user username;
            drop role rolename;
            drop role if exists role_name;


            ## 注意:
            ## 1、只用超级用户能够删除超级用户
            ## 2、只有具有createrole权限的用户能删除非超级用户
            ## 3、删除用户前,需要先删除依赖该用户的对象、权限等信息
            ## 4、任何属于该组角色的对象都必须先被删除或者将对象的所有者赋予其它角色,任何赋予该组角色的权限也都必须被撤消。
            ## 5、删除组role只会删除组的role本身,组的成员并不会被删除
            • 5. 预定义角色

              角色描述
              pg_read_all_data读取所有数据(表、视图、序列),拥有对象SELECT权限,对所有架构拥有USAGE权限一样,即使没有明确的权限。此角色没有设置角色属性BYPASSRLS。如果正在使用RLS,管理员可能希望在授予此角色的角色上设置BYPASSRLS。
              pg_write_all_data写入所有数据(表、视图、序列),就好像对这些对象具有INSERT、UPDATE和DELETE权限,对所有架构具有USAGE权限一样,即使没有明确的权限。此角色没有设置角色属性BYPASSRLS。如果正在使用RLS,管理员可能希望在授予此角色的角色上设置BYPASSRLS。
              pg_read_all_settings读取所有配置变量,即使是那些通常只对超级用户可见的变量。
              pg_read_all_stats读取所有pg_stat_*视图并使用各种与统计信息相关的扩展,即使是那些通常只对超级用户可见的扩展。
              pg_stat_scan_tables执行监视函数,这些函数可能会在很长一段时间内对表使用ACCESS SHARE锁。
              pg_monitor读取/执行各种监视视图和功能。此角色是pg_read_all_settings、pg_read_all_stats和pg_stat_scan_tables的成员。
              pg_database_owner无。成员身份隐含地由当前数据库所有者组成。
              pg_signal_backend用信号通知另一个后端取消查询或终止其会话。
              pg_read_server_files允许使用COPY和其他文件访问功能从数据库可以访问的服务器上的任何位置读取文件。
              pg_write_server_files允许使用COPY和其他文件访问功能写入数据库可以在服务器上访问的任何位置的文件。
              pg_execute_server_program允许以用户身份在数据库服务器上执行程序数据库与COPY和其他允许执行服务器端程序的功能一样运行。
              pg_checkpoint允许执行checkpoint命令。
              pg_use_reserved_connections允许使用通过reserved_connections保留的连接插槽。
              pg_create_subscription允许对数据库具有create权限的用户发出create subscription。


            03

            权限管控
            • 任何数据库对象都有一个所有者,默认情况下,所有者拥有该对象的所有权限。

            • 数据库中所有权限都和角色挂钩,PostgreSQL权限分为系统权限和对象权限。

            • 1. 实例权限

              ## 配置pg_hba.conf限制用户登录
              cat $PGDATA/pg_hba.conf
              # TYPE DATABASE USER ADDRESS METHOD


              # "local" is for Unix domain socket connections only
              local all all trust
              # IPv4 local connections:
              host all all 127.0.0.1/32 trust
              # IPv6 local connections:
              host all all ::1/128 trust
              # Allow replication connections from localhost, by a user with the
              # replication privilege.
              local replication all trust
              host replication all 127.0.0.1/32 trust
              host    replication     all             ::1/128                 trust
              • 2. 数据库权限

              特权描述
              connect允许用户连接到特定的数据库
              create授予在数据库创建新对象的能力
              temporary
              允许创建临时表

              默认情况下,CONNECT权限被授予PUBLIC角色(所有用户)。但是,不可能直接从单个用户撤销此权限。相反,您需要从PUBLIC角色中撤销它,然后将它单独授予其他需要它的用户。

                revoke connect on database dbname from public;
                • 3. schema权限

                • PostgreSQL数据库可以由一个或多个模式组成,其中包含表和其他对象,如视图、数据类型、函数、过程和运算符。

                • 不同的模式可以具有相同名称的对象,而不会发生冲突。例如,schema1和schema2都可以包含名为table1的表。

                • 与数据库不同,模式不是严格分开的。用户可以访问他们所连接的数据库中任何模式中的对象,前提是他们拥有必要的权限。

                  grant usage on schema schemaname to username;
                  grant create on schema schemaname to username;
                  grant all on schema schemaname to username;
                  • 4. object权限

                  权限描述
                  select允许从表中提取数据
                  insert
                  允许向表中添加新行
                  update
                  修改表中的现有行
                  delete
                  授予从表中删除行的功能
                  references
                  允许创建外键约束
                  trigger
                  允许在表上创建触发器
                  truncate
                  允许在表上使用truncate


                    ## 授予增删改权限
                    grant insert,update,delete on table tablename to username;


                    ## 授予单个表上的所有权限
                    grant all on table tablename to username;


                    ## 授权schema上所有表的所有权限
                    grant all on all tables in schema schemaname to username;

                    关于授权的语法格式如下:

                      postgres=# \h grant
                      Command:     GRANT
                      Description: define access privileges
                      Syntax:
                      GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
                      [, ...] | ALL [ PRIVILEGES ] }
                      ON { [ TABLE ] table_name [, ...]
                      | ALL TABLES IN SCHEMA schema_name [, ...] }
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
                      [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
                      ON [ TABLE ] table_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { { USAGE | SELECT | UPDATE }
                      [, ...] | ALL [ PRIVILEGES ] }
                      ON { SEQUENCE sequence_name [, ...]
                      | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
                      ON DATABASE database_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { USAGE | ALL [ PRIVILEGES ] }
                      ON DOMAIN domain_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { USAGE | ALL [ PRIVILEGES ] }
                      ON FOREIGN DATA WRAPPER fdw_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { USAGE | ALL [ PRIVILEGES ] }
                      ON FOREIGN SERVER server_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]


                      GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
                      ON LARGE OBJECT loid [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
                      ON SCHEMA schema_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { CREATE | ALL [ PRIVILEGES ] }
                      ON TABLESPACE tablespace_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT { USAGE | ALL [ PRIVILEGES ] }
                      ON TYPE type_name [, ...]
                      TO role_specification [, ...] [ WITH GRANT OPTION ]
                      [ GRANTED BY role_specification ]


                      GRANT role_name [, ...] TO role_specification [, ...]
                      [ WITH ADMIN OPTION ]
                      [ GRANTED BY role_specification ]


                      where role_specification can be:


                      [ GROUP ] role_name
                      | PUBLIC
                      | CURRENT_ROLE
                      | CURRENT_USER
                        | SESSION_USER



                      本文内容就到这啦,阅读完本篇,相信你对PostgreSQL的用户、角色以及权限相关的配置有了一个大概的掌握了吧!记得有空的时候多做做练习哦!我们下篇再见!


                      点击上方公众号,关注我吧!


                      文章转载自呆呆的私房菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论