
HANA Cloud对各类用户的安全性要求极高,设定了非常多的角色和User Group。这在实际使用过程中,是需要十分注意的。dbadmin这个用户和HDI Admin是完全分离的。同时,它也不能直接访问Container (或叫目标schema)下的数据库对象。
记得在前边有一篇短文:HANA Cloud案例: 清理残留的Tenant Container 特意提到这个现象,其实这也是一种权限保护。但是在保护的同时,也给admin用户带来困扰,那么有没有办法创建一个统一的用户,去访问所有的HDI container呢?本文的目的就是基于这个背景进行一些实验,结论是有办法。
首先我们可以看下HDI (HANA Deployment Instructure)的权限基本架构:
基本上是需要通过dbadmin以及hdiadmin进行层层授权才能达到最终目的。
1、首先,创建一个新用户,用作hdi admin。为方便,后边都用这个用户做所有的container的管理用户。这里,这个admin用户是:ABCDEF1234567890ABCDEF1234567890 (HANA数据库用户名是不区分大小写的)。HANA cloud对于hdi相关用户的使用要求还是蛮严格的,名太短,后续的一些操作就可能不成功。密码是要符合有大小写最短8位的基本要求。这里创建的用户名长度为32位的字符串。
CREATE USER ABCDEF1234567890ABCDEF1234567890 PASSWORD Pass0123456 NO FORCE_FIRST_PASSWORD_CHANGE;
CREATE LOCAL TEMPORARY TABLE #PRIVILEGES LIKE _SYS_DI.TT_API_PRIVILEGES;
INSERT INTO #PRIVILEGES (PRINCIPAL_NAME, PRIVILEGE_NAME, OBJECT_NAME) SELECT 'ABCDEF1234567890ABCDEF1234567890', PRIVILEGE_NAME, OBJECT_NAME FROM _SYS_DI.T_DEFAULT_DI_ADMIN_PRIVILEGES;
CALL _SYS_DI.GRANT_CONTAINER_GROUP_API_PRIVILEGES('_SYS_DI', #PRIVILEGES, _SYS_DI.T_NO_PARAMETERS, ?, ?, ?);
DROP TABLE #PRIVILEGES;
我们使用函数:_SYS_DI.GRANT_CONTAINER_GROUP_API_PRIVILEGES 来完成这个授权的动作。至此用户:ABCDEF1234567890ABCDEF1234567890具备DI_ADMIN的权限。
2、使用新DI_ADMIN权限用户登陆, 进行group container admin授权:
CREATE LOCAL TEMPORARY COLUMN TABLE #PRIVILEGES LIKE _SYS_DI.TT_API_PRIVILEGES;
INSERT INTO #PRIVILEGES (PRINCIPAL_NAME, PRIVILEGE_NAME, OBJECT_NAME) SELECT 'ABCDEF1234567890ABCDEF1234567890', PRIVILEGE_NAME, OBJECT_NAME FROM _SYS_DI.T_DEFAULT_CONTAINER_GROUP_ADMIN_PRIVILEGES;
CALL _SYS_DI.GRANT_CONTAINER_GROUP_API_PRIVILEGES('BROKER_CG', #PRIVILEGES, _SYS_DI.T_NO_PARAMETERS, ?, ?, ?);
DROP TABLE #PRIVILEGES;
注意结果一定要是return_code为0. 否则需要看看是什么原因.
| RETURN_CODE | REQUEST_ID |
| ----------- | ---------- |
| 0 | 205 |
这里是把自己加入到group admin
3、再用相同的用户登录,进行具体的默认的container admin授权
CREATE LOCAL TEMPORARY COLUMN TABLE #PRIVILEGES LIKE _SYS_DI.TT_API_PRIVILEGES;
INSERT INTO #PRIVILEGES (PRINCIPAL_NAME, PRIVILEGE_NAME, OBJECT_NAME) SELECT 'ABCDEF1234567890ABCDEF1234567890', PRIVILEGE_NAME, OBJECT_NAME FROM _SYS_DI.T_DEFAULT_CONTAINER_ADMIN_PRIVILEGES;
CALL _SYS_DI#BROKER_CG.GRANT_CONTAINER_API_PRIVILEGES('1594449AA9B8432BA70D91402E4ED474', #PRIVILEGES, _SYS_DI.T_NO_PARAMETERS, ?, ?, ?);
DROP TABLE #PRIVILEGES;
比如这里就有一个container, schema是:1594449AA9B8432BA70D91402E4ED474. 将它的admin授权给用户:ABCDEF1234567890ABCDEF1234567890.
4、使用相同的用户登录,发现这个时候它是1594449AA9B8432BA70D91402E4ED474#DI的admin了。
我们最后的目的 是要访问schema: 1594449AA9B8432BA70D91402E4ED474中的对象
5、使用相同的用户登录,执行
CREATE LOCAL TEMPORARY COLUMN TABLE #PRIVILEGES LIKE _SYS_DI.TT_API_PRIVILEGES;
INSERT INTO #PRIVILEGES (PRINCIPAL_NAME, PRIVILEGE_NAME, OBJECT_NAME) SELECT 'ABCDEF1234567890ABCDEF1234567890', PRIVILEGE_NAME, OBJECT_NAME FROM _SYS_DI.T_DEFAULT_CONTAINER_USER_PRIVILEGES;
CALL 1594449AA9B8432BA70D91402E4ED474#DI.GRANT_CONTAINER_API_PRIVILEGES(#PRIVILEGES, _SYS_DI.T_NO_PARAMETERS, ?, ?, ?);
DROP TABLE #PRIVILEGES;
仔细看下,调用的是1594449AA9B8432BA70D91402E4ED474#DI.GRANT_CONTAINER_API_PRIVILEGES。这一步授权的是T_DEFAULT_CONTAINER_USER_PRIVILEGES.
6、schema user权限授权
使用相同的用户登录, 执行schema相关授权:
CREATE LOCAL TEMPORARY COLUMN TABLE #PRIVILEGES LIKE _SYS_DI.TT_SCHEMA_PRIVILEGES;
INSERT INTO #PRIVILEGES ( PRIVILEGE_NAME, PRINCIPAL_SCHEMA_NAME, PRINCIPAL_NAME ) VALUES ( 'CREATE ANY', '', 'ABCDEF1234567890ABCDEF1234567890' );
CALL 1594449AA9B8432BA70D91402E4ED474#DI.GRANT_CONTAINER_SCHEMA_PRIVILEGES( #PRIVILEGES, _SYS_DI.T_NO_PARAMETERS, ?, ?, ?);
DROP TABLE #PRIVILEGES;
至此,我们可以通过用户ABCDEF1234567890ABCDEF1234567890完全访问1594449AA9B8432BA70D91402E4ED474这个schema/container下的对象了。
SET SCHEMA 1594449AA9B8432BA70D91402E4ED474;
CREATE TABLE t123(id int, col2 varchar(32));
INSERT INTO t123 values(1, 'wang');
SELECT * FROM t123;
我们可以用set schema切换schema,简单的验证权限了。
整个HDI的权限体系看起来很繁琐,可这也是SAP HANA的一大特色,如果不加小心,很难达到目标schema的区域进行合规操作。这方面HANA Cloud在权限体系方面做的确实非常有特色。
SAP HDI Administration :
https://help.sap.com/docs/SAP_HANA_PLATFORM/3823b0f33420468ba5f1cf7f59bd6bd9/b36b4b60c9e44291ae02e520135fd898.html

原文作者:数据库杂记;如有侵权,请联系管理员删除。