用户标识与鉴别

用户标识与鉴别对试图登录数据库进行数据访问的用户进行身份验证,以确认此用户是否能与某一数据库用户进行关联,并根据关联的数据库用户的权限对此用户在数据库中的数据访问活动进行安全控制。

2.1 DM 的管理用户

在现实生活中,任何一个系统如果将所有的权利都赋予给某一个人,而不加以监督和控制,势必会产生权利滥用的风险。从数据库安全角度出发,一个大型的数据库系统有必要将数据库系统的权限分配给不同的角色来管理,并且各自偏重于不同的工作职责,使之能够互相限制和监督,从而有效保证系统的整体安全。

DM 数据库采用“三权分立”或“四权分立”的安全机制,将系统中所有的权限按照类型进行划分,为每个管理员分配相应的权限,管理员之间的权限相互制约又相互协助,从而使整个系统具有较高的安全性和较强的灵活性。

可在创建 DM 数据库时通过建库参数 PRIV_FLAG 设置使用“三权分立”或“四权分立”安全机制,0 表示“三权分立”,1 表示“四权分立”。此参数仅在 DM 安全版本下提供,即仅 DM 安全版本提供“四权分立”安全机制,缺省采用“三权分立”安全机制。

使用“三权分立”安全机制时,将系统管理员分为数据库管理员、数据库安全员和数据库审计员三种类型。在安装过程中,DM 数据库会预设数据库管理员账号 SYSDBA、数据库安全员账号 SYSSSO 和数据库审计员账号 SYSAUDITOR,其缺省口令都与用户名一致。

使用“四权分立”的安全机制时,将系统管理员分数据库管理员、数据库对象操作员、数据库安全员和数据库审计员四种类型,在“三权分立”的基础上,新增数据库对象操作员账户 SYSDBO,其缺省口令为 SYSDBO。

注意

各管理员应在安装过程中或安装完毕后立即修改缺省口令,避免因口令泄漏造成的安全问题。

数据库管理员(DBA)

每个数据库至少需要一个 DBA 来管理,DBA 可能是一个团队,也可能是一个人。在不同的数据库系统中,数据库管理员的职责可能也会有比较大的区别,总体而言,数据库管理员的职责主要包括以下任务:

  • 评估数据库服务器所需的软、硬件运行环境
  • 安装和升级 DM 服务器
  • 数据库结构设计
  • 监控和优化数据库的性能
  • 计划和实施备份与故障恢复

数据库安全员(SSO)

有些应用对于安全性有着很高的要求,传统的由 DBA 一人拥有所有权限并且承担所有职责的安全机制可能无法满足企业实际需要,此时数据库安全员和数据库审计员两类管理用户就显得异常重要,它们对于限制和监控数据库管理员的所有行为都起着至关重要的作用。

数据库安全员的主要职责是制定并应用安全策略,强化系统安全机制。数据库安全员 SYSSSO 是 DM 数据库初始化的时候就已经创建好的,可以以该用户登录到 DM 数据库来创建新的数据库安全员。

SYSSSO 或者新的数据库安全员都可以制定自己的安全策略,在安全策略中定义安全级别、范围和组,然后基于定义的安全级别、范围和组来创建安全标记,并将安全标记分别应用到主体(用户)和客体(各种数据库对象,如表、索引等),以便启用强制访问控制功能。

数据库安全员不能对用户数据进行增、删、改、查,也不能执行普通的 DDL 操作如创建表、视图等。他们只负责制定安全机制,将合适的安全标记应用到主体和客体,通过这种方式可以有效的对 DBA 的权限进行限制,DBA 此后就不能直接访问添加有安全标记的数据,除非安全员给 DBA 也设定了与之匹配的安全标记,DBA 的权限受到了有效的约束。数据库安全员也可以创建和删除新的安全用户,向这些用户授予和回收安全相关的权限,具体参见 3.2.1 节。

数据库审计员(AUDITOR)

