Django Framework ve Güvenlik

Merhaba arkadaşlar bu yazımda Django Framework ve Güvenlik konusunu ele alacağız. Bildiğiniz üzre Django, python programlama dili ile yazılmış olan bir web uygulaması geliştirme çatısıdır. Biz geliştiricilere sağladığı esneklik, kolaylıklığı ve hızı eklediğimiz de bizim için önemli olan bir web uygulaması geliştirme çatısıdır. Geliştiriciler için tercih edilmesinin en büyük nedeni yapmış olduğumuz web uygulamalarını daha kısa sürede bitirmemizdir. Evet geliştiriciler için bu kadar kolaylıklar sağlayan Django, sizce ne kadar güvenli ? Hiç sorduk mu kedimize bu soruyu ? İsterseniz bu sorunun cevabına birlikte bakalım 🙂

MITM Saldırıları

Man in the Middle diye tabir ettiğimiz MITM saldırıların amacı sunucu ve kullanıcı arasındaki veri trafiğine girerekistediği bilgileri ele geçirmesindir. MITM saldırılarından korunmak için sitenizi HTTPS arkasında almak güzel bir çözüm olacaktır. Bu güvenlik önlemi olmadan olmadan, kötü niyetli ağ kullanıcılarının kimlik doğrulama bilgilerini veya istemci ile sunucu arasında aktarılan diğer bilgileri ele geçirme ve değiştirme olasılığı vardır. Django, bu tür saldırılara karşı önlem alınmışdır.

XSS Zafiyeti

Öncelikle isterseniz XSS zafiyetinin ne olduğuna deginelim. XSS zafiyeti kelime anlamı olarak Cross Site Scripting anlamını taşımaktadır. Anlamından da anlayabileceğiniz gibi web uygulaması üzerinde javascript komutları çalıştırmayı sağlamakdır. XSS çoğunlukla tarayıcıda saklanan bilgiler olan cookielere saldırı amacı ile kullanılmaktadır. Django’nun şablon motoru ekrana basılan değişkenleri otomatik olarak “escape” ediyor.  Adres satırından bir veri alıp şablon dosyanızda direkt olarak kullansanız bile XSS diye bir problem kalmıyor.

SQL Enjeksiyon Zafiyeti

Django ile web uygulaması geliştirirken SQL Enjeksiyon açığı var mı ? yok mu ? acaba hatamı yaptım kodlarken veritabanı güvenliğinde bir zafiyete sebep oldum mu demenize gerek yok. Veritabanı sürücüleri, veritabanı türüne göre otomatik olarak filtrelemeler ve escape işlemleri yapıyor. Django’nun veritabani sürücüsü yeterince güvenli bir şeklide kontrollerini yapmaktadır. Kendiniz elle sorgu yazmak zorunda değilsiniz tabikide karmaşık işler yapmadığınız sürece diyebilirim. El ile sorgular yazdığınızda SQL Enjeksiyon açığına karşı önlemleri geliştiricinin alması gerekiyor. Her şeyide Django’dan beklemeyin 🙂

CSRF Zafiyeti

CSRF, kelime anlamı olarak siteler arası istek sahteciliği anlamına gelir. Bir web uygulamasına giriş yapmış olan bir kullanıcının haberi olmadan web uygulamasında onun yetkilerine eş değer kritik işlemler yaptırılmasıdır. Bir CSRF saldırısıyla kullanıcı istekleri değiştirilebilir ve/veya bilgileri çalınabilir. Django, CSRF zafiyet saldırılarına karşı oldukça kullanışlı bir ara uygulama kullanıyor. Projenizin ayar dosyasında settings.py middleware kısmına django.contrib.csrf.middleware.CsrfMiddleware satırını eklediğimde otomatik olarak CSRF saldırılarına karşı koruma almış oluyorsunuz.

Django Framework ve Güvenlik Hakkındaki Sonucum

