Transparent Data Encryption以下简称TDE。

称为透明是因为加密工作在SQL层以下,由数据库引擎自动进行。

TDE是第三代加密,10gR2时引入。之前两代为DBMS_OBFUSCATION_TOOLKIT和DBMS_CRYPTO。

TDE最大的好处是不用改应用。

ENCRYPTION 101

cryptography - 密码学

Goal of Encryption

加密的目的是保护在不安全媒介上传输的敏感信息。

数据库安全与网络安全很不同。不过在透明上是相同的,即网络使用SSL和TLS。

The Basics

加密将明文转换为不可辨识的形式。解密反之。研究此两过程称为密码学。
参考书籍《Applied Cryptography: Protocols, Algorithms, and Source Code in C》

Encryption Choices

自己写加解密算法是不明智的,应选择标准的,经验证的算法。

The Algorithm and the Key

加密数据需要算法和加密key,加密的强调取决于两者组合。算法使用加密key加密数据。

由于算法是公开的,因此唯一需要保密的是加密key。

两类加密算法:对称和非对称(PKE或Public Key Encryption)。 对称算法包括DES,3DES,AES,TLS等,由于效率高,通常用于加密大批量数据。TLS是网络加密的标准。

PKE中的两个key称为公钥和私钥。私钥加密的数据可以用公钥解密,反之亦然。PKE解决了密钥发布的问题。

私钥也解决了认证的问题。

在对称加密中,PKE可用来加密加密key。

为效率计,数据库加密也使用对称加密,不够需要解决密钥管理的问题。

ENCRYPTING DATA STORED IN THE DATABASE

加密的第一需求来自合规性,如PCI DSS。第二需求来自生命周期管理,如备份,复制等。

防止DBA看到敏感数据需要DBV。

Where the Data “Rests”

在TDE之前,磁盘上的数据是明码存放。

Protecting the Data

如果有OS权限,以下命令可以看到明码数据:

strings *.dbf | grep pattern

Applied Example

更换磁盘是必须完全擦除数据,如shred。

Encrypting in the Database

文件系统加密是blanket approach(整体的方法),即加密所有,但比较昂贵(耗资源)。

应用加密如DBMS_CRYPTO则需要改应用。

THE TRANSPARENT DATA ENCRYPTION SOLUTION

TDE是声明式的,支持所有原生数据库功能。

TDE直接,简单。

Key Management Facilities

以下数据加密key称为DEK,加密DEK的密钥称为MEK(master key或master encryption key)。

在12c中,所有PDB共享一个key store,但每一个PDB可以有自己的MEK和DEK。

实际上,在19c中,PDB可以指定自己的key store,这成为isolated mode,而传统的方式称为united mode, 详见https://docs.oracle.com/en/database/oracle/oracle-database/19/asoag/managing-keystores-encryption-keys-in-isolated-mode.html#GUID-1637E45A-36BA-4BC8-B9E3-581515A9AA1C。
本文只讨论unitied mode。

MEK存放在keystore中,有3种保护方法:

  1. 口令保护:使用口令打开key store
  2. 自动登录:自动生成口令并自动打开keystore
  3. 本地自动登录

TDE可以于HSM(hardware security modules)结合。

在创建key store前,必须先建立wallet目录,如果是RAC建议创建在共享的ASM中:

$ mkdir $ORACLE_BASE/admin/ORCLCDB/wallet

然后指定wallet目录,编辑文件$ORACLE_HOME/network/admin/sqlnet.ora

ENRYPTION_WALLET_LOCATION =(SOURCE=(METHOD=file) (METHOD_DATA=(DIRECTORY=/opt/oracle/admin/ORCLCDB/wallet)))

最后重启数据库。

Key Management Roles

12c中有专门的SYSKM权限,PDB中可使用ADMINISTER KEY MANAGEMENT权限。

connect / as sysdbaalter session set container=sales;grant create session to sec_mgr identified by welcome1;create role sec_mgr_role;GRANT administer key management TO sec_mgr_role;GRANT SELECT ON gv_$encryption_wallet TO sec_mgr_role;
GRANT SELECT ON gv_$encryption_keys TO sec_mgr_role;
GRANT SELECT ON gv_$encrypted_tablespaces TO sec_mgr_role;grant sec_mgr_role to sec_mgr;

