ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SAP HANA新建账号与授权设置实战指南

SAP HANA新建账号与授权设置实战指南 做SAP HANA的运维和项目交付这些年HANA新建账号和授权设置是我遇到频次最高、也最容易被反复问爆的一类操作。无论是S/4 HANA新项目上线给FICO顾问开账号还是集成测试阶段给第三方系统创建接口用户甚至是给领导开一个只读查询账号本质都绕不开这套流程。很多刚接触HANA的朋友总以为“创建用户就是一条SQL的事”但实际上账号建好之后的授权设计、角色规划、密码策略、甚至后续的权限回收才是真正决定这个账号能不能安全稳定用下去的关键。这篇文章我打算把HANA新建账号及授权设置的完整链路拆开来讲从权限模型的基本概念到CREATE USER和GRANT的实操细节再到几个真实业务场景的完整配置过程最后把我踩过的一些坑汇总成速查表。不管你是刚接手HANA的模块顾问还是需要给团队配置环境的开发负责人这篇内容应该都能直接照着操作。1. 先搞清楚HANA的账号权限体系再动手很多人刚拿到HANA账号需求的时候第一反应就是“先连上去建个用户再说”结果往往是建完用户才发现不知道该授予哪些权限东试一个西试一个最后要么权限给小了用户干不了活要么权限给大了留下安全隐患。所以我把这部分放在最前面先把HANA的权限模型讲清楚。1.1 账号、用户、角色之间的关系HANA里的“用户”和“账号”在绝大多数场景下指的是同一个东西也就是通过CREATE USER语句创建出来的数据库登录对象。一个用户可以分配给真实的人也可以分配给应用程序或接口服务。每个用户都有自己的密码和独立的权限集合登录后看到的、能操作的全部由这个权限集合决定跟操作系统用户没有任何关系。用户和角色之间的关系可以用一个很直白的生活类比来理解用户就是“员工”角色就是“岗位职责”。员工到岗之后并不是把每件具体的事一条条告诉他能做不能做而是直接给他定一个岗位这个岗位对应了一整套可以做的事情。比如FICO顾问这个角色天然就拥有查询财务相关表的权限开发人员这个角色天然就拥有在开发Schema里建表改数据的权限。这样管理的好处是显而易见的人员流动时只需要调整“员工”和“岗位”的绑定关系不用一条权限一条权限地去改。在HANA的体系里权限既可以直接授予用户也可以通过角色授予用户。实际项目中我强烈建议优先使用角色因为直接给用户授很多细粒度权限后期的维护成本会高到让你怀疑人生。1.2 为什么不能拿SYSTEM用户到处干活说到账号权限就不得不提SYSTEM用户。SYSTEM是HANA安装时自动创建的超级管理员账号拥有数据库几乎所有的权限包括创建用户、管理角色、访问所有数据、执行各种系统命令。刚开始做HANA项目的同学最容易犯的一个错误就是让业务顾问或开发人员直接用SYSTEM账号连接数据库查数。这个做法的风险是明摆着的。第一SYSTEM权限过大一旦误操作删除数据或者修改配置后果是不可逆的。第二所有使用同一账号的人无法区分操作记录出了问题根本定位不到人。第三审计层面很难看得过去无论是外部审计还是企业内部合规检查共用超级账号都是重大缺陷。正确的做法永远是SYSTEM账号只保留给数据库管理员或者极少数核心运维人员使用其他人一律通过新建的普通账号按需授权。这个原则我再强调都不为过。1.3 HANA权限的整体分类HANA的权限体系大致可以分为系统权限、对象权限、分析权限和包权限四大类。系统权限管的是“能不能做某类操作”比如创建用户、创建Schema、执行备份恢复这些对象权限管的是“能不能访问某个具体的东西”比如对某一张视图的SELECT权限、对某个表的INSERT权限分析权限是HANA特有的主要用来做数据行级别的安全控制比如某个用户只能看华东区的销售数据包权限则是在HANA的Repository仓库层面控制开发包Package的读写权限。新建账号时最容易搞混的是系统权限和对象权限的区别。我经常看到有人给用户授予了CATALOG READ以为这样用户就能查所有表了其实CATALOG READ只是让用户能看到目录信息能不能查表数据还得看对象权限。反过来有人只想让用户查几张表却从某个角色带进来了一堆系统权限这也是需要警惕的。2. 新建账号前的准备工作清单新建HANA账号这件事技术上只需要一条CREATE USER就能完成但要把账号建得“好用又安全”准备工作反而更重要。我一般会先跟需求方确认几个问题这个账号给谁用、用来做什么、需要访问哪些数据、有没有特殊的安全约束。搞清楚这些之后才会动手。2.1 梳理业务对账号的真实需求先别急着写SQL花十分钟想清楚账号的使用场景。如果是给财务顾问开的账号大概率只需要查询和导数的权限那SELECT权限就给够了UPDATE和DELETE绝对不能给如果是给开发人员开的账号那就要考虑CREATE ANY TABLE这类建表权限还得细分到具体哪些Schema允许操作如果是给报表系统用的接口账号可能还需要限制连接来源和会话参数。我习惯在需求阶段就输出一张简单的账号需求确认表内容包括账号名称、用途、使用人/系统、允许访问的Schema、需要的权限类型只读/读写/管理、是否需要限定有效期等字段。这张表既是后续执行授权的依据也是后期审计时的凭据。2.2 角色与权限的规划思路在给用户授权之前先想清楚是直接授权还是通过角色授权。我的建议是只要是超过一个用户会用到相同权限的场景就一定要建角色。尤其是S/4 HANA项目里通常会有多个FICO顾问、多个MM顾问他们的权限需求高度相似建立一个FICO_QUERY角色、一个MM_QUERY角色后续再有人入职就直接把角色套上去效率高很多。角色的命名我建议遵循统一的规范比如模块前缀加用途后缀像FICO_QUERY、FICO_DEV、SALES_REPORT等等。命名规范的意义在于后期维护的时候能一眼看出这个角色是干什么用的不用点开一个个看权限明细。至于角色里放哪些权限要严格遵循最小权限原则只授必要权限宁可后面发现不够再补也不要一开始就大把撒权限。2.3 确认HANA的密码策略HANA对密码的复杂度有默认要求最低长度8位至少包含一个大写字母、一个小写字母和一个数字。如果密码不满足复杂度要求CREATE USER会直接报错。有些企业还会有自己的安全基线比如要求密码12位以上、90天强制修改、连续输错5次锁定账号这些需求HANA都能通过密码策略配置实现但需要提前跟安全团队确认基线要求。另外还要确认账号是否需要强制首次登录修改密码。如果是给真实用户建的账号强烈建议开启FORCE_FIRST_PASSWORD_CHANGE让用户首次登录后自己改成专属密码避免初始密码一直沿用。如果是给应用程序用的接口账号那就千万不要开这个选项不然应用系统突然断连排查半天才发现是密码策略把连接拦了。3. 新建账号实操从CREATE USER到账号启用准备工作做完就可以开始执行新建账号了。HANA的账号操作可以通过多种方式完成HANA Studio、DBA Cockpit、WEB IDE、HDBSQL命令都可以但最通用的还是SQL。下面我用SQL的方式完整演示创建账号的过程并逐一解释参数含义。3.1 最简单的CREATE USER语法创建用户的基础语法是CREATE USER后跟用户名和PASSWORD关键字例如CREATE USER FICO_USER PASSWORD Abc12345;这条语句会创建一个名为FICO_USER的标准数据库用户初始密码是Abc12345。执行成功后在USERS系统视图中就能看到这个用户了SELECT USER_NAME, USER_CREATED, USER_TYPE FROM USERS WHERE USER_NAME FICO_USER;这里有个重要的细节需要注意HANA的用户类型有标准用户STANDARD和受限用户RESTRICTED之分。标准用户默认可以连接数据库、查看部分目录信息受限用户只能访问被明确授权的对象不能访问系统信息。如果你创建的是应用账号或低权限账号可以考虑使用RESTRICTED USER安全性更高。创建语句是CREATE USER APP_INTERFACE PASSWORD Abc12345 RESTRICTED USER;3.2 常用参数逐项说明实际项目中不会真的用最小语法建账号通常都会带上一堆参数每一个参数都对应一个安全约束或运维需求。CREATE USER FICO_001 PASSWORD Init12345 FORCE_FIRST_PASSWORD_CHANGE ON PASSWORD_LIFETIME 90 MAX_CONNECTIONS 5 USERGROUP WORKGROUP_001;FORCE_FIRST_PASSWORD_CHANGE ON表示首次登录必须修改密码PASSWORD_LIFETIME 90表示密码有效期为90天到期后必须改密码MAX_CONNECTIONS 5限制这个用户同时最多只有5个连接防止有人拿着共享账号到处登录USERGROUP参数把用户归入指定用户组方便批量管理同一批账号的密码策略和资源限制。还有两个参数我经常在具体场景里用。DISABLE_PASSWORD_LIFETIME ON可以让某个账号不受全局密码过期策略的限制适合接口账号和长期运行的计划任务账号VALID UNTIL用来限定账号的有效期到某个时间点适合临时外包人员或短期使用的账号CREATE USER TEMP_AUDITOR PASSWORD Temp12345 VALID UNTIL 2025-12-31 23:59:59;3.3 批量创建账号的高效写法项目集中上线期间经常遇到大批量建账号的需求比如一次性给20个顾问开测试环境账号。这时逐条手敲CREATE USER效率太低我通常会先把用户信息和初始密码整理到Excel或文本文件里然后通过HDBSQL脚本循环执行。更靠谱的方式是直接把SQL脚本写成文本文件一行一个CREATE USER语句然后用HDBSQL批量执行hdbsql -U SYSTEM -I create_users.sql执行完后用一条SELECT语句校验所有账号是否创建成功SELECT USER_NAME, USER_CREATED, CREATED, USER_TYPE FROM USERS WHERE USER_NAME LIKE FICO_% ORDER BY USER_NAME;批量操作前一定要记得检查一遍脚本内容特别是密码不能写在生产环境可被他人读到的临时文件里用完立即清理。这个细节虽然小但安全问题往往就是从小地方漏出来的。4. 授权设置实操用户权限的精细控制账号创建完成只是第一步真正体现功夫的是授权。HANA授权主要依靠GRANT语句完成但给什么权限、给到哪个层级、是否需要级联授权每一个选择背后都有讲究。4.1 系统权限与对象权限的区别与选择我再用一个通俗的例子解释一遍系统权限相当于“职位等级”决定的是一个用户能不能做某些系统级别的操作比如CREATE USER、DROP SCHEMA、EXPORT这些对象权限相当于“门禁卡”决定的是用户能不能打开某一扇门比如SELECT ON SCHEMA FICO就是打开FICO这个Schema大门去看里面的表。实际授权时对象权限的优先级比系统权限高得多。日常业务账号99%的需求都能通过对象权限解决系统权限要尽量避免授予。即使是开发人员也不需要整库级别的CREATE ANY TABLE权限只需要在特定开发Schema下授权即可。4.2 使用GRANT语句给用户授权假设有一个Schema叫FINANCE希望让用户FICO_QUERY_USER只能查询这个Schema下的所有表只能执行SELECT语句那授权语句很简单GRANT SELECT ON SCHEMA FINANCE TO FICO_QUERY_USER;这里有几个容易被搞迷糊的点。第一GRANT SELECT ON SCHEMA FINANCE是把FINANCE这个Schema下面所有现有和未来新建的表的SELECT权限都授给用户这跟一张表一张表地授权相比效率高很多。第二如果你只想授权某一张表应该是GRANT SELECT ON FINANCE.BKPF TO FICO_QUERY_USER。第三如果你想用一条语句授权多个Schema可以用逗号分隔GRANT SELECT ON SCHEMA FINANCE, SCHEMA CONTROLLING TO FICO_QUERY_USER;对象权限的类型也很丰富。除了SELECT还有INSERT、UPDATE、DELETE、EXECUTE针对存储过程、CREATE ANY在特定Schema下建表等。给用户授权之前一定要想清楚他到底需要哪些能力只读账号给SELECT就够了千万不要顺手给个INSERT。4.3 通过角色做批量权限管理的实操前面提到了角色的重要性这里用一段完整流程演示角色的创建和使用。第一步创建角色CREATE ROLE FICO_QUERY;第二步把权限授予角色而不是直接授给用户GRANT SELECT ON SCHEMA FINANCE TO FICO_QUERY; GRANT SELECT ON SCHEMA CONTROLLING TO FICO_QUERY;第三步把角色授予用户GRANT FICO_QUERY TO FICO_USER_01; GRANT FICO_QUERY TO FICO_USER_02;这样一来以后只要有新的FICO顾问入职只需要执行GRANT FICO_QUERY TO 新用户名这一行权限就配置好了。如果需要收回某些权限也只要调整角色本身所有拥有该角色的用户会同步生效。角色的好处在权限变更和审计的时候体现得最明显。你可以随时查看一个角色下有哪些权限、哪些用户拥有这个角色常规审计时直接查询SYSTEM表即可SELECT * FROM GRANTED_PRIVILEGES WHERE GRANTEE FICO_QUERY; SELECT * FROM GRANTED_ROLES WHERE GRANTEE FICO_USER_01;4.4 修改权限与回收权限的注意事项有授权就有回收HANA回收权限使用REVOKE语句。比如收回用户对某张表的查询权限REVOKE SELECT ON FINANCE.BKPF FROM FICO_USER_01;回收权限时有一个坑必须重视如果权限是通过角色获得的那么直接从用户身上REVOKE单条权限可能不会生效。正确做法是先看这个用户是通过哪个角色获得了权限然后从角色身上RECOKE或者断开用户与角色的绑定REVOKE FICO_QUERY FROM FICO_USER_01;权限变更还有一个隐藏特性已经建立的会话可能不会立刻生效。HANA在会话建立时会缓存用户的权限信息如果你给用户授了新权限那个用户当前已经打开的连接可能需要重连才能感知到变化。遇到“权限明明授了但用户还是报无权限”的情况第一反应应该是让用户断开重连而不是急着调整权限配置。5. 三个真实业务场景完整演示理论讲完了下面用三个我实际处理过的场景把整个流程串起来。这三个场景基本覆盖了新建HANA账号时最常见的情况。5.1 给FICO顾问创建只读查询账号S/4 HANA项目里FICO顾问是最常需要数据库查询账号的角色。这个场景的需求很典型顾问需要查财务凭证、科目余额、成本中心数据但要严格限制只能读不能改。我的操作步骤是这样。首先创建一个只读角色把财务相关Schema的SELECT权限都装进去CREATE ROLE FICO_QUERY_ROLE; GRANT SELECT ON SCHEMA FINANCE TO FICO_QUERY_ROLE; GRANT SELECT ON SCHEMA CONTROLLING TO FICO_QUERY_ROLE; GRANT SELECT ON SCHEMA COSTING TO FICO_QUERY_ROLE;然后创建用户并开启首次登录强制改密CREATE USER FICO_CONSULTANT_01 PASSWORD Init2025Aa FORCE_FIRST_PASSWORD_CHANGE ON;最后把角色授予用户GRANT FICO_QUERY_ROLE TO FICO_CONSULTANT_01;到这里顾问就可以登录查数了。这个配置的精髓在于三个Schema的只读能力都封装在角色里后续再有新顾问入职一条GRANT就搞定。5.2 给开发人员创建Schema开发账号开发人员的需求比只读账号复杂很多。开发人员一般需要在开发Schema下建表、写数据、调试存储过程但又不能影响其他Schema。我通常会先给开发人员建一个专属的开发SchemaCREATE SCHEMA DEV_FICO;然后创建一个开发角色并授予该角色对这个Schema的全部开发权限CREATE ROLE FICO_DEV_ROLE; GRANT CREATE ANY, ALTER, DROP, SELECT, INSERT, UPDATE, DELETE ON SCHEMA DEV_FICO TO FICO_DEV_ROLE; GRANT EXECUTE ON SCHEMA DEV_FICO TO FICO_DEV_ROLE;再创建开发用户并绑定用户组CREATE USER FICO_DEV_01 PASSWORD Dev2025Bb FORCE_FIRST_PASSWORD_CHANGE ON USERGROUP DEV_GROUP;最后把角色授予用户。这里的核心是CREATE ANY只限制在了DEV_FICO这个Schema下开发人员再怎么样也影响不到财务正式数据所在的其他Schema。把所有开发用户放到同一个用户组里后续调整密码策略或资源限制时也会特别方便。5.3 创建接口调用专用账号第三个场景是给外部报表系统或集成平台创建接口账号。接口账号的特点是没有真人使用、需要7x24小时稳定连接、密码不能定期被人为修改。这种账号适合用受限用户加长密码有效期的方式创建CREATE USER REPORT_IF_USER PASSWORD Rp2025!x#9Kq RESTRICTED USER DISABLE_PASSWORD_LIFETIME ON;然后按需授予接口需要访问的Schema权限。接口账号往往只需要访问少量特定表或视图这时候就不要整个Schema授出去了精确到表和视图是更好的做法GRANT SELECT ON VIEW REPORT.V_FICO_MONTHLY TO REPORT_IF_USER;接口账号通常还会遇到多系统并发连接的情况可以根据实际需要调整MAX_CONNECTIONS参数避免默认连接数不够导致接口数据拉取失败。6. 权限管理与排查的实战经验流程都走通之后分享一些我在真实运维环境中积累的问题排查经验。这些场景不一定每个人都会遇到但遇到了如果没人告诉你排查起来是真的费劲。6.1 授权后不生效的排查思路授权之后用户反馈没有权限排查思路其实是有固定套路的。先确认授权是否真正执行成功查询授权视图SELECT * FROM GRANTED_PRIVILEGES WHERE GRANTEE 目标用户名;确认权限确实存在后再检查用户的有效权限。HANA提供了EFFECTIVE_PRIVILEGES视图来查看用户实际生效的权限集合SELECT * FROM EFFECTIVE_PRIVILEGES WHERE USER_NAME 目标用户名;如果授权视图有效但有效权限视图里看不到大概率是用户需要重新建立会话。让用户断开数据库连接重新登录一般就能解决。还有一个常见原因是权限层级问题用户直接拥有的权限、通过角色获得的权限、通过角色嵌套获得的权限生效范围不一样排查时要把HANA的权限继承链完整捋一遍。6.2 账号锁定与密码过期处理HANA默认有登录失败次数限制连续输错密码会直接锁住账号。锁定后的表现是即使用正确的密码登录也会提示用户被锁定。处理方法是管理员用SYSTEM账号解锁ALTER USER FICO_CONSULTANT_01 ACCOUNT UNLOCK;如果想知道账号为什么被锁、什么时候被锁可以查询系统的审计日志或状态视图SELECT USER_NAME, ACCOUNT_LOCK_STATUS, LAST_SUCCESSFUL_CONNECT, LAST_FAILED_CONNECT_TIME FROM USERS WHERE USER_NAME FICO_CONSULTANT_01;关于密码过期默认情况下HANA用户密码有生命周期限制。如果你想临时给某个用户延长有效期可以这样操作ALTER USER FICO_CONSULTANT_01 PASSWORD LIFETIME 180;或者干脆禁用过期限制仅限特殊账号ALTER USER FICO_CONSULTANT_01 DISABLE PASSWORD LIFETIME ON;6.3 如何审计和管控账号权限账号越来越多之后权限管控就变成了体力活。我个人的习惯是每月固定做一次账号权限巡检核心是回答三个问题当前有哪些用户、每个用户有哪些有效权限、这些权限是否仍然必要。常用查询脚本-- 查看所有用户 SELECT USER_NAME, USER_TYPE, CREATED, ACCOUNT_LOCK_STATUS FROM USERS; -- 查看指定用户拥有的直接权限 SELECT * FROM GRANTED_PRIVILEGES WHERE GRANTEE 用户名; -- 查看指定用户通过哪些角色获得的权限 SELECT * FROM EFFECTIVE_PRIVILEGES WHERE USER_NAME 用户名;巡检发现长期未使用的账号先锁定再观察确认无影响后删除。不要直接DROP因为账号一旦删除审计日志里关联的信息可能也会丢失。锁定账号的方式ALTER USER FICO_CONSULTANT_01 ACCOUNT LOCK;6.4 高频问题速查表我把日常支持中碰到的高频问题整理成了表格方便大家直接对照。问题现象常见原因解决方式CREATE USER报密码复杂度错误密码未满足大写字母小写字母数字的最低要求按HANA密码策略修改密码后重试登录提示用户被锁定连续多次输错密码触发锁策略SYSTEM账号执行ACCOUNT UNLOCK授权后用户仍然无权限会话缓存了旧权限用户断开数据库连接重新登录REVOKE权限不生效权限来自角色而非直接授权从角色上REVOKE权限或解除角色绑定用户不小心删除了Schema授予了DROP ANY权限立即锁定账号从备份恢复后续收紧权限系统提示密码即将过期达到PASSWORD_LIFETIME限制用户自行改密码或管理员调整有效期应用连接提示连接数过多超过MAX_CONNECTIONS限制ALTER USER调整MAX_CONNECTIONS参数新建用户无法看到任何表未授予任何Schema的访问权限按需GRANT SELECT ON SCHEMA或具体对象7. 我在HANA账号权限管理上的几点体会最后聊点操作之外的东西。账号权限这一块表面上是一堆SQL语句的排列组合但真正决定项目顺不顺的是能不能从一开始就建立起一套清晰、规范、可审计的账号管理体系。我踩过最大的坑就是项目初期图省事直接给业务顾问授了一堆系统权限和整库权限。当时觉得方便等到项目快上线做安全审查时光是梳理权限清单、回收超额权限就花了两周时间比当初省下的那点功夫多了不知道多少。从那以后我给自己定了一条规矩不管需求多急账号权限必须最小化必须先建角色再授用户过程必须有记录。还有一个体会是HANA的权限管理和传统关系型数据库差别不算大但HANA的分析权限、包权限这些概念一开始确实容易绕晕。好在这几年SAP官方文档也越写越清楚配合系统视图一点点排查总能找到答案。如果大家在实操中遇到这里没提到的问题也欢迎随时交流我把自己踩过的坑都写出来就是希望能帮后来的人少走点弯路。
返回列表