mssql-django ile Always Encrypted

Bu makalede arka uç aracılığıyla Django uygulamalarıyla SQL Server Always Encrypted'ın mssql-django nasıl kullanılacağı açıklanmaktadır. Always Encrypted, depolanan ve aktarım sırasında olan hassas verileri koruyan sütun düzeyinde şifreleme sağlar.

Prerequisites

  • SQL Server için Microsoft ODBC Sürücüsü 17 veya 18
  • SQL Server 2016 veya üzeri ya da Azure SQL Veritabanı
  • SQL Server tarafında yapılandırılan sütun şifrelemesi (sütun ana anahtarı ve sütun şifreleme anahtarı)

Nasıl çalışır?

Always Encrypted, Django tarafından değil ODBC sürücü katmanı tarafından işlenir. ODBC parametresini ColumnEncryption etkinleştirdiğinizde, sürücü uygulamanızla SQL Server arasında geçiş yaparken verileri otomatik olarak şifreler ve şifresini çözer. Django modelleri ve sorguları, sütunların şifrelenip şifrelenmediğiyle aynı şekilde çalışır.

Windows sertifika deposu

Sütun ana anahtarları Windows sertifika deposunda depolandığında, ColumnEncryption=Enabled öğesini extra_params öğesine ekleyerek Always Encrypted'ı etkinleştirin:

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

Bu yaklaşım yalnızca Windows üzerinde çalışır.

İstemci kimliği ve gizli dizi ile Azure Key Vault

Sütun ana anahtarları Azure Key Vault’ta saklandığında, uygulama kimlik bilgilerini extra_params içinde sağlayın:

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

<application-client-id> ve <client-secret> öğelerini uygulama kaydının Uygulama (istemci) kimliği ve istemci gizli değeriyle değiştirin.

Important

settings.py içine gizli bilgileri sabit kodlamayın. Çalışma zamanında kimlik bilgilerini sağlamak için ortam değişkenlerini veya gizli dizi yöneticisini kullanın.

Yönetilen kimlikle Azure Key Vault

Azure üzerinde çalışırken (örneğin, Azure Sanal Makineler veya Azure App Service), Azure Key Vault erişmek için yönetilen kimliği kullanın.

Sistem tarafından atanan yönetilen kimlik

Parametresinin ötesinde KeyStoreAuthentication ek yapılandırma gerekmez:

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

Kullanıcı tarafından atanan yönetilen kimlik

Yönetilen kimliğin istemci kimliğini (uygulama kimliği olarak da adlandırılır) ekleyin:

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

Yönetilen kimlik izinlerini ver

  1. Yönetilen kimliğe Azure SQL veritabanınıza erişim izni verin:

    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. Sütun ana anahtarını depolayan Azure Key Vault’a, Always Encrypted Azure Key Vault belgelerinde listelenen izinlerle yönetilen kimlik için erişim izni verin.

Django'ya şifrelenmiş tabloları yönetme izni verme

Always Encrypted'ı Django ile kullanırken önce SQL Server'de şifreleme nesnelerini yapılandırın, ardından geçişleri çalıştırın.

Önerilen sıra:

  1. SQL Server veya Azure SQL sütun ana anahtarını (CMK) ve sütun şifreleme anahtarını (CEK) oluşturun.
  2. ColumnEncryption=Enabled öğesini Django bağlantı ayarlarında yapılandırın.
  3. Django geçişlerini çalıştırın.
  4. hedef sütunları SQL Server Management Studio veya T-SQL ile şifreleyin.

Migrasyonları çalıştırın:

python manage.py migrate

mssql-django Always Encrypted anahtar meta verilerini oluşturmaz veya yönetmez. Anahtar oluşturma ve sütun şifreleme ilkesi, SQL Server yönetim görevleri olmaya devam eder.

Desteklenmeyen kimlik doğrulama yöntemleri

Kullanıcı adı/parola ve Azure Key Vault Etkileşimli kimlik doğrulaması Always Encrypted anahtar deposu erişimi için desteklenmez.