Django, web uygulama güvenliği açısından geliştiriciye güvenli web uygulaması geliştirmesi açısından kolaylık sağlamakta, fakat django framework’ün güvenlik çözümleri sistemin her yerinde etkin olamayacağından dolayı, iş geliştiriciye düşmektedir. Başta dediğim gibi her şeyi Django’dan beklemeyin 🙂 Her uygulama gibi Django’da da belirli aralıklarla güvenlik açıkları ortaya çıkıyor ve bu açıklar yayınlanıp kısa zamanda kapatılır. Nasıl python’da, php’de, javascript’te veya başka bir programlama dilinde  güvenlik açığı çıkıyor ve kısa süre içinde kapatılıyorsa bunu da benzer bir durum olarak görebiliriz. Bu noktada uygulama geliştiricisinin düzenli olarak Django projesini takip edip, yayınlanan güvenlik güncellemeleriyle web uygulamasını güncel tutmalıdır. Bunun dışında gelişirdiği web uygulamasına zafiyet tarama ve sızma testini düzenli olarak uzman kişilere yaptırmalıdır. Unutulmamalıdır ki hiç bir zaman %100 güvenlik yoktur. Önemli olan en güvenli hale getirmeye çalışmakdır.

Bir sonraki yazımda görüşmek dileği ile kendinize iyi bakın..

Django AbstractUser ile Genişletme

User Modelini Genişletme

Merhabalar, OneToOneField ile user modelini genişlettik. Fakat AbstractUser kullanarak genişletmek daha akıllıca bir hareket olacaktır.

Yeni bir proje başlatıyorsanız, varsayılan Kullanıcı Modeli sizin için yeterli olsa bile özel bir kullanıcı modeline bir şekilde ihtiyaç duyacaksınız. AbstractUser model, varsayılan kullanıcı modeliyle aynı şekilde davranıyor, ancak ihtiyaç ortaya çıkarsa kullanmanız yeterlidir.

  • Model.py giriş yapalım.

User adında bir oluşturduk. User modelini default olarak django’nun algılaması için settings.py’e AUTH_USER_MODEL” değişkeni ile belirtmemiz gerekiyor.

  • Settings.py giriş yapalım.

Admin panele girdiğimizde “kullanıcılar” bölümü silinmiş olacaktır. Yeni user modelini, admin panele ekliyelim.

  • admin.py giriş yapalım.

fieldsets üzerinden yeni alanlar, list_display üzerinden yeni göküzücek alanlar ekleyebiliriz.

Ek olarak;

Örneğin, yeni eklediğiniz alanların aranma yaparkende çıkmasını istiyorsanız, list_display altına şöyle ekleyin.

Son olarak, veritabanını oluşturalım.

  • Yeni Modelin oluşması için;

  • Veritabanına göç işlemleri

  • Kullanıcı oluşturma

Admin paneline giriş yapalım ;

 

List_display alanına “Avatar” alanı eklenmiş.

Kullanıcı ekleme bölümüne “Avatar” eklenmiş.

User Kayit Form Genişletme

Kullanıcı kayit işlemleri için “UserCreationForm” kullaniyoruz. Fakat yeni eklediğimiz alanlar kayıt ekranına gelmeyecektir.

Örneğin “Avatar” alanını eklemek için ;

Form’u çağırırsak eğer şöyle bir görüntü gelecektir.

User modelini A’dan z’ye genişlettik diye düşünüyorum 🙂 umarım faydalı olmuştur.

Django Modellere Giriş

Django Modelleri ile kısaca veritabanı işlemleri yaparız. Django kullanıcı ne SQL tabloları oluşturur ne sorgularını yaparlar. Bunların hepsini bize django yapacaktır Şimdi siz rahatınıza bakın onlar sorguları ile uğraşsınlar 🙂 biraz bu mantığa daynan bir yapısı vardır.

Bu makalede Models giriş niteliğinde bilgiler olacaktır, Models tam olarak ne işe yarar neler yaparız gibi soruları cevaplayacağım. Model için temel bilgileri taşıyan bilgilerdir dikkatli okuyunuz.

Django Veritabanı Yapılandırılması