Creating Keystores and a Master Key in the Root Container

首先要在CDB中设置:

connect / as syskm-- 口令保护的key store
ADMINISTER KEY MANAGEMENT
CREATE KEYSTORE '/opt/oracle/admin/ORCLCDB/wallet'
IDENTIFIED BY welcome1;

然后在目录下可看到新文件,p12后缀是因其遵循PKCS #12标准:

$ ll /opt/oracle/admin/ORCLCDB/wallet
total 4
-rw-------. 1 oracle oinstall 2555 Aug 26 23:13 ewallet.p12

以下命令创建自动登录的key store,也就是不需要口令,这是不安全的,生产环境不建议使用:

ADMINISTER KEY MANAGEMENT
CREATE LOCAL AUTO_LOGIN KEYSTORE
FROM KEYSTORE '/opt/oracle/admin/ORCLCDB/wallet'
IDENTIFIED BY welcome1;

我们可以看到多了sso文件:

$ ll /opt/oracle/admin/ORCLCDB/wallet
total 8
-rw-------. 1 oracle oinstall 2600 Aug 26 23:17 cwallet.sso
-rw-------. 1 oracle oinstall 2555 Aug 26 23:13 ewallet.p12

目前的状态是:

column wrl_parameter format a35
column wallet_type format a20
column status format a19
SELECT wrl_parameter, wallet_type, status
FROM sys.gv_$encryption_wallet;WRL_PARAMETER                       WALLET_TYPE          STATUS
----------------------------------- -------------------- -------------------
/opt/oracle/admin/ORCLCDB/wallet    LOCAL_AUTOLOGIN      OPEN_NO_MASTER_KEY

在PDB中查询结果:

WRL_PARAMETER                       WALLET_TYPE          STATUS
----------------------------------- -------------------- -------------------LOCAL_AUTOLOGIN      OPEN_NO_MASTER_KEY

escrow - 代管,托管。

注意, Keystore一旦创建就不应该删除,因此也没有删除命令

如何将自动登录的key store更改为口令保护的key store? 可参考How to convert Local Autologin/Autologin Keystore to Password based Keystore (Doc ID 2061244.1):

SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE;keystore altered.SQL> SELECT wrl_parameter, wallet_type, status FROM sys.gv_$encryption_wallet;WRL_PARAMETER                       WALLET_TYPE          STATUS
----------------------------------- -------------------- -------------------
/opt/oracle/admin/ORCLCDB/wallet    UNKNOWN              CLOSEDUNKNOWN              CLOSEDUNKNOWN              CLOSEDUNKNOWN              CLOSEDSQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY welcome1;keystore altered.SQL> SELECT wrl_parameter, wallet_type, status FROM sys.gv_$encryption_wallet;WRL_PARAMETER                       WALLET_TYPE          STATUS
----------------------------------- -------------------- -------------------
/opt/oracle/admin/ORCLCDB/wallet    PASSWORD             OPEN_NO_MASTER_KEYUNKNOWN              CLOSEDUNKNOWN              CLOSEDUNKNOWN              CLOSED

好了,现在可以用以下命令来打开和关闭key store:

ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY welcome1 CONTAINER = ALL;ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY welcome1 CONTAINER = ALL;

下面开始创建MEK。首先必须设置CDB中的MEK, 否则直接在PDB中创建会报错:

SQL> administer key management use key 'AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' identified by "welcome1" with backup;
administer key management use key 'AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' identified by "welcome1" with backup
*
ERROR at line 1:
ORA-46671: master key not set in root container

CDB中的过程如下:

connect / as sysdbaADMINISTER KEY MANAGEMENT
CREATE KEY
USING TAG 'root'
IDENTIFIED BY welcome1
WITH BACKUP
;SQL> SELECT tag,key_id FROM v$encryption_keys;TAG        KEY_ID
---------- ------------------------------------------------------------------------------
root       AQKj4ziKK0/3vz9xxCSOOxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAadminister key management use key 'AQKj4ziKK0/3vz9xxCSOOxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' identified by "welcome1" with backup;

以上的CREATE和USE可以直接用SET一步替代:

administer key management set key identified by "welcome1" with backup;

此时, CDB和PDB$SEED的key stor状态为OPEN, 表示其中有MEK了:

SQL> SELECT con_id, wrl_parameter, wallet_type, status FROM sys.gv_$encryption_wallet;CON_ID WRL_PARAMETER                       WALLET_TYPE          STATUS
---------- ----------------------------------- -------------------- -------------------1 /opt/oracle/admin/ORCLCDB/wallet    PASSWORD             OPEN2                                     PASSWORD             OPEN3                                     PASSWORD             OPEN_NO_MASTER_KEY4                                     PASSWORD             OPEN_NO_MASTER_KEY

Creating Master Keys in Pluggable Databases

接下来在某PDB中创建2个MEK:

alter session set container=sales;ADMINISTER KEY MANAGEMENT
CREATE KEY
USING TAG 'sales1'
IDENTIFIED BY welcome1
WITH BACKUP USING 'root_create'
;ADMINISTER KEY MANAGEMENT
CREATE KEY
USING TAG 'sales2'
IDENTIFIED BY welcome1
WITH BACKUP USING 'sales_create'
;SELECT tag,creator,key_use
,to_char(creation_time,'DD-MON-YYYY HH24:MI:SS') creation_timeFROM sys.gv_$encryption_keys;TAG        CREATOR    KEY_USE    CREATION_TIME
---------- ---------- ---------- -----------------------------
sales1     SYS        TDE IN PDB 27-AUG-2020 02:58:27
sales2     SYS        TDE IN PDB 27-AUG-2020 03:06:27
root       SYS        TDE IN PDB 27-AUG-2020 03:29:15

以上语句中的WITH BACKUP会备份key store。

我们在pdb中创建了两个MEK,现在需要激活一个:

SQL> SELECT tag,key_id FROM v$encryption_keys;TAG        KEY_ID
---------- ------------------------------------------------------------------------------
root       AQKj4ziKK0/3vz9xxCSOOxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
sales      AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
root       AZbgQL5oLU80vwZ6ZxGzp0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAASQL> SELECT wrl_parameter, wallet_type, status FROM sys.gv_$encryption_wallet;WRL_PARAMETER                       WALLET_TYPE          STATUS
----------------------------------- -------------------- -------------------PASSWORD             OPEN_NO_MASTER_KEYSQL> administer key management use key 'AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' identified by "welcome1" with backup;keystore altered.SQL> SELECT wrl_parameter, wallet_type, status FROM sys.gv_$encryption_wallet;WRL_PARAMETER                       WALLET_TYPE          STATUS
----------------------------------- -------------------- -------------------PASSWORD             OPENadminister key management use key 'AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' identified by "welcome1" with backup;

通过con_id, 我们可以知道每个PDB使用的MEK:

SQL> SELECT con_id, key_id FROM v$encryption_keys;CON_ID KEY_ID
---------- ------------------------------------------------------------------------------1 AQKj4ziKK0/3vz9xxCSOOxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4 AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0 AZbgQL5oLU80vwZ6ZxGzp0wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

也可以通过最近激活时间来判断:

SQL> show con_idCON_ID
------------------------------
4
SELECT KEY_ID
FROM V$ENCRYPTION_KEYS
WHERE ACTIVATION_TIME = (SELECT MAX(ACTIVATION_TIME)FROM V$ENCRYPTION_KEYS5                           WHERE ACTIVATING_DBID = (SELECT DBID FROM V$DATABASE));KEY_ID
------------------------------------------------------------------------------
AcR7hDRNxk/fv05JQML4YLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

由于所有PDB共享key store,而MEK存于key store,因此你创建的MEK可以为所有PDB使用。

Creating an Encrypted Column in a New Table

列加密的最简形式:

create table foo(a int, b varchar(2) encrypt);

复杂一点的:

create table bar(a int, b varchar(2) encrypt using 'AES192' 'SHA-1' SALT);

其中AES192为加密算法。SHA-1为MAC(message authentication code)算法,需要额外的20字节。SALT会在数据后附加16随机字节,这样相同的数据可加密结果不同。

Determining TDE Encrypted Columns

