Always Encrypted met mssql-django

In dit artikel wordt uitgelegd hoe u SQL Server Always Encrypted gebruikt met Django-toepassingen via de mssql-django back-end. Always Encrypted biedt versleuteling op kolomniveau waarmee gevoelige gegevens in rust en in transit worden beschermd.

Prerequisites

  • Microsoft ODBC-stuurprogramma 17 of 18 voor SQL Server
  • SQL Server 2016 of hoger of Azure SQL Database
  • Kolomversleuteling geconfigureerd aan de SQL Server zijde (kolomhoofdsleutel en kolomversleutelingssleutel)

Hoe werkt het?

Always Encrypted wordt verwerkt door de ODBC-stuurprogrammalaag, niet door Django zelf. Wanneer u de ColumnEncryption ODBC-parameter inschakelt, worden gegevens automatisch versleuteld en ontsleuteld wanneer deze worden doorgegeven tussen uw toepassing en SQL Server. Django-modellen en -query's werken op dezelfde manier als kolommen worden versleuteld of niet.

Windows-certificaatarchief

Wanneer kolomhoofdsleutels worden opgeslagen in het Windows certificaatarchief, schakelt u Always Encrypted in door toe te voegen ColumnEncryption=Enabled aanextra_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",
        },
    },
}

Deze aanpak werkt alleen op Windows.

Azure Key Vault met client-id en geheim

Wanneer kolomhoofdsleutels worden opgeslagen in Azure Key Vault, geeft u de toepassingsreferenties op inextra_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>"
            ),
        },
    },
}

Vervang <application-client-id> en <client-secret> door de Toepassings-id (client) van de app-registratie en de clientgeheime waarde.

Important

Codeer geheimen niet in settings.py. Gebruik omgevingsvariabelen of een geheimbeheerder om referenties op te geven tijdens runtime.

Azure Key Vault met beheerde identiteit

Wanneer u toepassingen uitvoert op Azure (bijvoorbeeld Azure Virtuele Machines of Azure App Service), gebruikt u een beheerde identiteit om toegang te krijgen tot Azure Key Vault.

Door het systeem toegewezen beheerde identiteit

Er is geen extra configuratie nodig buiten de KeyStoreAuthentication parameter:

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

Door de gebruiker toegewezen beheerde identiteit

Neem de client-id van de beheerde identiteit op (ook wel toepassings-id genoemd):

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

Machtigingen voor beheerde identiteit verlenen

  1. Geef de beheerde identiteit toegang tot uw Azure SQL-database:

    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. Verleen de beheerde identiteit toegang tot de Azure Key Vault waarin de hoofdsleutel van de kolom wordt opgeslagen, met de machtigingen die worden genoemd in de documentatie van Always Encrypted Azure Key Vault.

Laat Django versleutelde tabellen beheren

Wanneer u Always Encrypted met Django gebruikt, configureert u eerst versleutelingsobjecten op SQL Server en voert u vervolgens migraties uit.

Aanbevolen volgorde:

  1. Maak de kolomhoofdsleutel (CMK) en kolomversleutelingssleutel (CEK) op SQL Server of Azure SQL.
  2. Configureer ColumnEncryption=Enabled in django-verbindingsinstellingen.
  3. Voer Django-migraties uit.
  4. Doelkolommen versleutelen met SQL Server Management Studio of T-SQL.

Migraties uitvoeren:

python manage.py migrate

mssql-django maakt of beheert geen metagegevens van Always Encrypted-sleutels. Sleutel maken en kolomversleutelingsbeleid blijven SQL Server beheertaken.

Niet-ondersteunde verificatiemethoden

Gebruikersnaam/wachtwoord en Azure Key Vault Interactieve verificatie worden niet ondersteund voor toegang tot Always Encrypted-sleutelarchief.