云服务器内容精选

  • 权限授予或撤销 数据库对象创建后,进行对象创建的用户就是该对象的所有者。集群安装后的默认情况下,未开启三权分立,数据库系统管理员具有与对象所有者相同的权限。 也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和删除对象,以及通过GRANT将对象的权限授予其他用户。为使其他用户能够使用对象,可以由对象所有者或管理员通过GRANT/REVOKE对其他用户或角色授予与撤销。 使用GRANT语句授予权限。 例如,将模式myschema的权限赋给角色u1后,将表myschema.t1的SELECT权限授予角色u1。 1 2 GRANT USAGE ON SCHEMA myschema TO u1; GRANT SELECT ON TABLE myschema.t1 to u1; 使用REVOKE撤销已经授予的权限。 例如:撤销用户u1在指定表myschema.t1上的所有权限。 REVOKE ALL PRIVILEGES ON myschema.t1 FROM u1;
  • 预置角色 GaussDB(DWS)提供了一组预置角色,以“gs_role_”开头命名,提供对特定的、通常需要高权限的操作的访问,可以将这些角色授权予数据库中的其他用户或角色,使这些用户能够访问或使用特定的信息和功能。请谨慎使用预置角色,以确保预置角色权限的安全使用。 预置角色允许的权限范围可参考下表: 表1 预置角色允许的权限范围 角色 权限描述 gs_role_signal_backend 具有调用函数pg_cancel_backend、pg_terminate_backend、pg_terminate_query、pg_cancel_query、pgxc_terminate_query、pgxc_cancel_query来取消或终止其他会话的权限,但不能操作属于初始用户的会话。 gs_role_read_all_stats 读取系统状态视图并且使用与扩展相关的各种统计信息,包括有些通常只对系统管理员可见的信息。包括: 资源管理类: pgxc_wlm_operator_history pgxc_wlm_operator_info pgxc_wlm_operator_statistics pgxc_wlm_session_info pgxc_wlm_session_statistics pgxc_wlm_workload_records pgxc_workload_sql_count pgxc_workload_sql_elapse_time pgxc_workload_transaction 状态信息类: pgxc_stat_activity pgxc_get_table_skewness table_distribution pgxc_total_memory_detail pgxc_os_run_info pg_nodes_memory pgxc_instance_time pgxc_redo_stat gs_role_analyze_any 具有系统级ANALYZE权限类似系统管理员用户,跳过schema权限检查,对所有的表可以执行ANALYZE。 gs_role_vacuum_any 具有系统级VACUUM权限类似系统管理员用户,跳过schema权限检查,对所有的表可以执行VACUUM。 预置角色的使用约束: 以gs_role_开头的角色名作为数据库的预置角色保留字,禁止新建以“gs_role_”开头的用户/角色,也禁止将已有的用户/角色重命名为以“gs_role_”开头。 禁止对预置角色执行ALTER和DROP操作。 预置角色默认没有LOGIN权限,不设置预置登录密码。 gsql元命令\du和\dg不显示预置角色的相关信息,但若指定了PATTERN(用来指定要被显示的对象名称)则预置角色信息会显示。 三权分立关闭时,系统管理员和具有预置角色ADMIN OPTION权限的用户有权对预置角色执行GRANT/REVOKE管理;三权分立打开时,安全管理员(具有CREATEROLE属性)和具有预置角色ADMIN OPTION权限的用户有权对预置角色执行GRANT/REVOKE管理。例如: 1 2 GRANT gs_role_signal_backend TO user1; REVOKE gs_role_signal_backend FROM user1;
  • 层级权限管理 GaussDB(DWS)通过Database、Schema和数据对象权限实现层级权限管理。 Database之间无法直接互访,通过连接隔离实现彻底的权限隔离。各个Database之间共享资源极少,可实现连接隔离、权限隔离等。数据库集群包含一个或多个已命名数据库。用户和角色在整个集群范围内是共享的,但是其数据并不共享。即用户可以连接任何数据库,但当连接成功后,任何用户都只能访问连接请求里所声明的数据库。 Schema隔离的方式共用资源较多,可以通过GRANT与REVOKE语法便捷地控制不同用户对各Schema及其下属对象的权限,从而赋给业务更多的灵活性。每个数据库包括一个或多个Schema。每个Schema包含表、函数等其他类型的对象。用户要访问包含在指定Schema中的对象,需要被授予Schema的USAGE权限。 对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和删除对象。其他用户要访问包含具体的数据库对象,例如table1,需要首先被授予database的CONNECT权限,再被授予Schema的USAGE权限,最后授予table1的SELECT权限。用户要访问底层的对象,必须先赋予上层对象的权限。比如用户要创建或者删除Schema,需要首先被授予database的CREATE权限; 图1 层级权限管理
  • 角色 GaussDB(DWS)的权限管理模型,是一种典型的RBAC(基于角色的权限控制)的实现。其将用户、角色、权限通过此模型管理起来。 角色是一组权限的集合。 “用户”概念和“角色”概念实际是等同的,唯一的区别在于“用户”拥有login权限,而“角色”拥有nologin权限。 按照数据库系统中承担的责任划分具有不同权限的角色。角色是数据库权限的集合,代表了一个数据库用户、或一组数据用户的行为约束。 角色和用户可以转换,通过ALTER将角色拥有登录权限。 通过GRANT把角色授予用户后,用户即具有了角色的所有权限。推荐使用角色进行高效权限分配。例如,可以为设计、开发和维护人员创建不同的角色,将角色GRANT给用户后,再向每个角色中的用户授予其所需数据的差异权限。在角色级别授予或撤销权限时,这些权限更改会对角色下的所有成员生效。 非三权分立时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有具有CREATEROLE属性的用户才能创建、修改或删除角色。 要查看所有角色,请查询系统表PG_ROLES: 1 SELECT * FROM PG_ROLES; 具体的创建,修改和删除角色操作,请参考SQL语法参考中CREARE ROLE/ALTER ROLE/DROP ROLE。
  • 权限概述 权限表示用户访问某个数据库对象(包括模式、表、函数、序列等)的操作(包括增、删、改、查、创建等)是否被允许。 GaussDB(DWS)中的权限管理分为三种场景: 系统权限 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 数据对象权限 将数据库对象(表和视图、指定字段、数据库、函数、模式等)的相关权限授予特定角色或用户。GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。 用户权限 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。
  • 三权分立 默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的权限分立给安全管理员和审计管理员。 三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。即不再拥有创建角色和用户的权限,并不再拥有查看和维护数据库审计日志的权限。关于CREATEROLE属性和AUDITADMIN属性的更多信息请参考CREATE ROLE。 三权分立后,系统管理员只会对自己作为所有者的对象有权限。 三权分立的设置办法请参考设置三权分立章节。 三权分立前的权限详情及三权分立后的权限变化,请分别参见表1和表2。 表1 默认的用户权限 对象名称 系统管理员 安全管理员 审计管理员 普通用户 表空间 对表空间有创建、修改、删除、访问、分配操作的权限。 不具有对表空间进行创建、修改、删除、分配的权限,访问需要被赋权。 表 对所有表有所有的权限。 仅对自己的表有所有的权限,对其他用户的表无权限。 索引 可以在所有的表上建立索引。 仅可以在自己的表上建立索引。 模式 对所有模式有所有的权限。 仅对自己的模式有所有的权限,对其他用户的模式无权限。 函数 对所有的函数有所有的权限。 仅对自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。 自定义视图 对所有的视图有所有的权限。 仅对自己的视图有所有的权限,对其他用户的视图无权限。 系统表和系统视图 可以查看所有系统表和视图。 只可以查看部分系统表和视图。详细请参见系统表和系统视图。 表2 三权分立较非三权分立权限变化说明 对象名称 系统管理员 安全管理员 审计管理员 普通用户 表空间 无变化 无变化。 表 权限缩小。 只对自己的表有所有权限,对其他用户放在属于各自模式下的表无权限。 无变化。 索引 权限缩小。 只可以在自己的表上建立索引。 无变化。 模式 权限缩小。 只对自己的模式有所有的权限,对其他用户的模式无权限。 无变化。 函数 权限缩小。 只对自己的函数有所有的权限,对其他用户放在属于各自模式下的函数无权限。 无变化。 自定义视图 权限缩小。 只对自己的视图及其他用户放在public模式下的视图有所有的权限,对其他用户放在属于各自模式下的视图无权限。 无变化。 系统表和系统视图 无变化。 无变化。 无变化。 无权查看任何系统表和视图。 父主题: 管理用户及权限
  • 密码设置和修改 建议系统管理员和普通用户都要定期修改自己的账户密码,避免账户密码被非法窃取。 以修改用户user1密码为例,使用管理员用户连接数据库并执行如下命令: 1 ALTER USER user1 IDENTIFIED BY 'newpassword' REPLACE 'oldpassword'; 密码要符合规则,否则会执行失败。 管理员可以修改自己的或者其他账户的密码。通过修改其他账户的密码,解决用户密码遗失所造成无法登录的问题。 以修改用户joe账户密码为例,命令格式如下: 1 ALTER USER joe IDENTIFIED BY 'password'; 系统管理员之间不允许互相修改对方密码。 系统管理员可以修改普通用户密码且不需要用户原密码。 系统管理员可以修改自己的密码但需要管理员原密码。 密码验证 设置当前会话的用户和角色时,需要验证密码。如果输入密码与用户的存储密码不一致,则会报错。 以设置用户joe为例,命令格式如下: 1 SET ROLE joe PASSWORD 'password'; 显示如下命令表示设置成功: SET ROLE
  • 自定义密码策略示例 示例一:配置密码复杂度参数password_policy。 登录GaussDB(DWS) 管理控制台。 在左侧导航栏中,单击“集群管理”。 在集群列表中找到所需要的集群,单击集群名称,进入“集群详情”页面。 单击“参数修改”页签,并在“参数列表”模块修改password_policy参数值,然后单击“保存”。password_policy参数无需进行重启集群操作,参数修改后立即生效。 图1 password_policy
  • 密码设置和修改 建议系统管理员和普通用户都要定期修改自己的账户密码,避免账户密码被非法窃取。 以修改用户user1密码为例,使用管理员用户连接数据库并执行如下命令: 1 ALTER USER user1 IDENTIFIED BY 'newpassword' REPLACE 'oldpassword'; 密码要符合规则,否则会执行失败。 管理员可以修改自己的或者其他账户的密码。通过修改其他账户的密码,解决用户密码遗失所造成无法登录的问题。 以修改用户joe账户密码为例,命令格式如下: 1 ALTER USER joe IDENTIFIED BY 'password'; 系统管理员之间不允许互相修改对方密码。 系统管理员可以修改普通用户密码且不需要用户原密码。 系统管理员可以修改自己的密码但需要管理员原密码。 密码验证 设置当前会话的用户和角色时,需要验证密码。如果输入密码与用户的存储密码不一致,则会报错。 以设置用户joe为例,命令格式如下: 1 SET ROLE joe PASSWORD 'password'; 显示如下命令表示设置成功: SET ROLE
  • 自定义密码策略示例 示例一:配置密码复杂度参数password_policy。 登录GaussDB(DWS) 管理控制台。 在左侧导航栏中,单击“集群管理”。 在集群列表中找到所需要的集群,单击集群名称,进入“集群详情”页面。 单击“参数修改”页签,并在“参数列表”模块修改password_policy参数值,然后单击“保存”。password_policy参数无需进行重启集群操作,参数修改后立即生效。 图1 password_policy
  • 私有用户 对于有多个业务部门,各部门间使用不同的数据库用户进行业务操作,同时有一个同级的数据库维护部门使用数据库管理员进行维护操作的场景下,业务部门可能希望在未经授权的情况下,管理员用户只能对各部门的数据进行控制操作(DROP、ALTER、TRUNCATE),但是不能进行访问操作(INSERT、DELETE、UPDATE、SELECT、COPY)。即针对管理员用户,表对象的控制权和访问权要能够分离,提高普通用户数据安全性。 三权分立情况下,管理员对其他用户放在属于各自模式下的表无权限。但是,这种无权限包含了无控制权限,因此不能满足上面的诉求。为此,GaussDB提供了私有用户方案。即在非三权分立模式下,创建具有INDEPENDENT属性的私有用户。具备CREATEROLE权限或者是系统管理员权限的用户可以创建私有用户或者修改普通用户的属性为私有用户,普通用户也可以修改自己的属性为私有用户。 1 postgres=# CREATE USER user_independent WITH INDEPENDENT IDENTIFIED BY "1234@abc"; 针对该用户的表对象,系统管理员和拥有CREATEROLE属性的安全管理员在未经其授权前,只能进行控制操作(DROP、ALTER、TRUNCATE),无权进行INSERT、DELETE、SELECT、UPDATE、COPY、GRANT、REVOKE、ALTER OWNER操作。
  • 创建、修改和删除用户 要创建用户,请使用SQL语句CREATE USER。 例如:创建用户joe,并设置用户拥有CREATEDB属性。 1 2 postgres=# CREATE USER joe WITH CREATEDB PASSWORD "xxxxxxxxxxx"; CREATE ROLE 要创建系统管理员,请使用带有SYSADMIN选项的CREATE USER语句 。 要删除现有用户,请使用DROP USER。 要更改用户帐户(例如,重命名用户或更改密码),请使用ALTER USER。 要查看用户列表,请查询视图PG_USER: 1 postgres=# SELECT * FROM pg_user; 要查看用户属性,请查询系统表PG_AUTHID: 1 postgres=# SELECT * FROM pg_authid;
  • 创建、修改和删除角色 非三权分立时,只有系统管理员和具有CREATEROLE属性的用户才能创建、修改或删除角色。三权分立下,只有初始用户和具有CREATEROLE属性的用户才能创建、修改或删除角色。 要创建角色,请使用CREATE ROLE。 要在现有角色中添加或删除用户,请使用ALTER ROLE。 要删除角色,请使用DROP ROLE。DROP ROLE只会删除角色,并不会删除角色中的成员用户帐户。
  • 搜索路径 搜索路径定义在search_path参数中,参数取值形式为采用逗号分隔的Schema名称列表。如果创建对象时未指定目标Schema,则将该对象会被添加到搜索路径中列出的第一个Schema中。当不同Schema中存在同名的对象时,查询对象未指定Schema的情况下,将从搜索路径中包含该对象的第一个Schema中返回对象。 要查看当前搜索路径,请使用SHOW。 1 2 3 4 5 openGauss=# SHOW SEARCH_PATH; search_path ---------------- "$user",public (1 row) search_path参数的默认值为:"$user",public。$user表示与当前会话用户名同名的Schema名,如果这样的模式不存在,$user将被忽略。所以默认情况下,用户连接数据库后,如果数据库下存在同名Schema,则对象会添加到同名Schema下,否则对象被添加到Public Schema下。 要更改当前会话的默认Schema,请使用SET命令。 执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。 1 2 openGauss=# SET SEARCH_PATH TO myschema, public; SET
  • 创建、修改和删除Schema 要创建Schema,请使用CREATE SCHEMA。默认初始用户和系统管理员可以创建Schema,其他用户需要具备数据库的CREATE权限才可以在该数据库中创建Schema,赋权方式请参考GRANT中将数据库的访问权限赋予指定的用户或角色中的语法。 要更改Schema名称或者所有者,请使用ALTER SCHEMA。Schema所有者可以更改Schema。 要删除Schema及其对象,请使用DROP SCHEMA。Schema所有者可以删除Schema。 要在Schema内创建表,请以schema_name.table_name格式创建表。不指定schema_name时,对象默认创建到搜索路径中的第一个Schema内。 要查看Schema所有者,请对系统表PG_NAMESPACE和PG_USER执行如下关联查询。语句中的schema_name请替换为实际要查找的Schema名称。 1 openGauss=# SELECT s.nspname,u.usename AS nspowner FROM pg_namespace s, pg_user u WHERE nspname='schema_name' AND s.nspowner = u.usesysid; 要查看所有Schema的列表,请查询PG_NAMESPACE系统表。 1 openGauss=# SELECT * FROM pg_namespace; 要查看属于某Schema下的表列表,请查询系统视图PG_TABLES。例如,以下查询会返回Schema PG_CATALOG中的表列表。 1 openGauss=# SELECT distinct(tablename),schemaname from pg_tables where schemaname = 'pg_catalog';