我们可以想象一下,某个企业内部 DBA 非常熟悉公司内部 ERP 系统的数据库设计,该系统包括了员工工资表,里面记录了所有员工的工资,公司的出纳通过查询系统内部员工工资表来发放工资。传统的 DBA 集所有权利于一身,可以很容易修改工资表,从而导致公司工资账务错乱。为了预防该问题,可以采用前面数据库安全员制定安全策略的方法,避免 DBA 或者其他数据库用户具有访问该表的权限。为了能够及时找到 DBA 或者其他用户的非法操作,在 DM 数据库中还可以在系统建设初期,由数据库审计员(SYSAUDITOR 或者其他由 SYSAUDITOR 创建的审计员)来设置审计策略(包括审计对象和操作),在需要时,数据库审计员可以查看审计记录,及时分析并查找出幕后真凶。

从上面的介绍中我们也可以看出,在 DM 数据库中,审计员的主要职责就是创建和删除数据库审计员,设置/取消对数据库对象和操作的审计设置,查看和分析审计记录等。

数据库对象操作员(DBO)

数据库对象操作员是“四权分立”新增加的一类用户,可以创建数据库对象,并对自己拥有的数据库对象(表、视图、存储过程、序列、包、外部链接等)具有所有的对象权限并可以授出与回收,但其无法管理与维护数据库对象。

2.2 如何创建用户

数据库系统在运行的过程中,往往需要根据实际需求创建用户,然后为用户指定适当的权限。创建用户的操作一般只能由系统预设用户 SYSDBA、SYSSSO 和 SYSAUDITOR 完成,如果普通用户需要创建用户,必须具有 CREATE USER 的数据库权限。

使用 MANAGER 执行 CREATE USER 语句创建的用户会同时具备 SVI(此时 SVI 属于 PUBLIC)和 VTI 角色权限。使用 DIsql 执行 CREATE USER 语句创建的用户只具备 SVI 角色权限。CREATE USER 语句创建的用户无 SOI 权限,如果想让这些用户能够查看系统表,还需要额外授予 SOI 权限。CREATE USER 创建的新用户不具备 SOI 权限。

2.2.1 创建用户

创建用户的命令是 CREATE USER,创建用户所涉及的内容包括为用户指定用户名、认证模式、口令、口令策略、只读属性以及资源限制等。其中用户名是代表用户账号的标识符,长度为 1~128 个字符。用户名可以用双引号括起来,也可以不用,但如果用户名以数字开头,必须用双引号括起来。

在 DM 中使用 CREATE USER 语句创建用户,具体的语法格式如下:

CREATE USER <用户名> IDENTIFIED <身份验证模式>  [PASSWORD_POLICY <口令策略>][<锁定子句>][<存储加密密钥>][<只读标志>][<资源限制子句>][<密码过期子句>][<允许IP子句>][<禁止IP子句>][<允许时间子句>][<禁止时间子句>][<TABLESPACE子句>][<INDEX_TABLESPACE子句>][<表空间配额子句>];
<身份验证模式> ::= 
	<数据库身份验证模式>|
	<外部身份验证模式>
<数据库身份验证模式> ::= BY <口令> [<散列选项>]
<散列选项> ::= HASH WITH [<密码引擎名>.]<散列算法> [<加盐选项>]
<加盐选项> ::= [NO] SALT
<外部身份验证模式> ::= 
	EXTERNALLY | 
	EXTERNALLY AS <用户DN>
<口令策略> ::= 口令策略项的任意组合
<锁定子句> ::= 
	ACCOUNT LOCK | 
	ACCOUNT UNLOCK
<存储加密密钥> ::= ENCRYPT BY <口令>
<只读标志> ::= [NOT] READ ONLY
<资源限制子句> ::= 
	DROP PROFILE | 
	PROFILE <profile名> | 
	LIMIT <资源设置>
<资源设置> ::= 
	<资源设置项>{,<资源设置项>} | 
	<资源设置项>{ <资源设置项>}
