标签:SQLServer 备份 加密
各位新年好,戊戌年正月初一,老白在此给大家拜年了,祝各位新年快乐,身体健康,阖家幸福,万事顺利!
近期我在研究一些除了SQL SERVER以外的东西,容我卖个关子,后续也许有机会,也会在这里和大家见面.
好了,我们接着讲数据库,在今天的话题前,我们先看下DBA的工作核心内容:安全,稳定,高效;
这三点是刚入门的时候,我的授业恩师千叮咛万嘱咐的.也是指导我这么多年DBA之路的行动准则
.
并且,这三者是顺序是不可以变换的,安全永远是第一位,如果有发现无法决定方案的时候,按照此核心原则来排序找出核心重点.
今天的讲的核心内容也就是和安全有关的:备份透明加密
上两期中我们讲了备份
和快照
,其中快照
是需要SQL SERVER
服务的支持才能使用,并且权限依赖于原库的权限(数据库权限管理部分我们后续再进行扩展),因此如果数据库权限控制得当,数据泄露的风险是很小的;
但是对于备份
来讲就不一样了,一般情况下,数据库对于磁盘的IO要求是较高的,因此,活动的数据文件和日志文件都尽可能的存放在高性能的磁盘上(如15K SATA盘
或SSD盘
甚至PCIE SSD盘
),但备份
使用率极低,就不适合存放在数据库服务器上,为了提高ROI(投入产出比)
,很多时候备份
是存放在远端专用的备份服务器
上,使用7.2K磁盘
或者5.4K磁盘
进行存储.
相对而言,备份服务器
的使用率较低,因此被入侵后发现的几率会降低,这样的情况下,如果备份服务器
被入侵后,备份
将极有可能被拖走(也就是大家经常遇到的拖库,当然还有其他的拖库方式,原理上也不一样,这里不做展开),获取到备份
后,不需要数据库服务器的任何权限就能获取到完整数据(获取方式:复制备份文件
-->找到同样版本或更高版本的数据库服务
-->恢复备份文件
),这样一来,数据安全性就降低了.
鉴于此,为了保护备份文件
,即使备份文件
被拿走数据也不会泄露,SQL SERVER
从2008
开始提供了数据库透明加密
的办法来保护数据库文件,避免未经许可
的恢复或附加导致数据泄露.
这就是我们今天要介绍的看不见摸得着的安全绳.
参考网址: https://technet.microsoft.com/zh-CN/library/bb934049(v=sql.120).aspx
下面给出相关的实施步骤,测试过程和注意点:
一. 数据库支持版本
数据库版本需要在SQL Server 2008
以上
二. 创建透明加密操作步骤
1.创建主密钥和透明数据加密证书
执行下述脚本:
/************************TDE*************/
USE Master
GO
--------删除旧主密码
--------DROP MASTER KEY
--------GO
--创建主密钥
Create MASTER KEY ENCRYPTION
BY PASSWORD = 'abcdefghijklmnopqrstuvwxy'--此处密码一定要记牢!!!!!!一定要记牢!!!!!!!一定要记牢!!!!!!
GO
--创建证书,用于透明数据加密************
USE Master
GO
CREATE CERTIFICATE TDE_Server_Cretificate--注意此处服务器级证书名称!!!下面好几处需要使用
WITH SUBJECT = 'Server-level cert for TDE'
GO
注:密码一定要注意保存,不可忘记!!!!
2.备份透明加密证书
透明加密证书新建后必须备份并妥善保存,否则将会导致加密数据无法恢复.
执行下述脚本:
USE Master
GO
BACKUP CERTIFICATE TDE_Server_Certificate--注意此处服务器级证书名称!!!
TO FILE = 'D:\certbak\###ServerNameCertbak_20180215###.crt'--文件保存好
WITH PRIVATE KEY
(
FILE = 'D:\certbak\###ServerNameCertbak_20180215###.key',--文件保存好
ENCRYPTION BY PASSWORD = 'abcdefghijklmnopqrstuvwxy'--此处密码一定要记牢!!!!!!一定要记牢!!!!!!!一定要记牢!!!!!!
);
注:证书的文件名和KEY的文件名不一样,需要特别注意.
证书加密的密码也要注意保存,证书的密码可以与主加密密码不一样,也可以一样,从安全性角度考虑,建议不一样,单独保存.
3.给数据库设置透明加密
执行下述脚本:
USE ###DataBaseName###
GO
--第一步,现在开始透明加密
CREATE DATABASE ENCRYPTION KEY--创建数据库加密密钥
WITH ALGORITHM = TRIPLE_DES_3KEY--加密方式
ENCRYPTION BY SERVER CERTIFICATE TDE_Server_Certificate--使用服务器级证书加密
GO
--第二步:打开加密开关
ALTER DATABASE ###DataBaseName###
SET ENCRYPTION ON
GO
注:修改需要加密的数据库名即可,如有多个库,重复本步骤.
4.查看数据库是否加密
执行下述脚本:
--查看数据库是否加密
USE Master
GO
SELECT name,is_encrypted FROM sys.databases
GO
SELECT DB_NAME(database_id) as DBName,
CASE encryption_state
when 0 then 'No Encryption'
when 1 then 'Unencrypted'
when 2 then 'Encryption in progress'
when 3 then 'Encrypted'
when 4 then 'Key change in progress'
when 5 then 'Decryption in progress'
end as encryption_state,
key_algorithm,
key_length
FROM sys.dm_database_encryption_keys
GO
能够得到如下信息:
第一个SQL结果:
第二个SQL结果:
结果显示状态为数据库正在进行加密
但加密完成后,状态将变为:
加密的耗时取决于被加密数据库的大小.
三. 去除数据库透明加密
当数据库需要升级或迁移时,可以采用先去除透明加密,然后迁移文件后附加的方式进行迁移,或采用备份恢复的方式进行迁移.这时候就需要先去除数据库透明加密,然后进行迁移操作,迁移完成后再重新添加透明加密.
1.关闭加密
--移除数据库透明加密
ALTER DATABASE ###DataBaseName###
SET ENCRYPTION OFF
GO
2.删除数据库加密密钥
但解密完成后接可以删除加密密钥了
--移除TDE后,可以删除DEK(DATABASE ENCRYPTION KEY)
USE ###DataBaseName###
GO
DROP DATABASE ENCRYPTION KEY
GO
完成后执行检查脚本可以看到数据库已经没有加密
四. 迁移到新的服务器启用加密数据库
1.在新的服务器上导入备份的key和证书
USE Master
GO
--------删除旧主密码
--------DROP MASTER KEY
--------GO
--创建主密钥
Create MASTER KEY ENCRYPTION
BY PASSWORD = 'abcdefghijklmnopqrstuvwxy'--此处密码与源服务器上主加密密码一致!!!
GO
--导入源服务器证书文件和密钥文件
CREATE CERTIFICATE TDC_Server_Certificate--注意此处服务器级证书名称!!!需要与源服务器证书名称一致
FROM FILE = 'D:\certbak\###ServerNameCertbak_20180215###.crt'--此处文件必须为源服务器备份出来的证书文件!!!
WITH PRIVATE KEY
(
FILE = 'D:\certbak\###ServerNameCertbak_20180215###.key',--此处文件必须为源服务器备份出来的密钥文件!!!
DECRYPTION BY PASSWORD = 'abcdefghijklmnopqrstuvwxy'--此处密码为备份文件密码,非主密码!!!!!
);
GO
注:密码和新建的时候的密码需要一致,证书文件和KEY文件使用之前备份的,不能有误,否则无法恢复加密数据库使用.
如恢复证书有问题,将在附加或恢复数据库时出现如下报错:
2.恢复或附加加密的数据库
如未恢复所需证书,执行还原数据库命令将出现如下错误:
如果证书恢复正确,将能够正常恢复:
五.方案实施注意点:
实施过程中的密码及证书备份文件和KEY备份文件必须妥善保存.
采用文档记录相应密码,并标明所在服务器IP和对应的数据库实例名
采用文档记录证书备份文件路径和KEY备份文件路径,建议异地存放
,并存放多份
,防止文件灭失.
好啦,既然叫透明,那么就是说明这个加密对于使用数据库的人来说是无感的.所以,这根隐形而真实存在的安全绳能够保证数据的更高层的安全性喔.快来试试吧~