Firebase Veri Güvenliği Nasıl Sağlanır? (Security & Rules)

Merhabalar..
Biliyorsunuz ki bir Firebase furyasına kapıldık gidiyoruz..
Her makalede Firebase ile ilgili birşeyler anlattığım bu dönemde yine geleneği bozmayacağım, yine sizi şaşırtmayacağım..

Bu makalede sık sık karşımıza çıkan Security & Rules yani Firebase‘de veri güvenliğini sağlamak için bilmemiz gereken kodlar hakkında bilgiler vererek, Firebase ile Veri Güvenliği konusunu anlamaya çalışacağız.

Bu konunun; mobil uygulama geliştiren arkadaşların yanı sıra, web uygulamalarında Firebase kullanan arkadaşlar için de yararı olacağını düşünüyorum.
Neyse.. Sadede geleyim.

Firebase veri tabanına (Firebase Realtime Database) kaydedilen bilgilerin güvenliği Security & Rules adı verilen, kullanımı programlama dillerine benzeyen bir kural yapısı ile sağlanmaktadır.
Bu kurallar sayesinde veri tabanı erişim seviyelerini düzenleyerek güvenliği sağlayabilmenin yanı sıra; verilerin belli kriterlere göre veri tabanına yazılabilmesi de sağlanabilir. Bu cümle biraz anlaşılmaz gibi gelmiş olabilir ama makalenin sonunda ne demek istediğimi anlamış olacağınızı düşünüyorum 🙂

Firebase veri tabanı güvenliğini sağlayan güvenlik kurallarının genel yapısından biraz söz edelim..
JavaScript benzeri bir syntax yapısına sahip bir programlama diline benzemektedir.
Güvenlik kuralları “rules” : { … } kod bloğu içerisinde tanımlanmaktadır.

Bu kurala göre veri tabanındaki bilgiler herkes tarafından okunabilir, fakat admin dışında hiç kimse veri tabanına yazı yazamaz..

Admin yetkisine sahip kullanıcılar veri tabanı üzerinde sınırsız yetkiye sahiptirler.

Şimdi bu kuralı boş bir Firebase Uygulamasına ekleyip deneyelim..

firebase security rules 1

Uygulamanın Database kısmına geldiğimizde DATA ve RULES sekmelerinin olduğunu göreceksiniz.
DATA kısmında veri tabanında saklanan veriler gösterilmektedir. (Gördüğünüz üzere şuan veri tabanımız boş.)
RULES kısmında ise veri tabanının güvenlik kuralları yer almaktadır.

firebase security rules 2

RULES sekmesine tıkladığımızda default olarak bir takım kuralların hazır olarak yazılmış olduğunu göreceksiniz. Biz bu kuralları silip, yerine yukarıda örnek olarak verdiğim kuralları yazıyoruz.

RULES kısmında her hangi bir değişiklik yapıldığında PUBLISH ve DISCARD butonlarının yukarıda çıktığını göreceksiniz. Kodların tamamını yazdıktan sonra kuralların uygulanabilmesi için PUBLISH butonuna tıklıyoruz.

Sağ üst köşede “Rules Published” yazısını gördükten sonra kuralların uygulanıp uygulanmadığını test etmek için SIMULATOR butonuna tıklayarak Firebase‘in bize sunmuş olduğu Simulator‘u açıyoruz.

firebase security rules 3

Sağ tarafta açılan Simulator ekranında “Read” kısmını seçip “RUN” butonuna bastığımızda “Simulated read allowed” yazısının çıktığını göreceksiniz. Bu yazı; yetkilendirme yapılmadan (Authenticated kısmının kapalı olduğunu görüyorsunuz.) simule edilen bir okuma isteğinin veri tabanı tarafından kabul edildiğini göstermektedir.

