a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 200|回复: 3

[其他] Oracle认证:使用Oracle的TDE特性加密(1)

[复制链接]
发表于 2012-8-4 13:41:06 | 显示全部楼层 |阅读模式
使用作为 Oracle 高级平安选件(版本 10.2 及更高版本)的一部门惹人的 Oracle 数据库透明数据加密(TDE),可以有选择地对保留在数据库底层数据文件中的敏感数据库数据以及所有下流文件组件(如联机重做日志、归档重做日志和数据库备份)进行加密。 TDE 的根基方针是呵护在这些原始操作系统文件中发现的敏感数据,防止不怀好意的人访谒磁盘或备份磁带时对这些数据进行窥探,然后考试考试还原数据库或扫描原始操作系统文件中的数据,如小我可识别信息或信用卡信息。   作为我的咨询通例的一部门,我已经实施 TDE 多次。可是,在其一一个比来的合约之前,我一向使用 TDE 对现有表中的新列或属于全新表的列进行加密。在这两种情形下使用 TDE 很是简单,因为方针列为空,是以因为缺乏数据和现有应用轨范相关性而不会涉及较大的风险。
) T& \! v1 q$ `  e# X  我比来实施 TDE 的体验有所分歧。我辅佐一家大型公司对一个已跨越一百万行的表中的现有列进行加密。还有一个依靠于列的关头使命应用轨范,是以,您可以设想一下,在起头工作之前有良多主要的工作要考虑。在 Internet 上搜索可供给经验的近似气象之后,我发现只有几个优异的资本可以辅佐我。
) x8 W# j5 J; K+ ^  本文概述了我在经由过程使用 TDE 对现稀有据进行加密的过程中总结出的经验教训。如不美观您考试考试对现有列数据使用 TDE,我但愿此处供给的信息可辅佐您迅速有用地开展近似工作。
8 @# G7 m* q& H& C8 M9 d# _  确定可能的限制
1 j) n4 h/ K0 x/ ?7 y  研究客户的系统时,我做的第一件工作就是查找与方针列有关的将禁止我们对列加密的数据模子特征,或者查找可能对现有操作发生负面影响的有关列的事项。钙揭捉究搜罗查找列索引和完整性约束。
; c: D1 F' f: S3 n, @/ r9 Y  正如 Oracle 文档明晰声明,当您想对具有索引的某个列进行加密时,需要体味良多限制前提。Oracle 不许可对具有位图索引的列进行加密,这与我们的情形没有慎密亲密关系。可是,方针列具有多个通俗的(B 树)索引。尽管 Oracle 许可对具有通俗索引的列进行加密,可是 Oracle 禁止对索引列进行“salt 措置”加密。Salt 措置经由过程在加密之前向数据添加随机字符串来提高一再数据的平安性,是以窃贼使用模式匹配识别手艺加倍难于破解加密的数据。总而言之,经由这个最初的剖析之后,我们会碰着一种情形,那就是我们可以对列进行加密,但不能进行 salt 措置。- b& i3 J+ p/ t) j# |
  对列索引进行剖析后,我本可以到此为止,可是我想回覆的下矣闽问题是“使用这些索引合适吗?”我的思虑过程是这样:如不美观索引没有用,那么我会将其删除,从而削减维护索引条目所必需的系统开销,尤其是考虑到加密的额外承担。要判定索引是否有用,我使用 Oracle 数据库的索引看管特征。我发现,现实上索引正处于使用傍边,是以我们必需对其继续进行维护。, B8 ]% D. v9 K0 b" v0 b* ~5 j) j
  接下来,我查看了引用完整性约束前提中是否涉及方针列。因为每个表都具有其自己的加密密钥,是以 Oracle 不许可您使用 TDE 对外键关系中涉及的列进行加密。在我们的情形下,引用完整性约束前提中未涉及方针列。3 h$ n; W5 B1 K
  评估机能开销
( V, r# f: Y: P) i8 ~  我的客户询问的第一组问题之一就是“TDE 对我的应用轨范的一般机能酉鹏何?”Oracle 文档中有一小部门阐述了一般情形下 TDE 对相关应用轨范机能的影响。可是我的客户但愿获得一些具体的统计信息,以辅佐他们体味 TDE 若何酉耪常进行的有严酷时刻要求的数据加载过程。' U3 R2 h1 n: ?6 [0 e

, `3 J; Q- X) u! W8 _( v  为了知足客户需求,我计较了天天在有严酷时刻要求的过程中插入到方针表中的平进行数。然后,我在客户端的不异沙箱情形中建树了一个近似的测试表和索引,测量在加密方针列前后插入不异数目的行所破耗的时刻。时刻耗损上的分歧让我们更好地体味了在该过程中对列数据进行加密所造成的“机能损失踪”。列表 1 是我若何使用 SQL*Plus 执行该操作的示例。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:07 | 显示全部楼层

Oracle认证:使用Oracle的TDE特性加密(1)

</p>  SQL> CONNECT system
$ U4 B0 D. H) h& Y3 i% t" \  Enter password:+ P+ b3 N( L  r" v
  Connected." W/ v% X3 V8 k0 m+ J( p, U
  SQL> -- Configure Oracle-Managed (Data) Files