<资源设置项> ::= 
	SESSION_PER_USER <参数设置> |
	CONNECT_IDLE_TIME <参数设置> |
	CONNECT_TIME <参数设置> |
	CPU_PER_CALL <参数设置> |
	CPU_PER_SESSION <参数设置> |
	MEM_SPACE <参数设置> |
	READ_PER_CALL <参数设置> |
	READ_PER_SESSION <参数设置> |
	FAILED_LOGIN_ATTEMPTS <参数设置> |
	PASSWORD_LIFE_TIME <参数设置> | 
	PASSWORD_REUSE_TIME <参数设置> |
	PASSWORD_REUSE_MAX <参数设置> |
	PASSWORD_LOCK_TIME <参数设置> |
	PASSWORD_GRACE_TIME <参数设置>
<参数设置> ::=
	<参数值>| 
	UNLIMITED| 
	DEFAULT
<密码过期子句> ::= PASSWORD EXPIRE 
<允许IP子句> ::= 
	ALLOW_IP NULL |
	ALLOW_IP <IP项>{,<IP项>}
<禁止IP子句> ::= 
	NOT_ALLOW_IP NULL |
	NOT_ALLOW_IP <IP项>{,<IP项>}
<IP项> ::= 
	<具体IP>|
	<网段>
<允许时间子句> ::= ALLOW_DATETIME <时间项>{,<时间项>}
<禁止时间子句> ::= NOT_ALLOW_DATETIME <时间项>{,<时间项>}
<时间项> ::= 
	<具体时间段> | 
	<规则时间段>
<具体时间段> ::= <具体日期> <具体时间> TO <具体日期> <具体时间>
<规则时间段> ::= <规则时间标志> <具体时间> TO <规则时间标志> <具体时间> 
<规则时间标志> ::= 
	MON | 
	TUE | 
	WED | 
	THURS | 
	FRI | 
	SAT | 
	SUN
<TABLESPACE子句> ::= DEFAULT TABLESPACE <表空间名> 
<INDEX_TABLESPACE子句> ::= DEFAULT INDEX TABLESPACE <表空间名>
<表空间配额子句> ::= 
	QUOTA UNLIMITED |
	QUOTA 0 |
	QUOTA <配额大小> ON <表空间名>{ QUOTA <配额大小> ON <表空间名>}
<配额大小> ::= 
	UNLIMITED |
	<空间大小>[K|M|G|T]
注意

外部身份验证仅在DM安全版本中才提供支持。

资源限制子句将在第 9 章进行详细介绍。

例 创建用户名为 BOOKSHOP_USER、口令为 BOOKSHOP_PASSWORD、会话超时为 3 分钟的用户。

CREATE USER BOOKSHOP_USER IDENTIFIED BY BOOKSHOP_PASSWORD LIMIT CONNECT_TIME 3;

2.2.2 口令策略

用户口令最长为 48 字节,创建用户语句中的 PASSWORD POLICY 子句用来指定该用户的口令策略,系统支持的口令策略有:

  • 0 无限制。但总长度不得超过 48 个字节
  • 1 禁止与用户名相同
  • 2 口令长度需大于等于 INI 参数 PWD_MIN_LEN 设置的值
  • 4 至少包含一个大写字母(A-Z)
  • 8 至少包含一个数字(0-9)
  • 16 至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号)

口令策略可单独应用,也可组合应用。组合应用时,如需要应用策略 2 和 4,则设置口令策略为 2+4=6 即可。

除了在创建用户语句中指定该用户的口令策略,DM 的 INI 参数 PWD_POLICY 可以指定系统的默认口令策略,其参数值的设置规则与 PASSWORD_POLICY < 口令策略 > 子句一致,缺省值为 2。若在创建用户时没有使用 PASSWORD_POLICY < 口令策略 > 子句指定用户的口令策略,则使用系统的默认口令策略。

系统管理员可通过查询 V$PARAMETER 动态视图查询 PWD_POLICY 的当前值。