COL OWNER format a10
COL TABLE_NAME format a15
COL COLUMN_NAME format a15
COL ENCRYPTION_ALG format a18
COL SALT format a5
SELECT owner, table_name, column_name
, encryption_alg, saltFROM dba_encrypted_columns;OWNER      TABLE_NAME      COLUMN_NAME     ENCRYPTION_ALG     SALT
---------- --------------- --------------- ------------------ -----
HR         FOO             B               AES 192 bits key   YES

每个表使用不同的DEK,而且是对称key。然后DEK使用MEK加密,这种两级方式使得MEK的rekey非常简单。

Encrypting an Existing Column

已有表的加密:

create table foo(a int, b varchar(2));
alter table foo modify (b encrypt);

由于加密会增加字节,可能会导致性能问题。因此建议对表做reorg。

手工的方法是通过impdp和expdp做导出导入。

自动的方法是通过online redefinition。可参考这里

Caveats to Column-Level TDE

列加密工作在SQL层:

TDE column encryption is performed at the SQL layer. Oracle Database utilities that bypass the SQL layer cannot use TDE column encryption services.

列加密的限制参见Restrictions on Using TDE Column Encryption

推荐表空间加密,它没有任何限制。

Tablespace Encryption

CREATE TABLESPACE sales_encrypt
DATAFILE 'sales_encrypt.dbf' SIZE 50M
ENCRYPTION USING 'AES256'
DEFAULT STORAGE (ENCRYPT);Tablespace created.SELECT ts.name, et.encryptedts, et.encryptionalg
FROM v$tablespace ts, v$encrypted_tablespaces et
WHERE ts.ts# = et.ts#;NAME                           ENC ENCRYPT
------------------------------ --- -------
SALES_ENCRYPT                  YES AES256

然后可以将已有的表迁移到加密表空间:

SQL> create table t1(a int);Table created.SQL> alter table t1 move tablespace sales_encrypt;Table altered.

加密已有的表空间:

SQL> CREATE TABLESPACE noencrypt datafile 'noencrypt.dbf' size 10M;Tablespace created.SQL> ALTER TABLESPACE noencrypt ENCRYPTION ONLINE USING 'AES192' ENCRYPT;Tablespace altered.

可参考这里

TDE AND ORACLE DATABASE TOOLS INTEROPERABILITY

当数据需要移动时,TDE需要和其它工具配合使用,如OGG,Data Pump, ADG,详见Oracle Database Advanced Security Guide。

PERFORMANCE

性能视情况而定,总之建议用表空间加密。如果用列加密,需要注意不要用在逐渐,主外键约束等。

另外可考虑硬件加速,参见:How To Benefit From Hardware Acceleration for Tablespace Encryption? (Doc ID 1365021.1)。

ADVANCED ENCRYPTION PROTECTION SUPPORT

Oracle数据库支持FIPS 140-2,设置参见How To Setup Federal Information Processing Standard (FIPS) standard for 140-2 Using FIPS.ORA On Single Instance and On RAC ( Real Application Cluster) (Doc ID 2250070.1)。

SQL> show parameter fips;NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
DBFIPS_140                           boolean     FALSE

可用于网络数据,静态数据的加密,以及DBMS_CRYPTO package。

参考

  • Master Note For Transparent Data Encryption ( TDE ) (Doc ID 1228046.1)
  • TDE 12c : Frequently Asked Questions (Doc ID 2253348.1)
  • Master Note: Overview of Oracle Tablespace Management (Doc ID 1493350.1)
  • All About Security: User, Privilege, Role, SYSDBA, O/S Authentication, Audit, Encryption, OLS, Database Vault, Audit Vault (Doc ID 207959.1)
  • Oracle TDE: How to Use It and Survive
  • Getting Started With Transparent Data Encryption in Oracle 12c (non pluggable database ) (Doc ID 1964158.1)