Yazdığımız kurala tekrar göz atacak olursak;
“rules”: { … } kod bloğunun içine yazmış olduğumuz “.read” kuralı, veri tabanındaki bilgilerin okunabilmesi ile ilgili sınırlandırmaların belirlendiği kuraldır.
Biz burada “.read”: true yaparak veri tabanındaki verilerin herkes tarafından okunabileceğini belirtiyoruz. Yani şuan Firebase uygulamamızın URL adresini bilen bir kişi, çeşitli yöntemler kullanarak veri tabanımızdaki bilgileri okuyabilir.. Bu yüzden Firebase Uygulamamızın URL adresini başkalarıyla paylaşmamanız güvenlik açısından yararınıza olacaktır.. 

Firebase uygulamanızın URL adresini Database kısmına geldiğinizde üst kısımda göreceksiniz.
Benim sizlere güvenim sonsuz olduğu için bu örnek uygulamanın URL adresini saklama gereksinimi duymadım 🙂
Adresi ilk resimde görebilirsiniz.. (https://project-1554142704628126920.firebaseio.com/)

Simulator kullanarak veri okumaya işleminden sonra, şimdi de veri tabanına yazma işlemini deneyelim..

firebase security rules 4

Simulator‘u tekrar açıp “Write” seçeneğini seçtikten sonra Data (JSON) kısımına örnek bir JSON verisi yazıp “RUN” butonuna basıyoruz.

Butona bastıktan sonra üst kısımda “Simulated write denied” uyarısını almaktayız. Bu uyarı; yetkilendirmesiz simule edilen bu yazma isteğinin reddedildiği anlamına gelmektedir. Yani gönderdiğimiz JSON verisi veri tabanına yazılmamaktadır. Eğer her hangi bir mobil veya web uygulamasında bu işlemi deneseydik uygulama hata verecek ve işlem iptal olacaktı.

“.write” kuralından biraz bahsedecek olursak;
Bu kural, veri tabanına her hangi bir veri yazma işleminin güvenlik ile ilgili düzenlemelerinin yapıldığı kuradır..
Burada “.write”: false yazarak veri tabanına yapılacak olan yazma isteklerini engellemiş oluyoruz.

Bu engelleme işlemi admin yetkisine sahip olanları kapsamamaktadır. Firebase sistemi üzerinde adminler sınırsız yetkiye sahip oldukları için şu an veri tabanına sadece admin yetkisine sahip kullanıcılar veri yazabilmektedirler.

Bu kuralları bütün bir veri tabanı için tanımlayabildiğimiz gibi her bir child için de ayrı ayrı tanımlayabiliriz.

Hemen bir örnek yapalım..

“deneme 1” ve “deneme 2” olmak üzere 2 tane child olsun..

firebase security rules 5

“deneme 1” ; herkes tarafından okunabilsin fakat kimse tarafından değiştirilemesin.
“deneme 2” ise herkes tarafından değiştirilebilsin fakat kimse tarafından okunamasın..

Kuralları yukarıdaki gibi düzenledikten sonra Simulator üzerinden yazma ve okuma denemeleri yapıp sonuçlarına bakalım :

firebase security 6

firebase security 7

firebase security 8

firebase security 9

Buraya kadar ki kısımda örneklerimizi herhangi bir yetkilendirme olmama koşuluna göre hazırladık. Yani herhangi bir koşul göz önünde bulundurmadık.

Peki veri tabanının belirli bölümüne sadece belirli kişilerin erişebilmesini nasıl sağlarız? Yani verilere belirli koşullara göre erişip erişememe durumunu nasıl sağlarız, biraz bundan bahsedelim..

Öncelikle Firebase üzerindeki veri tabanı güvenliğini en iyi şekilde sağlayabilmek için; Firebase Yetkilendirme Mekanizmasını (FirebaseAuth) iyice anlamış olmamız gerekmektedir.

Önceki makalelerde de yüzeysel olarak anlatmıştım. Firebase platformunda 2 çeşit yetki seviyesi bulunmaktadır:

  1. Admin Seviyesinde Yetkilendirme :

    • Veri tabanına bağlanan birinin admin yetkisine erişebilmesi için Custom Auth yöntemini kullanarak sistem tarafından oluşturulan Auth Token (Yetki Anahtarı) kelimesini girmelidir. Bu anahtar kelimeler Google API Manager sayfasında yer alan Credentials bölümünden oluşturulabilir ve alınabilir. (Ayrıntılı bilgi için : https://firebase.google.com/docs/auth/android/custom-auth)
    • Sizinde tahmin edeceğiniz üzere admin seviyesindeki kişiler veri tabanı üzerinde sınırsız yetkiye sahiptirler..
  2. Kullanıcı Seviyesinde Yetkilendirme :

    • Admin dışında veri tabanına yetki sahibi diğer grup ise kullanıcılardır. Kullanıcı yetkisine erişebilmek için çeşitli yöntemler kullanılır. Bunlar :
      • Email ve Şifre ile yetkilendirme
      • Sosyal Medya Hesapları ile yetkilendirme (Google, Facebook, Twitter ve Github)
      • Misafir Kullanıcı olarak yetkilendirme
    • Yukarıdaki yöntemler Firebase Console üzerindeki Auth kısmından kontrol edilmektedir.

      firebase auth-1

      firebase auth-2
    • Kullanıcıların yetkileri adminlere göre daha sınırlıdır ve bu sınırlar Security & Rules kuralları ile belirlenmektedir.

Veri tabanına bağlanan admin ve kullanıcılara sistem tarafından farklı bir uid (Unique ID) atanır. Bu uid değeri; bağlanan kişilere özgü bir ID değeridir. Yani Firebase, sisteme bağlanan herkesi bu uid değerinden tanır.

firebase auth-3

“ADD USER” butonunu kullanarak eklenen örnek bir kullanıcının UID değeri.

Şimdi örneklerle bu anlattıklarımızın nasıl kullanıldığına bir bakalım:

Firebase Rules içerisinde kullanılan “auth” anahtarı yetkilendirme ile işlemleri sorgularken kullanılmaktadır.

Veri tabanına bağlanan bir kişi her hangi bir yöntem ile yetkilendirilmemiş ise “auth” anahtarının değeri “null” olacaktır. Yani veri tabanına bağlanan herkes için “auth” anahtarı başlangıçta “null” değerindedir.  Eğer bağlanan kişi, kullanıcı yada admin seviyesine yetkilendirilirse “auth” değeri değişecektir.
Sonuç itibarıyla;

kuralı bize; deneme 1 içindeki verilerin sadece yetkilendirilmiş kişiler (kullanıcı yada admin) tarafından okunabileceğini, yetkisiz bağlantı yapanların bu verileri okuyamayacağını belirtmektedir.

Az önce sizlere Firebase sisteminin; yetkilendirilen herkesi bir uid değeri ile tanıdığından bahsetmiştim. Buradaki “auth.uid” anahtarı bize yetkilendirilmiş bağlantının uid değerini vermektedir.

Bu kurala göre deneme 1 içerisine sadece belirtilen uid değerine sahip kullanıcı  (ve ayrıca admin yetkisine sahip olanlar..) veri yazabilmektedir.

Sizlerin de bildiği gibi kullanıcı yetkilendirmesi yaparken; Email ve Şifre ile yetkilendirme, Sosyal Medya Hesabı ile yetkilendirme ve Misafir Kullanıcı girişi gibi çeşitli yöntemlerin olduğunu söylemiştik.
Peki Firebase içerisinde kullanılabilen bu yöntemleri nasıl ayırt edeceğiz?
Veri tabanımıza sadece belirli yöntemleri kullanan kişilerin erişimini sağlamak mümkün müdür?

Cevap : Evet mümkündür.. Firebase veri tabanımız, sistem içerisinde Türkçe’de “sağlayıcı,sağlayan” anlamındaki provider isimli anahtar sayesinde; bağlanan kullanıcının hangi yöntemi kullandığını tespit etmemize olanak sağlamaktadır.

Bu kurala göre deneme 2 içerisindeki veriler, sadece Google Hesabı ile yetkilendirilen kullanıcılar (ve admin yetkisine sahip olanlar) tarafından okunabilecektir.

Diğer yetkilendirme yöntemleri ve provider değerleri şu şekildedir :

  • Email ve Şifre ile yetkilendirme : ‘password’
  • Google hesabıyla yetkilendirme : ‘google’
  • Facebook hesabıyla yetkilendirme : ‘facebook’
  • Twitter hesabıyla yetkilendirme : ‘twitter’
  • Github hesabıyla yetkilendirme : ‘github’
  • Misafir kullanıcı girişi : ‘anonymous’

ÖNEMLİ NOT : Kullanıcı yetkilendirme yöntemlerini kullanmadan önce kullanılacak yöntemi Firebase Console üzerinde Auth bölümündeki SIGN-IN METHOD sekmesine gelerek aktif etmeniz gerekmektedir.

Kullanıcıların yetkilendirilme yöntemlerini, ve Firebase sisteminin yetkilendirilen kullanıcıları ne şekilde tanımladığını açıklığa kavuşturduğumuza göre; admin yetkisine sahip olanların nasıl tanındığını ve nasıl ayırt edildiğini de hemen açıklayalım.

Sizinde gördüğünüz gibi tüm yetki değerleri aslında “auth” anahtarı altında toplanmaktadır. “auth.provider” anahtarı bize kullanıcıların hangi yöntemle yetkilendirildiğini değer olarak vermekteydi.
Veri tabanına bağlanıp yetki alan birinin admin yetkisine sahip olup olmadığını da yine benzer yöntem ile “isAdmin” anahtarını kullanarak öğrenebiliriz.

Eğer veri tabanına bağlanan kişi yetki almışsa “auth” anahtarının değeri değişecek ve null‘dan farklı bir değer olacağını biliyoruz. Bunun yanı sıra, bağlanan kişi admin yetkisine sahip ise “isAdmin” anahtarının değeri de true olarak değişecektir. (admin yetkisine sahip değilse bu değer false olur.)

Bu kurala göre deneme 2 içerisine sadece admin yetkisine sahip olanların veri yazabilmesine olanak sağlanmaktadır.

Son olarak hasEmergencyTowel anahtarından bahsetmek istiyorum. (Belki bir çoğumuz bu anahtarı asla kullanmayacak ama yinede burada dursun belki işinize yarar.)

Auth Token kullanarak admin yetkisine erişebildiğimizden bahsetmiştik. Bu Auth Token‘lar Google Console üzerinde oluşturulup kullanılabilmekteydi.
Google Console üzerindeki Token‘lara ek olarak bazı kütüphaneler aracılığıyla kendi Custom Token‘larımızı da oluşturup sistem üzerinde admin yetkisine erişebilmemiz mümkündür. Şuan anlattıklarımız dışında olduğundan Custom Token‘ların nasıl oluşturulduğu konusuna deyinmeyeceğim. (Custom Token oluşturmak hakkında detaylı bilgi edinmek isteyenler için : https://firebase.google.com/docs/auth/server/create-custom-tokens)

Sistemde admin yetkisine sahip olan birinin Custom Tokens kullanarak admin yetkisi alıp almadığını öğrenmek için hasEmergencyTowel anahtarı kullanılır.

Bu kurala göre deneme 3 içerisindeki veriler sadece Custom Tokens kullanan kişiler tarafından okunabilmektedir.

Vee böylelikle bir makalenin daha sonuna gelmiş bulunuyoruz.. 🙂
Firebase kurallarının sadece Realtime Database (Gerçek Zamanlı Veri Tabanı) kısmının güvenliği ile ilgili kuralları sizlere anlatmaya çalıştım.

Eğer faydalı olabildiysem siteye abone olabilirsiniz.. Hatta daha abartıp sosyal medya üzerinde makaleyi paylaşacak işi dahada sapkın bir boyuta taşıyabilirsiniz 🙂 Size bırakıyorum..

Hoşçakalın.. 😉

 

You may also like...

Bir Cevap Yazın