Immer verschlüsselt mit mssql-django

In diesem Artikel wird erläutert, wie Sie SQL Server Always Encrypted with Django-Anwendungen über das mssql-django Back-End verwenden. Always Encrypted bietet Verschlüsselung auf Spaltenebene, die vertrauliche Daten im Ruhezustand und während der Übertragung schützt.

Voraussetzungen

  • Microsoft ODBC-Treiber 17 oder 18 für SQL Server
  • SQL Server 2016 oder höher oder Azure SQL-Datenbank
  • Auf der SQL Server Seite konfigurierte Spaltenverschlüsselung (Spaltenmasterschlüssel und Spaltenverschlüsselungsschlüssel)

Funktionsweise

Always Encrypted wird von der ODBC-Treiberebene behandelt, nicht von Django selbst. Wenn Sie den ColumnEncryption ODBC-Parameter aktivieren, verschlüsselt und entschlüsselt der Treiber automatisch Daten, während er zwischen Ihrer Anwendung und SQL Server übergeben wird. Django-Modelle und -Abfragen funktionieren auf die gleiche Weise, ob Spalten verschlüsselt sind oder nicht.

Windows-Zertifikatspeicher

Wenn Spaltenmasterschlüssel im Windows-Zertifikatspeicher gespeichert werden, aktivieren Sie Always Encrypted durch Hinzufügen von ColumnEncryption=Enabled zu 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",
        },
    },
}

Dieser Ansatz funktioniert nur für Windows.

Azure Key Vault mit Client-ID und Geheimnis

Wenn Spaltenmasterschlüssel in Azure Key Vault gespeichert werden, geben Sie die Anwendungsanmeldeinformationen in 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;"
                "KeyStoreAuthentication=KeyVaultClientSecret;"
                "KeyStorePrincipalId=<application-client-id>;"
                "KeyStoreSecret=<client-secret>"
            ),
        },
    },
}

Ersetzen Sie <application-client-id> und <client-secret> durch die Anwendungs-ID (Client-ID) und den Wert des geheimen Clientschlüssels der App-Registrierung.

Important

Codieren Sie keine geheimen Schlüssel in settings.py. Verwenden Sie Umgebungsvariablen oder einen Secret-Manager, um Zugangsdaten zur Laufzeit bereitzustellen.

Azure Key Vault mit verwalteter Identität

Verwenden Sie bei der Ausführung auf Azure (z. B. Azure Virtual Machines oder Azure App Service) verwaltete Identität, um auf Azure Key Vault zuzugreifen.

Vom System zugewiesene verwaltete Identität

Über den KeyStoreAuthentication Parameter hinaus ist keine zusätzliche Konfiguration erforderlich:

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

Vom Benutzer zugewiesene verwaltete Identität

Einschließen der Client-ID der verwalteten Identität (auch als Anwendungs-ID bezeichnet):

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

Berechtigungen für verwaltete Identitäten erteilen

  1. Gewähren Sie der verwalteten Identität Zugriff auf Ihre Azure SQL-Datenbank:

    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. Gewähren Sie der verwalteten Identität Zugriff auf den Azure Key Vault, in dem der Spaltenmasterschlüssel gespeichert ist, mit den in der Dokumentation zu Always Encrypted Azure Key Vault aufgeführten Berechtigungen.

Lassen Sie Django verschlüsselte Tabellen verwalten

Wenn Sie Always Encrypted with Django verwenden, konfigurieren Sie zuerst Verschlüsselungsobjekte für SQL Server, und führen Sie dann Migrationen aus.

Empfohlene Reihenfolge:

  1. Erstellen Sie den Spaltenmasterschlüssel (CMK) und den Spaltenverschlüsselungsschlüssel (Column Encryption Key, CEK) auf SQL Server oder Azure SQL.
  2. Konfigurieren Sie ColumnEncryption=Enabled in den Django-Verbindungseinstellungen.
  3. Führen Sie Django-Migrationen aus.
  4. Verschlüsseln sie Zielspalten mit SQL Server Management Studio oder T-SQL.

Ausführen von Migrationen:

python manage.py migrate

mssql-django erstellt oder verwaltet keine Always Encrypted-Schlüsselmetadaten. Schlüsselerstellung und Spaltenverschlüsselungsrichtlinie bleiben Aufgaben der SQL Server-Administration.

Nicht unterstützte Authentifizierungsmethoden

Benutzername/Kennwort und Azure Key Vault Interaktive Authentifizierung werden für den Zugriff auf Always Encrypted-Schlüsselspeicher nicht unterstützt.