SQL 在 Azure 中始终加密
SQL Always Encrypted in Azure
我需要构建一个 Web 应用程序来访问数据库上的一些加密列。所有这些都必须托管在客户的 Azure 帐户中。我已经搜索了几天并阅读了很多教程,但找不到问题的答案。
我主要关注了这些:
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-always-encrypted
http://www.bradleyschacht.com/always-encrypted-with-azure-key-vault/
我能够使用 SSMS 加密向导生成的证书和托管在 Azure 上的 SQL 数据库在我的机器上 运行 一个网络应用程序。我无法使用天蓝色的金库密钥来完成。
现在我需要在 Azure 上发布我的 Web 应用程序,但我无法 access/modify 数据库数据。我需要使用我机器上的证书或使用 azure 保险库。谁能给我解释一下这是怎么做到的?
我尝试将证书导出到 Azure 保管库,但我不知道如何"reference"
我试图在数据库上创建一个新的 table 并使用保管库密钥对其进行加密,但我得到:
Failed to decrypt a column encryption key. Invalid key store provider
name: 'AZURE_KEY_VAULT'. A key store provider name must denote either
a system key store provider or a registered custom key store provider.
Valid system key store provider names are: 'MSSQL_CERTIFICATE_STORE',
'MSSQL_CNG_STORE', 'MSSQL_CSP_PROVIDER'. Valid (currently registered)
custom key store provider names are: . Please verify key store
provider information in column master key definitions in the database,
and verify all custom key store providers used in your application are
registered properly."
- 我在某处读到我需要在 AD 中为我的应用程序授予权限,但我的客户(Azure 订阅的所有者)没有权限执行此操作。
- 我还读到必须使用存储过程来读取和写入数据库。这是真的吗?
在此先感谢您的帮助。
I need to either use the certificate from my machine or use the azure
vault. Can anyone explain to me how it's done?
这取决于您的用例。实际上,为您的列主密钥选择密钥库提供程序取决于您使用的驱动程序和版本。密钥存储有两个高级类别:Read here
- 本地
- 集中式密钥库
本地
如果您计划在 On-Prem/VM 中部署您的应用程序,那么您可以生成我们自己的证书并将证书保存在您的本地 VM 中。
集中式密钥库
如果您计划在 azure web APP/Cloud 中部署您的应用程序,那么您应该将您的密钥库保存在一个集中的安全保管库中,它可能在这里 Azure Key Vault
作为最佳实践,您不应将提供程序存储在本地计算机中,如果您的 VM 受到威胁,那么您的数据库证书也会受到威胁,这将是一个问题。
I tried to export the certificate to the azure vault, but I don't know
how to "reference" it
CREATE COLUMN MASTER KEY [TESTMASTERKEY]
WITH
(
KEY_STORE_PROVIDER_NAME = N'AZURE_KEY_VAULT',
KEY_PATH = N'' --Paste your Key Identifier
)
GO
I tried to create a new table on the DB and encrypting it with a vault
key, but I get:
- 始终尝试下载 latest SSMS version。
- 假设您使用的是 Azure SQLDB。始终加密仅适用于 SQL 服务器
2016 年及更高版本在本地和所有版本的 Azure SQLDB
- 将连接字符串设置为
Column Encryption Setting=enabled
您描述的行为是 CTP 3.0 和 SSMS 十月更新中的错误。如您所料,问题是如果您打开查询编辑器 window 首先打开 Always Encrypted 向导,则 Azure Key Vault 提供程序未注册。我们已经为 SSMS 的下一次更新修复了这个问题!同时,解决方法是打开 Always Encrypted 向导(您可以在打开后立即关闭 it/cancel),这将导致 Azure Key Vault 提供程序被注册。
此错误仅通过这种特定情况(在向导之前使用查询编辑器)表现出来,并且完全不会影响您使用 Always Encrypted 向导或将 Azure Key Vault 提供程序与您的任何客户端应用程序一起使用的能力。
所以尝试下载最新的SSMS版本。
I read somewhere that I need to give permission in the AD to my
application, but I don't have permissions from my client (the owner of
the Azure subscription) to do that.
这主要针对客户端。您需要注册您的应用程序,以便为您的客户端应用程序获取 client id
和 client secret
,以便与数据库中的加密数据进行对话。 Read here for how to register your client app。除非您注册您的应用程序,否则您无法从任何客户端(SSMS 除外)进行连接。您需要联系订阅所有者才能注册该应用程序。
I read also that a stored procedure must be used to read and write to
the DB. Is this true?
取决于您的加密类型。加密方式有两种Read here about it
- 确定性
- 随机化
各有利弊。
确定性加密总是为任何给定的明文值生成相同的加密值。使用确定性加密允许对加密列进行点 查找、相等连接、分组和索引。 但是,也可能允许未经授权的用户通过检查加密列中的模式来猜测有关加密值的信息,尤其是如果存在一小组可能的加密值,例如 True/False 或 North/South/East/West 区域。确定性加密必须对字符列使用 binary2 排序顺序的列排序规则。
随机加密使用一种以不可预测的方式加密数据的方法。随机加密更安全,但会阻止对加密列进行搜索、分组、索引和连接。
我需要构建一个 Web 应用程序来访问数据库上的一些加密列。所有这些都必须托管在客户的 Azure 帐户中。我已经搜索了几天并阅读了很多教程,但找不到问题的答案。
我主要关注了这些:
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-always-encrypted http://www.bradleyschacht.com/always-encrypted-with-azure-key-vault/
我能够使用 SSMS 加密向导生成的证书和托管在 Azure 上的 SQL 数据库在我的机器上 运行 一个网络应用程序。我无法使用天蓝色的金库密钥来完成。
现在我需要在 Azure 上发布我的 Web 应用程序,但我无法 access/modify 数据库数据。我需要使用我机器上的证书或使用 azure 保险库。谁能给我解释一下这是怎么做到的?
我尝试将证书导出到 Azure 保管库,但我不知道如何"reference"
我试图在数据库上创建一个新的 table 并使用保管库密钥对其进行加密,但我得到:
Failed to decrypt a column encryption key. Invalid key store provider name: 'AZURE_KEY_VAULT'. A key store provider name must denote either a system key store provider or a registered custom key store provider. Valid system key store provider names are: 'MSSQL_CERTIFICATE_STORE', 'MSSQL_CNG_STORE', 'MSSQL_CSP_PROVIDER'. Valid (currently registered) custom key store provider names are: . Please verify key store provider information in column master key definitions in the database, and verify all custom key store providers used in your application are registered properly."
- 我在某处读到我需要在 AD 中为我的应用程序授予权限,但我的客户(Azure 订阅的所有者)没有权限执行此操作。
- 我还读到必须使用存储过程来读取和写入数据库。这是真的吗?
在此先感谢您的帮助。
I need to either use the certificate from my machine or use the azure vault. Can anyone explain to me how it's done?
这取决于您的用例。实际上,为您的列主密钥选择密钥库提供程序取决于您使用的驱动程序和版本。密钥存储有两个高级类别:Read here
- 本地
- 集中式密钥库
本地
如果您计划在 On-Prem/VM 中部署您的应用程序,那么您可以生成我们自己的证书并将证书保存在您的本地 VM 中。
集中式密钥库
如果您计划在 azure web APP/Cloud 中部署您的应用程序,那么您应该将您的密钥库保存在一个集中的安全保管库中,它可能在这里 Azure Key Vault
作为最佳实践,您不应将提供程序存储在本地计算机中,如果您的 VM 受到威胁,那么您的数据库证书也会受到威胁,这将是一个问题。
I tried to export the certificate to the azure vault, but I don't know how to "reference" it
CREATE COLUMN MASTER KEY [TESTMASTERKEY]
WITH
(
KEY_STORE_PROVIDER_NAME = N'AZURE_KEY_VAULT',
KEY_PATH = N'' --Paste your Key Identifier
)
GO
I tried to create a new table on the DB and encrypting it with a vault key, but I get:
- 始终尝试下载 latest SSMS version。
- 假设您使用的是 Azure SQLDB。始终加密仅适用于 SQL 服务器
2016 年及更高版本在本地和所有版本的 Azure SQLDB
- 将连接字符串设置为
Column Encryption Setting=enabled
您描述的行为是 CTP 3.0 和 SSMS 十月更新中的错误。如您所料,问题是如果您打开查询编辑器 window 首先打开 Always Encrypted 向导,则 Azure Key Vault 提供程序未注册。我们已经为 SSMS 的下一次更新修复了这个问题!同时,解决方法是打开 Always Encrypted 向导(您可以在打开后立即关闭 it/cancel),这将导致 Azure Key Vault 提供程序被注册。 此错误仅通过这种特定情况(在向导之前使用查询编辑器)表现出来,并且完全不会影响您使用 Always Encrypted 向导或将 Azure Key Vault 提供程序与您的任何客户端应用程序一起使用的能力。
所以尝试下载最新的SSMS版本。
I read somewhere that I need to give permission in the AD to my application, but I don't have permissions from my client (the owner of the Azure subscription) to do that.
这主要针对客户端。您需要注册您的应用程序,以便为您的客户端应用程序获取 client id
和 client secret
,以便与数据库中的加密数据进行对话。 Read here for how to register your client app。除非您注册您的应用程序,否则您无法从任何客户端(SSMS 除外)进行连接。您需要联系订阅所有者才能注册该应用程序。
I read also that a stored procedure must be used to read and write to the DB. Is this true?
取决于您的加密类型。加密方式有两种Read here about it
- 确定性
- 随机化
各有利弊。
确定性加密总是为任何给定的明文值生成相同的加密值。使用确定性加密允许对加密列进行点 查找、相等连接、分组和索引。 但是,也可能允许未经授权的用户通过检查加密列中的模式来猜测有关加密值的信息,尤其是如果存在一小组可能的加密值,例如 True/False 或 North/South/East/West 区域。确定性加密必须对字符列使用 binary2 排序顺序的列排序规则。
随机加密使用一种以不可预测的方式加密数据的方法。随机加密更安全,但会阻止对加密列进行搜索、分组、索引和连接。