Always Encrypted dengan mssql-django

Artikel ini menjelaskan cara menggunakan SQL Server Always Encrypted dengan aplikasi Django melalui mssql-django backend. Always Encrypted menyediakan enkripsi tingkat kolom yang melindungi data sensitif saat tidak aktif dan saat transit.

Prasyarat

  • Microsoft ODBC Driver 17 atau 18 untuk SQL Server
  • SQL Server 2016 atau yang lebih baru, atau Azure SQL Database
  • Enkripsi kolom dikonfigurasi di sisi SQL Server (kunci master kolom dan kunci enkripsi kolom)

Cara kerjanya

Always Encrypted ditangani oleh lapisan driver ODBC, bukan oleh Django itu sendiri. Saat Anda mengaktifkan ColumnEncryption parameter ODBC, driver secara otomatis mengenkripsi dan mendekripsi data saat diteruskan antara aplikasi Anda dan SQL Server. Model dan kueri Django bekerja dengan cara yang sama apakah kolom dienkripsi atau tidak.

Toko sertifikat Windows

Saat kunci master kolom disimpan di penyimpanan sertifikat Windows, aktifkan Always Encrypted dengan menambahkan ColumnEncryption=Enabled ke 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",
        },
    },
}

Pendekatan ini hanya berfungsi pada Windows.

Azure Key Vault dengan ID klien dan rahasia

Saat kunci master kolom disimpan di Azure Key Vault, berikan kredensial aplikasi di 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>"
            ),
        },
    },
}

Ganti <application-client-id> dan <client-secret> dengan ID Aplikasi (klien) pendaftaran aplikasi dan nilai rahasia klien.

Important

Jangan menanamkan informasi rahasia secara tetap di settings.py. Gunakan variabel lingkungan atau manajer rahasia untuk memberikan kredensial saat runtime.

Azure Key Vault dengan identitas terkelola

Saat berjalan di Azure (misalnya, Azure Virtual Machines atau Azure App Service), gunakan identitas terkelola untuk mengakses Azure Key Vault.

Identitas terkelola yang diberikan oleh sistem

Tidak ada konfigurasi tambahan yang diperlukan di luar 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"
            ),
        },
    },
}

Identitas terkelola yang ditetapkan pengguna

Sertakan ID klien identitas terkelola (juga disebut ID aplikasi):

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

Memberikan izin identitas terkelola

  1. Berikan akses identitas terkelola ke database Azure SQL Anda:

    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. Berikan akses identitas terkelola ke Azure Key Vault yang menyimpan kunci master kolom, dengan izin yang tercantum dalam dokumentasi Azure Key Vault Always Encrypted.

Biarkan Django mengelola tabel terenkripsi

Saat menggunakan Always Encrypted dengan Django, konfigurasikan objek enkripsi pada SQL Server terlebih dahulu, lalu jalankan migrasi.

Urutan yang disarankan:

  1. Buat kunci master kolom (CMK) dan kunci enkripsi kolom (CEK) di SQL Server atau Azure SQL.
  2. Konfigurasikan ColumnEncryption=Enabled di pengaturan koneksi Django.
  3. Jalankan migrasi Django.
  4. Enkripsi kolom target dengan SQL Server Management Studio atau T-SQL.

Jalankan migrasi:

python manage.py migrate

mssql-django tidak membuat atau mengelola metadata kunci Always Encrypted. Pembuatan kunci dan kebijakan enkripsi kolom tetap menjadi tugas administratif SQL Server.

Metode autentikasi yang tidak didukung

Nama pengguna/kata sandi dan autentikasi interaktif Azure Key Vault tidak didukung untuk akses penyimpanan kunci Always Encrypted.