Informix 数据库内部用户使用原理
- 概述
Informix数据库支持两种用户访问方式,数据库内部用户和操作系统用户。
数据库内部用户是指使用create user命令创建的用户,通过映射配置,新建用户可以映射至操作系统用户。这种方法使系统可以通过映射系统中已存在的除 Informix 和 root 外的其他用户,来访问数据库。这种机制将会减少为了使用数据库而创建的大量系统用户。减少 DBA 的工作量,增加系统的安全系数。操作步骤如下
1,配置allowed.surrogates
在/etc/informix目录(如没有,使用root用户创建)下创建allowed.surrogates配置文件,内容如下:
USERS:daemon
2,数据库开启USERMAPPING
onmode -wf USERMAPPING=ADMIN
3,加载surrogates到缓存
onmode -cache surrogates
4,在sysuser库中创建系统默认用户,可以指定默认目录
CREATE DEFAULT USER WITH PROPERTIES USER daemon HOME “/home/gbase8t/users” ;
5,创建普通用户,并指定密码
CREATE USER ifxuser WITH PASSWORD ‘ifxuser’;
6,在数据库中赋权访问
echo “grant dba to ifxuser;” | dbaccess testdb -
7,使用内部用户访问数据库,按提示输入密码
dbaccess - -
CONNECT TO ‘[email protected]’ USER ‘ifxuser’;
操作系统用户是指使用服务器存在用户进行登录。
- Informix 的授权机制
Informix 从 Informix 11.7 版本开始提供除了通过操作系统用户鉴权方式,还提供了非操作系统用户 NON-OS user 鉴权方式。如下介绍这 2 种鉴权方式的机制和差异性。
2.1 Informix 操作系统用户鉴权机制
Informix 传统的操作系统用户认证方式就是使用一个操作系统用户,并通过一个用户 ID 和密码来判定用户的合法性。这是一种最常见也是最简单的认证方式。下面是一个 Informix 授权机制的示意图。
图 1. Informix 传统验证机制示意图
Informix 数据库内部用户使用原理
如图 1 所示,传统的认证方式需要访问数据库的用户同时也是一个系统用户,即如要创建一个 Informix 数据库用户,需要先创建一个操作系统用户,然后对该用户进行授权访问数据库。当有需要创建大量的数据库用户时,就造成了会产生大量的系统用户,需要较大的系统管理工作,同时对系统安全存在一些隐患。
2.2 Informix11.7 非系统用户验证机制
Informix 自 11.7 版本开始增加了非系统用户映射系统用户来操作数据库的方法,该方法可以使多个非系统用户映射到一个系统用户。如下所示是 Informix 非系统用户访问数据库示意图:
图 2. Informix 非系统用户验证机制示意图
Informix 数据库内部用户使用原理
从上面的图中可以看出,非系统用户通过映射系统用户来完成 Informix 的完全认证,非系统用户将使用被映射的操作系统用户的 UserID 和 GroupID 等信息。Informix 的 onconfig 文件中的 USERMAPPING 参数用于控制映射功能的启用和禁用。默认情况下,只要启用了映射功能,任何非系统用户都可以通过被映射的系统用户来连接数据库。当然,也可以通过命令控制用户是否可以接入。
- 非系统用户的设置和使用
使用非系统用户访问数据库的设置包括创建系统用户,映射用户,创建及维护数据库服务器用户和用户权限管理四部分。其中创建系统用户和映射用户为准备过程,创建数据库服务器用户和用户权限管理如下图所示为整个过程的示意图:
图 3. Informix 非系统用户访问数据库设置方法示意图
Informix 数据库内部用户使用原理
由图 3 所示,创建和使用非系统用户一般按照下面的步骤:1. 创建新系统用户。2. 映射用户。3. 创建数据库用户。4. 权限管理 下面详细介绍非系统用户设置和使用每一步的具体步骤。
3.1 创建系统用户
非系统用户访问数据库必须通过映射到一个系统的数据库用户上才能进行,所以必须首先创建一个系统用户,用于非系统用户的映射。创建系统用户可以使用常用的命令 useradd。在此以创建系统用户 user1 为例。
1 useradd user1
3.2 映射用户(Mapped Users)
数据库系统管理员(DBSA)能够通过设置数据库来允许内部用户连接数据库。外部用户通过 Kerberos,PAM 或者内部授权来连接数据库的可以通过映射到一个操作系统级的配置文件来处理连接请求。Informix 11.7 开始提供了映射用户的机制来允许非系统的用户访问数据库。
3.2.1 编辑 allowed. surrogates 文件
可以通过编辑 /etc/informix/allowed.surrogates 文件来确定使用哪一个系统用户和组来做为非系统用户的映射用户。如下面例子中将使用 user1 用户来作为非系统用户的映射用户。
1 USER:user1
3.2.2 将修改的内容加载到共享内存
allowed. surrogate 文件中提供了用作映射的操作系统用户名,但对该文件修改后,要使修改结果生效则需要运行如下命令:
1 onmode -cache surrogates
该命令会导致数据库服务器重新读取 allowed.surrogate 文件,并将其中的用户名,用户 ID 等信息存储到共享内存的缓存中。如果该过程失败,之前存储在缓存中的用于映射的用户的信息也会被清掉。则将会直接导致映射用户被禁止。 任何对 /etc/informix/allowed.surrogates 文件修改后,必须执行 onmode -cache surrogates 才能生效,否则则会在上述步骤 5 中报如下错误:
26729: The user user1;
is not in the /etc/informix/allowed.surrogates file or in the cache.
3.2.3 设置 USERMAPPING 参数
Informix 的 onconfig 文件中的 USERMAPPING 参数可以控制允许或禁止非系统用户访问数据库该参数可以设置为 OFF, BASIC 和 ADMIN 三种状态,其含义和区别见下表:
可设置的参数 含义
OFF 只允许操作系统的用户访问数据库,不允许非系统用户访问数据库。
BASIC 允许非系统用户访问数据库,但不允许执行对数据库系统的授权用户操作,如 DBSA, DBSSO, AAO 等。即使被映射的用户具有上述权限。
ADMIN 允许非系统用户访问数据库。且如果被映射的用户为授权用户,则非系统用户也被允许执行授权用户操作。
可以通过修改 Informix 的 onconfig 文件或者使用 onmode 命令来动态更改该参数的值。下面的代码可以动态的修改 USERMAPPING 参数的值,所有会话都将被影响。
1 onmode – wf USERMAPPING= ’ BASIC’;
也可使用下面的代码,此时则只有执行该代码的会话会受到影响。
1 onmode – wm USERMAPPING= ’ BASIC ’
3.3 创建及维护数据库服务器用户
拥有数据库系统管理员权限的用户,在 USERMAPPING 参数设置为 BASIC 或者 ADMIN 时,可以创建与操作系统无关的数据库用户。可以使用如下所示的命令来创建用户:
1 CREATE USER username WITH PASSWORD password
如果要创建一个非系统的 Informix 用户,则必须有一个系统的 Informix 用户,使非系统用户可以映射到该用户。以创建非系统用户 sue 为例,可使用如下所示命令:
Create user user1 with password ‘informix’;
– 创建一个系统的 Informix 用户
Create user sue with password ‘informix’ PROPERTIES user “user1”;
– 创建非系统的 Informix 用户,映射到 user1
可以使用创建一个默认用户的方法使以后创建的非系统的 Informix 用户都映射到默认用户,默认用户须是系统用户。如下面代码所示:
CREATE DEFAULT USER WITH PROPERTIES USER ‘user1’; – 创建默认用户
Create user sue with password ‘informix’;
– 创建非系统的 Informix 用户,该用户映射到默认用户 user1 上
另外,Informix 提供了***账户的机制来锁住某个账户,被锁住的账户将无法连接数据库,使用 ACCOUNT LOCK 选项来创建一个被锁住的账户,如下面代码所示:
CREATE USER sue WITH PASSWORD “informix” ACCOUNT LOCK;
– 创建一个被锁住的账户,该账户以默认账户作为映射
此时,如使用新创建被锁定用户 sue 来连接数据库,则会报如下所示的错误:
-26702
User sue cannot connect to the database server because the user account is locked.
要解锁一个被锁住的账户,则可以用如下所示的代码:
Alter user sue account unlock;
解锁以后,该账户便可以正常使用了。 同样,DBSA 可以通过使用 Alter, drop, Rename 等命令来管理数据库用户,如下所示为将 DBSA 权限赋给用户 user1:
ALTER USER user1 ADD AUTHORIZATION (dbsa);
需要注意的是,以上命令都是具有 DBSA 权限的用户才可以进行的操作。其他用户如要完成类似修改密码的操作则需使用类似如下所示的命令:
SET USER PASSWORD old ‘informix1’ new ‘informix’
另外,在创建用户和管理用户的时候,有如**意事项:
若已有默认用户(default user),则重新创建新的默认用户前需先删除掉之前的默认用户。
创建非系统账户时可以不使用默认用户来创建,也可使用 informix 用户创建。
非系统用户通过映射成系统用户来登陆数据库服务器,它利用了系统用户的用户 ID,组 ID 等信息。创建了非系统用户后,需要允许非系统用户接入(access)才能连接数据库。默认情况下,只要将 USERMAPPING 的值设置为 BASIC 或者 ADMIN,则已经允许所有用户(PUBLIC)接入。我们可以使用如下命令允许和禁止某非系统用户接入数据库。
GRANT ACCESS TO sue PROPERTIES USER user1;
Revoke ACCESS from sue;
该命令可以允许非系统用户映射到指定系统用户。但应注意不能映射成 informix 或者 root 用户。如上述设置步骤 5 中如果将 sue 用户映射到 informix 或 root 用户则会报错如下:
26108: You cannot grant root or informix user privilege to the user.
3.4 用户权限管理
对非系统用户的权限管理与系统用户的相同,Informix 的权限管理从级别上来包括数据库级和表级两个级别的系统管理,现在分别介绍这两种不同级别的权限管理。
3.4.1 数据库权限管理
Informix 的系统权限包括连接(connect)、资源(resource)和数据库管理员(DBA)三个权限,通过映射接入的非系统用户对任何数据库都没有任何权限,此时 DBA 可以通过使用 grant 命令有选择的将不同数据库的不同权限赋给非系统用户。如下所示将 testdb 数据库的连接权限赋给非系统用户 sue1。
Dbaccess testdb;
grant connect to sue1
此时,非系统用户 sue1 就具有了连接数据库 testdb 的权限。当然也可以将资源或 DBA 的权限赋予 sue1。如下面代码所示。
grant resource to sue1 ;
grant dba to sue1
同样也可以使用 revoke 命令将赋予非系统用户的权限收回。如下面代码所示:
Revoke connect from sue1;
在这里需要强调的是,非系统用户通过映射系统用户的组 ID、用户 ID 等信息接入数据库,但它并不具有系统用户所具有的数据库操作权限。假如系统用户对数据库具有 DBA 的权限,但通过映射接入数据库的非系统用户则并不具有任何对相应数据库的权限。反之亦然。
3.4.2 数据库表权限管理
数据库表的权限是用户连接到某个数据库后对该数据库中相应表权限的管理,数据库表的权限包括插入、删除、查询等权限,下面的表中给出了表的不同权限及该权限的作用。
权限 作用
插入(insert) 允许插入数据
删除(delete) 允许删除数据
查询(select) 允许通过 select 语句访问相应列
更新(update) 允许通过 update 语句访问相应列
索引(index) 允许创建永久索引。但要使用索引则用户必须有 resource 权限。
更改(alter) 允许对表的结构进行修改,包括添加列、删除列等,但必须拥有 resource 权限。
- 相关系统表
在系统中,与非系统用户访问相关的数据库是 SYSUSER。该数据库中包含与非系统用户映射相关的所有信息。其中,起主要作用的表是 sysintauthusers 和 sysusermap。下面分别介绍这两个表的表结构及主要作用。
4.1 Sysusermap 表
该表包含 username 和 surrogate_id 两列。其中,username 列用于存储映射用户的名字。Surrogate_id 为映射用户的 ID 号,该号码是独一无二的。其表结构如下所示:
Column Type Description
username char(32) PUBLIC 或者是映射用户的名字
surrogate_id INT 映射用户的 ID 号,该号码在运行 grant access to 命令后产生
4.2 Sysintauthusers 表
在一个非 Informix 的用户连接数据库前,数据库服务器必须要验证该用户在 sysintauthusers 表中的信用信息。包括系统的和非系统的用户信息都会存储在内。如下所示是该表的表结构:
Column Type Description
username NCHAR(32) 用户名
salt BIGINT 一个 64 位的 salt。在数据库服务器加密密码前,将密码转换为一个其他值
Hashed_password VARCHAR(128) 一个 sha-256 哈希算法和 base-64 加密的密码。
Hash_type CHAR(16) 哈希算法类型,目前使用的是 SHA-256
updated DATETIME YEAR TO SECOND N/A
flags INTEGER 用于存储账户信息(比如 account lock)的标志位
min_change INTERVAL DAY(7) TO SECOND N/A
max_change INTERVAL DAY(7) TO SECOND N/A
inactive INTERVAL DAY(7) TO SECOND N/A
ac_expire DATETIME YEAR TO SECOND N/A
非系统用户创建和使用示例
可以按照下面的步骤创建一个非系统用户并使用该用户访问数据库。新创建一个系统用户,如 user1
1 useradd user1
以 root 用户修改文件 /etc/informix/allowed.surrogates。并在文件末尾加入 USER :user1。
运行下面的命令使修改的内容生效。
1 onmode -cache surrogates
- 修改 Informix ONCONFIG 文件,将其中的 USERMAPPING 参数修改为 BASIC 或者 ADMIN,可通过直接修改 onconfig 文件中该参数的值再重启或使用命令
1 onmode -wf USERMAPPING=’ADMIN’ or ‘BASIC’。
- 创建默认账户:以 informix 用户连接数据库后,将 user1 创建为默认账户
dbaccess sysuser
CREATE DEFAULT USER WITH PROPERTIES USER ‘user1’;
到此为止,准备设置已经完成,以下步骤开始创建非系统用户。
- 创建非系统账户:以 informix 用户登录并创建 4 个非系统账户: sue1,sue2,sue3 和 sue4。
dbaccess sysuser;
CREATE USER sue1 WITH PASSWORD “p_sue1”;
CREATE USER sue2 WITH PASSWORD “p_sue2”;
CREATE USER sue3 WITH PASSWORD “p_sue3”;
CREATE USER sue4 WITH PASSWORD “p_sue4”;
- 为新建用户赋权 :
dbaccess testdb ;
grant connect to sue1;
grant connect to sue2;
grant connect to sue3;
grant connect to sue4;
之后,四个非系统用户 sue1 到 sue4 就都可以对 testdb 数据库进行访问了。
结束语
Informix 从 11.7 版本开始增加的非系统用户访问数据库的机制,解决了之前 Informix 用户必须是操作系统账户的问题。此机制减少了操作系统的维护工作,降低了系统的风险,提高了系统的灵活性。方便了数据库管理员对数据库的管理工作。对于需要多个用户访问及使用的场景,该机制极大降低了管理和维护的复杂度,提高了效率。