SELECT * FROM V$PARAMETER WHERE NAME= 'PWD_POLICY';

也可以通过使用客户端工具 Console 或调用系统过程 SP_SET_PARA_VALUE 重新设置 PWD_POLICY 的值。

使用客户端工具 Console

DBA 用户在 DM 控制台 Console 工具中,配置 DM 数据库的 PWD_POLICY 参数值,如下图所示。

使用 Console 工具配置 PWD_POLICY

图2.1 使用Console工具配置PWD_POLICY

需要注意的是,Console 为脱机工具,对参数值的修改通过修改 dm.ini 文件中的参数值来进行,无论参数类型是静态还是动态,都需要重启 DM 服务器才能使新设置的参数值生效。

使用系统过程

DBA 用户也可以使用系统过程 SP_SET_PARA_VALUE 来配置 PWD_POLICY 参数值,关于 SP_SET_PARA_VALUE 的详细介绍请参考《DM8_SQL 语言使用手册》。

例 将 PWD_POLICY 置为 8,同时修改文件和内存参数,由于 PWD_POLICY 为动态 INI 参数,这样设置后新的参数值可以立即生效。

SP_SET_PARA_VALUE(1, 'PWD_POLICY',8);
建议

DM的INI参数都可以通过上述使用客户端工具Console或调用系统过程SP_SET_PARA_VALUE/SP_SET_PARA_DOUBLE_VALUE/ SP_SET_PARA_STRING_VALUE的方法来进行设置,后续不再具体描述。

2.3 用户身份验证模式

DM 提供数据库身份验证模式和外部身份验证模式来保护对数据库访问的安全。数据库身份验证模式需要利用数据库口令,即在创建或修改用户时指定用户口令,用户在登录时输入对应口令进行身份验证;外部身份验证模式支持基于操作系统(OS)的身份验证、LDAP 身份验证和 KERBEROS 身份验证。

2.3.1 基于操作系统的身份验证

基于 OS 的身份验证分为本机验证和远程验证,本机验证需要将 DM 配置文件 dm.ini 的 ENABLE_LOCAL_OSAUTH 参数设置为 1(缺省为 0);而远程验证需要将 DM 配置文件 dm.ini 的 ENABLE_REMOTE_OSAUTH 参数设置为 1(缺省为 0),表示支持远程验证,同时还要将 dm.ini 的 ENABLE_ENCRYPT 参数设置为 1(缺省为 0),表示采用 SSL 安全连接。这三个参数均为静态参数,数据库管理员可以使用系统过程 SP_SET_PARA_VALUE 进行修改,但修改后需要重新启动 DM 服务器才能生效。

基于 OS 的身份验证需要首先将操作系统用户加入到操作系统的 dmdba|dmsso|dmauditor 用户组,分别对应数据库的 SYSDBA|SYSSSO|SYSAUDITOR 用户。也可以将操作系统用户加入到操作系统的 dmusers 用户组来进行基于 OS 的身份验证,对应数据库的同名用户,即此时数据库中需要存在一个与操作系统用户同名的用户。

例如,若当前操作系统用户名为 dameng,则 dameng 基于 OS 的身份验证登录数据库的操作步骤如下:

  1. 在数据库中创建一个操作系统的同名用户,并修改相关参数。
SQL> CREATE USER dameng IDENTIFIED BY "dameng12345";

SQL> SP_SET_PARA_VALUE(2,'ENABLE_LOCAL_OSAUTH',1);

SQL> COMMIT;

重新启动数据库服务器,使 INI 参数生效。

  1. 在操作系统中创建 dmusers 用户组,并将操作系统用户 dameng 添加到 dmusers 用户组。

Windows 操作系统下,以管理员身份运行命令提示符工具并执行以下命令:

C:\Windows\system32>net localgroup dmusers /add

C:\Windows\system32>net localgroup dmusers dameng /add

Linux 操作系统下:

[dameng@test163 ~]$ sudo groupadd dmusers

