怎么联系网站管理员,深圳做物流网站,中学建设校园网站方案,wordpress类目目录
3.3 权限管理
3.4 权限检查 书接上文数据库高安全—角色权限#xff1a;角色创建角色管理#xff0c;从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍#xff0c;本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。
3.3 权限管理
#x…目录
3.3 权限管理
3.4 权限检查 书接上文数据库高安全—角色权限角色创建角色管理从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。
3.3 权限管理
1 访问控制列表
访问控制列表(Access Control ListACL)是实现数据库对象权限管理的基础每个对象都具有ACL存储该对象的所有授权信息。当用户访问对象时只有用户在对象的ACL中并且具有所需的权限才能够访问该对象。
每个ACL是由1个或多个AclItem构成的链表每1个AclItem由授权者、被授权者和权限位3部分构成记录着可在对象上进行操作的用户及其权限。
数据结构AclItem
typedef struct AclItem { Oid ai_grantee; // 被授权者的OID Oid ai_grantor; // 授权者的OID AclMode ai_privs; // 权限位32位的比特位 } AclItem;
其中ai_privs字段是AclMode类型。AclMode是一个32位的比特位其高16位为权限选项位当该比特位取值为1时表示AclItem中的ai_grantee对应的用户具有此对象的相应操作的授权权限否则表示用户没有授权权限低16位为操作权限位当该比特位取值为1时表示AclItem中的ai_grantee对应的用户具有此对象的相应操作权限否则表示用户没有相应的权限。在AclMode的结构位图1中Grant Option记录各权限的授权权限的授予情况。低16位记录各权限的授予情况当授权语句使用ALL时则表示对象的所有权限。 图1 openGauss AclMode结构图
在openGauss的具体实现中我们将对对象执行DML类操作和DDL类操作的权限分别记在两个AclMode结构中并以第15位的值来区分二者最终实现对于每一个数据库对象相同的授权者和被授权者对应两个不同的AclMode分别表示记录DML类操作权限和DDL类操作权限实现方式如图2和图3所示。 图2 openGauss记录DML类操作权限的AclMode结构 图3 openGauss记录DDL类操作权限的AclMode结构
每个权限参数代表的权限如表1所示。
表1 权限参数 参数 对象权限 参数 对象权限 a INSERT T TEMPORARY r SELECT c CONNECT w UPDATE p COMPUTE d DELETE R READ D TRUNCATE W WRITE x REFERENCES A ALTER t TRIGGER P DROP X EXECUTE m COMMENT U USAGE i INDEX C CREATE v VACUUM
2对象权限管理
数据库对象权限管理主要通过使用SQL命令GRANT/REVOKE授予或回收一个或多个角色在对象上的权限。GRANT/REVOKE命令都由函数ExecuteGrantStmt实现该函数只有一个GrantStmt类型的参数基本流程如图4。 图4 openGauss对象权限管理代码接口
数据结构GrantStmt定义如下
typedef struct GrantStmt { NodeTag type; bool is_grant; // true 授权, false 回收 GrantTargetType targtype; // 操作目标的类型 GrantObjectType objtype; // 被操作对象的类型表数据库模式函数等 List* objects; // 被操作对象的集合 List* privileges; // 要操作权限列表 List* grantees; // 被授权者的集合 bool grant_option; // true with grant option/grant option for DropBehavior behavior; // 回收权限的行为restrictcascade} GrantStmt;
函数ExecuteGrantStmt首先将GrantStmt结构转化为InternalGrant结构将权限列表转化为内部的AclMode表示形式。当privileges 取值为NIL时表示授予或回收所有的权限此时置InternalGrant的all_privs字段为trueprivileges字段为ACL_NO_RIGHTS。
数据结构InternalGrant
typedef struct InternalGrant { bool is_grant; // true授权, false回收 GrantObjectType objtype; // 被操作对象的类型表数据库模式函数等 List* objects; // 被操作对象的集合 bool all_privs; // 是否授予或回收所有的权限AclMode privileges; // AclMode形式表示的DML类操作对应的权限AclMode ddl_privileges; // AclMode形式表示的DDL类操作对应的权限List* col_privs; // 对列执行的DML类操作对应的权限List* col_ddl_privs; // 对列执行的DDL类操作对应的权限 List* grantees; // 被授权者的集合 bool grant_option; // truewith grant option/grant option for DropBehavior behavior; // 回收权限的行为restrictcascade} InternalGrant;
函数ExecuteGrantStmt在完成结构转换之后调用ExecGrantStmt_oids根据对象类型分别调用相应对象的权限管理函数。接下来以表对象的权限管理过程为例介绍权限管理的算法函数ExecGrant_Relation的处理流程如图5所示。 图5 openGauss表对象权限管理流程图
函数ExecGrant_Relation用来处理表对象权限的授予或回收操作入参为InternalGrant类型的变量存储着授权或回收操作的操作对象信息、被授权者信息和权限信息。 首先从系统表pg_class中获取旧ACL如果不存在旧的ACL则新建一个ACL并调用函数acldefault将默认的权限信息赋给该ACL。根据对象的不同初始的缺省权限含有部分可赋予PUBLIC的权限。如果存在旧的ACL则将旧的ACL存储为一个副本。 然后调用select_best_grantor来获取授权者对操作对象所拥有的授权权限avail_goptions将参数avail_goptions传入函数restrict_and_check_grant结合SQL命令中给出的操作权限计算出实际需要授予或回收的权限。 再调用merge_acl_with_grant生成新的ACL如果是授予权限则将要授予的权限添加到旧ACL中如果是回收权限则将要被回收的权限从旧ACL中删除。 最后将新的ACL更新到系统表pg_class对应元组的ACL字段完成授权或回收过程。
具体的函数实现如下
static void ExecGrant_Relation(InternalGrant* istmt){ . . .// 循环处理每一个表对象。 foreach (cell, istmt-objects) { . . .// 判断所要操作的表对象是否存在若不存在则提示报错。 tuple SearchSysCache1(RELOID, ObjectIdGetDatum(relOid)); if (!HeapTupleIsValid(tuple)) ereport( ERROR, (errcode(ERRCODE_CACHE_LOOKUP_FAILED), errmsg(cache lookup failed for relation %u, relOid))); pg_class_tuple (Form_pg_class)GETSTRUCT(tuple);. . . // 系统表pg_class中获取旧ACL若不存在旧的ACL则新建一个ACL若存在旧的ACL则将旧的ACL存储为一个副本。 ownerId pg_class_tuple-relowner; aclDatum SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relacl, isNull); if (isNull) { switch (pg_class_tuple-relkind) { case RELKIND_SEQUENCE: old_acl acldefault(ACL_OBJECT_SEQUENCE, ownerId); break; default: old_acl acldefault(ACL_OBJECT_RELATION, ownerId); break; } noldmembers 0; oldmembers NULL; } else { old_acl DatumGetAclPCopy(aclDatum); noldmembers aclmembers(old_acl, oldmembers); } old_rel_acl aclcopy(old_acl);// 处理表级别的权限。 if (this_privileges ! ACL_NO_RIGHTS) { AclMode avail_goptions; Acl* new_acl NULL; Oid grantorId; HeapTuple newtuple NULL; Datum values[Natts_pg_class]; bool nulls[Natts_pg_class] {false}; bool replaces[Natts_pg_class] {false}; int nnewmembers; Oid* newmembers NULL; AclObjectKind aclkind;// 获取授权者grantorId和授权者对该操作对象所拥有的授权权限avail_goptions。 select_best_grantor(GetUserId(), this_privileges, old_acl, ownerId, grantorId, avail_goptions);switch (pg_class_tuple-relkind) { case RELKIND_SEQUENCE: aclkind ACL_KIND_SEQUENCE; break; default: aclkind ACL_KIND_CLASS; break; }// 结合参数avail_goptions和SQL命令中给出的操作权限计算出实际需要授予或回收的权限。 this_privileges restrict_and_check_grant(istmt-is_grant, avail_goptions, istmt-all_privs, this_privileges, relOid, grantorId, aclkind, NameStr(pg_class_tuple-relname), 0, NULL);// 生成新的ACL并更新到系统表pg_class对应元组的ACL字段。 new_acl merge_acl_with_grant(old_acl, istmt-is_grant, istmt-grant_option, istmt-behavior, istmt-grantees, this_privileges, grantorId, ownerId);. . . replaces[Anum_pg_class_relacl - 1] true; values[Anum_pg_class_relacl - 1] PointerGetDatum(new_acl);newtuple heap_modify_tuple(tuple, RelationGetDescr(relation), values, nulls, replaces);simple_heap_update(relation, newtuple-t_self, newtuple);. . . }// 若存在列级授权或回收则调用ExecGrant_Attribute 函数处理。. . . if (have_col_privileges) { AttrNumber i;for (i 0; i num_col_privileges; i) { if (col_privileges[i] ACL_NO_RIGHTS) continue; ExecGrant_Attribute(istmt, relOid, NameStr(pg_class_tuple-relname), i FirstLowInvalidHeapAttributeNumber, ownerId, col_privileges[i], attRelation, old_rel_acl); } } . . . }heap_close(attRelation, RowExclusiveLock); heap_close(relation, RowExclusiveLock);}
3.4 权限检查
用户在对数据库对象进行访问操作时数据库会检查用户是否拥有该对象的操作权限。通常数据库对象的所有者和初始用户superuser拥有该对象的全部操作权限其他普通用户需要被授予权限才可以执行相应操作。数据库通过查询数据库对象的访问控制列表(ACL)检查用户对数据库对象的访问权限数据库对象的ACL保存在对应的系统表中当被授予或回收对象权限时系统表中保存的ACL权限位会被更新。常用的数据库对象权限检查函数、ACL检查函数、ACL所在系统表以及对象所有者检查函数对应关系如表2所示。
表2 数据库对象函数对应关系表 对象 权限检查 ACL检查 所有者检查 系统表 table pg_class_aclcheck pg_class_aclmask pg_class_ownercheck pg_class column pg_attribute_aclcheck pg_attribute_aclmask NA pg_attribute database pg_database_aclcheck pg_database_aclmask pg_database_ownercheck pg_database function pg_proc_aclcheck pg_proc_aclmask pg_proc_ownercheck pg_proc language pg_language_aclcheck pg_language_aclmask pg_language_ownercheck pg_language largeobject pg_largeobject_aclcheck_snapshot pg_largeobject_aclmask_snapshot pg_largeobject_ownercheck pg_largeobject_metadata namespace pg_namespace_aclcheck pg_namespace_aclmask pg_namespace_ownercheck pg_namespace tablespace pg_tablespace_aclcheck pg_tablespace_aclmask pg_tablespace_ownercheck pg_tablespace foreign data wrapper pg_foreign_data_wrapper_aclcheck pg_foreign_data_wrapper_aclmask pg_foreign_data_wrapper_ownercheck pg_foreign_data_wrapper foreign server pg_foreign_server_aclcheck pg_foreign_server_aclmask pg_foreign_server_ownercheck pg_foreign_server type pg_type_aclcheck pg_type_aclmask pg_type_ownercheck pg_type
下面以表的权限检查为例进行权限检查过程说明。表权限检查函数pg_class_aclcheck定义如下
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode, bool check_nodegroup){ if (pg_class_aclmask(table_oid, roleid, mode, ACLMASK_ANY, check_nodegroup) ! 0) return ACLCHECK_OK; else return ACLCHECK_NO_PRIV;}
pg_class_aclcheck函数有4个入参其中table_oid用于表示待检查的表roleid用于表示待检查的用户或角色mode表示待检查的权限此权限可以是一种权限也可以是多种权限的组合。第4个参数check_nodegroup用于表示是否检查nodegroup逻辑集群权限如果调用时不给此参数赋值则默认为true。函数返回值为枚举类型AclResult如果检查结果有权限返回ACLCHECK_OK无权限则返回ACLCHECK_NO_PRIV。
pg_class_aclcheck函数通过调用pg_class_aclmask函数实现对象权限检查。pg_class_aclmask函数有5个参数其中第4个参数how为AclMaskHow枚举类型包括ACLMASK_ALL和ACLMASK_ANY两种取值ACLMASK_ALL表示需要满足待检查权限mode中的所有权限ACLMASK_ANY表示只需满足待检查权限mode中的一种权限即可。pg_class_aclmask函数的其余4个参数table_oid、roleid、mode和check_nodegroup直接由pg_class_aclcheck函数传入。pg_class_aclmask函数从“pg_class”系统表中获取ACL权限信息并调用aclmask函数完成权限位校验通过AclMode数据类型返回权限检查结果。
以上内容从权限管理和权限检查两方面对角色权限进行了介绍下篇将从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读敬请期待~ 文章转载自: http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.lzqtn.cn.gov.cn.lzqtn.cn http://www.morning.ypfw.cn.gov.cn.ypfw.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn http://www.morning.rnzwh.cn.gov.cn.rnzwh.cn http://www.morning.htqrh.cn.gov.cn.htqrh.cn http://www.morning.lclpj.cn.gov.cn.lclpj.cn http://www.morning.pdwzr.cn.gov.cn.pdwzr.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.ltkzb.cn.gov.cn.ltkzb.cn http://www.morning.kstgt.cn.gov.cn.kstgt.cn http://www.morning.mzjbz.cn.gov.cn.mzjbz.cn http://www.morning.fwzjs.cn.gov.cn.fwzjs.cn http://www.morning.rsdm.cn.gov.cn.rsdm.cn http://www.morning.dywgl.cn.gov.cn.dywgl.cn http://www.morning.nlywq.cn.gov.cn.nlywq.cn http://www.morning.qrcsb.cn.gov.cn.qrcsb.cn http://www.morning.rkqzx.cn.gov.cn.rkqzx.cn http://www.morning.bzfld.cn.gov.cn.bzfld.cn http://www.morning.tdscl.cn.gov.cn.tdscl.cn http://www.morning.mcjp.cn.gov.cn.mcjp.cn http://www.morning.htsrm.cn.gov.cn.htsrm.cn http://www.morning.yydeq.cn.gov.cn.yydeq.cn http://www.morning.lsfzq.cn.gov.cn.lsfzq.cn http://www.morning.jpgfx.cn.gov.cn.jpgfx.cn http://www.morning.hous-e.com.gov.cn.hous-e.com http://www.morning.tfkqc.cn.gov.cn.tfkqc.cn http://www.morning.oioini.com.gov.cn.oioini.com http://www.morning.plqhb.cn.gov.cn.plqhb.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.glnfn.cn.gov.cn.glnfn.cn http://www.morning.nrgdc.cn.gov.cn.nrgdc.cn http://www.morning.ho-use.cn.gov.cn.ho-use.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn http://www.morning.tpssx.cn.gov.cn.tpssx.cn http://www.morning.zrwlz.cn.gov.cn.zrwlz.cn http://www.morning.zmpqh.cn.gov.cn.zmpqh.cn http://www.morning.txfzt.cn.gov.cn.txfzt.cn http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn http://www.morning.zryf.cn.gov.cn.zryf.cn http://www.morning.bmssj.cn.gov.cn.bmssj.cn http://www.morning.rwbx.cn.gov.cn.rwbx.cn http://www.morning.cfybl.cn.gov.cn.cfybl.cn http://www.morning.rtbx.cn.gov.cn.rtbx.cn http://www.morning.lqqqh.cn.gov.cn.lqqqh.cn http://www.morning.sbqrm.cn.gov.cn.sbqrm.cn http://www.morning.xzsqb.cn.gov.cn.xzsqb.cn http://www.morning.lpcpb.cn.gov.cn.lpcpb.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.tmtrl.cn.gov.cn.tmtrl.cn http://www.morning.nhdw.cn.gov.cn.nhdw.cn http://www.morning.rmfwh.cn.gov.cn.rmfwh.cn http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.pqfbk.cn.gov.cn.pqfbk.cn http://www.morning.qhln.cn.gov.cn.qhln.cn http://www.morning.bqwrn.cn.gov.cn.bqwrn.cn http://www.morning.qbxdt.cn.gov.cn.qbxdt.cn http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.hmgqy.cn.gov.cn.hmgqy.cn http://www.morning.cwgpl.cn.gov.cn.cwgpl.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.trsmb.cn.gov.cn.trsmb.cn http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn http://www.morning.fpjxs.cn.gov.cn.fpjxs.cn http://www.morning.nkpml.cn.gov.cn.nkpml.cn http://www.morning.zpqlf.cn.gov.cn.zpqlf.cn http://www.morning.mnpdy.cn.gov.cn.mnpdy.cn http://www.morning.gtylt.cn.gov.cn.gtylt.cn http://www.morning.gediba.com.gov.cn.gediba.com