使用 EFS 保护您的 DB2 文件系统

DB2 AIX 加密

从 AIX 6.1 开始,用户创建的文件系统便可以加密,这种加密是在文件系统级别实现的。此方法允许对一些应用程序进行加密,同时不会增加太多的维护费用。DB2 就是这样一种可用于数据加密的产品。加密应用程序数据的要求变得越来越普遍,尤其是在制作了备份并将其从站点转移时,或者在应用程序位于外部站点上时。SOX 甚至建议为了维护数据的机密性而考虑使用加密。本文将演示如何创建 DB2 数据库并在 AIX 下对其进行加密,还将查看一些常见的 EFS 命令。

David Tansley, 系统管理员, Ace Europe

//ibm.com/developerworks/i/p-dtansley.jpgDavid Tansley 是一位自由作家。他有 15 年 UNIX 系统管理经验,最近 8 年使用 AIX。他喜欢打羽毛球和观赏一级方程式赛车,但是最喜欢与妻子一起开着 GSA 摩托车旅行。


developerWorks 投稿作者

2012 年 1 月 12 日

简介

在本文中,我将使用标准的表空间文件创建一个示例 DB2 数据库。还将演示如何加密存储表空间文件,在此过程中,将介绍一些 EFS 命令。

实际上,加密的工作原理是这样的:一个用户生成一个密钥,该密钥保存在一个密钥库中,这个密钥用于加密文件。文件只能由密钥的所有者访问,除非所有者单独或以分组形式为其他人提供了访问文件的权限。当另一个用户尝试访问文件时,系统会检查和验证该用户的密钥。如果用户通过验证,则会授予用户访问权限,否则会决绝访问。文件的解密会执行一种类似的操作。密钥保存在一个密钥库中,该密钥库受用户自己的密钥库密码保护。

当 EFS 在默认的管理员模式下运行时,root 用户能够访问所有用户和组密钥库。

客户端机器上没有保存任何密钥,密钥的保存全部在 AIX 主机上完成。您可以通过使用 lsuser 命令查看用户的用户属性,确定用户是否适合使用 EFS(加密文件系统):

# lsuser aixdev
aixdev id=206 pgrp=db2grp1 groups=db2grp1,staff home=/home/aixdev shell=/usr/bin
…
...
pwdchecks= dictionlist= default_roles= efs_initialks_mode=admin efs_key
store_algo=RSA_1024 efs_keystore_access=file efs_adminks_access=file efs_allowks
modechangebyuser=true efs_file_algo=AES_128_CBC fsize=2097151 cpu=-1 data=262144
 stack=65536 core=2097151 rss=65536 nofiles=2000 time_last_login=1306170057 time
_last_unsuccessful_login=1306070798 tty_last_login= tty_last_unsuccessful_login=
/dev/pts/0 host_last_login=rs6000 host_last_unsuccessful_login=honeysuckle 
unsuccessful_login_count=0 roles=

关于 EFS 的详细信息,请参阅 参考资料 一节。

用户密钥保存在位于以下位置的密钥库中:

 # pwd
/var/efs/users
# ls
.lock     alpha     db2fenc1  echo      root      zulu
aixdev    dasusr1   dxtans    oscar     xray	  insadm

组密钥密钥库位于:

# pwd
/var/efs/groups
# ls
.lock     audit     cron      db2fgrp1  lp        staff     sys       
app1      bin       dasadm1   db2grp1   security  syb       system

创建一个示例数据库

让我们创建一个示例数据库,数据将位于加密的文件系统内的表空间中。我使用的数据库系统为 DB2 v9.1。

关于 DB2 和实例所有者属性的信息,请参阅 参考资料 一节。

假设已安装了 DB2 并创建了一个实例。实例(和数据库)的所有者是 aixdev,主要的组为 db2grp1。我们现在将创建 3 个未加密的文件系统(加密在以后完成):

  • /db2/db2data:保存数据库(数据存储)表空间。
  • /db2/db2logs:保存数据库日志。
  • /db2/db2diag:保存对话日志。

创建文件系统

上面提到的文件系统使用以下命令创建:

# crfs -v jfs2 -A yes -g apps_vg -m /db2/db2diag -a size=32M
File system created successfully.
# crfs -v jfs2 -A yes -g apps_vg -m /db2/db2logs -a size=64M
File system created successfully.
# crfs -v jfs2 -A yes -g apps_vg -m /db2/db2data -a size=128M
File system created successfully.

文件系统位于 apps_vg 卷组中。它们使用 auto-mount 选项 on 创建,所以它们会在系统启动时自动挂载。我们需要这么做是因为,DB2 会通过 inittab 自动启动。如果文件系统不存在,数据库中可能发生错误。请注意,我们目前还未启用 EFS。

# mount /db2/db2data
# mount /db2/db2logs
# mount /db2/db2diag
# df -m|grep -w db2
/dev/fslv06       32.00     18.50   43%       18     1% /db2/db2diag
/dev/fslv07      128.00     77.64   40%        5     1% /db2/db2data
/dev/fslv08       64.00     11.53   82%       20     1% /db2/db2logs

设置权限

接下来我们需要设置权限和所有者:

# cd /
# chmod -R 775 /db2
# chown -R aixdev:db2grp1 /db2

我为目录权限使用了 775。我们需要为该组提供此访问权限,因为在某个时刻,一定会创建其他数据库实例,并且它们将使用上述文件系统。这些数据库实例也将使用 db2grp1 作为它们的主要组。在处理应用程序文件更改时,使用组访问权限更有效。

此演示中所有与数据库相关的命令由实例所有者 aixdev 运行,除非另有说明。

$ cd /db2
$ ls -l
total 0
drwxrwxr-x    3 aixdev   db2grp1         256 May 06 19:56 db2data
drwxrwxr-x    4 aixdev   db2grp1         256 May 05 21:08 db2diag
drwxrwxr-x    3 aixdev   db2grp1         256 May 06 19:36 db2logs

创建数据库

