oracle 数据库透明加密
简介:
您可以对包含敏感数据的单个表列进行加密。敏感数据的示例包括社会安全号码、信用卡号和医疗记录。列加密对应用程序是透明的,但有一些限制。
尽管加密并不能解决所有安全问题,但它确实可以保护您的数据免受试图规避数据库安全功能并直接通过操作系统文件系统访问数据库文件的用户的侵害。
列加密使用 Oracle 数据库的透明数据加密功能,这需要您创建一个 Oracle 钱包来存储数据库的主加密密钥。
必须先打开钱包,然后才能创建包含加密列的表,并且才能存储或检索加密数据。当您打开钱包时,它可用于所有会话,并且它一直保持打开状态,直到您明确关闭它或数据库关闭。
透明数据加密 (TDE) 具有以下优点:
作为安全管理员,您可以确保敏感数据是安全的,以防存储介质或数据文件被盗。
实施 TDE 有助于解决与安全相关的法规遵从性问题。
您无需创建触发器或视图来解密授权用户或应用程序的数据。表中的数据对数据库用户和应用程序进行透明解密。
数据库用户和应用程序无需意识到他们正在访问的数据是以加密形式存储的。对数据库用户和应用程序的数据进行透明解密。
无需修改应用程序即可处理加密数据。数据加密和解密由数据库管理。
密钥管理操作是自动化的。用户或应用程序不需要管理加密密钥。
加密类型包括列加密和表空间加密。
透明数据加密支持行业标准加密算法,包括以下高级加密标准 (AES) 和三重数据加密标准 (3DES) 算法:
AES256
AES192
AES128
3DES168
说明:
您可以选择创建表时要使用的算法。表中的所有加密列都使用相同的算法。默认值为 AES192。加密密钥长度由算法名称暗示。例如,AES128 算法使用 128 位密钥。
部分限制条件:
如果计划加密一个或多个表中的多个列,则可能需要考虑加密整个表空间,并将这些表存储在该表空间中。
表空间加密也使用透明数据加密功能,但在物理块级别进行加密,其性能比加密多列更好。在表空间级别进行加密的另一个原因是解决列加密的以下限制:
如果初始化参数设置为 10.2.0(这是启用透明数据加密的最低设置),那么排序或哈希联接中涉及的加密列中必须写入临时表空间的数据将以明文形式写入,因此会受到攻击。
您必须设置为 11.1.0 或更高版本,以确保写入临时表空间的加密数据保持加密状态。
请注意,只要设置为 10.2.0 或更高版本,加密列中的数据在写入撤消表空间或重做日志时将保持加密状态。
列加密不支持某些数据类型(如对象数据类型)。
不能将可传输表空间功能用于包含具有加密列的表的表空间。
特别需要注意的点:
1 钱包千万不能丢失
2 钱包的密码千万不能忘记
否则你会丢失加密的数据
测试步骤:
1、创建钱包目录(RAC所有节点一致或共享目录)
mkdir -p $ORACLE_BASE/admin/pdb/wallet
[oracle@single19c pdb]$ mkdir -p $ORACLE_BASE/admin/pdb/wallet
[oracle@single19c pdb]$ ls
adump dpdump pfile wallet xdb_wallet
[oracle@single19c pdb]$ pwd
/u01/app/oracle/admin/pdb
[oracle@single19c pdb]$ ll
total 16
drwxr-x--- 3 oracle oinstall 12288 Jul 22 21:01 adump
drwxr-x--- 3 oracle oinstall 60 Jul 22 14:46 dpdump
drwxr-x--- 2 oracle oinstall 36 Jul 22 14:49 pfile
drwxr-xr-x 2 oracle oinstall 6 Jul 22 21:11 wallet
drwxr-x--- 2 oracle oinstall 44 Jul 22 14:34 xdb_wallet
2、编辑钱包配置文件 oracle_home目录的网络配置文件目录下(RAC编辑grid用户sqlnet.ora,RAC所有节点一致)
cd $ORACLE_HOME/network/admin/ /
vi sqlnet.ora //编辑配置文件
添加以下内容:
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=/u01/app/oracle/admin/pdb/wallet)
)
)
3.创建主秘钥
alter system set encryption key identified by Ora123456;
设置钱包加密秘钥,要求至少8位,大小写、字母、数字组合,否则会报错
4. 开启和关闭钱包
打开Wallet:
SQL> alter system set encryption wallet open identified by Ora123456;
关闭Wallet:
SQL> alter system set encryption wallet close identified by Ora123456;
查询Wallet状态:
SQL> select * from v$encryption_wallet;
数据库如果重启之后,秘钥是会被关闭的,用如下命令可以打开秘钥
ALTER SYSTEM SET [ENCRYPTION] WALLET OPEN IDENTIFIED BY password
5. 进行测试
sys的对象不能被加密
SQL> create table tt as select * from dba_objects;
Table created.
SQL> alter table tt modify (object_id encrypt );
查询数据:
SQL> select object_id from tt where object_id=21445;
OBJECT_ID
----------
21445
//这个列存在索引加密方式
SQL> create index ob_na on tt(object_name);
Index created.
alter table tt modify (object_name encrypt no salt);
SQL> alter table tt modify (object_name encrypt no salt);
Table altered.
SQL> select object_id,object_name from tt where object_id=21445;
OBJECT_ID OBJECT_NAME
-----------------------------------------------------------------------------------------
21445 SYS_LOB0000021330C00122$$
alter table tt modify(object_name decrypt);
//取消对某个表某列的加密
SQL> alter table tt modify(object_name decrypt);
Table altered.
SQL> select object_id,object_name from tt where object_id=21445;
OBJECT_ID
----------
OBJECT_NAME
--------------------------------------------------------------------------------
21445
SYS_LOB0000021330C00122$$
SQL> alter system set encryption wallet close identified by Ora123456;
System altered.
SQL> select object_id,object_name from tt where object_id=21445;
select object_id,object_name from tt where object_id=21445
*
ERROR at line 1:
ORA-28365: wallet is not open
表空间加密:
1.创建加密的表空间 tt
SQL> create tablespace tt datafile size 20M
ENCRYPTION USING 'AES256'
DEFAULT STORAGE(ENCRYPT);
Tablespace created.
2.创建不加密的表空间 qq
SQL> create tablespace qq datafile size 20M;
Tablespace created.
3.创建用户 tt 默认表空间为 tt
SQL> create user tt identified by tt default tablespace tt;
User created.
4.创建用户 qq 认表空间为 qq
SQL> create user qq identified by qq default tablespace qq;
User created.
SQL>
赋权
SQL> grant dba to tt;
Grant succeeded.
SQL> grant dba to qq;
Grant succeeded.
5. 构造数据
[19c@test admin]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jul 22 09:46:08 2024
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> create table tt.test1 as select * from dba_objects;
Table created.
SQL> create table qq.test1 as select * from dba_objects;
Table created.
7.将脏数据写入到磁盘
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
System altered.
SQL> quit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
8.进入到存放数据文件的地方,用strings命令看能否查看到数据
ASMCMD> cd datafile
ASMCMD> ls
QQ.307.1174988647
SYSAUX.258.1166142973
SYSTEM.257.1166142939
T1.293.1173864221
TT.306.1174988643
UNDOTBS1.259.1166142989
USERS.260.1166142991
USERS.271.1166146177
ZC.294.1173864333
user02.dbf
ASMCMD> cp TT.306.1174988643 /home/grid
copying +data/orcl/datafile/TT.306.1174988643 -> /home/grid/TT.306.1174988643
ASMCMD> cp QQ.307.1174988647 /home/grid
copying +data/orcl/datafile/QQ.307.1174988647 -> /home/grid/QQ.307.1174988647
[grid@test ~]$ strings QQ.307.1174988647 |more
}|{z
dORCL
AAAAAAAAAAAAAAAA
I_HH_OBJ#_COL#
INDEX
2019-04-17:00:56:15
VALID
NONE
HIST_HEAD$
TABLE
2019-04-17:00:56:15
[grid@test ~]$ strings TT.306.1174988643 |more
}|{z
dORCL
P?Uz
Fq0v
9$}v
_Bj6
可以看到没有加密的表空间能看到存入的数据,而加密了的表空间则看不到。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




