Always Encrypted s mssql-django

Tento článek vysvětluje, jak používat SQL Server Always Encrypted s aplikacemi Django prostřednictvím back-endumssql-django. Funkce Always Encrypted poskytuje šifrování na úrovni sloupců, které chrání citlivá neaktivní uložená data a přenášená data.

Prerequisites

  • Microsoft ovladač ODBC 17 nebo 18 pro SQL Server
  • SQL Server 2016 nebo novější nebo Azure SQL Database
  • Šifrování sloupců nakonfigurované na straně SQL Server (hlavní klíč sloupce a šifrovací klíč sloupce)

Jak to funguje

Funkce Always Encrypted je zpracována vrstvou ovladače ODBC, nikoli samotným Django. Když povolíte ColumnEncryption parametr ODBC, ovladač automaticky šifruje a dešifruje data při předávání mezi vaší aplikací a SQL Server. Modely a dotazy Django fungují stejně bez ohledu na to, jestli jsou sloupce zašifrované nebo ne.

Úložiště certifikátů Systému Windows

Pokud jsou hlavní klíče sloupců uloženy v úložišti certifikátů Windows, povolte funkci Always Encrypted přidáním ColumnEncryption=Enabled do extra_params:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": "ColumnEncryption=Enabled",
        },
    },
}

Tento přístup funguje jenom na Windows.

Azure Key Vault s ID klienta a tajným kódem

Pokud jsou hlavní klíče sloupců uložené v Azure Key Vault, zadejte přihlašovací údaje aplikace vextra_params:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": (
                "ColumnEncryption=Enabled;"
                "KeyStoreAuthentication=KeyVaultClientSecret;"
                "KeyStorePrincipalId=<application-client-id>;"
                "KeyStoreSecret=<client-secret>"
            ),
        },
    },
}

Nahraďte <application-client-id> a <client-secret> hodnotami ID aplikace (klienta) a tajného klíče klienta z registrace aplikace.

Important

Nezakódujte tajné kódy v settings.pysouboru . K zadání přihlašovacích údajů za běhu použijte proměnné prostředí nebo správce tajných kódů.

Azure Key Vault se spravovanou identitou

Při spuštění na Azure (například Azure Virtual Machines nebo Azure App Service) použijte spravovanou identitu pro přístup k Azure Key Vault.

Spravovaná identita přiřazená systémem

Kromě parametru KeyStoreAuthentication není potřeba žádná další konfigurace:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "HOST": "<your-server>.database.windows.net",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": (
                "ColumnEncryption=Enabled;"
                "KeyStoreAuthentication=KeyVaultManagedIdentity"
            ),
        },
    },
}

Spravovaná identita přiřazená uživatelem

Zahrňte ID klienta spravované identity (označované také jako ID aplikace):

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "HOST": "<your-server>.database.windows.net",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": (
                "ColumnEncryption=Enabled;"
                "KeyStoreAuthentication=KeyVaultManagedIdentity;"
                "KeyStorePrincipalId=<managed-identity-client-id>"
            ),
        },
    },
}

Udělte oprávnění spravované identitě

  1. Udělte spravované identitě přístup k vaší databázi Azure SQL:

    CREATE USER [<identity-name>] FOR EXTERNAL PROVIDER;
    
    ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
    
    GRANT VIEW ANY COLUMN MASTER KEY DEFINITION TO [<identity-name>];
    GRANT VIEW ANY COLUMN ENCRYPTION KEY DEFINITION TO [<identity-name>];
    
  2. Udělte spravované identitě přístup ke službě Azure Key Vault, která ukládá hlavní klíč sloupce, s oprávněními uvedenými v dokumentaci k Always Encrypted Azure Key Vault.

Umožnit Django spravovat šifrované tabulky

Při použití funkce Always Encrypted s Django nejprve nakonfigurujte šifrovací objekty na SQL Server a pak spusťte migrace.

Doporučené pořadí:

  1. Vytvořte hlavní klíč sloupce (CMK) a šifrovací klíč sloupce (CEK) na SQL Server nebo Azure SQL.
  2. Nakonfigurujte ColumnEncryption=Enabled v nastavení připojení Django.
  3. Spusťte migrace Django.
  4. Šifrování cílových sloupců pomocí SQL Server Management Studio nebo T-SQL

Spusťte migrace:

python manage.py migrate

mssql-django nevytváří ani nespravuje metadata klíčů Always Encrypted. Zásady vytváření klíčů a šifrování sloupců zůstávají SQL Server úloh správy.

Nepodporované metody ověřování

Pro přístup k úložišti klíčů Always Encrypted nejsou podporovány ověřování pomocí uživatelského jména a hesla ani interaktivní ověřování Azure Key Vault.