Ajánlott biztonsági eljárások az mssql-django használatához

Ez a cikk a háttérrendszeren keresztül mssql-django SQL Server csatlakozó Django-alkalmazások biztonsági eljárásait ismerteti. Ezek a gyakorlatok kiegészítik a Django beépített biztonsági funkcióit és SQL Server biztonsági modelljét.

Jelszavak helyett Microsoft Entra hitelesítés használata

Microsoft Entra hitelesítés megszünteti a tárolt adatbázisjelszavakat. Használja az összes Azure SQL kapcsolathoz.

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": "Authentication=ActiveDirectoryMsi",
        },
    },
}

A hitelesítési módszerek, az aktuális kikötések és TOKEN példák teljes listájáért DefaultAzureCredentialManagedIdentityCredentiallásd az mssql-django Microsoft Entra hitelesítését.

Hitelesítő adatok biztonságos kezelése

Ha SQL-hitelesítésre van szüksége, ne tárolja a hitelesítő adatokat a forráskódban.

Környezeti változók

import os

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": os.environ["DB_NAME"],
        "USER": os.environ["DB_USER"],
        "PASSWORD": os.environ["DB_PASSWORD"],
        "HOST": os.environ["DB_HOST"],
        "PORT": os.environ.get("DB_PORT", "1433"),
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

Azure Key Vault

Éles környezetben történő üzembe helyezéshez kérje le a titkos adatokat az Azure Key Vaultból:

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()
client = SecretClient(vault_url="https://<your-vault>.vault.azure.net/", credential=credential)

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": client.get_secret("db-name").value,
        "USER": client.get_secret("db-user").value,
        "PASSWORD": client.get_secret("db-password").value,
        "HOST": client.get_secret("db-host").value,
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

Caution

Soha ne véglegesítse a hitelesítő adatokat a forrásvezérlőben. Fájlok hozzáadása .env a fájlhoz .gitignore. Használjon git-secrets vagy pre-commit hookokat a hitelesítő adatok véletlen commitolásának felderítésére.

TLS-titkosítás kényszerítése

SQL Server kapcsolatokat mindig titkosítani kell. Az ODBC-illesztőprogram alapértelmezés szerint titkosítja a kapcsolatokat az ODBC-illesztőprogram 18-tól kezdve:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "HOST": "<your-server>.database.windows.net",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            # Encryption is on by default with Driver 18
        },
    },
}

Ha ODBC Driver 17-et használ, engedélyezze a titkosítást kifejezetten:

"extra_params": "Encrypt=yes"

Caution

Csak helyi fejlesztéshez használható TrustServerCertificate=yes önaláírt tanúsítványokkal. Ne használja éles környezetben. Letiltja a tanúsítványlánc érvényesítését, és növeli a középen belüli támadói kockázatot. Telepítsen egy megbízható tanúsítványt a kiszolgálón, és csatlakozzon a kiszolgálóhoz TrustServerCertificate=no.

A minimális jogosultság elvének alkalmazása

Hozzon létre dedikált SQL Server bejelentkezéseket, csak az alkalmazás által igényelt engedélyekkel:

-- Create a login and user for the application
CREATE LOGIN [django_app]
WITH PASSWORD = '<strong-password>';

USE [<your-database>];

CREATE USER [django_app] FOR LOGIN [django_app];

-- Grant minimum required permissions
-- Read and write data
ALTER ROLE db_datareader ADD MEMBER [django_app];
ALTER ROLE db_datawriter ADD MEMBER [django_app];

-- Allow Django to create and alter tables during migrations
GRANT ALTER ON SCHEMA::dbo TO [django_app];
GRANT CREATE TABLE TO [django_app];
GRANT REFERENCES ON SCHEMA::dbo TO [django_app];

Azoknál az alkalmazásoknál, amelyek nem futtatnak migrációkat éles környezetben, hagyja ki a(z) ALTER és CREATE TABLE engedélyeket.

-- Production application user (read/write only)
ALTER ROLE db_datareader ADD MEMBER [django_app];
ALTER ROLE db_datawriter ADD MEMBER [django_app];

GRANT EXECUTE ON SCHEMA::dbo TO [django_app]; -- If using stored procedures

Migrálások futtatása külön, kiemeltebb üzembe helyezési lépésből:

-- Migration user (used only during deployments)
ALTER ROLE db_ddladmin ADD MEMBER [django_migrations];

Válassza ki a megfelelő szerepkört

A SQL Server rögzített adatbázis-szerepkörei a legkevesebb jogosultsággal rendelkezőtől a legtöbb jogosultsággal rendelkezőig vannak sorba rendezve. Válassza ki a számítási feladatokat lefedő legkevésbé kiemelt szerepkört, és csak szükség esetén eszkaláljon:

Role Grants Mikor érdemes használni?
db_datareader SELECT az összes felhasználói táblákon és nézeteken Írásvédett jelentéskészítő felhasználók
db_datawriter INSERT, UPDATE, DELETE az összes felhasználói táblán Futtatókörnyezeti alkalmazás felhasználója (db_datareader kombinálva)
db_ddladmin Sémaobjektumok létrehozása, módosítása és elvetése Csak migrálási vagy üzembe helyezési felhasználó
db_owner Minden adatbázis-engedély, beleértve a biztonságot is Kerülje az alkalmazásokhoz való használatát; tartsa fenn a DBA-k számára

