转自:oracle TDE学习系列 (1) — wallet 使用管理
关于oracle wallet,通常称为oracle钱夹,说的通俗一点,oracle wallet是一个用
口令加密的PKCS#12文件,PKCS#12是一个个人信息交换的语法标准,该公钥密码标准
由RSA security 涉及和发布。
我们知道11g的表空间加密依赖于oracle wallet以及wallet中的密钥,对于wallet分为
如下2种:
1. 手动打开的wallet (每次数据库启动以后,需要手动打开wallet)
2. 启动打开的wallet (每次数据库启动以后会启动打开)
如何设置数据库启动以后wallet启启动呢?很简单,通过owm去修改属性即可。
如果是DG环境,oracle推荐使自动的wallet(11g TDE支持dataguard)
创建wallet的方法分别有如下几种:
--> 手动调用OWM 进行GUI图形界面进行操作
--> 手工运行mkstore命令创建
--> alter system set encryption key identified by "xxxxx";
当然我这里图方便直接调用OWM进行创建了,如果是用mkstore命令,那么如下:
--> mkstore -wrl /home/ora11g/admin/roger/wallet -create
--> 输入密码(此时的密码是主密钥)
--> 确认密码
我们这里已经有一个wallet,所以我就直接打开即可,如下:
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "roger007~!@";
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "roger007~!@"
*
ERROR at line 1:
ORA-28368: cannot auto-CREATE wallet
|
如果出现上面错误,那么可以说手工指定wallet路径,添加如下信息到sqlnet.ora中:
NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT)
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/home/ora11g/admin/roger/wallet )))
|
当然,这里的method_data路径必须存在,否则会报错:
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "roger007~!@";
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "roger007~!@"
*
ERROR at line 1:
ORA-28368: cannot auto-CREATE wallet
|
错误依旧,突然发现该目录是不存在的,手工mkdir创建以下,即可:
[ora11g@11gr2test admin]$ mkdir -p /home/ora11g/admin/roger/wallet
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "roger007~!@";
System altered.
|
下面我们手工通过mkstore命令来看看(如下操作我是10204环境中进行):
[ora10g@killdb ~]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet -create
Enter password: ******
Enter password again: ******
==== 这里我输入的wallet密码是www.killdb.com ====
==== 将数据库用户roger用户认证信息加入到wallet进行管理 ====
[ora10g@killdb admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /home/ora10g/product/10.2//network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
TEST_10G =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = roger)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
|
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet -createCredential TEST_10G roger "roger"
Enter wallet password: ******
Create credential oracle.security.client.connect_string1
==== 这里输入的wallet同样是我们前面的www.killdb.com ====
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet -createCredential TEST_10G scott "tiger"
Enter wallet password:
Create credential Secret Store error occured: oracle.security.pki.OracleSecretStoreException: Credential already exists
==== 报错了,提示存在?====
|
google了一下,原理是每个连接字符串只能对应一个数据库用户,那我们就收工在tnsnames.ora中再添加一个即可,如下:
[ora10g@killdb admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /home/ora10g/product/10.2//network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
TEST_10G =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = roger)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
TEST_SCOTT =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = roger)
)
)
|
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet -createCredential TEST_SCOTT scott "tiger"
Enter wallet password: ******
Create credential oracle.security.client.connect_string2
==== 创建成功 ====
==== 到这里可能有人会问,如何知道哪些用户认证加到wallet了呢?oracle当然也提供了命令,如下:====
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet -listCredential
Enter wallet password: ******
List credential (index: connect_string username)
1: TEST_10G roger
2: TEST_SCOTT scott
|
我们可以发现,目前有2个数据库用户认证加入到wallet了,那么有什么用处呢?请看:
首先我们还得修改sqlnet.ora,添加如下内容:
[ora10g@killdb admin]$ cat sqlnet.ora
SQLNET.WALLET_OVERRIDE=TRUE
NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT)
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/home/ora10g/product/10.2/network/admin/wallet)))
|
[ora10g@killdb admin]$ sqlplus /@test_scott
SQL*Plus: Release 10.2.0.5.0 - Production ON Wed Oct 12 08:26:27 2011
Copyright (c) 1982, 2010, Oracle. ALL Rights Reserved.
Connected TO:
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.5.0 - Production
WITH the Partitioning, OLAP, DATA Mining AND REAL Application Testing options
SQL> SHOW USER
USER IS "SCOTT"
==== 我们可以发现,实现无密码登陆 ====
到最后,我想大家会跟我一样还会有个疑问,那就是:如果scott用户更改密码了呢?
那还会有用吗?如果没用的话,是不是需要重建用户的认证呢?
答案是否,oracle还提供了MODIFY功能,如下:
SQL> SHOW USER
USER IS "SCOTT"
SQL> ALTER USER scott IDENTIFIED BY scott;
USER altered.
SQL> exit
Disconnected FROM Oracle DATABASE 10g Enterprise Edition Release 10.2.0.5.0 - Production
WITH the Partitioning, OLAP, DATA Mining AND REAL Application Testing options
[ora10g@killdb admin]$ sqlplus /@test_scott
SQL*Plus: Release 10.2.0.5.0 - Production ON Wed Oct 12 08:29:41 2011
Copyright (c) 1982, 2010, Oracle. ALL Rights Reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
==== 下面进行修改wallet中的scott用户密码认证:====
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet/ -modifyCredential TEST_SCOTT scott "scott"
Enter wallet password:
MODIFY credential
MODIFY 2
[ora10g@killdb admin]$ sqlplus /@test_scott
SQL*Plus: Release 10.2.0.5.0 - Production ON Wed Oct 12 08:31:51 2011
Copyright (c) 1982, 2010, Oracle. ALL Rights Reserved.
Connected TO:
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.5.0 - Production
WITH the Partitioning, OLAP, DATA Mining AND REAL Application Testing options
==== 既然有了MODIFY,那是否有DELETE呢?当然有,如下:====
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet/ -deleteCredential TEST_SCOTT
Enter wallet password: ******
DELETE credential
DELETE 2
[ora10g@killdb admin]$ mkstore -wrl $ORACLE_HOME/network/admin/wallet -listCredential
Enter wallet password: ******
List credential (INDEX: connect_string username)
1: TEST_10G roger
|
最后来看看如何设置新的密钥?首先这里我们要弄清楚2个概念:
wallet密码跟我们这里要修改的master key不是一个东西,wallet密码仅仅是你登陆owm或进行wallet
时需要输入的密码,而master key是存在wallet中,用于加密解密数据库的加密列或加密表空间的。
另外还有一个表密钥,如果一个表有多个列需要进行加密,那么在该表上也只会生成一个表级密钥,
当前段用户从该表中取回数据时,会首先取出表密钥然后再取出存在wallet中的master key进行对
表密钥的解密,最后用解密后的表密钥去解密加密的列或表空间数据,最终返回明文数据给用户。
更改wallet key很简单,可以通过owm gui界面进行或如下命令:
orapki wallet change_pwd -wallet <wallet_location>
这里主要测试下master key的更改。
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ------------------------------------------------------------ ---------
file /home/ora10g/product/10.2/network/admin/wallet CLOSED
SQL> ALTER system SET encryption wallet OPEN IDENTIFIED BY "www.killdb.com";
System altered.
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ------------------------------------------------------------ ---------
file /home/ora10g/product/10.2/network/admin/wallet OPEN
SQL> conn roger/roger
Connected.
SQL> CREATE TABLE ht01 (id NUMBER ENCRYPT,name varchar2(10));
CREATE TABLE ht01 (id NUMBER ENCRYPT,name varchar2(10))
*
ERROR at line 1:
ORA-28361: master KEY NOT yet SET
SQL> ALTER system SET encryption KEY IDENTIFIED BY "www.killdb.com";
System altered.
SQL> CREATE TABLE ht01 (id NUMBER ENCRYPT,name varchar2(10));
TABLE created.
SQL> INSERT INTO ht01 VALUES(1314,'killdb');
1 ROW created.
SQL> commit;
Commit complete.
SQL> SELECT * FROM DBA_ENCRYPTED_COLUMNS;
OWNER TABLE_NAME COLUMN_NAME ENCRYPTION_ALG SAL INTEGRITY_AL
------------ ---------------- ---------------- ----------------------------- --- ------------
ROGER HT01 ID AES 192 bits KEY YES SHA-1
SQL> ALTER system SET encryption KEY IDENTIFIED BY "oraclemaster";
ALTER system SET encryption KEY IDENTIFIED BY "oraclemaster"
*
ERROR at line 1:
ORA-28353: failed TO OPEN wallet
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ------------------------------------------------------------ ---------
file /home/ora10g/product/10.2/network/admin/wallet CLOSED
SQL> ALTER system SET encryption wallet OPEN IDENTIFIED BY "www.killdb.com";
System altered.
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
-------------------- ------------------------------------------------------------ ---------
file /home/ora10g/product/10.2/network/admin/wallet OPEN
SQL> SELECT obj#, mkeyid FROM sys.enc$;
OBJ# MKEYID
---------- ----------------------------------------------------------------
51809 AcNbIDu9IE+6vzrrVp/L4qcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SQL> SELECT owner,object_name FROM dba_objects WHERE object_id=51809;
OWNER OBJECT_NAME
------------------------------ --------------------------------------------
ROGER HT01
SQL> SELECT obj#, mkeyid FROM sys.enc$;
OBJ# MKEYID
---------- ----------------------------------------------------------------
51809 AcNbIDu9IE+6vzrrVp/L4qcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SQL> SHOW USER
USER IS "ROGER"
SQL> ALTER system SET encryption KEY IDENTIFIED BY "www.killdb.com";
System altered.
SQL> SELECT a.owner, object_name, b.mkeyid
2 FROM sys.dba_objects a, sys.enc$ b
3 WHERE a.object_id = b.obj#;
OWNER OBJECT_NAME MKEYID
--------- --------------- -------------------------------------------------------
ROGER HT01 AUkm6RyZ2084v/KP0PwFGUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SQL>
++++ 我们可以看到,master KEY已经更改。++++
++++ 当然,当我们更改了master KEY以后,我们最好也同时更改下表级密钥。++++
SQL> SELECT * FROM ht01;
ID NAME
---------- ----------
1314 killdb
SQL> ALTER TABLE ht01 rekey;
TABLE altered.
SQL> SELECT * FROM ht01;
ID NAME
---------- ----------
1314 killdb
SQL> SELECT a.owner, object_name, b.mkeyid
2 FROM sys.dba_objects a, sys.enc$ b
3 WHERE a.object_id = b.obj#;
OWNER OBJECT_NAME MKEYID
------------------ --------------- -------------------------------------------------------
ROGER HT01 AUkm6RyZ2084v/KP0PwFGUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SQL> ALTER TABLE ht01 rekey;
TABLE altered.
SQL> SELECT a.owner, object_name, b.mkeyid
2 FROM sys.dba_objects a, sys.enc$ b
3 WHERE a.object_id = b.obj#;
OWNER OBJECT_NAME MKEYID
------------------ --------------- -------------------------------------------------------
ROGER HT01 AUkm6RyZ2084v/KP0PwFGUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+++++ 既然wallet如此重要,那如何备份wallet?++++++
SQL> ALTER system SET encryption wallet close IDENTIFIED BY "www.killdb.com";
ALTER system SET encryption wallet close IDENTIFIED BY "www.killdb.com"
*
ERROR at line 1:
ORA-28364: invalid wallet operation
SQL> ALTER system SET wallet close;
System altered.
SQL> ALTER system SET wallet close;
System altered.
SQL> !
|
[ora10g@killdb ~]$ cd $ORACLE_HOME/net*/admin
[ora10g@killdb admin]$ ls -ltr
total 48
-rw-r--r-- 1 ora10g oinstall 172 Dec 26 2003 shrept.lst
drwxr-x--- 2 ora10g oinstall 4096 Sep 24 05:11 samples
drwx------ 2 ora10g oinstall 4096 Oct 12 08:06 wallet
-rw-r--r-- 1 ora10g oinstall 488 Oct 12 08:08 listener.ora
-rw-r--r-- 1 ora10g oinstall 712 Oct 12 08:20 tnsnames.ora
-rw-r--r-- 1 ora10g oinstall 181 Oct 12 08:25 sqlnet.ora
[ora10g@killdb admin]$ mv wallet wallet_old
[ora10g@killdb admin]$ ls -ltr
total 48
-rw-r--r-- 1 ora10g oinstall 172 Dec 26 2003 shrept.lst
drwxr-x--- 2 ora10g oinstall 4096 Sep 24 05:11 samples
drwx------ 2 ora10g oinstall 4096 Oct 12 08:06 wallet_old
-rw-r--r-- 1 ora10g oinstall 488 Oct 12 08:08 listener.ora
-rw-r--r-- 1 ora10g oinstall 712 Oct 12 08:20 tnsnames.ora
-rw-r--r-- 1 ora10g oinstall 181 Oct 12 08:25 sqlnet.ora
[ora10g@killdb admin]$ exit
exit
|
SQL> SELECT * FROM roger.ht01;
SELECT * FROM roger.ht01
*
ERROR at line 1:
ORA-28365: wallet IS NOT OPEN
SQL> ALTER system SET encryption wallet OPEN IDENTIFIED BY "www.killdb.com";
ALTER system SET encryption wallet OPEN IDENTIFIED BY "www.killdb.com"
*
ERROR at line 1:
ORA-28367: wallet does NOT exist
SQL> !
[ora10g@killdb ~]$ cd $ORACLE_HOME/net*/admin
[ora10g@killdb admin]$ mv wallet_old wallet
[ora10g@killdb admin]$ exit
exit
SQL> ALTER system SET encryption wallet OPEN IDENTIFIED BY "www.killdb.com";
System altered.
SQL> SELECT * FROM roger.ht01;
ID NAME
---------- ----------
1314 killdb
==== 对于wallet的备份,我们可以直接拷贝即可如下,当然我这里直接mv测试:====
[ora10g@killdb admin]$ cp -r wallet wallet_20111113
|
- Oracle TDE的学习
TDE的开启和关闭 设置wallet目录,在参数文件sqlnet.ora中,按照下面的格式加入信息 # Oracle Advanced Security Transparent Data Encryp ...
- Oracle TDE的数据加密示例并用logminer验证加密效果
1.确认数据库版本 2创建密钥钱包 3创建加密列的表并初始值 4演示TDE的数据加密示例 5 logminer验证加密效果
- Oracle数据安全解决方案(1)——透明数据加密TDE
Oracle数据安全解决方案(1)——透明数据加密TDE2009年09月23日 22:49:00 华仔爱技术 阅读数:7991原文地址: http://www.oracle.com/technolog ...
- ORACLE恢复神器之ODU/AUL/DUL
分享ORACLE数据库恢复神器之ODU.DUL和AUL工具. ODU:ORACLE DATABASE UNLOADER DUL:DATA UNLOADER AUL:也称MyDUL 关于三种工具说明: ...
- Oracle中对列加密的方法
Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...
- 建立Oracle GoldenGate凭证
了解如何为与数据库交互的流程创建数据库用户,分配正确的权限并防止未经授权使用凭据. 主题: 为Oracle GoldenGate分配凭证 保护Oracle GoldenGate凭证 3.1 为Orac ...
- 透明数据加密 (TDE)常见问题解答
透明数据加密 (TDE)常见问题解答问题任何人只要有权访问加密数据就能对其进行解密吗?TDE 会带来哪些开销?哪些加密算法可与 TDE 一同使用?可以使用第三方加密算法代替 TDE 提供的算法吗?可以 ...
- [Oracle]构筑TDE 环境的例子
构筑TDE 环境的例子: 测试环境:12.1.0.2 $ cd $ORACLE_HOME/network/admin$ vim sqlnet.ora $ pwd/u01/app/oracle/prod ...
- Oracle“钱夹”的使用
最近几年发生了很多脱库的事件,有些时候安全不到位脱库再所避免,但是可以通过某些技术对数据库进行加密,让即使通过脱库得到的库也没法查看. 在技术层面的实现可以分为应用和数据库层. (1)通过在程序端对某 ...
随机推荐
- [MySQL FAQ]系列 — processlist中哪些状态要引起关注 解决mysql cpu过高问题
show processlist; 一般而言,我们在processlist结果中如果经常能看到某些SQL的话,至少可以说明这些SQL的频率很高,通常需要对这些SQL进行进一步优化. 今天我们要说的是, ...
- 【java】运算符
Java的运算符,分为四类: 算数运算符.关系运算符.逻辑运算符.位运算符. 算数运算符(9):+ - * / % ++ -- 关系运算符(6):== != > >= ...
- Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)
http://www.cnblogs.com/syfblog/p/4651621.html Sql Server Report Service 的部署问题 近期在研究SSRS部署问题,因为以前也用到过 ...
- live555源码学习笔记之TaskScheduler
今天抽空研究了下live555的任务实现: TaskScheduler分为三种任务:socket handler,event handler,delay task.这三种任务的特点是,前两个加入执行队 ...
- ==和is
is是比较两个引用是否指向了同一个对象(引用比较) ==是比较两个对象是否相等 数字在:-5~256之间的时候用来赋值的内存地址是不变的
- 网页如何检查浏览器是否安装flash插件
如果页面需要加载flash插件并且需要提示用户flash下载,这里有个官方很好的js文件只要引用就可以实现 //v1.7 // Flash Player Version Detection // De ...
- 阿里云服务器 ECS Linux SWAP 配置概要说明
SWAP 简介 Linux 中的 SWAP(交换分区),类似于 Windows 的虚拟内存.系统会把一部分硬盘空间虚拟成内存使用,将系统内非活动内存换页到 SWAP,以提高系统可用内存. 注:参阅 E ...
- Oracle 非归档--归档操作流程
转载自链接 https://blog.csdn.net/u013611461/article/details/53558077 SQL> shutdown immediate; Databas ...
- maven之BOM及BOM和provided的一个小坑
BOM(Bill of Materials)定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号.BOM的维护方负责版本升级,并保证 ...
- Jmeter(十一)参数化
有关参数化的概念,前面有篇随笔已经粗略的提到了参数化的一点内容.本篇来主要记录参数化. Jmeter的参数化方式有很多,在此我来一一记录,对待不同个规模.业务模型.数据量来进行记录参数化的方法. 一. ...