Django ön tanımlı olarak PostgreSQL, MySQL, SQlite ve Oracle desteği ile gelir. Veritabanı yapılandırılması proje klasöründeki settings.py içerisinden yapılır. Bu dosyanın DATABASES bölümü aşşağıdaki gibidir :

Buradakı verileri açıklayalım :

  • ENGINE : Herhangi bir veritabanı sistemini kullanacaksanız burada belirtmeniz gerekiyor. Örneğin  : Postgresql_psycopg2,mysql,sqlite3,oracle gibi veriler yazılabilir. Burada ön tanımlı olarak “django.db.backends.sqlite3” yazan Sqlite3 sistemi olduğunu belirtmektedir.
  • NAME : Bağlantı kurulacak veritabanı ismi yazılır. Önemli bir nokta konum belirtilerek isim yazılmalıdır. “os.path.join(BASE_DIR, ‘db.sqlite3’)” şu yapı ana dizindeki db.sqlite3 verisi olduğunu belirtmektedir.
  • USER : Veritabanı kullanıcı adı var ise yazılacak bölümdür.
  • PASSWORD : Veritabanı şifresi var ise yazılacak bölümdür.
  • HOST : Eğer veritabanı farklı bi yerde barınıyorsa, ip bilgisi yazılır.
  • PORT :  Farklı port üzerinde çalışalacaksa port bilgisi yazılır. Eğer port bilgisi yazılmazsa standart :8080 üzerinden çalışır.

 

İLK Django Modelimiz 

Django’nun güzel özelliklerinden biri model özelliğidir. Burada veritabanı bilgilerini belirtiyoruz django otomatik tablo ve sütünlarını kuruyor ve kullanıma hazır hale getiriyor.

Şimdi Models.py’i dosyasını açalım :

Bir fonksiyon oluşturalım.

Burada adi,soyadi veritabanı sütunlarımızdır. SQL bilgilerinizdende bilirsiniz yapı benzer göstermektedir.

  • adi sütünü max 50 karakter veri alabilir.
  • soyadi sütünü max 50 karakter veri alabilir şeklinde olduğunu belirtiyoruz.

Şimdi veritabanı sorgulama işlemi yaptığımızda verileri okumak için bir fonksiyon yazmamız gerekiyor :

 

  • Burada fonksiyon çalıştığında bu bölümde çalışacaktır. Veri okunmak istediğinde “ad” bilgisini verecektır.

Models.py şu şekilde olacaktır :

 

Şuanda veritabanımızı yazdık ;

veritabanı adı : ogrenciler sütün değerleri ise adi,soyadi olarak belirledik şimdi Django bizim için bunları kurmasını isteyeceğiz :

İlk olarak aşşağıdaki kodu girelim : Kurulacak veritabanlarını seçer.
python manage.py makemigrations
Daha Sonra aşşağıdaki komutu girelim : Buda seçilen veritabanlarını oluşturur.
python manage.py migrate
Verilerimiz kuruldu.

Django Model kullanarak veritabanı kurulumunu gördük. Bir sonraki makalede Şablon içerisinde kullanacağız. Umarım faydalı olmuştur 🙂

Django Kullanıcıları Yasaklama – DjangoBan

Django’da kayıtlı kullanıcıları yasaklamak için DjangoBan paketini kullanabiliriz.

Uyumluluk

  • Django 1.9+
  • Python 3.x +

Kurulum

Ayarlar

  • Django settings.py girip, INSTALLED_APPS bölümüden ban app’ını ekleyin.

  • Django settings.py girip Middleware  bölümüne ban.middleware.BanManagement katmanını ekleyin.

  • Database İşlemleri

Örnek Banlanmış Kullanıcı

Kullanımı

Admin panel üzerinden, basit şekilde kullanıcıyı yasaklayabilirsiniz.



Django Ban – Template

Template sayfasını özelleştirmek için, uygulamanızının templates klasörüne “ban.html” oluşturup değişiklik yapar iseniz o değişiklik yansıyacaktır.

Django Hızlı ve Basit Site Yayınlama – Djeasy

Django framework ile geliştirilmiş bir web siteyi yayınlamaya kalktığımızda, bir çok teknoloji ile karşılaşiyoruz örneğin;

  • Nginx
  • Gunicorn
  • Uwsgi
  • Supervisor
  • Apache

Bu şekilde devam ediyor ve uygun teknoloji seçip gerekli kurulumları yaparken, baya bir cebelleşiyoruz 🙂  , el pratiği olan biri için bile django site yayınlama süresi en az 30dk diyebilirim. Bu soruna çözüm bulmak adına Djeasy adlı paketi geliştirmeye başladım ve gerçekten iyi konuma geldi.

Kısaca;

Nginx ve Gunicorn kullanarak, django sitenizi 2-3dk içerisinde ayağa kaldırmaktadır. Nginx için gerekli css,js vb. sıkıştırma ayarlarından gerekli optimize ayarlarınızda standart olarak eklemektedir. Gunicorn içinde gerekli işçi ayarlamalarını standart olarak ayarlamaktadır.

Paket Uyumlulukları

  • Django 1.8+
  • Python 3.x +
  • Debian Türevleri : Ubuntu vb.

Kurulum

Ayarlar

Djeasy paketin doğru çalışması için, belli başlı şartlar bulunmaktadır. Bunları listeleyelim;

  • Proje klasörü içerisinde requirements.txt adlı belge kesinlikle olmadır. Hangi modülleri hangi paketleri kullandıysanız, kesinlikle yazın djeasy otomatik olarak kurmaktadır. Örnek : requirements.txt
  • Django settings.py içerisindeki “ALLOWED_HOSTS = []” içerisinde ip veya domain adresini yazmayı unutmayın.

Yukarıda yazdığım, iki adet şart düzgün şekilde uyar iseniz çok hızlı şekilde sonuç alabilirsiniz.

Kullanımı

Terminal üzerinden, kullanım örneklerine bakalım.

Komutu girdikten sonra, paket hakkında bilgi mesajları gelmektedir.

  • –create : site kurma komutu
  • –nginx :  nginx resetleme komutu
  • project_name –gunicorn : gunicorn resetler.

Site Yayınlama Adımları

1-) Virtualenv Kurulumu

2-) Uygulamanızı Yükleyin

Örnek olarak, kendi blogumu yükleyeceğim.

3-) Djeasy ile Kurma

Komutuyla, siteyi 4 adımda kurabiliriz.

  • server ip or domain : bölümüden server bilgilerini yazabilirsiniz. Eğer çoklu site bilgisi gireceksiniz boşluk bırakın. Örneğin : python.tc www.python.tc blog.python.tc
  • STATIC_URL : Django settings.py’da bulunan STATIC_URL değişkenine yazdığınız değeri yazın.
  • Nginx File : Kuracağınız site için bir nginx dosya adı belirleyin.
  • Virtuale File path : Virtualenv Dosya konumu yazın.
  • Project File path : Django projenizin yolunu yazın.

Birden Fazla Site Kurma

Eğer birden fazla site kurmak istiyorsanız. Yani farklı domainlerde farklı projeleri çalıştırmak istiyorsanız. Bu paket yine aynı yöntemlerle işini görecektir. Fakat diğer sitede kullandığınız gunicorn ve nginx dosya adları ile farklı kullanmayı unutmayın!

Aşşağıdaki resim gibi, bir sonuç aldıysanız kurulum sorunsuz tamamlanmıştır.

İşte Bukadar!

Diğer Özellikleri

Herhangi bir konumdan, projeniz için;

  • –nginx
  • project_name –gunicorn

Komutlarını djeasy ile uygulayabilirsiniz.

Database

 

Djeasy bir database için destek vermemektedir. Çünkü database alternatifleri çok olduğu için, sqlite dışında database kullanmak istiyorsanız kendiniz kurup gerekli ayarlamaları yapmanız gerekiyor.

Örneğin PostgreSQL için ; https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04#create-the-postgresql-database-and-user

 


Djeasy kaynak kodları : Djeasy

Umarım, faydalı olmuştur 🙂