【问题标题】:How to set up AzureSQL Database with AlwaysEncrypted and fill it with data?如何使用 Always Encrypted 设置 Azure SQL 数据库并用数据填充它?
【发布时间】:2020-09-01 16:36:05
【问题描述】:

目前我正在使用 Azure 云。我想设置一个 AzureSQL 数据库并使用 AlwaysEncrypted 来确保数据“始终加密”;-)。此外,我想设置能够连接到数据库以及写入记录的 AzureFunctions。

我已经设置了 AzureSQL 数据库,但我不知道如何使用它。我开始了两次尝试:

  1. 直接在 SSMS 中建表,在表中填入数据,创建密钥并使用向导对其进行加密。这完全正常,只有在连接到数据库时设置“AlwaysEncrypted”复选框,我才能看到纯数据。
  2. 我的第二次尝试是将“始终加密”直接包含在查询中。我尝试了以下方法:
CREATE COLUMN MASTER KEY CMK_test_1   
    WITH (  
        KEY_STORE_PROVIDER_NAME = 'AZURE_KEY_VAULT',  
        KEY_PATH = '<PATH_TO_AZURE_KEY_VAULT>'   
         )   

CREATE COLUMN ENCRYPTION KEY CEK_test_1   
WITH VALUES  
  (  
    COLUMN_MASTER_KEY = CMK_test_1,   
    ALGORITHM = 'RSA_OAEP',  
    ENCRYPTED_VALUE = <VALUE>
  )

Create Table dbo.AlwaysEncryptedTest
(
    ID int identity(1,1) PRIMARY KEY
    , FirstName varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (  
        ENCRYPTION_TYPE = RANDOMIZED,  
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
        COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL    
    , LastName varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (  
        ENCRYPTION_TYPE = RANDOMIZED,  
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
        COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
    , City varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (  
        ENCRYPTION_TYPE = RANDOMIZED,  
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
        COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
    , StreetName varchar(25) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (  
        ENCRYPTION_TYPE = RANDOMIZED,  
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
        COLUMN_ENCRYPTION_KEY = CEK_test_1) not NULL
)

我知道我必须使用应用程序将记录放入数据库,但我找不到可以帮助我这样做的教程或其他东西。我在 Microsoft 网站上找到了一些 C# 解释,但这并没有帮助我完成这项工作。在最好的情况下,我会在 python 中编写连接。

感谢任何帮助。

最好的 P

【问题讨论】:

    标签: python azure azure-sql-database always-encrypted


    【解决方案1】:

    如果你想在python应用程序中连接启用always encrypt的Azure SQL server和Azure key vault,我们可以使用ODBC驱动来实现。

    关于如何实现它,我们需要在连接字符串中添加ColumnEncryption=Enabled,以告诉odbc应用程序始终加密已启用。此外,由于我们使用 Azure 密钥保管库存储,我们还需要添加KeyStoreAuthenticationKeyStorePrincipalIdKeyStoreSecret 以使 ODBC 应用程序连接 Azure 密钥保管库,获取加密密钥。 更多详情请参考herehere

    例如

    1. 创建服务主体以连接 Azure 密钥保管库
    az login
    az ad sp create-for-rbac --skip-assignment --sdk-auth
    
    az keyvault set-policy --name $vaultName --key-permissions get, list, sign, unwrapKey, verify, wrapKey --resource-group $resourceGroupName --spn <clientId-of-your-service-principal>
    
    1. 代码
    server = '<>.database.windows.net'
    database = ''
    username = ''
    password = ''   
    driver= '{ODBC Driver 17 for SQL Server}'
    KeyStoreAuthentication='KeyVaultClientSecret'
    KeyStorePrincipalId='<clientId-of-your-service-principal>'
    KeyStoreSecret='<clientSecret-of-your-service-principal>'
    conn_str=f'DRIVER={driver};SERVER={server};PORT=1443;DATABASE={database};UID={username};PWD={password};ColumnEncryption=Enabled;KeyStoreAuthentication={KeyStoreAuthentication};KeyStorePrincipalId={KeyStorePrincipalId};KeyStoreSecret={KeyStoreSecret}'
    with pyodbc.connect(conn_str) as conn:
        with conn.cursor() as cursor:
            cursor.execute("SELECT * FROM [dbo].[Patients]")
            row = cursor.fetchone()
            while row:
                print (row)
                row = cursor.fetchone()
    

    【讨论】:

    • 非常感谢您的帮助。我一有时间就试试这个:-)
    • @Pet 你还有其他顾虑吗?
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2019-08-24
    • 2022-01-02
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多