[dameng@test163 ~]$ sudo usermod -G dmusers dameng
  1. 操作系统用户 dameng 基于 OS 的身份验证登录数据库。

以 Windows 操作系统为例:

D:\dmdbms\bin>disql.exe /@localhost:5236 as users
注意

基于操作系统的身份验证仅在DM安全版本中才提供支持。

DM 的 disql、dmfldr、dmdbg、dexp 和 dimp 等工具都支持基于操作系统的身份验证登录,具体登录方式可查看各工具操作手册。

2.3.2 LDAP 身份验证

DM 提供对 LDAP 的支持,主要利用 LDAP 服务器存储的账户数据信息,验证账户是否是数据库的合法用户。我们假定企业已经部署了 LDAP 服务器和 CA 服务器(或者花钱购买了证书认证)。

要使用 LDAP 身份验证,首先要在 DM 配置文件 dm.ini 中添加参数 LDAP_HOST。此参数为 LDAP 数据源所在机器的主库名,假如主库名为 ldapserver.dameng.org,则 LDAP_HOST = ldapserver.dameng.org。

LDAP 身份验证创建用户的语法如下:

CREATE USER <用户名>IDENTIFIED EXTERNALLY AS <用户DN> ......;
建议

“......”表示2.2节中创建用户语法从“<锁定子句>”开始往后的语法部分。

语法中的“用户 DN”指 LDAP 数据源中用户 DN,可以唯一标识每一个用户。

例如,如果域名为 dameng.org,若以 Administrator 用户登录,按 DN 规范书写则 certificate_dn 为 cn=Administrator,cn=users,dc=dameng,dc=org。则创建用户语法可以写为:

Windows 操作系统下:

CREATE USER USER01 IDENTIFIED EXTERNALLY AS 'cn=Administrator,cn=users,
dc=dameng,dc=org';

Linux 操作系统下:

CREATE USER USER01 IDENTIFIED EXTERNALLY AS 'cn=root, dc=dameng,dc=org';

当用户使用 DM 客户端或接口登录 DM 数据库时,将用户名写为“/username”的形式,则表示以 LDAP 验证方式进行登录,登录密码为 LDAP 数据源中创建用户时使用的密码。

2.3.3 KERBEROS 身份验证

KERBEROS 是为 TCP/IP 网络系统设计的可信的第三方认证协议,DM 支持 KERBEROS 身份验证。我们假设用户已经正确配置了 KERBEROS 使用环境。

KERBEROS 身份验证创建用户的语法如下:

CREATE USER <用户名>IDENTIFIED EXTERNALLY ......;
建议

“......”表示2.2节中创建用户语法从“<锁定子句>”开始往后的语法部分。

当用户使用 DM 客户端或接口登录 DM 数据库时,将用户名写为“///username”的形式,则表示以 KERBEROS 验证方式进行登录,不需要输入密码。

2.3.4 UKEY 身份验证

DM 支持 UKEY 身份验证,通过 INI 参数 CLIENT_UKEY 进行 UKEY 验证设置,缺省值为 0:

0:支持所有登录方式,是否采用 UKEY 验证由客户端驱动。当客户端输入 UKEY 名称和 UKEY_PIN 则采用 UKEY 验证,否则不使用 UKEY 验证;

1:客户端强制使用 UKEY 验证。

使用 UKEY 身份验证需要按照 8.1 节的介绍编写动态库,具体请参考 8.3 节的介绍。

2.4 如何修改用户信息

为了防止不法之徒盗取用户的口令,用户应该经常改变自己的口令。用户的口令不应该是类似 12345,abcdef 这样简单的字符串,更不要指定为自己的生日或姓名,也不要指定为一个英文单词,因为这样的口令很容易被破解。一个好的口令应该包含大小写字母、数字、特殊符号在内的混合字符串。统计表明,一个口令中包含的成分越复杂,就越难破译。

