簡介 在本文中,我將使用標準的表空間文件創(chuàng)建一個示例 DB2 數(shù)據(jù)庫。還將演示如何加密存儲表空間文件,在此過程中,將介紹一些 EFS 命令。 實際上,加密的工作原理是這樣的:一個用戶生成一個密鑰,該密鑰保存在一個密鑰庫中,這個密鑰用于加密文件。文件只能由密鑰的所有者訪問,除非所有者單獨或以分組形式為其他人提供了訪問文件的權限。當另一個用戶嘗試訪問文件時,系統(tǒng)會檢查和驗證該用戶的密鑰。如果用戶通過驗證,則會授予用戶訪問權限,否則會決絕訪問。文件的解密會執(zhí)行一種類似的操作。密鑰保存在一個密鑰庫中,該密鑰庫受用戶自己的密鑰庫密碼保護。 當 EFS 在默認的管理員模式下運行時,root 用戶能夠訪問所有用戶和組密鑰庫。 客戶端機器上沒有保存任何密鑰,密鑰的保存全部在 AIX 主機上完成。您可以通過使用 lsuser 命令查看用戶的用戶屬性,確定用戶是否適合使用 EFS(加密文件系統(tǒng)): # 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=
|
用戶密鑰保存在位于以下位置的密鑰庫中: # 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
|
創(chuàng)建一個示例數(shù)據(jù)庫 讓我們創(chuàng)建一個示例數(shù)據(jù)庫,數(shù)據(jù)將位于加密的文件系統(tǒng)內的表空間中。我使用的數(shù)據(jù)庫系統(tǒng)為 DB2 v9.1。 假設已安裝了 DB2 并創(chuàng)建了一個實例。實例(和數(shù)據(jù)庫)的所有者是 aixdev,主要的組為 db2grp1。我們現(xiàn)在將創(chuàng)建 3 個未加密的文件系統(tǒng)(加密在以后完成): - /db2/db2data:保存數(shù)據(jù)庫(數(shù)據(jù)存儲)表空間。
- /db2/db2logs:保存數(shù)據(jù)庫日志。
- /db2/db2diag:保存對話日志。
創(chuàng)建文件系統(tǒng) 上面提到的文件系統(tǒng)使用以下命令創(chuàng)建: # 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.
|
文件系統(tǒng)位于 apps_vg 卷組中。它們使用 auto-mount 選項 on 創(chuàng)建,所以它們會在系統(tǒng)啟動時自動掛載。我們需要這么做是因為,DB2 會通過 inittab 自動啟動。如果文件系統(tǒng)不存在,數(shù)據(jù)庫中可能發(fā)生錯誤。請注意,我們目前還未啟用 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。我們需要為該組提供此訪問權限,因為在某個時刻,一定會創(chuàng)建其他數(shù)據(jù)庫實例,并且它們將使用上述文件系統(tǒng)。這些數(shù)據(jù)庫實例也將使用 db2grp1 作為它們的主要組。在處理應用程序文件更改時,使用組訪問權限更有效。 此演示中所有與數(shù)據(jù)庫相關的命令由實例所有者 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
|
創(chuàng)建數(shù)據(jù)庫 使用數(shù)據(jù)庫創(chuàng)建命令,我們要求在 /db2/db2data/mtrbikes 目錄中創(chuàng)建表空間文件。這里是創(chuàng)建該目錄的方法: $ id
uid=206(aixdev) gid=204(db2grp1) groups=1(staff)
$ pwd
$ /db2/db2data
$ mkdir mtrbikes
|
實際的數(shù)據(jù)庫稱為 mtrbikes。它包含少量的摩托車數(shù)據(jù),這些數(shù)據(jù)已足夠演示使用。默認數(shù)據(jù)庫路徑為實例 $HOME/aixdev 目錄。 以下命令創(chuàng)建數(shù)據(jù)庫,該命令保存在 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' ) ;
|
要創(chuàng)建數(shù)據(jù)庫,使用: $ 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 并查看實例所有者能否連接數(shù)據(jù)庫。 $ db2 connect to mtrbikes
Database Connection Information
Database server = DB2/AIX64 9.1.5
SQL authorization ID = AIXDEV
Local database alias = MTRBIKES
|
接下來,創(chuàng)建另一個表空間,它將保存我們的摩托車數(shù)據(jù)。創(chuàng)建的該表空間的大小為 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.
|
確認表空間已創(chuàng)建: $ pwd
/db2/db2data/mtrbikes
$ du -ms *
50.00 mtrbikes1_ts
29.95 syscat_ts
0.0 tmp_ts
0.1 user_ts
|
現(xiàn)在我們在一個位置擁有了 mtrbikes 數(shù)據(jù)庫的所有表空間,該位置為:
更新 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
SYSADMSYSADM group name (SYSADM_GROUP) =
$ db2 update dbm cfg using SYSADM_GROUP db2grp1
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed
|
對于我們的數(shù)據(jù)庫備份(還原),我們通知 DB2 為一個組提供執(zhí)行此任務的授權。為此,我們使用 AIX 組 sysmaint,它的唯一的成員是 echo: $ lsgroup -a users
sysmaintsysmaint 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.
|
現(xiàn)在對于數(shù)據(jù)庫日志文件,更新 db cfg 日志路徑項;日志將保存在 /db2/db2log/mtrbikes 中: $ cd /db2/db2log
$ mkdir mtrbikes
$ db2 get db cfg for mtrbikes|grep " ath 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.
|
最后,執(zhí)行 TCP/IP 設置,以便遠程用戶能夠連接。當創(chuàng)建實例 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> 項作為后綴。將以下項添加到服務文件中:
現(xiàn)在可以為實例啟用 TCP/IP 了。使用從 /etc/services 獲取的 db2c_aixdev 項更新 dbm TCP/IP 項。另外,需要使用 db2set 實用工具為 DB2 環(huán)境變量設置一個項: $ 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
|
現(xiàn)在,您的任務完成了。停止并重新啟動實例,使值生效: $ db2stop force
05/07/2011 15:20:33 0 0
SQL1064N DB2STOP processing was successful.SQL1064N DB2STOP processing was successful
$ db2start05/07/2011
15:20:37 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
|
插入一些數(shù)據(jù) 現(xiàn)在創(chuàng)建了名為 motorbike 的表,create table 語句包含在 cr_table 文件中。該表在我們剛創(chuàng)建的表空間 mtrblsp_ts 上創(chuàng)建。執(zhí)行此文件的 DB2 命令為 db2 -tvf 命令行實用工具: $ cat cr_table
CREATE TABLE motorbike (
makeof Varchar(10),
modelcc Varchar(10),
colour Varchar (20))
in mtrtblsp_ts;
|
在創(chuàng)建表之前,首先連接數(shù)據(jù)庫: $ 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 表中。跟以前一樣,數(shù)據(jù)通過一個文件插入,在本演示中,該文件名為 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.
|
確認可從數(shù)據(jù)庫讀取數(shù)據(jù): $ 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
|
現(xiàn)在我們擁有了 TBSPACEID 值 3,我們可以查詢該表空間的位置: $ db2 list tablespace containers for 3
Tablespace Containers for Tablespace 3
Container ID = 0
Name = /db2/db2data/mtrbikes/mtrbikes1_ts
Type = File
|
我們現(xiàn)在可以看到,表 motorbike 位于表空間 mtrtblsp_ts 上。 數(shù)據(jù)庫配置到此就完成了。
[color=rgb(76, 110, 14  ] 回頁首
了解 EFS 在加密我們的 DB2 文件之前,首先讓我們通過示例看看一些常見的加密命令。對于加密操作,使用的命令包括: - efsenable:管理 EFS 的激活。
- efsmgr:管理加密和解密。
- efskeymgr:管理密鑰庫(密鑰)和組。
AIX 使用 AES(高級加密標準)來進行加密。要啟用 EFS,在您系統(tǒng)上使用以下命令:
當提示時,輸入一個密鑰庫密碼。 root 密碼和密鑰庫密碼[size=0.76em]為了方便管理,可以將您的 root 密碼和密鑰庫密碼設置為相同,以保持它們同步。這也適用于在系統(tǒng)上使用他們自己的密鑰庫密碼的普通用戶。 密鑰庫和用戶登錄密碼在操作上是不同的。密鑰庫密碼保護用戶自己的密鑰庫,而密鑰庫保存用戶密鑰。
當最初創(chuàng)建一個用戶時,會自動為它創(chuàng)建它的密鑰庫,密鑰庫密碼將與登錄密碼相同。 要更改您密鑰庫的密碼,可以使用 efskeymgr 命令。在以下示例中,用戶 aixdev 更改了他自己的密鑰庫密碼。他首先被提示輸入當前的密鑰庫密碼: $ efskeymgr -n
aixdev's EFS password:
Enter new password for aixdev's keystore:
Enter the same password again:
|
密鑰、密鑰、密鑰 當用戶更改其密鑰庫密碼時,他們仍然能夠訪問所有他們以前加密的文件。但是,如果密鑰庫文件被刪除或被破壞,或者刪除了過時的密鑰,這不會出現(xiàn)這種情況。創(chuàng)建一個新密鑰庫不會解密用戶以前加密的文件。對用戶和組密鑰庫進行定期備份是一項必不可少的操作。定期將目錄 /var/efs 備份到磁帶和磁盤,這樣如果發(fā)生密鑰損壞或意外刪除了用戶密鑰庫,可以很快恢復它們。 您在將加密的文件轉移到另一個擁有啟用了 EFS 的文件系統(tǒng)的主機,并且您希望解密這些文件時,也需要您的密鑰庫。 以下命令將 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"
|
要替換被損壞或丟失的以前的密鑰庫,可以執(zhí)行以下命令。假設出現(xiàn)問題的用戶是 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 現(xiàn)在能夠訪問他以前加密的文件。 加載并列出您的密鑰庫 要檢查您的密鑰庫是否已加載并顯示您的會話中的密鑰,可以使用: $ 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 命令輸出可以看出。 如果密鑰沒有在執(zhí)行 efskeymgr 時自動加載,這可能是因為用戶已從另一個帳戶注銷,或者您的登錄和密鑰庫密碼不同。要手動加載您的密鑰,可以使用 efskeymgr 和 “-o” 選項。該命令的格式為:
在通常選擇該命令作為 shell 的地方,這可以交互式或使用 “-p” 選項非交互式地完成。在下面的示例中使用了 bash,但您也可以使用 ksh 作為 shell 命令。假設要使用的密碼為 zulu123: $ efskeymgr -o bash -p zulu123 |
或 $ efskeymgr -o bash
zulu's EFS password:
|
第一個示例在作業(yè)是批量或定時的時很有用,您需要自動加載密鑰,另一種方法是交互式的。 要列出您當前的密鑰庫,使用: $ 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 命令,F(xiàn)在讓我們演示用戶 zulu 如何創(chuàng)建一個文件,然后加密它。此命令的格式為: efsmgr -e <file_to_encrypt> |
首先創(chuàng)建文件 zuluf $ id
uid=210(zulu) gid=1(staff)
$ echo "My file" > zuluf
|
現(xiàn)在加密它:
確認它已加密。一種測試這一點的方法是使用 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
|
現(xiàn)在,如果我們列出該文件的加密細節(jié),我們應該看到用戶 xray 將擁有訪問權限: $ id
uid=210(zulu) gid=1(staff)
$ efsmgr -l zuluf
EFS File information:
Algorithm: AES_128_CBCList 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 輸出,我們現(xiàn)在可以看到文件 zuluf,它具有 zulu 的密鑰,但也能看到其 uid 為 209 的用戶,它是用戶 xray,也具有訪問權限。 要確認用戶 xray 能夠查看文件: $ id
uid=209(xray) gid=208(appgrp) groups=1(staff)
$ cat zuluf
My file
|
用戶 xray 現(xiàn)在可以查看該文件。 即使一個用戶獲得了訪問另一個用戶的加密文件的權限,但基本的文件(所有者/組/其他用戶)權限并沒有授予其他用戶,那么訪問也會遭到拒絕。 撤銷用戶訪問 當 zulu 撤銷對文件的訪問權限時,此命令的格式為: efsmgr -r <filename> -u <user_name_to_revoke>
$ efsmgr -r zuluf -u xray
|
所列出的以下輸出中包含的文件加密細節(jié)表明,允許訪問文件的唯一的密鑰屬于 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
|
使用組密鑰庫訪問 要實現(xiàn)通過一個組進行訪問,在真實的 AIX 和 UNIX 領域中大部分系統(tǒng)管理員會這么做,首先需要創(chuàng)建 AIX 組。在此演示中,組 appgrp 包含成員 xray 和 oscar。 # mkgroup -'A' users='xray,oscar' appg
rp# lsgroup -a id users appgrp
appgrp id=208 users=xray,oscar
|
接下來,使用 efskeymgr 命令(以 root 用戶身份),創(chuàng)建組的密鑰庫。所使用的命令格式為: efskeymgr -C <group_name>
# efskeymgr -C appgrp
|
作為 appgrp 的組成員,用戶 xray 列出他的密鑰。我們可以從以下輸出中看到,現(xiàn)在組 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 現(xiàn)在注銷并再次登錄,以使更改生效,或者他可以運行以下命令來刷新環(huán)境:
用戶 oscar 現(xiàn)在查看他的密鑰,其 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 加密該文件:
該組包含以下成員: # lsgroup -a users
appgrpappgrp users=xray,oscar
|
用戶 zulu 現(xiàn)在向組 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 現(xiàn)在可以訪問 zuluf 文件,因為他是 appgrp 組的成員,而該組密鑰具有對 zuluf 的訪問權限。 撤銷組密鑰庫成員 現(xiàn)在假設我們希望從該組密鑰庫密鑰刪除用戶 oscar。命令格式為: efskeymgr -k user/<user_name> -S group/<group_name>
# efskeymgr -k user/oscar -S group/appgrp
|
用戶 oscar 注銷并再次登錄,以使更改生效;用戶 oscar 的組密鑰現(xiàn)在已刪除: $ 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 現(xiàn)在嘗試訪問該文件,他會遭到拒絕: $ 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 |
現(xiàn)在,文件 zuluf 只能供創(chuàng)作者(用戶 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
|
文件系統(tǒng)和目錄 啟用文件系統(tǒng)的加密可在文件系統(tǒng)創(chuàng)建級別完成,或者如果已經存在,也可以使用 chfs 命令修改。要加密一個已定義的文件系統(tǒng),可以使用 chfs 命令。以下命令在 /db2/db2data 文件系統(tǒng)上啟用 EFS: # chfs -a efs=yes /db2/db2data |
要是創(chuàng)建一個啟用了 EFS 的新文件系統(tǒng),請使用 “-a efs=yes” 選項,如下所示: # crfs -v jfs2 -a efs=yes -A yes -g apps_vg -m /db2/db2data -a size=128M |
要確認文件系統(tǒng)已啟用了加密,使用 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。 如果一個文件系統(tǒng)中的所有文件都要加密,它們可以單獨完成。但是,加密每個文件非常耗時。此方法也容易錯過一些您希望加密的文件。另一種方法是使用繼承設置加密整個文件系統(tǒng)或目錄。這樣,任何由具有有效密鑰的用戶創(chuàng)建的新文件都將自動加密。 要為文件系統(tǒng)啟用繼承加密,所使用的命令格式如下: efsmgr -s -E </filesystem> |
例如,為了允許在 /db2/db2data 文件系統(tǒng)上使用繼承功能,可以使用以下命令: # 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 -L /db2/holding
EFS inheritance is set with algorithm: AES_128_CBC
|
當禁用繼承功能時,所有以前加密的文件會保持加密,任何新文件不會自動加密。要在文件系統(tǒng)上禁用繼承,所使用的命令格式如下: efsmgr -s -D </filesystem> |
要在 /db2/db2data 文件系統(tǒng)上禁用繼承功能,可以使用以下命令: # efsmgr -s -D /db2/db2data |
要禁用目錄繼承功能,所使用的命令格式如下: efsmgr -D </directory/directory/..> |
要在 /db2/holding 目錄上禁用繼承功能,可以使用以下命令:
加密 DB2 文件 在本演示中,我將在 /db2/db2data 文件系統(tǒng)上啟用加密。此文件系統(tǒng)包含之前由數(shù)據(jù)庫創(chuàng)建的表空間。隨著數(shù)據(jù)不斷增加,會向此文件系統(tǒng)添加更多表空間。 如果尚未這么做,請為 /db2/db2data 文件系統(tǒng)啟用 EFS。 要在已定義的文件系統(tǒng)上啟用 EFS,請使用 chfs 命令,如下所示: # chfs -a efs=yes /db2/db2data |
DB2 下的默認操作時,所有向表空間的寫入都會由實例所有者執(zhí)行(如 aixdev 中所示)。 /db2/db2data/mtrbikes 目錄將包含我們即將加密的 DB2 表空間文件。這里,我們需要決定是否: - 為整個文件系統(tǒng)啟用繼承;
- 為目錄啟用繼承;或者
- 加密每個表空間。
對于本演示,我們啟用目錄繼承。 首先,停止 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(實例所有者)在現(xiàn)在設置了繼承的目錄中創(chuàng)建一個文件。此文件會立即使用他的密鑰加密,如下所示: $ 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
|
加密數(shù)據(jù)庫文件 請注意,在上面的輸出中,還未加密任何表空間文件。要加密,我們必須手動加密它們。因為有許多文件需要加密,可以使用 find 命令實用工具。我們還必須對目錄進行加密。以下兩個 find 命令實現(xiàn)此目的,首先加密目錄,然后加密從 /db2/db2data/mtrbikes 源目錄向下的文件。一個目錄已使用前面執(zhí)行的繼承命令加密,但是我們需要確保所有剩余目錄都已加密。請注意,它不會導致在相同目錄上重復該命令的問題。 $ find /db2/db2data/mtrbikes -type d -exec efsmgr -E {} \;
$ find /db2/db2data/mtrbikes –type f -exec efsmgr -e {} \;
|
請注意,上面的 find 命令中的 “{}”包含由 exec 計算時的文件名。 執(zhí)行上述 find 命令之后,這些文件現(xiàn)在已加密: $ 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.
|
接下來,檢查實例所有者能否連接并選擇數(shù)據(jù): $ 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 實例創(chuàng)建一個密鑰庫組 接下來,讓我們?yōu)檫@些文件提供通過組成員訪問的權限,不是所有文件都將允許組寫入,但一些文件將允許。用戶 insadm 是一個 DB2 管理員用戶,因此需要組密鑰訪問。 在本演示中,所有文件都授予了組密鑰庫訪問權限。 已有一個 AIX db2grp1 組,其中 insadm 是它的一個成員,當前的成員包括: $ lsgroup -a users db2grp1
db2grp1 users=db2fenc1,dasusr1,aixdev,echo,insadm
|
以 root 用戶身份,為組 db2grp1 創(chuàng)建密鑰庫,但僅包含成員 insadm。您可以在以后創(chuàng)建了更多實例時擴展該組。
以 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。 在目錄上設置了繼承之后,現(xiàn)在由 aixdev 創(chuàng)建的任何新文件都擁有與之關聯(lián)的組密鑰。 用戶 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 現(xiàn)在啟動 DB2 實例并連接數(shù)據(jù)庫,以進行快速的健康測試: $ 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
|
測試加密 要測試加密,我們?yōu)橐粋名為 alpha DB2 的用戶提供使用某些值更新 motorbike 表的特權。用戶 alpha 不屬于 keystore 組或 AIX db2grp1 組,也不會與任何人共享任何密鑰。隨著所有表空間寫入都已由實例所有者 aixdev 完成,所以加密/解密是對用戶透明的。 用戶 aixdev 現(xiàn)在為用戶 alpha 提供了表訪問權限,允許它選擇表 motorbike 并執(zhí)行插入操作: $ 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 表上執(zhí)行一項選擇
圖 2. 用戶 alpha 檢索解密的數(shù)據(jù)
表空間是加密的,普通用戶仍然可以向表空間寫入數(shù)據(jù),因為更新是由用戶 aixdev 完成的。如果還有其他用戶需要文件訪問,請確保將它們添加到了密鑰庫組中,并檢查表空間權限。
密鑰不正確 如果您沒有加載最初用于加密 DB2 表空間文件的正確密鑰,在重新啟動實例且您連接數(shù)據(jù)庫時,可能會看到一個類似以下內容的錯誤: $db2 connect to mtrbikesSQL0901N 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 提供備份數(shù)據(jù)庫的授權。用戶 echo 是組 sysmaint 的唯一成員,該用戶還屬于組 db2grp1。但是,該用戶沒有 db2grp1 的密鑰庫組訪問權限。該用戶仍然能夠執(zhí)行備份,因為轉儲內容的寫入時由實例所有者(也就是 aixdev)執(zhí)行的。假設所有用戶都已從數(shù)據(jù)庫注銷,用戶 echo 現(xiàn)在獲取數(shù)據(jù)庫的備份: $ 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 文件系統(tǒng)。 實例所有者 aixdev 現(xiàn)在將數(shù)據(jù)庫還原到現(xiàn)有的數(shù)據(jù)庫上: $ 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
|
如果您丟棄數(shù)據(jù)庫,然后從一個備份映像還原它(假設 aixdev 的密鑰未更改,表空間文件將還原并向以前一樣加密)。在下面的示例中,用戶 aixdev 現(xiàn)在丟棄數(shù)據(jù)庫并從前面的備份映像執(zhí)行一次重定向還原。請注意,在丟棄數(shù)據(jù)庫之后,所有表空間文件都已刪除。數(shù)據(jù)庫的丟棄可通過 db 目錄中沒有數(shù)據(jù)庫項來確認: $ 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
|
現(xiàn)在,將要執(zhí)行重定向還原: $ 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 存儲文件可為您的數(shù)據(jù)提供隱私保護。該過程對連接數(shù)據(jù)庫的用戶是透明的。如果您有組成員屬于 DB2 SYSCTRL 和 SYSMAINT 組,那么為它們提供組密鑰訪問可能仍然很有用。
關于作者 ![]() ![]() David Tansley 是一位自由作家。他有 15 年 UNIX 系統(tǒng)管理經驗,最近 8 年使用 AIX。他喜歡打羽毛球和觀賞一級方程式賽車,但是最喜歡與妻子一起開著 GSA 摩托車旅行。
http://www.ibm.com/developerworks/cn/aix/library/au-efsdb2/index.html
|