6 A* G# S+ l8 L7 b  SQL> ALTER SYSTEM
, `8 O2 }; H) }3 @+ r  2 SET db_create_file_dest = ’/data01/oracle/’
3 x. I  L8 L/ w  3 SCOPE = MEMORY;3 R2 G; v2 `+ I- v! N
  System altered.  q2 @! s; w0 n; W4 }
  SQL> -- Create two new tablespaces for the demo,
& C8 P0 Z6 |) v' M2 a: ?  SQL> -- one for data segments, one for index segments
. k# o4 |" r; b; e+ Z  SQL> CREATE TABLESPACE data_001- R" w) _% Q! K
  2 DATAFILE SIZE 1G;+ H: [2 J: ]9 S2 N
  Tablespace created.1 K" E1 B" y" M4 G- \  {
  SQL> CREATE TABLESPACE indx_001* I$ V! @, P8 K! N4 ~
  2 DATAFILE SIZE 500M;  p9 N- H/ E2 e( N/ s, s& \/ {
  Tablespace created.+ b- ^+ z9 X. j6 Y# Y5 q
  SQL> -- Create a user for the demo% d  i" a5 a/ u& A
  SQL> CREATE USER app_001 IDENTIFIED BY app
. i3 w1 q+ v4 D( i; y& J  2 DEFAULT TABLESPACE data_001
2 A+ M  j% R) _( w9 @$ \  3 TEMPORARY TABLESPACE temp" x; D6 `) {' s+ W' F4 c
  4 QUOTA UNLIMITED ON data_001
9 V+ g( _% j$ G+ C0 L  5 QUOTA UNLIMITED ON indx_001;$ ]# I5 c7 q6 [7 ^* o( D; k
  User created.0 Y) o2 _( Q1 C
  SQL> GRANT CREATE SESSION, CREATE TABLE TO app_001;- y* C+ i% d0 x$ j: ?8 T
  Grant succeeded.
( {5 |. x9 \. N& J% T& C9 I- ^  SQL> -- Work as the demo user
' h9 a) ^4 S" X' m/ M  SQL> CONNECT app_001/app;
8 Y& g# M9 I8 F& m: r  Connected.
7 g/ ^6 G" _5 x4 ?! _5 U6 s3 g  SQL> -- Create the demo table in the default tablespace, T- [; `! R# b+ D8 x' [
  SQL> CREATE TABLE app_001.transactions (" m! T4 F& C# }6 B! ]
  2 trans_id INTEGER
* H! }) _1 o0 P4 K1 Q. S/ L  3 CONSTRAINT transactions_pk PRIMARY KEY* v& ], w/ A0 l% p5 M7 y
  4 USING INDEX TABLESPACE indx_001,* P/ R  Z" \, m; q1 R# q
  5 credit_card INTEGER NOT NULL
* |% R1 |! J' m2 b( \  6 );
! S* h7 F- G: e$ L5 R4 C- o9 F( w  Table created.
" q4 F7 c8 e, o: K/ B  SQL> -- Create an index in the INDX_001 tablespace( a' ]! m2 t; _8 Q8 ^1 q
  SQL> CREATE INDEX app_001.transactions_ndx1
2 b5 l9 {. ^0 A- W* D' X- Y  2 ON app_001.transactions(credit_card)
* d( U8 D) f* g  3 TABLESPACE indx_001;* Y# P' Z! ^' Y1 P7 V- r
  Index created.0 `: n; ?5 w$ @( P
  SQL> -- Time how long it takes to load data in the clear- g  ~( k6 x# S7 R1 [
  SQL> SET TIMING ON;% H( @9 s) X1 N2 m* n
  SQL> BEGIN: E3 l7 W' h3 I- ^5 C
  2 -- AMEX* Y. `" o# V7 J! e  v8 G( t" b
  3 FOR i IN 1 .. 100000 LOOP% s/ i3 b' f* Q  ]
  4 INSERT INTO app_001.transactions(trans_id, credit_card). N! K) i/ w8 ]3 k
  5 VALUES (4 B" s+ }% |8 b5 L, o4 o# X5 w- D/ K
  6 i,1 I1 Y% }/ @2 n+ k" d
  7 ’34’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
7 V4 T& b% _0 a! \  8 );
! Z/ k" X' c- V9 K! z  S  9 END LOOP;
/ B! s: B+ [: g9 A1 D  10 COMMIT;
8 `$ ~8 K& x5 @$ Z0 `  O% ^5 @  11 -- VISA
! j% a( y! w3 S  A+ V& h5 R# N4 O2 z1 a  12 FOR i IN 100001 .. 400000 LOOP
6 I5 F8 a6 l$ u" @7 Q/ n  13 INSERT INTO app_001.transactions(trans_id, credit_card)6 ~; h: j' X8 Y% ?* W- b  N
  14 VALUES (
2 s, d7 i& W8 u& d: n* L1 ~7 ^  15 i,. k3 `& Y' H- s7 t/ w2 }; g/ H- Y
  16 ’4’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>999999999999999))
& ?7 q/ Q5 ~+ f% T, Y8 G% M. ?  17 );
7 q6 U; Q( {/ B; a3 |3 E; V$ }# i/ U
  18 END LOOP;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:08 | 显示全部楼层

Oracle认证:使用Oracle的TDE特性加密(1)

</p>  19 COMMIT;" ?& G8 n7 w4 }: `
  20 -- MASTERCARD
* D) H% j. A7 Z! ?) \  21 FOR i IN 400001 .. 500000 LOOP
+ t2 r( `4 m. X# e4 G& {  22 INSERT INTO app_001.transactions(trans_id, credit_card)
! P5 _! Z( u' ]: @% r  23 VALUES (3 x3 m6 O7 B( A, O) N' h; K
  24 i,5 _3 V) M- ^+ N' B
  25 ’54’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
5 }/ b: k+ V1 z  M$ _  26 );
8 ~$ ~, K( g# t( ]) s  27 END LOOP;
6 l% c# z) l5 f  28 COMMIT;( m: d1 A+ f; b" v# y
  29 END;# t6 L; A! r; a( {
  30 /. l0 c4 w) [) k+ v' u& |
  PL/SQL procedure successfully completed.5 ^, a& Y$ \. ]
  Elapsed: 00:00:56.140 g7 E. d/ W! \. w
  SQL> SET TIMING OFF;
" x% Q0 [% A. v! n, Z% S0 d  SQL> -- Remove existing synthetic data; i5 I1 ?2 R& Y3 y1 U) V
  SQL> TRUNCATE TABLE app_001.transactions;3 J2 H$ l6 o9 ^- @& W
  Table truncated.2 [# X. N$ f4 {+ m5 }3 [
  SQL> -- Enable encryption of the credit card column
& W, h$ u" ]. X$ {6 a$ q! c: q  SQL> ALTER TABLE app_001.transactions
3 z0 d' ]: `9 F  2 MODIFY (credit_card ENCRYPT NO SALT);
; E5 ]6 ~  y: y  Table altered.
7 W3 N! d+ @0 s/ b" X# b1 X  SQL> -- Time how long it takes to load encrypted data* g; Y* t3 s/ d& d6 ^. f2 z
  SQL> SET TIMING ON;9 U% t1 D% F7 R' p1 v, X' {/ j
  SQL> BEGIN/ X/ q* q2 A/ A+ }7 d0 T
  2 -- AMEX
0 O. A. E% ?. `1 K+ ?3 ]  3 FOR i IN 1 .. 100000 LOOP* Q9 R- w9 R9 |/ z3 ^
  4 INSERT INTO app_001.transactions(trans_id, credit_card)5 d- d5 C) b% x% S& S+ [. L! F
  5 VALUES (
. ~$ G) T7 V& s, q3 Q  6 i,) u& ^- C& F- A9 F. s. A
  7 ’34’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999))
9 c, b& z7 l; E' d# d3 E  8 );* X. o$ E: t4 e" j
  9 END LOOP;4 B" u: a" Q# p8 B
  10 COMMIT;  \  ?+ |3 Z  t8 r( ^/ T1 ]
  11 -- VISA9 o! P5 E# ~2 N  \' V
  12 FOR i IN 100001 .. 400000 LOOP
0 a* D' z3 r. r' @) I/ F" Z  13 INSERT INTO app_001.transactions(trans_id, credit_card)
& K5 `1 f$ c6 \- n0 e7 F5 n  14 VALUES (
! {& m  R- F$ B% w, \! F' a8 ]" T& z! {- [9 |
  15 i,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:41:09 | 显示全部楼层

Oracle认证:使用Oracle的TDE特性加密(1)

</p>  16 ’4’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>999999999999999))  F* Y, s) A( O$ r  |7 A) h: I, I9 w
  17 );
9 @+ h" D% ~" r$ u1 z' D  18 END LOOP;* k3 U. o& t( p- W
  19 COMMIT;
- T6 ~4 U# A# l2 ^" l! t  20 -- MASTERCARD! Q* R9 P: m5 A$ [
  21 FOR i IN 400001 .. 500000 LOOP
. h) }9 G0 u: t! q+ R! [  22 INSERT INTO app_001.transactions(trans_id, credit_card); c; w+ }2 a3 d+ a5 q5 A2 Q
  23 VALUES (9 {4 e! u% f7 d2 F9 Y$ l2 J
  24 i,1 q0 M" y# u# a% t: A
  25 ’54’ || TRUNC(DBMS_RANDOM.VALUE(low=>0, high=>99999999999999)). v! Z( e% T( K7 ~( r+ \2 x
  26 );
- w% O, x5 T, k  27 END LOOP;( d" e& E2 U6 F
  28 COMMIT;
$ V0 E! V+ l8 Z  V  29 END;% f. r0 ]2 q4 h: H  l* k1 M  s
  30 /
6 c* x$ ^5 r* k0 C6 W! B  PL/SQL procedure successfully completed.
' V7 J2 K- m( G% k+ y/ q  Elapsed: 00:01:16.31
6 b1 n/ V# r1 w" j1 R# _5 b  SQL> SET TIMING OFF;
8 C: K! V6 S3 W! @3 a  列表 1 使用与您的出产情形不异的沙箱情形,简单斗劲启用列加密前后加载代表性数据集所破耗的时刻,以使您更好地体味列加密对出产系统机能的影响。
/ c9 |- A) A# I8 @) O: e  和所有的机能测试一样,我思疑对列进行加密所造成的机能损失踪会因系统而异,具体取决于通俗变量(CPU、平均负载等)。在列表 1 中,您注重到计较的机能损失踪为 36% (((56.14-76.31)/56.14)*100),可是,使用我们在客户系统中收集的尝试证据,估量数据加载过程所破耗的时刻应该大约增添 11%,这与在出产中使用 TDE 获得结不美观完全一样。
2 I# d: U' S  y0 e/ H  ?5 S5 S  在本例中,我着重于对具有索引的数据加载过程估量数据加密的机能损失踪。如不美观您的系统具有分歧类型的关头过程,如要求苛刻的报表生成周期,那么我建议您使用沙箱情形来斗劲数据加密前后该过程所破耗的时刻。本文后面的“确定潜在发芽打算更改”部门将谈判发芽和数据加密的出格注重事项。! ?) t' D% t$ i4 O# E* s
  措置停机和维护时刻) k4 I7 j2 w6 ?! k4 i
  我的客户斗劲关心的另一个问题是,在加密约一百万行的表中的现有列数据时,需要对哪些出产应用轨范(如不美观有)进行需要的停用。我最初设法是,理论上不需要遏制任何应用轨范 — 事实下场,Oracle 文档明晰暗示了对现有列的数据进行加密素质上就是对折个表进行多行更新。如不美观没有更多地考虑这件事,我不会大白为什么新行无法并发插入到表中以及为什么现有行更新无法继续。当我咕哝着熟悉的 Oracle 口号“篡夺方不会阻止写入方,写入方也不会阻止篡夺方”时,我简直没有想到列加密会影响发芽。
8 ~2 u8 {, H" S: t& s& f4 P% g/ K& V  可是,在长时刻从事 DBA 工作后,我才总结出,若要对出产系统进行最终的现实更改,需要对理论进行测试,以避免呈现意外问题,这一点很是主要。您瞧,当我在加密列时代,针对沙箱数据库对应用轨范自己进行了测试,从而发现了良多问题。最主要的是,我发现进行中的加密延迟了某些发芽的响应时刻,以至于应用轨范会碰着响应超时。这些超时又会造成毗连断开,然后导致后续的事务失踪败,进而会加倍麻烦 — 我将为您供给具体信息。
9 q; J/ r' u& K4 l9 T$ o  必需一提的是,测试之后,我体味到遏制应用轨范运行绝对不是没有理由的。但下矣闽问题是,出产应用轨范需要脱机多久?在打算每个周末进行的正常两小时的维护时刻之内能够对列进行加密吗?或者,需要更长的停机时刻?为了弄清这个问题,我只需测量在沙箱情形中对列进行加密所破耗的时刻,因为沙箱情形与出产情形具有不异的处事器硬件和数据集。我发现,列加密要破耗一个小时多一点的时刻才能完成。率直地说,因为我使用近似数据在标识表记标帜本电脑上模拟测试加密运行才破耗了不到 5 分钟的时刻,是以对于它破耗这么长时刻,我感应很是震动。可是当我们在出产数据库系统中对列进行加密时,最要紧的是要使用陈旧处事器硬件所发生的情形。: U! \6 N5 S# }
  体味到在正常维护时刻内执行其他使命需要更多时刻,我抉择必需找到削减加密列破耗时刻的体例。我的第一个直觉就是删除包含方针列的两个索引。这样,Oracle 只需加密表自己中的列数据,之后我可以有用地重建索引,而没有日志记实狷。经由一些新的测试之后,我将加密列以及相关索引所需的时刻从 70 分钟(在加密时代放在索引)削减到仅 20 分钟(加密列后重建索引)。列表 2 是我用来得出结论的测试示例(从我们在列表 1 中遏制的位置继续)。此外,请注重,列表中的时刻来自用来编写本文的测试系统,而不是来自我的客户端使用的现实系统。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 22:03 , Processed in 0.167212 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表