为了避免用户登录数据库时直接接触数据库登录密码,DM 提供了一种登录用户名密码外部存储方式,系统管理员可将用户名和密码存储在外部加密的密码文件(wallet 文件)中,用户登录数据库时只需提供配置好的服务名便可成功登录数据库。
具体实现分为两步:一是创建 wallet 文件,用于存储服务名、用户名和登录密码。二是配置 dm_svc.conf 文件,设置 wallet 文件路径以及服务名对应的数据库连接地址(IP 和 PORT)。配置完成后用户便可直接通过服务名成功登录数据库。
以上数据库登录方式存在以下限制:
- LOGIN 命令不支持利用 wallet 文件登录数据库
- DM 管理工具和 JDBC 不支持利用 wallet 文件登录数据库
DM 提供了一个数据库密码管理工具 dmmkstore,系统管理员可通过 dmmkstore 工具创建、访问或修改 wallet 文件。
12.1 dmmkstore 工具的使用
dmmkstore 是 DM 数据库密码管理工具。系统管理员可以通过 dmmkstore 工具创建、访问或修改 wallet 文件,wallet 文件中存储有数据库登录信息。支持跨平台或跨编码下发 wallet 文件。
数据库登录信息在 wallet 文件中以凭据(credential)的格式存储。每个凭据包含三个条目(entry):服务名、用户名、密码。系统管理员可以利用 dmmkstore 工具增加、删除或修改 wallet 文件中的凭据。
12.1.1 启动 dmmkstore
安装好 DM 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmmkstore 执行文件。
启动操作系统的命令行窗口,进入 dmmkstore 所在目录,可以准备启动 dmmkstore 工具了。
dmmkstore 的使用需要指定必要的参数。为 dmmkstore 指定参数的格式为:
dmmkstore -wrl <wallet_location> {keyword [<value>]}
或
dmmkstore -help
-wrl:指定 wallet 文件路径。
keyword:参数关键字。关键字不区分大小写,多个参数之间使用空格间隔。
<value>:参数取值。参数关键字与参数取值之间使用空格间隔。
-help:显示帮助信息。
例如:
在/home/test/dmdbms/wallet 目录下创建一个 wallet 文件,文件密码为 Wallet_123。
./dmmkstore -wrl /home/test/dmdbms/wallet -create
输入口令: Wallet_123
再次输入口令: Wallet_123
如果创建成功,则/home/test/dmdbms/wallet 目录下会生成一个加密的 dmwallet.prikey 文件。
在 wallet 文件中创建凭据:
./dmmkstore -wrl /home/test/dmdbms/wallet -createCredential dm_user01 USER01 USER01_psd
输入 Wallet 口令: Wallet_123
Create credential DM.security.client.connect_string1
查看 wallet 文件中的凭据:
./dmmkstore -wrl /home/test/dmdbms/wallet -listCredential
输入 Wallet 口令: Wallet_123
List credential (index: connect_string username)
1: dm_user01 USER01
12.1.2 查看 dmmkstore 参数
dmmkstore 使用较为灵活,参数较多。用户可使用“-help”命令快速查看 dmmkstore 版本信息以及各参数信息。
./dmmkstore -help
DM Secret Store Tool: V8
version: 05134284311-20240822-240257-10000
dmmkstore [-wrl wrl] [-create] [-list] [-viewEntry alias] [-modifyEntry alias secret] [-createCredential connect_string username password] [-listCredential] [-modifyCredential connect_string username password] [-deleteCredential connect_string] [-cipherName name] [-hashName name] [-help]
12.1.3 dmmkstore 参数详解
下面将详细介绍 dmmkstore 工具各参数的功能以及使用方法。
12.1.3.1 -wrl
指定 wallet 文件路径。
语法如下:
dmmkstore -wrl <wallet_location>
<wallet_location>:wallet 文件路径。
该参数单独使用时无任何实际效果,必须搭配 dmmkstore 工具的其他参数(除-help 参数)一起使用。
当-wrl 参数与其他参数一起使用时,-wrl 参数必须作为第一个参数,否则报错。
12.1.3.2 -create
创建 wallet 文件。
语法如下:
dmmkstore -wrl <wallet_location> -create
创建 wallet 文件时,需要指定 wallet 文件的密码,该密码长度范围为 9~48,并且必须同时包含大写字母、小写字母、数字以及特殊字符。
创建成功后将在 <wallet_location> 指定路径下生成一个加密的 dmwallet.prikey 文件。若指定路径下已存在 dmwallet.prikey 文件,则报错。
例 在/home/test/dmdbms/wallet 目录下创建一个 wallet 文件,文件密码为 Wallet_123。
./dmmkstore -wrl /home/test/dmdbms/wallet -create
输入口令: Wallet_123
再次输入口令: Wallet_123
12.1.3.3 -createCredential
在 wallet 文件中创建凭据。
语法如下:
dmmkstore -wrl <wallet_location> -createCredential <server_name> <username> <password>
<server_name>:服务名。必须与 dm_svc.conf 文件中配置的服务名相匹配。
<username>:用户名。
<password>:密码。
若 wallet 文件中已存在服务名相同的凭据,则报错。
wallet 文件最大为 64M,若创建凭据时 wallet 文件大小超过 64M,则报错。
注意由于修改wallet文件过程中可能发生错误导致wallet文件受到损坏,因此修改wallet文件之前系统会自动在wallet文件路径下生成一个备份文件dmwallet.prikey.bak,若wallet文件修改失败,用户可以利用备份文件手动恢复wallet文件;若wallet文件修改成功,则系统自动删除备份文件。
例 在 wallet 文件中创建凭据,服务名为 dm_user01,用户名为 USER01,登录密码为 USER01_psd。
./dmmkstore -wrl /home/test/dmdbms/wallet -createCredential dm_user01 USER01 USER01_psd
12.1.3.4 -listCredential
显示 wallet 文件中的凭据。
语法如下:
dmmkstore -wrl <wallet_location> -listCredential
执行结果中会显示凭据的序号、服务名、用户名。
例如:
查看/home/test/dmdbms/wallet 路径下 wallet 文件中的凭据。
./dmmkstore -wrl /home/test/dmdbms/wallet -listCredential
输入 Wallet 口令: Wallet_123
List credential (index: connect_string username)
1: dm_user01 USER01
12.1.3.5 -modifyCredential
修改 wallet 文件中指定凭据的用户名和密码。
语法如下:
dmmkstore -wrl <wallet_location> -modifyCredential <server_name> <username> <password>
<server_name>:待修改凭据的服务名。
<username>:修改后的用户名。
<password>:修改后的密码。
若 wallet 文件中不存在服务名为 <server_name> 的凭据,则报错。
例 将 wallet 文件中服务名为 dm_user01 的凭据的用户名改为 SYSDBA,密码改为 DMdba_123。
./dmmkstore -wrl /home/test/dmdbms/wallet -modifyCredential dm_user01 SYSDBA DMdba_123
输入 Wallet 口令: Wallet_123
Modify credential
Modify 1
12.1.3.6 -deleteCredential
删除 wallet 文件中指定的凭据。
语法如下:
dmmkstore -wrl <wallet_location> -deleteCredential <server_name>
<server_name>:待删除凭据的服务名。
若 wallet 文件中不存在服务名为 <server_name> 的凭据,则报错。
例如:
删除 wallet 文件中服务名为 dm_user01 的凭据。
./dmmkstore -wrl /home/test/dmdbms/wallet -deleteCredential dm_user01
输入 Wallet 口令: Wallet_123
Delete credential
Delete 1
12.1.3.7 -list
显示 wallet 文件中所有凭据条目的别名。
语法如下:
dmmkstore -wrl <wallet_location> -list
凭据中各条目的别名如下表所示:
条目 | 别名 |
---|---|
服务名 | DM.security.client.connect_string%d |
用户名 | DM.security.client.username%d |
密码 | DM.security.client.password%d |
其中,%d 表示该条目所在凭据的序号。
例如:
查看 wallet 文件中的所有凭据。
./dmmkstore -wrl /home/test/dmdbms/wallet -listCredential
输入 Wallet 口令: Wallet_123
List credential (index: connect_string username)
1: dm_user01 USER01
2: dm_admin SYSDBA
可以看到,此时 wallet 文件中共有两条凭据,服务名分别为 dm_user01 和 dm_admin,凭据序号分别为 1 和 2。
查看 wallet 文件中所有凭据条目的别名。
./dmmkstore -wrl /home/test/dmdbms/wallet -list
输入 Wallet 口令: Wallet_123
DM 密钥存储条目:
DM.security.client.connect_string1
DM.security.client.connect_string2
DM.security.client.password1
DM.security.client.password2
DM.security.client.username1
DM.security.client.username2
12.1.3.8 -viewEntry
显示凭据中指定条目的值。
语法如下:
dmmkstore -wrl <wallet_location> -viewEntry <alias>
<alias>:指定条目的别名。条目别名不区分大小写,关于条目别名的详细介绍请参考 12.1.3.7 -list 。
若指定的条目为密码,则将以明文形式显示密码。
若指定的条目不存在,则报错。
例如:
查看别名为 DM.security.client.password1 的条目的值。
./dmmkstore -wrl /home/test/dmdbms/wallet -viewEntry DM.security.client.password1
输入 Wallet 口令: Wallet_123
DM.security.client.password1 = USER01_psd
12.1.3.9 -modifyEntry
修改凭据中指定条目的值。
语法如下:
dmmkstore -wrl <wallet_location> -modifyEntry <alias> <value>
<alias>:指定条目的别名。条目别名不区分大小写,关于条目别名的详细介绍请参考 12.1.3.7 -list 。
<value>:修改后条目的值。
若指定的条目不存在,则报错。
例如:
将别名为 DM.security.client.password1 的条目的值修改为“USER01_newpsd”。
./dmmkstore -wrl /home/test/dmdbms/wallet -modifyEntry DM.security.client.password1 USER01_newpsd
输入 Wallet 口令: Wallet_123
查看别名为 DM.security.client.password1 的条目的值。
./dmmkstore -wrl /home/test/dmdbms/wallet -viewEntry DM.security.client.password1
输入 Wallet 口令: Wallet_123
DM.security.client.password1 = USER01_newpsd
12.1.3.10 -cipherName
设置加密算法。
语法如下:
dmmkstore -wrl <wallet_location> -cipherName <cipher_name> -create
<cipher_name>:加密算法名称。默认使用 DESEDE_CFB 加密算法。
参数-cipherName 和-create 必须一起使用,且-cipherName 必须位于-create 的前面。
若-cipherName 参数指定的不是加密算法,或指定的加密算法为 NOPAD/EXTKEY 工作模式,则报错。
例如:
指定使用 AES256_CFB 加密算法创建 wallet 文件。
./dmmkstore -wrl /home/test/dmdbms/wallet -cipherName AES256_CFB -create
输入口令: Wallet_123
再次输入口令: Wallet_123
12.1.3.11 -hashName
设置杂凑算法(哈希算法)。
语法如下:
dmmkstore -wrl <wallet_location> -hashName <hash_name> -create
<hash_name>:杂凑算法名称。默认使用 SHA512 杂凑算法。
参数-hashName 和-create 必须一起使用,且-hashName 必须位于-create 的前面。
若-hashName 参数指定的不是杂凑算法,则报错。
例如:
指定使用 SHA512 杂凑算法创建 wallet 文件。
./dmmkstore -wrl /home/test/dmdbms/wallet -hashName SHA512 -create
输入口令: Wallet_123
再次输入口令: Wallet_123
12.1.3.12 -help
显示帮助信息。
语法如下:
dmmkstore -help
12.2 dm_svc.conf 文件配置
使用全局配置项 WALLET_LOCATION 指定 wallet 文件所在路径,并配置服务名对应的数据库连接地址(IP 和 PORT)。仅当全局配置项 WALLET_LOCATION 非空时,才可通过 wallet 文件登录数据库。
12.3 应用实例
下面列出一个完整的 dmmkstore 工具应用实例以供参考。
- 用户准备
数据库中新建用户 user01 和 user02。
CREATE USER USER01 IDENTIFIED BY "USER01_psd";
CREATE USER USER02 IDENTIFIED BY "USER02_psd";
COMMIT;
- 配置 dm_svc.conf 文件
dm_svc.conf 文件中的配置内容如下:
WALLET_LOCATION=(/home/test/dmdbms/wallet)
dm_user01=(192.168.100.163:5254)
dm_user02=(192.168.100.163:5254)
- 创建 wallet 文件
在/home/test/dmdbms/wallet 路径下创建一个 wallet 文件,文件密码为 Wallet_123。
./dmmkstore -wrl /home/test/dmdbms/wallet -create
输入口令: Wallet_123
再次输入口令: Wallet_123
- 创建凭据
在 wallet 文件中创建两条凭据,服务名分别为 dm_user01 和 dm_user02。
./dmmkstore -wrl /home/test/dmdbms/wallet -createCredential dm_user01 USER01 USER01_psd
输入 Wallet 口令: Wallet_123
Create credential DM.security.client.connect_string1
./dmmkstore -wrl /home/test/dmdbms/wallet -createCredential dm_user02 USER02 USER02_psd
输入 Wallet 口令: Wallet_123
Create credential DM.security.client.connect_string2
- 查看凭据
查看 wallet 文件中的凭据。
./dmmkstore -wrl /home/test/dmdbms/wallet -listCredential
输入 Wallet 口令: Wallet_123
List credential (index: connect_string username)
1: dm_user01 USER01
2: dm_user02 USER02
- 使用客户端工具连接数据库
disql 客户端工具通过 dm_user01 服务名登录数据库。
./disql /@dm_user01
服务器[192.168.100.163:5254]:处于普通打开状态
登录使用时间 : 9.232(ms)
disql V8
SQL> SELECT USER();
行号 USER()
---------- ------
1 USER01
关于各客户端工具登录数据库方法的详细介绍请参考各客户端工具使用手册。
12.4 dmmkstore 错误码汇编
运行 DM 数据库密码管理工具 dmmkstore 时,可能会就使用过程中的一些错误进行报错提示。
代码 | 解释 |
---|---|
-86500 | 未指定 wallet 文件的位置 |
-86501 | 命令无效 |
-86502 | 命令中缺少参数 |
-86503 | 无法创建目录 |
-86504 | 系统找不到指定的路径 |
-86505 | 系统指定的路径过长 |
-86506 | 系统找不到指定的文件 |
-86507 | 系统指定路径下已存在 wallet 文件 |
-86508 | 口令无效 |
-86509 | 口令不匹配 |
-86513 | 内存空间不足 |
-86514 | 写文件失败 |
-86515 | 无法创建文件 |
-86516 | 无法打开文件 |
-86517 | 无法删除文件 |
-86518 | 无法拷贝文件 |
-86519 | 无法截断文件 |
-86520 | 加密模块加载失败 |
-86521 | 生成杂凑值失败 |
-86522 | 杂凑值校验失败 |
-86523 | 加密失败 |
-86524 | 解密失败 |
-86525 | 命令中参数值无效 |
-86526 | 缺少必要命令 |
-86527 | 命令重复 |
-86528 | 无法关闭文件 |
-86529 | 文件校验失败 |
-86530 | 需要检查加密模块 |
-86531 | wallet 文件验证失败 |
-86532 | 凭据已存在 |
-86533 | 凭据不存在 |
-86534 | -cipherName 和-hashName 命令只能在-create 命令之前指定 |
-86535 | wallet 文件最大为 64M |
-86537 | 指定的别名不存在 |
-86538 | 转码失败 |