使用数据库创建命令,我们要求在 /db2/db2data/mtrbikes 目录中创建表空间文件。这里是创建该目录的方法:

$ id
uid=206(aixdev) gid=204(db2grp1) groups=1(staff)

$ pwd
$ /db2/db2data
$ mkdir mtrbikes

实际的数据库称为 mtrbikes。它包含少量的摩托车数据,这些数据已足够演示使用。默认数据库路径为实例 $HOME/aixdev 目录。

以下命令创建数据库,该命令保存在 create_db 文件中。

$ cat create_db
CREATE DATABASE mtrbikes ON '/home/aixdev'
 CATALOG TABLESPACE  MANAGED BY SYSTEM USING ( '/db2/db2data/mtrbikes/cat_ts' )
 USER TABLESPACE  MANAGED BY SYSTEM USING ( '/db2/db2data/mtrbikes/user_ts' )
 TEMPORARY TABLESPACE  MANAGED BY SYSTEM USING ( '/db2/db2data/mtrbikes/tmp_ts' ) ;

要创建数据库,使用:

$ db2 -tvf create_db
CREATE DATABASE mtrbikes ON '/home/aixdev' CATALOG TABLESPACE  MANAGED BY SYSTEM
 USING ( '/db2/db2data/mtrbikes/syscat_ts' ) USER TABLESPACE  MANAGED BY SYSTEM
USING ( '/db2/db2data/mtrbikes/user_ts' ) TEMPORARY TABLESPACE  MANAGED BY SYSTEM
 USING ( '/db2/db2data/mtrbikes/tmp_ts' )
DB20000I  The CREATE DATABASE command completed successfully.

测试 aixdev 并查看实例所有者能否连接数据库。

$ db2 connect to mtrbikes

   Database Connection Information

 Database server        = DB2/AIX64 9.1.5
 SQL authorization ID   = AIXDEV
 Local database alias   = MTRBIKES

接下来,创建另一个表空间,它将保存我们的摩托车数据。创建的该表空间的大小为 50MB。实际的物理文件称为 mtrbikes1_ts:

$ db2 "create tablespace mtrtblsp_ts managed by database using (file '/db2
/db2data/mtrbikes/mtrbikes1_ts' 50M)";
DB20000I  The SQL command completed successfully.

确认表空间已创建:

$ pwd
/db2/db2data/mtrbikes
$ du -ms *
50.00   mtrbikes1_ts
29.95   syscat_ts
0.0     tmp_ts
0.1     user_ts

现在我们在一个位置拥有了 mtrbikes 数据库的所有表空间,该位置为:

/db2/db2data/mtrbikes

更新 dbm 对话路径项并将对话/错误日志文件指向 /db2/db2diag/aixdev:

$ cd  /db2/db2diag
$ mkdir aixdev 
$ db2 get dbm cfg|grep DIAGPATH
 Diagnostic data directory path               (DIAGPATH) = /home/aixdev/sqllib/db2dump

$ db2 update dbm cfg using  DIAGPATH /db2/db2diag/aixdev
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.

更新 dbm sysadmin 组项,以包含此实例的 DB2 主要组,也就是 db2grp1:

$ db2 get dbm cfg|grep SYSADM
SYSADM group name                        (SYSADM_GROUP) =
$ db2 update dbm cfg using  SYSADM_GROUP db2grp1
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed

对于我们的数据库备份(还原),我们通知 DB2 为一个组提供执行此任务的授权。为此,我们使用 AIX 组 sysmaint,它的唯一的成员是 echo:

$  lsgroup -a users sysmaint
sysmaint users=echo

更新 dbm sysmaint 组项以包含此组:

$   db2 get dbm cfg|grep SYSMAINT
 SYSMAINT group name                    (SYSMAINT_GROUP) =
$ db2 update dbm cfg using  SYSMAINT_GROUP sysmaint
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.

现在对于数据库日志文件,更新 db cfg 日志路径项;日志将保存在 /db2/db2log/mtrbikes 中:

$ cd /db2/db2log
$ mkdir mtrbikes
$ db2 get db cfg for mtrbikes|grep "Path to log files"
 Path to log files   = /home/aixdev/aixdev/N
ODE0000/SQL00001/SQLOGDIR/
$ db2 update db cfg for mtrbikes using NEWLOGPATH /db2/db2logs/mtrbikes
DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.

最后,执行 TCP/IP 设置,以便远程用户能够连接。当创建实例 aixdev 时,实例的 TCP/IP 项会自动附加到 /etc/services,就像这样:

$ grep aixdev /etc/services
DB2_aixdev      60000/tcp
DB2_aixdev_1    60001/tcp
DB2_aixdev_2    60002/tcp
DB2_aixdev_END  60003/tcp

我们需要添加一个端口编号(通常是下一个递增编号),在我们的演示中为 60004。这需要添加 db2c_<instance_name> 项作为后缀。将以下项添加到服务文件中:

db2c_aixdev     60004/tcp

现在可以为实例启用 TCP/IP 了。使用从 /etc/services 获取的 db2c_aixdev 项更新 dbm TCP/IP 项。另外,需要使用 db2set 实用工具为 DB2 环境变量设置一个项:

$ db2 get dbm cfg |grep TCP
 TCP/IP Service name   (SVCENAME) = 
$ db2 "update dbm cfg using SVCENAME db2c_aixdev"
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.

$ db2set DB2COMM=tcpip

现在,您的任务完成了。停止并重新启动实例,使值生效:

$ db2stop force
05/07/2011 15:20:33     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful

$ db2start
05/07/2011 15:20:37     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.

插入一些数据

现在创建了名为 motorbike 的表,create table 语句包含在 cr_table 文件中。该表在我们刚创建的表空间 mtrblsp_ts 上创建。执行此文件的 DB2 命令为 db2 -tvf 命令行实用工具:

$ cat  cr_table
CREATE TABLE motorbike (
makeof Varchar(10),
modelcc Varchar(10),
colour Varchar (20))
in mtrtblsp_ts;

在创建表之前,首先连接数据库:

