美文网首页
新年快乐,狗年旺旺!--做一根看不见摸得着的绳子,拴住旺旺~~

新年快乐,狗年旺旺!--做一根看不见摸得着的绳子,拴住旺旺~~

作者: 疯狂十字军 | 来源:发表于2018-02-16 16:14 被阅读0次

    标签:SQLServer 备份 加密


    各位新年好,戊戌年正月初一,老白在此给大家拜年了,祝各位新年快乐,身体健康,阖家幸福,万事顺利!
    近期我在研究一些除了SQL SERVER以外的东西,容我卖个关子,后续也许有机会,也会在这里和大家见面.

    好了,我们接着讲数据库,在今天的话题前,我们先看下DBA的工作核心内容:安全,稳定,高效;
    这三点是刚入门的时候,我的授业恩师千叮咛万嘱咐的.也是指导我这么多年DBA之路的行动准则.
    并且,这三者是顺序是不可以变换的,安全永远是第一位,如果有发现无法决定方案的时候,按照此核心原则来排序找出核心重点.

    今天的讲的核心内容也就是和安全有关的:备份透明加密
    上两期中我们讲了备份快照,其中快照是需要SQL SERVER服务的支持才能使用,并且权限依赖于原库的权限(数据库权限管理部分我们后续再进行扩展),因此如果数据库权限控制得当,数据泄露的风险是很小的;
    但是对于备份来讲就不一样了,一般情况下,数据库对于磁盘的IO要求是较高的,因此,活动的数据文件和日志文件都尽可能的存放在高性能的磁盘上(如15K SATA盘SSD盘甚至PCIE SSD盘),但备份使用率极低,就不适合存放在数据库服务器上,为了提高ROI(投入产出比),很多时候备份是存放在远端专用的备份服务器上,使用7.2K磁盘或者5.4K磁盘进行存储.
    相对而言,备份服务器的使用率较低,因此被入侵后发现的几率会降低,这样的情况下,如果备份服务器被入侵后,备份将极有可能被拖走(也就是大家经常遇到的拖库,当然还有其他的拖库方式,原理上也不一样,这里不做展开),获取到备份后,不需要数据库服务器的任何权限就能获取到完整数据(获取方式:复制备份文件-->找到同样版本或更高版本的数据库服务-->恢复备份文件),这样一来,数据安全性就降低了.
    鉴于此,为了保护备份文件,即使备份文件被拿走数据也不会泄露,SQL SERVER2008开始提供了数据库透明加密的办法来保护数据库文件,避免未经许可的恢复或附加导致数据泄露.
    这就是我们今天要介绍的看不见摸得着的安全绳.

    参考网址: 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结果:


    05.png

    第二个SQL结果:


    06.jpg

    结果显示状态为数据库正在进行加密
    但加密完成后,状态将变为:


    07.png

    加密的耗时取决于被加密数据库的大小.

    三. 去除数据库透明加密
    当数据库需要升级或迁移时,可以采用先去除透明加密,然后迁移文件后附加的方式进行迁移,或采用备份恢复的方式进行迁移.这时候就需要先去除数据库透明加密,然后进行迁移操作,迁移完成后再重新添加透明加密.
    1.关闭加密

    --移除数据库透明加密
    ALTER DATABASE ###DataBaseName###
    SET ENCRYPTION OFF 
    GO 
    

    2.删除数据库加密密钥
    但解密完成后接可以删除加密密钥了

    --移除TDE后,可以删除DEK(DATABASE ENCRYPTION KEY)
    USE ###DataBaseName###
    GO
    DROP DATABASE ENCRYPTION KEY
    GO
    

    完成后执行检查脚本可以看到数据库已经没有加密


    10.png

    四. 迁移到新的服务器启用加密数据库

    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文件使用之前备份的,不能有误,否则无法恢复加密数据库使用.
    如恢复证书有问题,将在附加或恢复数据库时出现如下报错:


    12.png

    2.恢复或附加加密的数据库
    如未恢复所需证书,执行还原数据库命令将出现如下错误:


    13.png

    如果证书恢复正确,将能够正常恢复:


    14.jpg

    五.方案实施注意点:
    实施过程中的密码及证书备份文件和KEY备份文件必须妥善保存.
    采用文档记录相应密码,并标明所在服务器IP和对应的数据库实例名
    采用文档记录证书备份文件路径和KEY备份文件路径,建议异地存放,并存放多份,防止文件灭失.

    好啦,既然叫透明,那么就是说明这个加密对于使用数据库的人来说是无感的.所以,这根隐形而真实存在的安全绳能够保证数据的更高层的安全性喔.快来试试吧~

    相关文章

      网友评论

          本文标题:新年快乐,狗年旺旺!--做一根看不见摸得着的绳子,拴住旺旺~~

          本文链接:https://www.haomeiwen.com/subject/nusptftx.html