SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

栏目: 数据库 · 发布时间: 5年前

内容简介:本人新书上市,请多多关照:Always Encrypted,简称AE,官方翻译叫始终加密,下一节会介绍叫透明数据加密(TDE)的功能,如果搭配TDE连接SQL Server,那么数据在客户端和服务器上包含磁盘上的数据已经是被加密了的。但是还有一些不足的地方:1. 在内存中的数据页不被加密。2. 没有隔离密钥,SQL Server的管理员可以获取加密密钥和证书进行数据破解。基于大数据时代的数据安全性跟

本人新书上市,请多多关照: 《SQL Server On Linux运维实战 2017版从入门到精通》

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

Always Encrypted,简称AE,官方翻译叫始终加密,下一节会介绍叫透明数据加密(TDE)的功能,如果搭配TDE连接SQL Server,那么数据在客户端和服务器上包含磁盘上的数据已经是被加密了的。但是还有一些不足的地方:1. 在内存中的数据页不被加密。2. 没有隔离密钥,SQL Server的管理员可以获取加密密钥和证书进行数据破解。基于大数据时代的数据安全性跟 GDRP(General Data Protection Regulation) (它由欧盟推出,目的在于遏制个人信息被滥用,保护个人隐私。)的实行,数据的安全被推到非常高的程度。SQL Server在这方面也推出了各种功能来满足GDRP,其中一个就是AE。AE不仅解决了上面提到的两点不足,还实现了端对端的加密。

AE工作流

先来看第一个图,AE使用两类密钥来保护数据:

  1. CEK:列加密密钥(column encryption key),用于加密数据库中的数据。已加密的CEK(可以有多个)存储在数据库中。
  2. CMK:列主密钥(column master key),用于加密CEK。存储在可信任的密钥存储(Trusted Key Store)中,比如Windows 证书存储、Azure Key Vault、其他硬件安全模块中甚至自定义的密钥存储。
    在SQL Server中需要加密的数据使用 AEAD_AES_256_CBC_HMAC_SHA_256 算法进行加密,最重要的是解密过程不由SQL Server处理。也就是说单纯从SQL Server内部是看不到已加密数据的明文。解密过程由客户端执行,但是需要使用“启用始终加密”的客户端驱动程序来实现加解密。支持AE的驱动可以参阅官方文档 始终加密(客户端开发)
    驱动程序需要在连接字符串中使用***Column Encryption Setting***属性来处理AE,当SQL Server发送已加密的数据到应用程序时,会在结果集上附带上已加密的CEK和CMK的路径,客户端驱动程序会把这些信息整合并根据路径去找CMK,用于结合CEK解密数据。这个过程也同样适用于参数化查询。驱动程序会与SQL Server一起决定对哪些参数进行加密,要知道很多参数本身就是安全风险。
    SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted 简单来时候,整个加解密过程都发生在应用程序的驱动程序中,而SQL Server仅存储已加密的数据和CEK及CMK的位置。驱动程序通过位置去可信任密钥存储中获取实际CMK然后合并解密数据。这个过程对应用程序是透明的,不需要修改现有程序。另外注意上图的“内存缓存中的已解密CEK”,通过这种缓存,可以减少到密钥存储的往返次数。但是不可否认,这种过程是肯定会增加交互的往返次数和网络流量。另外因为它是缓存在客户端中,所以也不存在SQL Server高权限用户可以获取并解密的可能。

AE加密类型

AE支持两种加密类型:

  1. 确定性加密:deterministic encryption,对特定的值总产生相同的加密值,可用于需要创建所以并使用精确查找、分组等操作的数据列。但是很显然这种加密方式安全性不足。
  2. 随机加密:randomized encryption,如其名,产生随机加密值,更具有安全性但是由于其随机性,不适合进行索引化和分组等操作。
    跟其他功能类似,当允许你选择“用”还是“不用”的时候,就意味着它有一些适应场景,AE也同样,特别是对某些数据类型等的限制,完整的限制可以查阅官方文档: AE限制
    最后还要提醒一下,所有的加密技术都会增加存储空间,根据数据类型和算法的不同二不同,另外加解密也是CPU消耗操作,所以对资源的要求更加高。