$ db2 connect to mtrbikes
$ db2 -tvf cr_table
CREATE TABLE motorbike ( makeof Varchar(10), modelcc Varchar(10), colour Varchar
 (20)) in mtrtblsp_ts
DB20000I  The SQL command completed successfully.

接下来,我们将一些值插入到 motorbike 表中。跟以前一样,数据通过一个文件插入,在本演示中,该文件名为 insert_dat:

$ cat insert_dat
insert into aixdev.motorbike values
('bmw','f800 1200','yellow/black'),
('bmw','gs 1200','white/blue'),
('bmw','gsa 1200','grey');

接下来,插入以下值:

$ db2 -tvf insert_dat
insert into aixdev.motorbike values ('bmw','f800 1200','yellow/black'), ('bmw','
gs 1200','white/blue'), ('bmw','gsa 1200','grey')
DB20000I  The SQL command completed successfully.

确认可从数据库读取数据:

$  db2 "select * from motorbike"

MAKEOF     MODELCC    COLOUR
---------- ---------- --------------------
bmw        f800 1200  yellow/black
bmw        gs 1200    white/blue
bmw        gsa 1200   grey

  3 record(s) selected.

确认 mtrtblsp_ts 表空间实际上保存有我们的 motorbike 表。这可通过查询 syscat.tables 来完成,就以下代码所示:

$ db2 "select TABSCHEMA, TABNAME, TBSPACEID, TBSPACE from syscat.tables
  where TBSPACE='MTRTBLSP_TS'";

TABSCHEMA      TABNAME  TBSPACEID TBSPACE
------------------------------------------------
AIXDEV          MOTORBIKE     3 MTRTBLSP_TS

现在我们拥有了 TBSPACEID 值 3,我们可以查询该表空间的位置:

$ db2 list tablespace containers for 3

            Tablespace Containers for Tablespace 3

 Container ID                         = 0
 Name                                 = /db2/db2data/mtrbikes/mtrbikes1_ts
 Type                                 = File

我们现在可以看到,表 motorbike 位于表空间 mtrtblsp_ts 上。

数据库配置到此就完成了。


了解 EFS

在加密我们的 DB2 文件之前,首先让我们通过示例看看一些常见的加密命令。对于加密操作,使用的命令包括:

  • efsenable:管理 EFS 的激活。
  • efsmgr:管理加密和解密。
  • efskeymgr:管理密钥库(密钥)和组。

AIX 使用 AES(高级加密标准)来进行加密。要启用 EFS,在您系统上使用以下命令:

# efsenable -a

当提示时,输入一个密钥库密码。

root 密码和密钥库密码

为了方便管理,可以将您的 root 密码和密钥库密码设置为相同,以保持它们同步。这也适用于在系统上使用他们自己的密钥库密码的普通用户。

密钥库和用户登录密码在操作上是不同的。密钥库密码保护用户自己的密钥库,而密钥库保存用户密钥。

当最初创建一个用户时,会自动为它创建它的密钥库,密钥库密码将与登录密码相同。

要更改您密钥库的密码,可以使用 efskeymgr 命令。在以下示例中,用户 aixdev 更改了他自己的密钥库密码。他首先被提示输入当前的密钥库密码:

$  efskeymgr -n
aixdev's EFS password:
Enter new password for aixdev's keystore:
Enter the same password again:

密钥、密钥、密钥

当用户更改其密钥库密码时,他们仍然能够访问所有他们以前加密的文件。但是,如果密钥库文件被删除或被破坏,或者删除了过时的密钥,这不会出现这种情况。创建一个新密钥库不会解密用户以前加密的文件。对用户和组密钥库进行定期备份是一项必不可少的操作。定期将目录 /var/efs 备份到磁带和磁盘,这样如果发生密钥损坏或意外删除了用户密钥库,可以很快恢复它们。

您在将加密的文件转移到另一个拥有启用了 EFS 的文件系统的主机,并且您希望解密这些文件时,也需要您的密钥库。

以下命令将 user/group/admin 密钥库复制到 /admin 目录:

cp -rp /var/efs/users /admin/users_key$(date +"%d-%b-%y")
cp -rp /var/efs/groups /admin/grp_key$(date +"%d-%b-%y")
cp -rp /var/efs/efs_admin /admin/admin_key$(date +"%d-%b-%y")

要替换被损坏或丢失的以前的密钥库,可以执行以下命令。假设出现问题的用户是 insadm,备份密钥库保存在 /admin/users_key28-May-11 中:

# pwd
/admin/users_key28-May-11/insadm
# ls
.lock     keystore
# cp keystore /var/efs/users/insadm/keystore

用户 insadm 然后注销并再次登录。用户 insadm 现在能够访问他以前加密的文件。

加载并列出您的密钥库

要检查您的密钥库是否已加载并显示您的会话中的密钥,可以使用:

$ id
uid=210(zulu) gid=1(staff)

$ efskeymgr -V
List of keys loaded in the current process:
Key #0:
Kind ..................... User key
 Id (uid / gid) ......... 210
 Type ..................... Private key
 Algorithm ................ RSA_1024
 Validity ................. Key is valid
 Fingerprint .............. 66e34c2d:3687eefb:3e30ee55

在上面的示例中,Kind 属性表示它是一个用户密钥。id 属性是密钥的所有者 (zulu),由以前运行的 id 命令输出可以看出。

如果密钥没有在执行 efskeymgr 时自动加载,这可能是因为用户已从另一个帐户注销,或者您的登录和密钥库密码不同。要手动加载您的密钥,可以使用 efskeymgr 和 “-o” 选项。该命令的格式为:

efskeymgr -o <command>

在通常选择该命令作为 shell 的地方,这可以交互式或使用 “-p” 选项非交互式地完成。在下面的示例中使用了 bash,但您也可以使用 ksh 作为 shell 命令。假设要使用的密码为 zulu123:

 $ efskeymgr -o bash -p zulu123

$ efskeymgr -o bash
zulu's EFS password:

第一个示例在作业是批量或定时的时很有用,您需要自动加载密钥,另一种方法是交互式的。

要列出您当前的密钥库,使用:

$ efskeymgr -v
 Keystore content:
 Keystore owner ............ : uid 210
Keystore mode ............. : admin: managed by EFS
administrator
Password changed last on .. : 05/12/11 at 17:35:59
 Private key:
Algorithm : RSA_1024
 Fingerprint : 66e34c2d:3687eefb:3e30ee55:34f4f4b6:95f76bca
Validity : This key is valid.

用户加密

要加密文件,可以使用 efsmgr 命令。现在让我们演示用户 zulu 如何创建一个文件,然后加密它。此命令的格式为:

efsmgr -e <file_to_encrypt>

首先创建文件 zuluf

$ id
uid=210(zulu) gid=1(staff)
$  echo "My file" > zuluf

现在加密它:

$ efsmgr -e zuluf

确认它已加密。一种测试这一点的方法是使用 ls -Ul 命令查看属性列表中最后一个属性。如果最后一个属性是 “e”,那么文件已加密,就像这样:

$ ls -Ul zuluf
-rw-r--r--e    1 zulu     staff          1392 May 12 17:44 zuluf

当一个文件由所有者加密,并且所有者决定重写该文件的内容时,该文件仍然是加密的。

接下来,让我们卡纳可能用户 xray 是否可以查看该文件:

$ id
uid=209(xray) gid=208(appgrp) groups=1(staff)

我们可以从 id 命令中看到,用户 xray 和 zulu 都属于组成员,文件 zuluf 拥有针对组和其他人员的读权限。

$ cat zuluf
cat: 0652-050 Cannot open zuluf.

用户 xray 无法看到由用户 zulu 加密的文件。

允许和共享用户密钥访问

用户 xray 要查看该文件,用户 zulu 需要添加对该文件的访问权限,以允许用户 xray 查看它。也可以为组授予访问权限。允许用户访问的格式为:

efsmgr -a <filename_to_access> -u <user_list>:
$  efsmgr -a zuluf -u xray

现在,如果我们列出该文件的加密细节,我们应该看到用户 xray 将拥有访问权限:

$ id
uid=210(zulu) gid=1(staff)

$ efsmgr -l zuluf
EFS File information:
 Algorithm: AES_128_CBC
List of keys that can open the file:
 Key #1:
  Algorithm       : RSA_1024
  Who             : uid 209
  Key fingerprint : 3975781d:52056f10:d86aa005:57e24f27:daa20bab
 Key #2:
  Algorithm       : RSA_1024
  Who             : uid 210
  Key fingerprint : 66e34c2d:3687eefb:3e30ee55:34f4f4b6:95f76bca

从前面的 efsmgr 输出,我们现在可以看到文件 zuluf,它具有 zulu 的密钥,但也能看到其 uid 为 209 的用户,它是用户 xray,也具有访问权限。

要确认用户 xray 能够查看文件:

$ id
uid=209(xray) gid=208(appgrp) groups=1(staff)
$ cat zuluf
My file

用户 xray 现在可以查看该文件。

即使一个用户获得了访问另一个用户的加密文件的权限,但基本的文件(所有者/组/其他用户)权限并没有授予其他用户,那么访问也会遭到拒绝。

撤销用户访问

当 zulu 撤销对文件的访问权限时,此命令的格式为:

efsmgr -r <filename> -u  <user_name_to_revoke> 
$ efsmgr -r zuluf -u xray

所列出的以下输出中包含的文件加密细节表明,允许访问文件的唯一的密钥属于 uid 210,它是用户 zulu。

$  efsmgr -l zuluf
EFS File information:
 Algorithm: AES_128_CBC
List of keys that can open the file:
 Key #1:
  Algorithm       : RSA_1024
  Who             : uid 210
  Key fingerprint : 66e34c2d:3687eefb:3e30ee55:34f4f4b6:95f76bca

使用组密钥库访问

要实现通过一个组进行访问,在真实的 AIX 和 UNIX 领域中大部分系统管理员会这么做,首先需要创建 AIX 组。在此演示中,组 appgrp 包含成员 xray 和 oscar。

# mkgroup -'A' users='xray,oscar' appgrp
# lsgroup -a id users appgrp
appgrp id=208 users=xray,oscar

接下来,使用 efskeymgr 命令(以 root 用户身份),创建组的密钥库。所使用的命令格式为:

efskeymgr -C <group_name>

# efskeymgr -C appgrp

作为 appgrp 的组成员,用户 xray 列出他的密钥。我们可以从以下输出中看到,现在组 appgrp 有一个组密钥库:

$ id
uid=209(xray) gid=208(appgrp) groups=1(staff)
$ efskeymgr -v
 Keystore content:
                             Keystore owner ............ : uid 209
                             Keystore mode ............. : admin: managed by EFS
 administrator
                             Password changed last on .. : 05/12/11 at 17:36:20
    Private key:
          Algorithm : RSA_1024
        Fingerprint : 3975781d:52056f10:d86aa005:57e24f27:daa20bab
           Validity : This key is valid.
    Access key to keystore group/appgrp

接下来,将密钥推送给组中的成员,以允许这些成员访问。这并不意味着您必须包含所有成员,但在本演示中,我们是这么做的。完成此任务的命令格式为:

efskeymgr -k group/<group_name> -s user/<user_name>

将密钥推送给了属于组 appgrp 的用户 oscar 和 xray:

# efskeymgr -k group/appgrp -s user/oscar
# efskeymgr -k group/appgrp -s user/xray

用户 oscar 现在注销并再次登录,以使更改生效,或者他可以运行以下命令来刷新环境:

$ efskeymgr -o bash

用户 oscar 现在查看他的密钥,其 gid 为 208 的组的组密钥库密钥的,这是一组 appgrp(前面已演示过):

$ efskeymgr -V
List of keys loaded in the current process:
 Key #0:
                           Kind ..................... User key
                           Id   (uid / gid) ......... 211
                           Type ..................... Private key
                           Algorithm ................ RSA_1024
                           Validity ................. Key is valid
                           Fingerprint .............. f56f1e61:112c691f:961f771b
:b2a2582e:b905aa03
 Key #1:
                           Kind ..................... Group key
                           Id   (uid / gid) ......... 208
                           Type ..................... Private key
                           Algorithm ................ RSA_1024
                           Validity ................. Key is valid
                           Fingerprint .............. 2424a8a8:ce107236:ad2c708c
:59289399:e3022f6c

允许和共享组密钥库访问

假设用户 zulu 希望将向 appgrp 组提供一个即将加密的文件的访问权限。首先,用户 zulu 加密该文件:

$ efsmgr -e zuluf

该组包含以下成员:

# lsgroup -a users appgrp
appgrp users=xray,oscar

用户 zulu 现在向组 appgrp 密钥提供了文件 zuluf 的访问权限。此命令的格式为:

efsmgr -a <user_name> -g <group_name>
$ efsmgr -a zuluf -g appgrp

查看文件 zuluf 的文件访问密钥,可以看到我们拥有 gid 为 208 的组的密钥库,也就是 appgrp 组。

$  efsmgr -l zuluf
EFS File information:
 Algorithm: AES_128_CBC
List of keys that can open the file:
 Key #1:
  Algorithm       : RSA_1024
  Who             : uid 210
  Key fingerprint : 66e34c2d:3687eefb:3e30ee55:34f4f4b6:95f76bca
 Key #2:
  Algorithm       : RSA_1024
  Who             : gid 208
  Key fingerprint : 2424a8a8:ce107236:ad2c708c:59289399:e3022f6c

$ id
uid=211(oscar) gid=1(staff) groups=208(appgrp)
$ cat zuluf
My file

在前一个例子中,用户 oscar 现在可以访问 zuluf 文件,因为他是 appgrp 组的成员,而该组密钥具有对 zuluf 的访问权限。

撤销组密钥库成员

现在假设我们希望从该组密钥库密钥删除用户 oscar。命令格式为:

efskeymgr -k user/<user_name> -S group/<group_name>
# efskeymgr -k user/oscar -S group/appgrp

用户 oscar 注销并再次登录,以使更改生效;用户 oscar 的组密钥现在已删除:

$ id
uid=211(oscar) gid=1(staff) groups=208(appgrp)
$ efskeymgr -V
List of keys loaded in the current process:
 Key #0:
                           Kind ..................... User key
                           Id   (uid / gid) ......... 211
                           Type ..................... Private key
                           Algorithm ................ RSA_1024
                           Validity ................. Key is valid
                           Fingerprint .............. f56f1e61:112c691f:961f771b
:b2a2582e:b905aa03


$ efskeymgr -v
 Keystore content:
                             Keystore owner ............ : uid 211
                             Keystore mode ............. : admin: managed by EFS
 administrator
                             Password changed last on .. : 05/19/11 at 19:01:44
    Private key:
          Algorithm : RSA_1024
        Fingerprint : f56f1e61:112c691f:961f771b:b2a2582e:b905aa03
           Validity : This key is valid.

如果用户 oscar 现在尝试访问该文件,他会遭到拒绝:

$ cat zuluf
cat: 0652-050 Cannot open zuluf.
$ ls -lU zuluf
-rw-r—r--e  1 zulu  staff  8 May 19 19:35 zuluf

要撤销完整的组访问权限,命令格式为:

efsmgr -r <filename> -g <group_name>

要撤销整个 appgrp 组对文件 zuluf 的访问权限,请使用以下命令:

 $ efsmgr -r zuluf -g appgrp

现在,文件 zuluf 只能供创作者(用户 zulu,他加密了它)访问:

$ efsmgr -l zuluf
EFS File information:
 Algorithm: AES_128_CBC
List of keys that can open the file:
 Key #1:
  Algorithm       : RSA_1024
  Who             : uid 210
  Key fingerprint : 66e34c2d:3687eefb:3e30ee55:34f4f4b6:95f76bca

解密文件

如果用户 zulu 希望从 zuluf 中取消加密,他可以使用以下命令:

$ efsmgr -d zuluf
$ ls -Ul zuluf
-rw-r--r---   1 zulu     staff             8 May 19 18:06 zuluf

文件系统和目录

启用文件系统的加密可在文件系统创建级别完成,或者如果已经存在,也可以使用 chfs 命令修改。要加密一个已定义的文件系统,可以使用 chfs 命令。以下命令在 /db2/db2data 文件系统上启用 EFS:

# chfs -a efs=yes /db2/db2data

要是创建一个启用了 EFS 的新文件系统,请使用 “-a efs=yes” 选项,如下所示:

# crfs -v jfs2 -a efs=yes -A yes -g apps_vg -m /db2/db2data -a size=128M

要确认文件系统已启用了加密,使用 lsfs 命令:

# lsfs -q |grep db2data
/dev/fslv07 --/db2/db2data jfs2 262144 rw yes
no
 (lv size: 262144, fs size: 262144, block size: 4096, sparse files: yes, inline
log: no, inline log size: 0, EAformat: v2, Quota: no, DMAPI: no, VIX: yes, EFS:
yes, ISNAPSHOT: no, MAXEXT: 0)

在前面的输出中,请注意 EFS 项 EFS:yes。这表明它已启用 EFS。

如果一个文件系统中的所有文件都要加密,它们可以单独完成。但是,加密每个文件非常耗时。此方法也容易错过一些您希望加密的文件。另一种方法是使用继承设置加密整个文件系统或目录。这样,任何由具有有效密钥的用户创建的新文件都将自动加密。

要为文件系统启用继承加密,所使用的命令格式如下:

efsmgr -s -E </filesystem>

例如,为了允许在 /db2/db2data 文件系统上使用继承功能,可以使用以下命令:

# efsmgr -s -E /db2/db2data

为了确认已设置该功能,可以使用以下命令:

# efsmgr -s -L /db2/db2data
EFS inheritance is set with algorithm: AES_128_CBC

要向一个目录应用继承,所使用的命令格式如下:

efsmgr -E </directory/directory/..>

要在 /db2/holding 目录上启用继承功能,可以使用以下命令:

# efsmgr -E /db2/holding

要确认已设置继承功能,可以使用以下命令:

 # efsmgr  -L /db2/holding
EFS inheritance is set with algorithm: AES_128_CBC

当禁用继承功能时,所有以前加密的文件会保持加密,任何新文件不会自动加密。要在文件系统上禁用继承,所使用的命令格式如下:

efsmgr -s -D </filesystem>

要在 /db2/db2data 文件系统上禁用继承功能,可以使用以下命令:

# efsmgr -s -D /db2/db2data

要禁用目录继承功能,所使用的命令格式如下:

efsmgr -D </directory/directory/..>

要在 /db2/holding 目录上禁用继承功能,可以使用以下命令:

# efsmgr -D /db2/holding

加密 DB2 文件

在本演示中,我将在 /db2/db2data 文件系统上启用加密。此文件系统包含之前由数据库创建的表空间。随着数据不断增加,会向此文件系统添加更多表空间。

如果尚未这么做,请为 /db2/db2data 文件系统启用 EFS。

要在已定义的文件系统上启用 EFS,请使用 chfs 命令,如下所示:

# chfs -a efs=yes /db2/db2data

DB2 下的默认操作时,所有向表空间的写入都会由实例所有者执行(如 aixdev 中所示)。

当创建其他实例时,应该在 /db2/db2data/<DB> 中创建表空间。每个目录然后可以按数据库目录加密。

/db2/db2data/mtrbikes 目录将包含我们即将加密的 DB2 表空间文件。这里,我们需要决定是否:

  • 为整个文件系统启用继承;
  • 为目录启用继承;或者
  • 加密每个表空间。

对于本演示,我们启用目录继承。

首先,停止 aixdev DB2 实例:

$ db2stop force
05/22/2011 14:42:34     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.
$ db2_kill
ipclean: Removing DB2 engine and client's IPC resources for aixdev.

设置继承

接下来,在 /db2/db2data/mtrbikes 目录上启用继承,然后确认它已设置:

# efsmgr  -E /db2/db2data/mtrbikes
# efsmgr  -L /db2/db2data/mtrbikes
EFS inheritance is set with algorithm: AES_128_CBC

为了进一步测试这一点,用户 aixdev(实例所有者)在现在设置了继承的目录中创建一个文件。此文件会立即使用他的密钥加密,如下所示:

$ pwd
/db2/db2data/mtrbikes
$ id
uid=206(aixdev) gid=204(db2grp1) groups=1(staff)
$ ls >myfile
$ ls -Ul
total 102480
-rw--------    1 aixdev   db2grp1    52428800 May 23 19:02 mtrbikes1_ts
-rw-r--r--e    1 aixdev   db2grp1          50 May 23 19:06 myfile
drwxr-x----    2 aixdev   db2grp1       16384 May 23 18:19 syscat_ts
drwxr-x----    2 aixdev   db2grp1         256 May 23 18:19 tmp_ts
drwxr-x----    2 aixdev   db2grp1         256 May 23 18:19 user_ts

加密数据库文件

请注意,在上面的输出中,还未加密任何表空间文件。要加密,我们必须手动加密它们。因为有许多文件需要加密,可以使用 find 命令实用工具。我们还必须对目录进行加密。以下两个 find 命令实现此目的,首先加密目录,然后加密从 /db2/db2data/mtrbikes 源目录向下的文件。一个目录已使用前面执行的继承命令加密,但是我们需要确保所有剩余目录都已加密。请注意,它不会导致在相同目录上重复该命令的问题。

$ find /db2/db2data/mtrbikes -type d -exec efsmgr -E {} \;
$ find /db2/db2data/mtrbikes –type f -exec efsmgr -e {} \;

请注意,上面的 find 命令中的 “{}”包含由 exec 计算时的文件名。

执行上述 find 命令之后,这些文件现在已加密:

$ ls -Ul|more
total 63696
-rw-------e    1 aixdev   db2grp1        4096 May 23 19:22 SQL00001.DAT
-rw-------e    1 aixdev   db2grp1      262144 May 23 19:22 SQL00002.DAT

从顶级目录 mtrbikes 开始查找,我们拥有以下文件:

$ pwd
/db2/db2data/mtrbikes
$ ls -Ul
-rw-------e    1 aixdev   db2grp1    52428800 May 23 19:27 mtrbikes1_ts
drwxr-x---e    2 aixdev   db2grp1       16384 May 23 19:24 syscat_ts
drwxr-x---e    2 aixdev   db2grp1         256 May 23 19:25 tmp_ts
drwxr-x---e    2 aixdev   db2grp1         256 May 23 19:26 user_ts

全部完成了,接下来启动 DB2 实例:

$ db2start
05/23/2011 19:38:12     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.

接下来,检查实例所有者能否连接并选择数据:

$ db2 connect to mtrbikes

   Database Connection Information

 Database server        = DB2/AIX64 9.1.5
 SQL authorization ID   = AIXDEV
 Local database alias   = MTRBIKES


$ db2 "select * from motorbike"

MAKEOF     MODELCC    COLOUR
---------- ---------- --------------------
bmw        f800 1200  yellow/black
bmw        gs 1200    white/blue
bmw        gsa 1200   grey

  3 record(s) selected.

为 DB2 实例创建一个密钥库组

接下来,让我们为这些文件提供通过组成员访问的权限,不是所有文件都将允许组写入,但一些文件将允许。用户 insadm 是一个 DB2 管理员用户,因此需要组密钥访问。

在本演示中,所有文件都授予了组密钥库访问权限。

已有一个 AIX db2grp1 组,其中 insadm 是它的一个成员,当前的成员包括:

$ lsgroup -a users db2grp1
db2grp1 users=db2fenc1,dasusr1,aixdev,echo,insadm

以 root 用户身份,为组 db2grp1 创建密钥库,但仅包含成员 insadm。您可以在以后创建了更多实例时扩展该组。

# efskeymgr -C db2grp1

以 root 用户身份,仅将密钥推送到用户 insadm:

# efskeymgr -k group/db2grp1 -s user/insadm

我们接下来需要停止 DB2 实例,以便我们可以更改加密组访问的表空间文件:

$ db2stop 
05/22/2011 14:42:34     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.
$ db2_kill
ipclean: Removing DB2 engine and client's IPC resources for aixdev.

用户 aixdev 使用 find 命令提供了对 DB2 表空间文件的组访问权限:

$ find /db2/db2data/mtrbikes -type f -exec efsmgr -a {} -g db2grp1 \;

检查两个文件上的文件加密访问,以确认组密钥:

$ efsmgr -l mtrbikes1_ts
EFS File information:
 Algorithm: AES_128_CBC
List of keys that can open the file:
 Key #1:
  Algorithm       : RSA_1024
  Who             : uid 206
  Key fingerprint : 8167ebb6:d4e0e799:c9c96642:f46b31d2:5f652183
 Key #2:
  Algorithm       : RSA_1024
  Who             : gid 204
  Key fingerprint : cbe66fe1:387bad46:48fe5ad4:a58510b1:12e851ac

$ pwd
/db2/db2data/mtrbikes/syscat_ts
$ efsmgr -l SQL00019.DAT
EFS File information:
 Algorithm: AES_128_CBC
List of keys that can open the file:
 Key #1:
  Algorithm       : RSA_1024
  Who             : uid 206
  Key fingerprint : 8167ebb6:d4e0e799:c9c96642:f46b31d2:5f652183
 Key #2:
  Algorithm       : RSA_1024
  Who             : gid 204
  Key fingerprint : cbe66fe1:387bad46:48fe5ad4:a58510b1:12e851ac

从前面的输出中,我们可以确定文件所有权密钥属于用户 aixdev (uid 206),密钥库组 db2grp1 (gid 204) 也具有访问权限。加密组成员为 insadm。

在目录上设置了继承之后,现在由 aixdev 创建的任何新文件都拥有与之关联的组密钥。

用户 insadm 登录以检查新授权的组密钥:

$ id
uid=207(insadm) gid=204(db2grp1) groups=206(db2fgrp1)
$ efskeymgr -V
List of keys loaded in the current process:
 Key #0:
                           Kind ..................... User key
                           Id   (uid / gid) ......... 207
                           Type ..................... Private key
                           Algorithm ................ RSA_1024
                           Validity ................. Key is valid
                           Fingerprint .............. 4667f3a5:cba463fe:90b1d6d5
:3c834724:e143e70b
 Key #1:
                           Kind ..................... Group key
                           Id   (uid / gid) ......... 204
                           Type ..................... Private key
                           Algorithm ................ RSA_1024
                           Validity ................. Key is valid
                           Fingerprint .............. cbe66fe1:387bad46:48fe5ad4
:a58510b1:12e851ac

从前面的输出中,我们可以看到用户 insadm 拥有组密钥(db2grp1,gid 204)。

用户 aixdev 现在启动 DB2 实例并连接数据库,以进行快速的健康测试:

$ db2start
05/22/2011 14:46:49     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
$ db2 connect to mtrbikes

   Database Connection Information

 Database server        = DB2/AIX64 9.1.5
 SQL authorization ID   = AIXDEV
 Local database alias   = MTRBIKES

$ db2 terminate

测试加密

要测试加密,我们为一个名为 alpha DB2 的用户提供使用某些值更新 motorbike 表的特权。用户 alpha 不属于 keystore 组或 AIX db2grp1 组,也不会与任何人共享任何密钥。随着所有表空间写入都已由实例所有者 aixdev 完成,所以加密/解密是对用户透明的。

用户 aixdev 现在为用户 alpha 提供了表访问权限,允许它选择表 motorbike 并执行插入操作:

$ db2 connect to mtrbikes
$ db2 "grant select,insert  on table aixdev.motorbike to user alpha";
DB20000I  The SQL command completed successfully.

接下来,用户 alpha 连接并位于加密的表空间文件上的表并向其插入一些值:

$ id
uid=212(alpha) gid=1(staff)

$ db2 "connect to mtrbikes user alpha using alpha123"
   Database Connection Information

 Database server        = DB2/AIX64 9.1.5
 SQL authorization ID   = ALPHA
 Local database alias   = MTRBIKES

$ db2 "insert into aixdev.motorbike values('bmw','gs 650','yellow')";
DB20000I  The SQL command completed successfully.

$ db2 "select * from aixdev.motorbike"

MAKEOF     MODELCC    COLOUR
---------- ---------- --------------------
bmw        f800 1200  yellow/black
bmw        gs 1200    white/blue
bmw        gsa 1200   grey
bmw        gs 650     yellow

下面的 图 1图 2 显示用户 alpha 从一个 Windows 客户端连接并运行前一个示例中所演示的相同查询:

图 1. 用户 alpha 在 motorbike 表上执行一项选择
用户 alpha 在 motorbike 表上执行选择的屏幕截图
图 2. 用户 alpha 检索解密的数据
用户 alpha 检索解密的数据的屏幕截图

表空间是加密的,普通用户仍然可以向表空间写入数据,因为更新是由用户 aixdev 完成的。如果还有其他用户需要文件访问,请确保将它们添加到了密钥库组中,并检查表空间权限。


密钥不正确

如果您没有加载最初用于加密 DB2 表空间文件的正确密钥,在重新启动实例且您连接数据库时,可能会看到一个类似以下内容的错误:

$db2 connect to mtrbikes
SQL0901N The SQL statement failed because of a non-severe system error.
Subsequent SQL statements can be processed. (Reason "".) SQLSTATE=58004

对 DB2 diag.log 的进一步分析显示了您的表空间的验证问题,类似于:

OSERR : ENOATTR (112) "Cannot find the requested security attribute."
DATA #1 : File name, 42 bytes
/db2/db2data/mtrbikes/syscat_ts/SQLTAG.NAM
FUNCTION: DB2 UDB, oper system services, sqloopenp, probe:80
MESSAGE : ZRC=0x83000071=-2097151887
CALLED : OS, -, open
OSERR : ESAD (113) "Security authentication is denied."
DATA #1 : File name, 42 bytes

diag.log 表明,它无法找到请求的安全性属性。您需要恢复在您加密表空间文件时使用的密钥,密钥的恢复已在本文前面探讨。


DB2 备份和还原

在本文前面,我们通知 DB2 为组 sysmaint 提供备份数据库的授权。用户 echo 是组 sysmaint 的唯一成员,该用户还属于组 db2grp1。但是,该用户没有 db2grp1 的密钥库组访问权限。该用户仍然能够执行备份,因为转储内容的写入时由实例所有者(也就是 aixdev)执行的。假设所有用户都已从数据库注销,用户 echo 现在获取数据库的备份:

$ id
uid=213(echo) gid=204(db2grp1) groups=1(staff),207(sysmaint)

$ db2 connect to mtrbikes user echo using echo123
   Database Connection Information

 Database server        = DB2/AIX64 9.1.5
 SQL authorization ID   = ECHO
 Local database alias   = MTRBIKES
$ db2 "backup db mtrbikes to '/hold'"
Backup successful. The timestamp for this backup image is : 20110529151536

$pwd
/hold
$ ls -Ul
-rw-r-----    1 aixdev   db2grp1    78684160 May 29 15:15 MTRBIKES.0.aixdev.NODE
0000.CATN0000.20110529151536.001

请注意转储文件归 aixdev 所有,它没有加密。这是因为它已转储到一个非 EFS 文件系统。

实例所有者 aixdev 现在将数据库还原到现有的数据库上:

$ db2 "restore db mtrbikes from '/hold/' taken at 20110529151536"
SQL2539W  Warning!  Restoring to an existing database that is the same as the
backup image database.  The database files will be deleted.
Do you want to continue ? (y/n) y
DB20000I  The RESTORE DATABASE command completed successfully.

$ db2 "connect to mtrbikes"
   Database Connection Information

 Database server        = DB2/AIX64 9.1.5
 SQL authorization ID   = AIXDEV
 Local database alias   = MTRBIKES

查看表空间文件,我们可以看到它们在还原后仍然是加密的。

$ ls -Ul
total 108088
-rw-------e    1 aixdev   db2grp1    52428800 May 29 15:52 mtrbikes1_ts
drwxr-x---e    2 aixdev   db2grp1       16384 May 29 15:48 syscat_ts
drwxr-x---e    2 aixdev   db2grp1         256 May 28 08:39 tmp_ts
drwxr-x---e    2 aixdev   db2grp1         256 May 28 08:39 user_ts

如果您丢弃数据库,然后从一个备份映像还原它(假设 aixdev 的密钥未更改,表空间文件将还原并向以前一样加密)。在下面的示例中,用户 aixdev 现在丢弃数据库并从前面的备份映像执行一次重定向还原。请注意,在丢弃数据库之后,所有表空间文件都已删除。数据库的丢弃可通过 db 目录中没有数据库项来确认:

$ id
uid=206(aixdev) gid=204(db2grp1) groups=1(staff)
$ db2 drop db mtrbikes
DB20000I  The DROP DATABASE command completed successfully.
$ pwd
/db2/db2data/mtrbikes
$ ls
$
$ db2 list db directory
SQL1057W  The system database directory is empty.  SQLSTATE=01606

现在,将要执行重定向还原:

 $ db2 -tvf MTRBIKESredirect.sql
restore db MTRBIKES from '/hold' taken at 20110529191939 into MTRBIKES redirect
without rolling forward without prompting
SQL1277W  A redirected restore operation is being performed.  Table space
configuration can now be viewed and table spaces that do not use automatic
storage can have their containers reconfigured.
DB20000I  The RESTORE DATABASE command completed successfully.
set tablespace containers for 0 using (Path '/db2/db2data/mtrbikes/syscat_ts')
DB20000I  The SET TABLESPACE CONTAINERS command completed successfully.
set tablespace containers for 1 using (Path '/db2/db2data/mtrbikes/tmp_ts')
DB20000I  The SET TABLESPACE CONTAINERS command completed successfully.
set tablespace containers for 2 using (Path '/db2/db2data/mtrbikes/user_ts')
DB20000I  The SET TABLESPACE CONTAINERS command completed successfully.
set tablespace containers for 3 using (File '/db2/db2data/mtrbikes/mtrbikes1_ts'12800)
DB20000I  The SET TABLESPACE CONTAINERS command completed successfully.

restore db MTRBIKES continue
DB20000I  The RESTORE DATABASE command completed successfully

还原之后,还原的表空间仍然是加密的。

$ pwd
/db2/db2data/mtrbikes

$ ls -Ul
total 102496
-rw-------e    1 aixdev   db2grp1    52428800 May 30 13:14 mtrbikes1_ts
drwxr-x---e    2 aixdev   db2grp1       16384 May 30 13:14 syscat_ts
drwxr-x---e    2 aixdev   db2grp1         256 May 30 13:14 tmp_ts
drwxr-x---e    2 aixdev   db2grp1         256 May 30 13:14 user_ts

结束语

使用 EFS 加密 DB2 存储文件可为您的数据提供隐私保护。该过程对连接数据库的用户是透明的。如果您有组成员属于 DB2 SYSCTRL 和 SYSMAINT 组,那么为它们提供组密钥访问可能仍然很有用。

参考资料

学习

  • DB2 V9 信息中心
  • AIX V6 高级安全功能 红皮书重点介绍了 AIX 6 安全功能,包括 EFS 密钥库。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

获得产品和技术

  • 免费 试用 IBM 软件。下载一个试用版,登录到在线试用版,在沙盒环境中使用产品,或者通过云访问它。可以从 100 多个 IBM 产品试用版中选择。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=785091
ArticleTitle=使用 EFS 保护您的 DB2 文件系统
publish-date=01122012