A rögzített szerepkörök által megengedettnél részletesebb vezérlés érdekében hozzon létre egy egyéni adatbázis-szerepkört, és GRANT csak az alkalmazás által használt sémára vonatkozó adott engedélyeket. Ha az összes alkalmazásobjektumot egy dedikált sémában tartja (például app), akkor az engedélyeket a GRANT ... ON SCHEMA::app használatával hatókörözheti, ahelyett hogy az ամբողջ adatbázisra kiterjedő db_datareader és db_datawriter szerepkörökre támaszkodna.

Note

Ne használja a sa felhasználói fiókot vagy a db_owner rögzített adatbázisbeli szerepkört alkalmazáskapcsolatokhoz. Ha az alkalmazás biztonsága sérül, a támadó teljes adatbázis-vezérlést kap.

SQL-injektálás megakadályozása

A Django ORM-je automatikusan paraméterezi az összes lekérdezést. Az SQL-injektálás csak akkor jelent kockázatot, ha nyers SQL-t használ:

Biztonságos: ORM-lekérdezések

# Django parameterizes these automatically
users = User.objects.filter(email=user_input)
products = Product.objects.filter(price__lte=max_price)

Biztonságos: Paraméterezett nyers SQL

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute(
        "SELECT * FROM products WHERE category = %s AND price < %s",
        [category, max_price],
    )

Nem biztonságos: Sztringformázás nyers SQL-ben

# NEVER do this - vulnerable to SQL injection
cursor.execute(f"SELECT * FROM products WHERE category = '{category}'")
cursor.execute("SELECT * FROM products WHERE category = '%s'" % category)

Extra és RawSQL

Django és extra()RawSQL() fogadja el a nyers SQL-töredékeket. Mindig használjon paramétereket:

# Safe - parameterized
Product.objects.extra(where=["category = %s"], params=[category])

from django.db.models.expressions import RawSQL
Product.objects.annotate(
    discount=RawSQL("price * %s", [discount_rate])
)

Important

Soha ne használja a extra() vagy a RawSQL() elemet karakterlánc-formázáshoz. Ezek megkerülik az ORM automatikus paraméterezését.

Django biztonsági köztes szoftver konfigurálása

Engedélyezze a Django beépített biztonsági köztes szoftverét a webes réteg védelméhez. Bár ezek nem adatbázisspecifikusak, védik az adatbázishoz csatlakozó alkalmazást:

# settings.py

# HTTPS enforcement
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000  # 1 year
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

# Cookie security
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True

# Content security
SECURE_CONTENT_TYPE_NOSNIFF = True

Adatbázis-hozzáférés ellenőrzése

Engedélyezze SQL Server naplózást a Django-alkalmazás adatbázis-műveleteinek nyomon követéséhez:

-- Create a server audit (Azure SQL uses Azure SQL Auditing instead)
CREATE SERVER AUDIT [DjangoAudit]
TO FILE (FILEPATH = 'C:\Audits\')
WITH (ON_FAILURE = CONTINUE);

ALTER SERVER AUDIT [DjangoAudit] WITH (STATE = ON);

-- Create a database audit specification
USE [<your-database>];

CREATE DATABASE AUDIT SPECIFICATION [DjangoDbAudit]
FOR SERVER AUDIT [DjangoAudit]
ADD (SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo BY [django_app])
WITH (STATE = ON);

Az Azure SQL Database esetében engedélyezze a naplózást az Azure Portalon vagy az Azure CLI használatával:

az sql db audit-policy update --resource-group <rg> --server <server> \
    --name <database> --state Enabled \
    --storage-account <storage-account>

Bizalmas oszlopok védelme az Always Encrypted használatával

Bizalmas adatok, például SSN-ek, hitelkártyaszámok vagy fizetési adatok oszlopszintű titkosításához használja az Always Encryptedt. Az ODBC-illesztő transzparensen kezeli a titkosítást és a visszafejtést:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "extra_params": "ColumnEncryption=Enabled",
        },
    },
}

A Azure Key Vault kulcskezelésével kapcsolatos részletes beállításért lásd: Always Encrypted with mssql-django.

Biztonsági ellenőrzőlista

Kategória Practice Priority
Authentication Használjon Microsoft Entra hitelesítést Azure SQL. Magas
Credentials Titkos kulcsok tárolása környezeti változókban vagy Azure Key Vault. Magas
Titkosítás Használja az ODBC Driver 18 -at (alapértelmezés szerint titkosítás) vagy Encrypt=yes. Magas
Injekció HASZNÁLJON ORM-lekérdezéseket vagy paraméteres nyers SQL-t. Ne formázza az SQL-t karakterlánc-formázással. Magas
Minimális jogosultság Hozzon létre dedikált bejelentkezéseket a minimálisan szükséges engedélyekkel. Magas
TLS Ne használja TrustServerCertificate=yes éles környezetben. Magas
Django Engedélyezze a SECURE_SSL_REDIRECT, a biztonságos cookie-kat és a HSTS-t. Medium
Auditing Engedélyezze SQL Server naplózást vagy Azure SQL naplózást. Medium
Oszloptitkosítás Az Always Encrypted használata rendkívül érzékeny oszlopokhoz. Alacsony
Kapcsolat Állítsa be a CONN_MAX_AGE és a CONN_HEALTH_CHECKS értékét a beragadt kapcsolatok megelőzése érdekében. Alacsony