【IT专家网独家】
问题
安全是任何公司的一个主要考量。数据库备份容易被偷并被恢复到另一个SQL Server实例上。当我们浏览SQL Server 2008的新特性时,我们对一个叫做透明数据加密的特性很感兴趣,我们可以用它来加密我们的数据库备份。你能为我们详细介绍下应该怎样使用这个新功能吗?
专家解答
透明数据加密是SQL Server 2008的一个新特性,它执行数据库级别的加密,补充了目前在SQL Server 2005中使用的记录级别加密。它直接或通过恢复一个数据库备份到另一个SQL Server实例上来保护数据库访问。
在这篇文章里,我们将看看怎样执行透明数据加密来保护数据库备份。让我们首先介绍下怎样的数据库备份是免受威胁的。默认情况下,SQL Server备份是不加密的。让我们先在我的default实例上创建Northwind数据库的一个完全备份。
BACKUP DATABASE Northwind TO DISK = 'C:\Northwind_unencrypted.bak' WITH INIT, STATS = 10 |
让我们在Northwind数据库中查询一条指定记录。我们将在之后使用这条记录来查看我们的数据库备份内容。
SELECT * FROM dbo.Customers WHERE ContactName = 'Aria Cruz' |
在记事本中打开数据库备份并搜索“A r i a C r u z”(注意字母间的空格和“Aria”与“"Cruz”间的三个空格,因为这个是Unicode文本)。可以看到这个文本数据是可读的。
因为你的本地备份是可读的,所以它们易于受到威胁,因为它们可以以清晰的文本形式读取到。这使得别人只要看看你的数据库备份就可以从这些文件获得数据。更糟的是,任何人都可以将你的数据库备份恢复到另一个SQL Server实例上。我们将简要地介绍这个过程。
现在我们在我们的Northwind数据库上执行透明数据加密,首先在服务器上建立加密。为了做到这一点,我们在主数据库上创建数据库主钥。
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mY_P@$$w0rd' |
然后,我们创建基于服务器的证书,它将用于加密这个数据库。
CREATE CERTIFICATE NorthwindCert WITH SUBJECT = 'My DEK Certificate for Northwind database' |
然后我们将为Northwind数据库设置解密,通过使用我们刚刚创建的证书创建一个数据库加密密钥和密码。
USE Northwind GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE NorthwindCert GO |
因为有一些不同的选择,所以加密算法选择是你自己的。在创建数据库加密密钥之后,我们将激活数据库级别的加密。
ALTER DATABASE Northwind SET ENCRYPTION ON |
让我们备份这个加密的Northwind数据库,但是这次使用一个不同的文件名。
BACKUP DATABASE Northwind TO DISK = 'C:\Northwind_encrypted.bak' WITH INIT, STATS = 10 |
加密备份花费的时间将比未加密的备份稍长一些。如果你打开这个加密数据库备份并搜索我们之前搜索的字符串“A r i a C r u z”,你将搜索不到它。你可以滚动这个文本并注意到这个加密的数据与你在未加密备份中看到的不一样。
因为你的本地备份是可读的,所以它们易于受到威胁,因为它们可以以清晰的文本形式读取到。这使得别人只要看看你的数据库备份就可以从这些文件获得数据。更糟的是,任何人都可以将你的数据库备份恢复到另一个SQL Server实例上。我们将简要地介绍这个过程。
现在我们在我们的Northwind数据库上执行透明数据加密,首先在服务器上建立加密。为了做到这一点,我们在主数据库上创建数据库主钥。
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mY_P@$$w0rd' |
然后,我们创建基于服务器的证书,它将用于加密这个数据库。
CREATE CERTIFICATE NorthwindCert WITH SUBJECT = 'My DEK Certificate for Northwind database' |
然后我们将为Northwind数据库设置解密,通过使用我们刚刚创建的证书创建一个数据库加密密钥和密码。
USE Northwind GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE NorthwindCert GO |
因为有一些不同的选择,所以加密算法选择是你自己的。在创建数据库加密密钥之后,我们将激活数据库级别的加密。
ALTER DATABASE Northwind SET ENCRYPTION ON |
让我们备份这个加密的Northwind数据库,但是这次使用一个不同的文件名。
BACKUP DATABASE Northwind TO DISK = 'C:\Northwind_encrypted.bak' WITH INIT, STATS = 10 |
加密备份花费的时间将比未加密的备份稍长一些。如果你打开这个加密数据库备份并搜索我们之前搜索的字符串“A r i a C r u z”,你将搜索不到它。你可以滚动这个文本并注意到这个加密的数据与你在未加密备份中看到的不一样。
在另一个SQL Server实例上恢复加密数据库备份
很容易恢复一个未加密的备份到另一个SQL Server实例上。事实上,这就是为什么它易受威胁的原因。你可以尝试恢复加密的数据库备份为Northwind_encrypted,而你将遇到一个错误。我在我的TEST实例上进行了尝试。这个错误信息告诉你服务器证书找不到。尽管这个恢复失败了,但是你仍然可以在对象浏览器中看到Northwind_encrypted数据库处于正在恢复状态。
为了在另一个SQL Server实例上恢复加密的数据库备份,首先我们需要导出我们在这个创建了加密数据库备份的实例上创建的证书。为了将这个证书导出到一个文件中,我将连接到我的default实例并运行这个查询。
USE master GO BACKUP CERTIFICATE NorthwindCert TO FILE = 'C:\NorthwindCert_File.cer' WITH PRIVATE KEY (FILE = 'C:\NorthwindCert_Key.pvk' , ENCRYPTION BY PASSWORD = 'mY_P@$$w0rd' ) GO |
然后,我们将需要复制这个证书和私钥文件到另一个SQL Server实例上。因为我在同一个服务器上运行我的default和我的TEST实例,所以我在做这个导入操作时将直接指向这些文件。现在,在TEST实例上,首先创建一个主钥来导入这个证书。
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'EnKrYpt3d_P@$$w0rd' GO |
这里提供的密码与你在default实例中用到的密码是不同的,因为你将为这个实例创建一个新的主钥。在创建了一个主钥之后,你可以通过导入我们之前创建的证书来创建一个证书。
CREATE CERTIFICATE NorthwindCert FROM FILE = 'C:\NorthwindCert_File.cer' WITH PRIVATE KEY (FILE = 'C:\NorthwindCert_Key.pvk', DECRYPTION BY PASSWORD = 'mY_P@$$w0rd'); GO |
注意,这里在DECRYPTION BY PASSWORD参数中指定的密码是和我们在导出这个证书到一个文件中所使用的一样。这是因为我们将在这个新实例上使用同一个证书来访问加密的数据库。在证书创建之后,我们可以在这个实例上恢复加密数据库备份。你可能想删除最初你在操作之前试图恢复的加密数据库。你现在可以成功地恢复加密数据库备份了。