DB2解决”非当前实例下的用户可连接实例”的问题

作者: 5473 分类: DB2 发布时间: 2015-03-24 20:46 阅读数:557

问题:DB2上建了2个实例,分别是db2inst1和db2inst2,现在用db2inst2账号居然也能连接db2inst1下的数据库!!!

分析DB2 在内部使用一个名为 PUBLIC 的伪组,对于 PUBLIC,可以为之授予特权,也可以撤销它的特权。PUBLIC 实际上不是在外部安全设施中定义的一个组,但通过它可以为通过 DB2 认证的用户授予特权。

当创建一个新数据库时,某些数据库权限和特权就会自动授予 PUBLIC,如下表所示。

表. 创建数据库后被授予 PUBLIC 的权限和特权列表
权限或特权 描述
BINDADD 允许用户在数据库中创建新的包
CREATETAB 允许用户在数据库中创建新的表
CONNECT 允许用户连接到数据库
IMPLICIT_SCHEMA 允许用户在不存在的模式中创建对象(动态地创建模式)
USERSPACE1 上的 USE 特权 允许用户在 USERSPACE1 表空间中创建表或索引
NULLID 模式上的 CREATEIN 允许用户在 NULLID 模式中创建对象
模式 SQLJ 上的 CREATEIN 允许用户在 SQLJ 模式中创建对象
SYSPROC 模式上所有函数和过程上的 EXECUTE WITH GRANT 特权 允许用户调用 SYSPROC 模式中的存储过程和执行该模式中的函数,并且可以将该许可授给其他用户
SQLJ 模式中所有过程上的 EXECUTE WITH GRANT 特权 允许用户调用 SYSPROC 模式中的存储过程
NULLID 模式中创建的所有包上的 BIND 和 EXECUTE 特权 允许用户绑定(BIND)和执行(EXECUTE)NULLID 模式中的包
SYSIBM 模式中表上的 SELECT 特权 允许用户查看系统编目表中的信息
SYSCAT 模式中视图上的 SELECT 特权 允许用户查看系统编目视图中的信息
SYSIBMADM 模式中管理视图上的 SELECT 特权 允许用户查看这些管理视图中的信息
SYSSTAT 模式中编目视图上的 SELECT 特权 允许用户查看系统编目视图中的信息
SYSTAT 模式中视图上的 UPDATE 特权 允许用户更新这些系统编目视图中的统计信息

作为一项最佳实践,在创建一个新的数据库之后,应立即撤销这些被授给 PUBLIC 的隐式特权

例如,您可以执行上表中显示的语句来撤销系统编目视图上的特权和其他被授予 PUBLIC 的隐式特权。不过这个清单还不是最全的。

清单. 创建数据库后撤销 PUBLIC 的隐式特权

从 DB2 V9.1 开始,CREATE DATABASE 命令语法增加了 RESTRICTIVE 选项。

  • 如果该命令中包括了 RESTRICTIVE 选项,那么会导致 RESTRICT_ACCESS 数据库配置参数被设置为 YES,同时不自动授予 PUBLIC 任何特权。
  • 如果忽略了 RESTRICTIVE 选项,那么 RESTRICT_ACCESS 数据库配置参数被设置为 NO,前述所有特权都将自动授予 PUBLIC。
从 DB2 V10.5 开始,CREATE DATABASE 命令将不自动授予 PUBLIC 任何特权。
解决:
a.数据库已创建
1.连接至目标数据库
shell > su – db2inst1
shell > db2 connect to SLPDB 
2.取消连接权限
shell > db2 “REVOKE CONNECT ON DATABASE FROM PUBLIC”
DB20000I  The SQL command completed successfully.
3.测试非当前实例用户是否可连接
shell > db2 connect to SLPDB user db2inst9 using 1qaz2wsx
SQL1060N  User “DB2INST9” does not have the CONNECT privilege.  SQLSTATE=08004

b.数据库未创建
shell > db2 create db SLPDB using codeset UTF-8 territory zh_CN RESTRICTIVE 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注