Oracle Database 12c Security - 11. Oracle Transparent Data Encryption相关推荐

  1. Oracle Database 12c Security - 12. Audit for Accountability

    Oracle Unified Audit Trail (OUA)是12c新增功能. THE SECURITY CYCLE 审计使安全更完整,审计是事后行为,不能预防. 访问控制并不能保证非授权访问,人 ...

  2. Oracle Database 12c Security - 13. An Applied Approach to Multitenancy and Cloud Security

    有时,不必要的安全措施会导向更不安全.例如,增加口令强度导致用户不得不将口令记录,并存放在不安全的地方. 安全象洋葱,一层又一层. SYSTEM BASELINE AND CONFIGURATION ...

  3. Oracle Database 12c Security - 6. Real Application Security

    RAS(Real Application Security)是12c的新特性,RAS的特点是全面(comprehensive)和透明. 传统的Web应用,要在不同连接间切换,并保证正确权限的成本太高, ...

  4. Oracle Database 12c Security - 1. Security for Today’s World

    THE SECURITY LANDSCAPE 全面考虑(think holistically),理解为什么要这么做. 基本假设: 系统是脆弱的,可能会被攻破,要保护最重要的部分 一切关乎数据,正如抢劫 ...

  5. 开始读《Oracle Database 12c Security》

    去年大致过了一遍,几年由于遇到很多数据库安全需求,因此决定仔细过一遍. 原出版社Oracle Press应是被McGraw Hill收购了,介绍页面即随书代码下载参见这里 8月8日开始读,8月30日读 ...

  6. 【OH】Deprecated and Desupported Features for Oracle Database 12c

    连接地址:http://docs.oracle.com/database/121/UPGRD/deprecated.htm#UPGRD60000 8Deprecated and Desupported ...

  7. 5和6 objbc oracle_《Oracle Database 12c完全参考手册(第7版)(试读版)》

    图书目录: 第Ⅰ部分 数据库核心概念 第1章 Oracle Database 12c架构选件 3 1.1 数据库和实例 4 1.2 数据库技术 5 1.2.1 存储数据 6 1.2.2 数据保护 7 ...

  8. Oracle Database 12c Attribute Cluster 和 Zone Map 高阶实验

    本文为参照此教程的实验过程. 此实验设计得非常好,感谢作者Nigel Bayliss和Veerabhadra Rao Putrevu. 术语翻译 Attribute Cluster:属性聚类 Clus ...

  9. oracle12c如何存档图片,Oracle Database 12c实用教程

    第1章 数据库技术基础 1 1.1 数据库基本概念 1 1.2 数据模型 3 1.2.1概念模型 3 1.2.2结构模型 5 1.3 数据库的设计步骤 9 1.4 习题 10 第2章 Oracle D ...

最新文章

  1. Asp.Net Core在线生成二维码
  2. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting
  3. POJ 2388 Who's in the Middle
  4. url编码混乱下下载工具如何应对
  5. GIS基本知识学习PDF文档
  6. 服务器系统扩展c盘,云服务器c盘扩展
  7. 人工智障学习笔记——深度学习(2)卷积神经网络
  8. Stanford Machine Learning 学习 2016/7/4
  9. mysql查到库怎么进入表_mysql如何进入数据库查看所有表
  10. HTML的基本知识(三)
  11. 零基础轻松学mysql_零基础轻松学MySQL 5.7
  12. [转载] JavaScrip ajaxt和python flask通过json传递数据的方法
  13. POJ 2226 Muddy Fields(最小点覆盖)题解
  14. servelet 实现Post接口访问
  15. 系统测试(功能测试、性能测试、负载测试、压力测试、兼容性测试、安全测试、健壮性测试、配置测试、可用性测试、文档测试)
  16. ZT世界第九大奇迹--北京西直门立交桥〔爆笑〕
  17. spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value
  18. 苹果商城怎么调成中文_使用苹果手机时,你感觉最不舒服的地方有哪些?
  19. 人工智能ai思维_人工智能系统如何学习创造性思维
  20. 奇葩!小米手机自带浏览器css兼容问题,强制屏蔽、隐藏类名为 top_box 的元素。

热门文章

  1. GAMS语法初级教程
  2. Servlet之请求包含与会话技术获取表单信息(Cookie)
  3. 第一章 计算机基础知识
  4. 难忘战斗岁月————PMP认证考试总结
  5. 手机音量键只能调音量?华为:我这还有7个功能麻烦了解一下
  6. 苹果手机用android系统,安卓与苹果手机系统使用感受对比
  7. 魔兽世界各服务器显示版本,魔兽怀旧服:都说TBC版本百花齐放,为何各职业处境差距那么大?...
  8. 路由器打印机虚拟服务器,怎么用路由器设置打印机服务器
  9. Windows 编程,画笔画刷以及几何图形的绘制
  10. JavaScript鼠标事件、键盘事件