Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 |
Kapcsolódó tartalom
- Microsoft Entra hitelesítés mssql-django használatával
- Always Encrypted with mssql-django
- Az mssql-django kapcsolati beállításai
- Nyers SQL-lekérdezések az mssql-django-ban
- Újrapróbálkozási logika és kapcsolati rugalmasság az mssql-django használatával
- SQL Servert használó Django-alkalmazás üzembe helyezése az Azure App Service-be