接下来做个快速演示,为了避免影响其他环节,这次创建一个专门的演示库:AEDemo。

新建列主密钥

即前面的CMK,按下图路径新建列主密钥。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

配置新列主密钥

这里选择默认的选项也就是当前用户,可以看到一共有四种可选,根据具体情况而定。 SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted 然后点击生成证书,可以看到证书信息,点击确定后再刷新SSMS的目录,新的列主密钥已经生成完毕。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

CMK创建完毕,提醒一下,CMK可以有多个。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

新建列加密密钥:

即CEK,按下图方式打开并输入CEK名字,同时选择使用什么CMK来对其加密。前面提到,CMK是可以有多个的。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

选择用于加密CEK的CMK。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

创建完毕

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

创建测试表并加密

创建一个Patients

use AEDemo
GO
CREATE TABLE [dbo].[Patients](
 [PatientId] [int] IDENTITY(1,1) NOT NULL,
 [SSN] [nvarchar](11) NOT NULL,
 [FirstName] [nvarchar](50) NOT NULL,
 [LastName] [nvarchar](50) NOT NULL,
 [MiddleName] [nvarchar](50) NULL,
 [StreetAddress] [nvarchar](50) NULL,
 [City] [nvarchar](50) NULL,
 [ZipCode] [int] NULL,
 [State] [nvarchar](50) NULL,
 [BirthDate] [datetime2](7) NOT NULL,
 PRIMARY KEY CLUSTERED 
 (
 [PatientId] ASC
 ) WITH (
 PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
 ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 ) ON [PRIMARY]

插入测试数据

insert into [dbo].[Patients]
values(N'1097-22-14',N'abc',N'george',N'def',N'china',N'guangzhou',123456,N'guangdong','1900-01-01')


select * from [dbo].[Patients]

结果如下图

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

接下来开始使用密钥进行加密。选择加密列,如下图

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted 选择需要加密的列及加密类型和密钥,这里可以选择已建好的CEK,或者由系统自动创建,不过系统创建的步骤较多,就不多演示,等后续有时间详细介绍的时候再演示,因为这个系列我想尽快介绍完 SQL 2019的新功能。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

选了已有的CEK后,后面的步骤就简单多了。

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

使用默认选项一直进行下去:

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted

检验效果

再次执行查询表的语句,可以看到已经加密成功

SQL Server On Linux(11)—— SQL Server On Linux安全性(4)——Always Encrypted 更多的资料可以访问官方博客: SQL Server Security Blog ,我也会抽空翻译或者整合。

AE是非常重要且易用的功能,但是在本人研究过程发现AE实际上还有很多内容可以使用,正如上面官方博客,基于这个系列的初衷是介绍SQL on Linux 特别是2019为主,所以不打算前期过于深入。

AE从SQL Server 2016引入,跟平台无关,本文虽然是在 Linux 上操作,但是还没有深入演示如何在Linux上使用,由于时间关系,暂时不写出来,不过有兴趣的读者可以看一下国外的文章: SQL Server 2016: Always Encrypted


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python编程实战

Python编程实战

[美] Mark Summerfield / 爱飞翔 / 机械工业出版社 / 2014-8 / 69.00元

《python编程实战:运用设计模式、并发和程序库创建高质量程序》由python开发者社区知名技术专家mark summerfield亲笔撰写,全球资深python专家doug hellmann作序鼎力推荐,是python领域最有影响力的著作之一。书中通过大量实用的范例代码和三个完整的案例研究,全面而系统地讲解了如何运用设计模式来规划代码结构,如何通过并发与cython等技术提升代码执行速度,以及......一起来看看 《Python编程实战》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具