Always Encrypted with mssql-django

Ez a cikk bemutatja, hogyan használható SQL Server Always Encrypted django-alkalmazásokkal a mssql-django háttérrendszeren keresztül. Az Always Encrypted oszlopszintű titkosítást biztosít, amely a bizalmas adatok védelmét szolgálja nyugalmi állapotban és átvitel közben.

Prerequisites

  • Microsoft ODBC Driver 17 vagy 18 SQL Serverhez
  • 2016-os vagy újabb SQL Server vagy Azure SQL Database
  • A SQL Server oldalon konfigurált oszloptitkosítás (oszlop főkulcsa és oszloptitkosítási kulcs)

Hogyan működik?

Az Always Encryptedt az ODBC illesztőprogram-rétege kezeli, nem maga a Django. Ha engedélyezi az ColumnEncryption ODBC paramétert, az illesztőprogram automatikusan titkosítja és visszafejti az adatokat az alkalmazás és a SQL Server között áthaladva. A Django-modellek és -lekérdezések ugyanúgy működnek, függetlenül attól, hogy az oszlopok titkosítva vannak-e.

Windows-tanúsítványtároló

Ha az oszlopfőkulcsok a Windows tanúsítványtárolóban vannak, engedélyezze az Always Encrypted funkciót a(z) ColumnEncryption=Enabled hozzáadásával a(z) extra_params elemhez:

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",
        },
    },
}

Ez a megközelítés csak Windows működik.

Azure Key Vault ügyfélazonosítóval és titkos kóddal

Ha az oszlop főkulcsait Azure Key Vault tárolja, adja meg az alkalmazás hitelesítő adatait a következő helyenextra_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>"
            ),
        },
    },
}

Cserélje le a <application-client-id> és <client-secret> elemet az alkalmazásregisztrációjának Alkalmazás (ügyfél) azonosítója és ügyféltitok értékére.

Important

Ne kódolja a titkos kódokat a fájlban settings.py. Használjon környezeti változókat vagy titkos kulcskezelőt hitelesítő adatok megadásához futásidőben.

Azure Key Vault felügyelt identitással

Ha Azure (például Azure Virtual Machines vagy Azure App Service) fut, a felügyelt identitással érheti el a Azure Key Vault.

Rendszer által hozzárendelt felügyelt identitás

A paraméteren túl nincs szükség további konfigurációra KeyStoreAuthentication :

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"
            ),
        },
    },
}

Felhasználó által hozzárendelt felügyelt identitás

Adja meg a felügyelt identitás ügyfél-azonosítóját (más néven alkalmazásazonosítót):

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>"
            ),
        },
    },
}

Felügyelt identitás engedélyeinek megadása

  1. Adjon hozzáférést a felügyelt identitásnak a Azure SQL-adatbázishoz:

    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. Adjon a felügyelt identitásnak hozzáférést az oszlop főkulcsát tároló Azure Key Vaulthoz az Always Encrypted Azure Key Vault dokumentációjában felsorolt engedélyekkel.

A Django kezelheti a titkosított táblákat

Az Always Encrypted és a Django használatakor először konfigurálja a titkosítási objektumokat SQL Server, majd futtassa az áttelepítéseket.

Ajánlott rendelés:

  1. Hozza létre az oszlopfőkulcsot (CMK) és az oszloptitkosítási kulcsot (CEK) az SQL Serveren vagy az Azure SQL-ben.
  2. Konfigurálja ColumnEncryption=Enabled a Django kapcsolati beállításait.
  3. Django-migrációk futtatása.
  4. A céloszlopok titkosítása SQL Server Management Studio vagy T-SQL használatával.

Migrációk futtatása:

python manage.py migrate

mssql-django nem hozza létre vagy kezeli az Always Encrypted kulcs metaadatait. A kulcsok létrehozása és az oszloptitkosítási szabályzat továbbra is az SQL Server felügyeleti feladata marad.

Nem támogatott hitelesítési módszerek

A felhasználónév/jelszó és Azure Key Vault Interaktív hitelesítés nem támogatott az Always Encrypted kulcstároló-hozzáférés esetében.