GBase 8s 内部用户创建全攻略:权限管理与安全实践
看到标题里写着“GBase 8s 内部用户创建”估计不少刚接触国产数据库的朋友第一反应是这不就是CREATE USER一条语句的事吗实际真上手搞过 GBase 8s 的人都知道这个“内部用户”和 MySQL、Oracle 里的用户概念不完全是一回事。它牵扯到数据库自身的认证机制、操作系统用户映射、sqlhosts 配置、甚至 Informix 时代遗留下来的一套权限习惯。我把最近在项目里创建内部用户、分配权限、排查认证问题的完整过程整理出来尽量把容易踩的坑一次说清楚适合刚接触 GBase 8s 的 DBA、运维以及需要自己搭测试环境做开发的同学。1. 内部用户设计思路与整体方案拆解1.1 为什么 GBase 8s 要单独搞一套“内部用户”先捋一个基础概念GBase 8s 在血缘上继承自 Informix 的体系架构早期版本最常用的认证方式叫“操作系统用户映射”也就是数据库不单独维护密码而是直接信任操作系统的登录用户。你在 Linux 上有一个informix账号数据库里也对应一个同名用户两边靠$GBASEDBTUSER之类的环境变量对上号客户端一连接数据库就认为“你就是这个操作系统用户”不再校验口令。这套机制胜在简单、部署快但问题也很明显一旦操作系统账号密码泄露数据库等于门户大开多业务系统共用一个informix超级账号的情况更是家常便饭权限难以隔离。所以 GBase 8s 后来引入了真正意义上的“内部用户”也就是完全由数据库自身维护、与操作系统账号解耦的数据库账号。用户密码存在数据库内部认证时数据库自己校验不依赖外部系统。这个设计思路和 Oracle 的本地认证用户、MySQL 的独立用户体系基本一致只是语法细节和权限模型还带着老 Informix 的影子。1.2 内部用户和外部映射用户的核心区别我用项目里实际遇到的一个场景来说明当时我们有一套测试环境操作系统账号只有informix和root但前端应用需要以三个不同身份连接同一个实例做权限隔离测试。如果用传统操作系统用户映射就得在 Linux 里创建三个系统账号再逐一配置映射关系麻烦不说还容易把系统账号和数据库账号绑死。改成内部用户之后直接在数据库里CREATE USER三个账号密码全由数据库管理操作系统层完全不用动。两者差异我整理成一张表方便对照对比项操作系统映射用户内部用户数据库管理认证方式依赖操作系统账号数据库不校验密码数据库内部存储密码独立认证创建入口需要系统层账号配合再映射直接在 SQL 中用 CREATE USER 创建密码管理跟随系统密码策略数据库 ALTER USER 管理适用场景内部可信网络、单机管理多业务隔离、远程访问、权限细分隔离性弱系统账号一旦失控影响数据库强数据库账号独立于系统维护成本需要系统管理员配合DBA 独立完成从维护角度看我强烈建议新项目优先用内部用户。尤其是远程访问场景客户端机器上和数据库服务器根本没有共享账号体系依赖操作系统映射几乎是给自己埋雷。内部用户把“数据库账号”和“系统账号”彻底剥离开权限边界清晰得多。2. 创建内部用户前的环境准备与前置检查2.1 确认实例已启用内部用户认证能力创建内部用户之前先确认当前实例运行方式支持这一特性。GBase 8s 的实例默认由informix这个操作系统用户启动ONCONFIG配置文件里有一个关键参数决定认证行为。我在不同版本上见过两种常见配置路径一种是在$GBASEDBTDIR/etc下的sqlhosts文件里声明连接协议另一种则是通过onmode -wf动态调整安全相关配置。最直接的办法是连上实例后执行一条 SQL 查看版本和认证模式SELECT DBINFO(version, full) FROM systables WHERE tabid 1;如果版本支持内部用户通常默认就开启了数据库本地认证直接执行CREATE USER不会报“此功能未启用”之类的错误。如果报错优先查ONCONFIG中与安全认证相关的参数是否被注释或设成了禁用值。常见的做法是参考官方文档确认该版本 GBase 8s 对“用户认证”功能的开关名称再通过onmode -wf在线调整调整后无需重启实例。注意修改认证相关参数前先备份$GBASEDBTDIR/etc下的配置文件我习惯在改动前加时间戳复制一份防止手滑改错又无法回滚。2.2 用 dbaccess 建立初始连接创建用户属于管理操作推荐使用dbaccess命令行工具以 DBA 权限连接。连接前要确认两件事一是环境变量INFORMIXSERVER是否指向目标实例名二是当前系统用户是否能正常访问实例。我第一次在一台新环境上操作时直接在普通用户下敲dbaccess结果报了一堆共享内存连接错误最后发现是没切换到informix用户、也没 source 实例的环境变量文件。规范的连接步骤是# 切换到 informix 系统用户 su - informix # 加载实例环境变量常见文件名如 gbasedbtserver.env 或 profile.gbasedbt . /opt/GBASE/gbase/etc/gbasedbt.env # 确认实例名 echo $INFORMIXSERVER # 连接默认数据库并执行 SQLsysmaster 或 sysuser 均可 dbaccess sysmaster这里有个细节dbaccess进入交互界面后默认连接的是当前INFORMIXSERVER指定的实例但不代表你就有管理员权限。在 GBase 8s 中初始的超级用户一般是informix如果当前操作系统用户不是informix连接后执行CREATE USER大概率会报“没有 DBA 权限”。所以最好的起手式就是切到informix用户再操作省去后面一堆权限排查。2.3 规划账号命名与密码策略不要小看命名和密码规划这步偷懒后面全是坑。GBase 8s 的标识符大小写规则和操作系统不太一样默认情况下数据库对象名会按大写处理但用户名字符串的敏感性在不同版本上表现又有差异。我在实际项目里统一用“小写字母加下划线”的命名风格比如app_readonly、app_rw_user避免因为大小写问题导致应用连接时“用户不存在”的幻觉报错。密码策略方面至少要求 8 位以上、包含字母和数字不能太简单。虽然 GBase 8s 的本地认证不像 Oracle 那样默认带复杂的 profile 策略但作为 DBA 自己有责任把常用账号密码强度提上去尤其那些开放给应用服务器连接的业务账号。测试环境可以放宽生产环境务必严谨。3. 内部用户创建的实操全流程3.1 使用 CREATE USER 创建数据库内部账号GBase 8s 的CREATE USER语法和主流数据库略有差异但核心思路一致。我以一个实际需求为例创建只读账号app_read密码设为Read2024。在dbaccess交互界面中执行CREATE USER app_read WITH PASSWORD Read2024 PROPERTIES USER DEFAULT;不同小版本对PROPERTIES子句的支持程度可能不一样有的版本语法是CREATE USER app_read IDENTIFIED BY Read2024;如果第一条语句报语法错误就试试第二条。这里想强调一个排查思路遇到语法报错时先查官方文档中对应版本的语法图而不是反复猜测。GBase 8s 的语法兼容 Informix 比较明显关键词、子句顺序都比较“古早”和 MySQL 那种宽松写法差别很大。创建成功后用新用户连接测试dbaccess sysmaster - - EOF CONNECT TO sysmaster USER app_read USING Read2024; EOF注意GBase 8s 的密码如果包含、#这类特殊字符在不同客户端工具和 shell 环境下可能需要转义建议在脚本中用单引号包住密码避免被 shell 解释掉。3.2 验证用户并处理首次登录的常见报错创建完用户我习惯立刻做一轮验证而不是直接丢给应用同事。验证的核心就一句话确认这个账号能连上实例且权限符合预期。用dbaccess连接时如果报User cannot connect to database别急着怀疑密码先确认三件事用户是否被赋予了CONNECT权限GBase 8s 默认CREATE USER后不会自动给任何数据库访问权限目标数据库是否存在当前INFORMIXSERVER是否指向正确实例注意看第一条这点和其他数据库很不一样。MySQL 里CREATE USER后用户至少能登录GBase 8s 里如果只建账号不授权用户连CONNECT权限都没有哪怕密码完全正确也登不进去。我第一次在新版本上踩的就是这个坑专门花时间记录一下。所以创建完用户后下一步必须立刻授权GRANT CONNECT TO app_read;如果是业务读写账号还要加上RESOURCE甚至DBA权限具体看你的权限矩阵设计。3.3 DBA、RESOURCE、CONNECT 权限分级与选择GBase 8s 的权限模型分为三个层级我把它们之间的差异和适用场景已经整理成表格这里想补充一些实战经验权限级别功能范围适合场景CONNECT登录实例、访问已授权数据库但不具备建表等 DDL 权限只读报表账号、查询用户RESOURCE具备 CONNECT 全部能力可以在授权库中建表、建索引业务开发账号、读写应用DBA拥有数据库内几乎所有管理操作权限运维账号、高级管理账号实际授权时细心的同事可能会问为什么读账号不直接给RESOURCE因为RESOURCE能建表意味着这个账号一旦被拖库或被应用误用就能在库里创建对象留下安全隐患。只读账号给CONNECT就足够了配合后续的SELECT授权完成数据访问。而 DBA 权限更要谨慎发放任何 DBA 账号的操作都会绕过一部分普通权限检查出问题后审计定位难安全边界也容易失控。我建议的最小权限实践是应用账号用CONNECT或RESOURCE即可只有 DBA 或运维人员才用 DBA 权限每个业务模块单独建账号避免共用账号导致后期审计和追责困难。4. 权限分配、角色管理与使用技巧4.1 按场景精细化授权从 SELECT 到存储过程执行权限内部用户创建完成后才进入真正的重头戏授权。GBase 8s 的授权粒度比一般想象中更细除了库级权限还有表级、列级、甚至存储过程执行权限。以只读账号为例只给CONNECT还不够需要单独对目标表授权GRANT SELECT ON customer TO app_read; GRANT SELECT ON orders TO app_read;这里推荐一个高效做法连上目标数据库后用一条 SQL 拼接出批量授权脚本。比如要把某 schema此处以常见业务模式为例下所有表的SELECT权限一次性授予只读账号可以用SELECT GRANT SELECT ON || tabname || TO app_read; FROM systables WHERE tabid 99 AND tabtype T;把查询结果导出为 SQL 文件再批量执行。这个方法比手工一条条GRANT高效得多也避免漏表。如果是给应用配读写账号除了表级INSERT、UPDATE、DELETE还要考虑序列、存储过程的权限GRANT INSERT, UPDATE, DELETE ON customer TO app_rw_user; GRANT EXECUTE ON proc_update_customer TO app_rw_user;4.2 利用角色ROLE统一管理权限当账号数量多起来逐个GRANT会变成纯体力活而且容易有一天突然发现漏授权。GBase 8s 支持角色ROLE建议把角色作为授权单位而不是直接对人授权。创建一个角色并授权CREATE ROLE read_only_role; GRANT SELECT ON customer TO read_only_role; GRANT SELECT ON orders TO read_only_role;再把用户加入角色GRANT read_only_role TO app_read;后续新人加入只要执行一次角色授予所有表的查询权限全部自动生效。权限调整时也只需要改角色上的授权不用一个个用户去收权限。我后来管理的几套环境都是这套玩法省心不少。需要注意角色名和用户名在同一命名空间下不能重复角色授权和回收的语法也遵循标准的GRANT ROLE TO USER与REVOKE ROLE FROM USER和 Oracle 的用法有几分相似。4.3 ALTER USER、DROP USER 与密码变更实操日常运维中账号生命周期管理比创建更考验基本功。密码定期更换是常见需求GBase 8s 的语法是ALTER USER app_read WITH PASSWORD NewPass2025;有些版本可能支持其他属性调整但密码变更是最常用的。我的经验是每次改完密码立刻更新应用侧的连接配置并安排一次带新密码的连通性测试避免出现“账号己改密但应用仍用旧密码重试导致锁死”的情况。虽然 GBase 8s 本地认证不一定有明确的失败锁定策略但频繁失败的日志会刷满 online.log影响故障排查。删除用户的语法更简单DROP USER app_read;不过删除前一定要确认这个用户没有被对象依赖比如他拥有的表、序列、触发器否则直接DROP USER会报依赖错误。稳妥做法是先把他的对象转移给其他用户或者建一个临时 DBA 账号接管再删除原账号。5. 实际使用中的常见问题与排查记录5.1 用户创建成功但连接被拒日志怎么定位创建用户本身不难难的是连接不上时如何快速定位。我遇到过的典型场景是新用户从应用服务器远程连接实例提示认证失败但dbaccess在数据库服务器本机却能正常登录。排查顺序我固定为三步走先看 online.log 中的认证记录再排查sqlhosts的协议配置最后检查客户端侧的环境变量和服务名。online.log是 GBase 8s 排查问题最重要的日志文件路径一般在$GBASEDBTDIR/tmp或日志目录下也可以用onstat -m直接查看最近消息。onstat -m | tail -50日志里出现类似Client authentication failed的记录时我会先分清是密码错误还是用户根本不存在。这时可以在服务器本地用该账号试一次dbaccess如果本地可以而远程不行基本可以判断是网络认证或协议配置的问题而不是账号本身有问题。5.2 用户创建成功但连接被拒日志怎么定位上面提到的方法虽然常用但 GBase 8s 的认证链路还涉及另一层容易被忽视的环节$GBASEDBTDIR/etc下的sqlhosts文件以及实例的LISTEN配置。远程客户端连接时服务名要对应sqlhosts中配置的协议和主机名如果应用连接串里写的别名不对或主机名解析问题导致连不上也会表现为类似认证失败的错误。排查命令是cat $GBASEDBTDIR/etc/sqlhosts如果sqlhosts中使用了onsoctcp这类 TCP 协议项还要检查监听端口是否被防火墙拦截。我在测试环境就犯过漏开端口的低级错误本地连得欢远程全超时。所以每次远程连接失败我都会顺手检查端口连通性telnet 服务器IP 端口端口通、服务名对、日志没有明显报错再回头审视用户名密码不要一上来就怀疑账号建错了。5.3 忘记密码与 DBA 强制重置最后分享一个救急场景业务同事把应用账号密码忘了而生产环境又不能随便重启。GBase 8s 内部用户的密码重置本质上是 DBA 权限用户执行ALTER USER即可并不会影响现有连接。操作方式以informix或 DBA 权限用户连接sysmaster执行ALTER USER app_rw_user WITH PASSWORD 临时密码通知业务方用新密码登录首次登录后建议强制业务方再改一次这里有个小优化建议改成临时密码后不要直接通过不安全的聊天工具发给业务。我通常把临时密码放在内部密码管理平台限期 24 小时有效业务方登录后立即改密。别问为什么干过生产环境的都懂密码明文满天飞是最常见的安全隐患。6. 安全加固与个人实操心得6.1 内部用户的安全基线建议账号体系搭好之后安全加固不能落下。结合我自己的维护经验整理出几条基线规则每个应用模块独立建号严禁共用超级账号连库只读账号一律只授CONNECT加表级SELECTDBA 权限只保留最小必要人数定期复核授权清单密码定期轮换至少保证 90 天一次的节奏从应用侧限制连接来源 IP能不开公网就不开公网操作前先备份配置文件操作后立刻验证登录这些规则本身不难难在坚持。我把账号清单和授权关系维护在一张表格里每次变更都同步更新半年一次权限审计才能保证不出大乱子。6.2 最后分享一条我踩过坑换来的经验GBase 8s 内部用户使用中最容易阴沟翻船的不是建用户而是“以为建完就万事大吉”。没有CONNECT授权的用户、忘了批量授权只读权限的角色、改了密码没通知应用的案例我都遇过。现在我总结出一条铁律新建任何账号必须走完“建号-授权-验证登录-验证权限-记录归档”这五步闭环。宁可每一步多花一分钟也不要事后在业务群里被一整天。如果你刚接触 GBase 8s建议先拿测试环境从dbaccess建一个只读用户跑通全流程再逐步尝试角色和批量授权把账号体系这几板斧练熟后面管理多实例就顺了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →