Giris
Gelistirme ayarlari ile uretim ayarlari ayni dosyada tutulmamali. DEBUG=True, gevsek ALLOWED_HOSTS ve sabit SECRET_KEY gelistirmede kolaylik saglar ancak internete acik bir sunucuda ciddi guvenlik aciklari olusturur. Bu yazida Django'yu uretime tasirken zorunlu guvenlik yapilandirmalarini adim adim gozden geciriyoruz.
Hedef: cevre degiskenleri ile yonetilen, denetlenebilir ve OWASP Django cheat sheet ile uyumlu bir settings yapisi kurmak.
Settings Dosyasi Ayirimi
base.py ortak ayarlari, development.py ve production.py ortama ozel override'lari icerir. DJANGO_SETTINGS_MODULE=proj.settings.production ile baslatilir.
- django-environ veya python-decouple kullanin
- .env dosyasini git'e eklemeyin
- Her ortam icin ayri SECRET_KEY
# settings/production.py
from .base import *
DEBUG = False
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
SECRET_KEY = env('SECRET_KEY')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = TrueDEBUG ve SECRET_KEY
DEBUG=False iken ALLOWED_HOSTS zorunludur; aksi halde SuspiciousOperation hatasi alinir. SECRET_KEY imzalama, session ve CSRF icin kritiktir; asla repoya commit etmeyin. Rotation plani olusturun.
# Kotu - asla boyle yapmayin
SECRET_KEY = 'django-insecure-hardcoded-key'
DEBUG = True # production'da
# Iyi
import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DEBUG = os.environ.get('DJANGO_DEBUG', 'false').lower() == 'true'SECRET_KEY sizintisi tum session ve imzali token'lari tehlikeye atar; hemen rotate edin.
HTTPS, HSTS ve Guvenlik Basliklari
SecurityMiddleware ile SECURE_SSL_REDIRECT, HSTS ve XSS korumalari etkinlestirilir. Reverse proxy (nginx) arkasinda SECURE_PROXY_SSL_HEADER ayarlanmalidir.
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'
SECURE_REFERRER_POLICY = 'strict-origin-when-cross-origin'
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')CSRF, Session ve Cookie Guvenligi
CSRF_COOKIE_SECURE ve SESSION_COOKIE_SECURE yalnizca HTTPS uzerinden cookie gonderir. CSRF_TRUSTED_ORIGINS, farkli subdomain'den POST yapan frontend icin gereklidir. SESSION_COOKIE_HTTPONLY ve CSRF_COOKIE_HTTPONLY JavaScript erisimini engeller.
- CSRF_TRUSTED_ORIGINS: ['https://app.example.com']
- SESSION_COOKIE_AGE ile oturum suresi
- SameSite=Lax veya Strict politikasi
CSRF_TRUSTED_ORIGINS = ['https://blog.example.com']
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'Veritabani ve Statik Dosyalar
Veritabani sifreleri ortam degiskeninden gelir; SSL baglantisi zorunlu tutulabilir. Statik dosyalar whitenoise veya CDN uzerinden servis edilir; MEDIA_ROOT dogrudan internete acilmamalidir.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('DB_NAME'),
'USER': env('DB_USER'),
'PASSWORD': env('DB_PASSWORD'),
'HOST': env('DB_HOST'),
'OPTIONS': {'sslmode': 'require'},
}
}Logging, Izleme ve Hata Bildirimi
LOGGING yapilandirmasi ile uretimde dosya veya merkezi log toplayiciya (ELK, CloudWatch) akis saglanir. ADMINS ve django.utils.log.AdminEmailHandler kritik hatalarda e-posta gonderebilir; Sentry entegrasyonu tercih edilir.
- DEBUG=False iken console handler yerine file/remote
- Sentry SDK ile exception tracking
- Gizli veriyi loglama (SQL, token, sifre)
- Health check endpoint'i load balancer icin
LOGGING = {
'version': 1,
'handlers': {
'console': {'class': 'logging.StreamHandler'},
},
'root': {'handlers': ['console'], 'level': 'WARNING'},
}Sonuc ve Kontrol Listesi
Uretim guvenligi tek seferlik bir is degil; her deploy oncesi kontrol listesi uygulanmali. django-deploy checklist ve mozilla django-guideline dokumanlari duzenli gozden gecirilmelidir.
- DEBUG=False, guclu SECRET_KEY, ALLOWED_HOSTS tanimli
- HTTPS zorunlu, HSTS aktif
- Guvenlik guncellemeleri: pip-audit / dependabot
- Yedekleme ve felaket kurtarma plani