修改用户口令的操作一般由用户自己完成,SYSDBA、SYSSSO、SYSAUDITOR 可以无条件修改同类型的用户的口令。普通用户只能修改自己的口令,如果需要修改其他用户的口令,必须具有 ALTER USER 数据库权限。修改用户口令时,口令策略应符合创建该用户时指定的口令策略。

注意

具有ALTER USER权限的用户可以修改包括管理员在内的所有用户的口令和用户资源限制,因此对ALTER USER权限的授予应慎之又慎。

使用 ALTER USER 语句可修改用户口令。除口令外,这个语句还可以修改用户的口令策略、空间限制、只读属性以及资源限制等。

ALTER USER 的语法与创建用户的语法极为相似,具体语法格式如下:

ALTER USER <用户名> [<修改用户子句>] | [<用户代理功能子句>];
<修改用户子句> ::= [IDENTIFIED <身份验证模式>] [PASSWORD_POLICY <口令策略>] [<锁定子句>] [<存储加密密钥>] [<只读标志>][<资源限制子句>][<密码过期子句>] [<允许IP子句>][<禁止IP子句>][<允许时间子句>][<禁止时间子句>][<TABLESPACE子句>][<INDEX_TABLESPACE子句>][<SCHEMA子句>][<表空间配额子句>]
<SCHEMA子句> ::= ON SCHEMA <模式名>
<用户代理功能子句> ::= <GRANT | REVOKE> CONNECT THROUGH <代理用户名>

< 修改用户子句 > 中的 <SCHEMA 子句 > 用于设置用户的缺省模式,其余子句的具体语法格式请参考 2.2.1 创建用户

< 用户代理功能子句 > 用于赋予用户 B 能够以代理的身份认证登录用户 A 的权限,即 CONNECT THROUGH 权限。其中,用户 B 表示参数 < 代理用户名 > 指定的用户,用户 A 表示参数 < 用户名 > 指定的用户。关键字 GRANT 表示赋予权限,关键字 REVOKE 表示收回权限。

例 下面的语句修改用户 BOOKSHOP_USER 的只读属性为只读。

ALTER USER BOOKSHOP_USER READ ONLY;
注意

不论DM的INI参数DDL_AUTO_COMMIT设置为自动提交还是非自动提交,ALTER USER操作都会被自动提交。

2.5 如何删除用户

当一个用户不再需要访问数据库系统时,应将这个用户及时地从数据库中删除,否则可能会有安全隐患。

删除用户的操作一般由 SYSDBA、SYSSSO、SYSAUDITOR 完成,他们可以删除同类型的其他用户。普通用户要删除其他用户,需要具有 DROP
USER 权限。

使用 DROP USER 语句删除语句,语法格式为:

DROP USER [IF EXISTS] <用户名> [RESTRICT | CASCADE];

一个用户被删除后,这个用户本身的信息,以及它所拥有的数据库对象的信息都将从数据字典中被删除。

指定 IF EXISTS 关键字后,删除不存在的用户时不会报错,否则会报错。

如果在删除用户时未使用 CASCADE 选项(缺省使用 RESTRICT 选项),若该用户建立了数据库对象,DM 将返回错误信息,而不删除此用户。

如果在删除用户时使用了 CASCADE 选项,除数据库中该用户及其创建的所有对象被删除外,若其他用户创建的对象引用了该用户的对象,DM 还将自动删除相应的引用完整性约束及依赖关系。

例 假设用户 BOOKSHOP_USER 建立了自己的表或其他数据库对象,执行下面的语句:

DROP USER BOOKSHOP_USER;

将提示错误信息“试图删除被依赖对象[BOOKSHOP_USER]”。

下面的语句则能成功执行,会将 BOOKSHOP_USER 所建立的数据库对象一并删除。

DROP USER BOOKSHOP_USER CASCADE;
注意

正在使用中的用户可以被其他具有DROP USER权限的用户删除,被删除的用户继续做操作或尝试重新连接数据库会报错。

微信扫码
分享文档
扫一扫
联系客服