Firebase Güvenlik Kurallarını yönetin ve dağıtın

Firebase, Kurallarınızı yönetmeniz için her biri özel durumlarda faydalı olacak ve her biri aynı arka uç Firebase Security Rules management API'yi kullanan çeşitli araçlar sunar.

API'yi çağırmak için hangi araç kullanılırsa kullanılsın, management API aşağıdakileri sağlar:

  • Kural kaynağı alıp kullanır: Kurallar kümesi, genellikle Firebase Güvenlik Kuralları ifadeleri içeren bir kod dosyasıdır.
  • Beslenen kaynağı sabit bir kural kümesi olarak depolar.
  • Bir sürümde her kural kümesinin dağıtımını izler. Firebase Güvenlik Kurallarının etkin olduğu hizmetler, her isteği güvenli bir kaynak için değerlendirmek amacıyla proje sürümünü arar.
  • Kural kümesinin söz dizimsel ve semantik testlerini çalıştırma olanağı sağlar.

Firebase CLI'yı kullanma

Firebase CLI ile yerel kaynaklar yükleyebilir ve sürümleri dağıtabilirsiniz. CLI'ın Firebase Local Emulator Suite ürünü, kaynakların tam yerel testini yapmanızı sağlar.

KSA kullanmak, kurallarınızı uygulama kodunuzla sürüm kontrolü altında tutmanıza ve kuralları mevcut dağıtım sürecinizin bir parçası olarak dağıtmanıza olanak tanır.

Yapılandırma dosyası oluşturma

Firebase projenizi Firebase CLI kullanarak yapılandırdığınızda proje dizininizde bir .rules yapılandırma dosyası oluşturursunuz. Firebase projenizi yapılandırmaya başlamak için aşağıdaki komutu kullanın:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Realtime Database

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Cloud Storage

// Set up Storage in your project directory, creates a .rules file
firebase init storage

Kurallarınızı düzenleme ve güncelleme

Kural kaynağınızı doğrudan .rules yapılandırma dosyasında düzenleyin.

Firebase CLI'da yaptığınız tüm düzenlemelerin Firebase konsoluna yansıtıldığından veya Firebase konsolunu veya Firebase CLI'yı kullanarak tutarlı şekilde güncelleme yaptığınızdan emin olun. Aksi takdirde, Firebase konsolunda yapılan güncellemelerin üzerine yazabilirsiniz.

Güncellemelerinizi test etme

Local Emulator Suite, Güvenlik Kuralları'nın etkinleştirildiği tüm ürünler için emülatörler sağlar. Her bir emülatörün Güvenlik Kuralları motoru, kuralların hem söz dizimsel hem de anlamsal değerlendirmelerini gerçekleştirir, böylece Security Rules management API'sinin sunduğu söz dizimi testini aşar.

CLI ile çalışıyorsanız Suite, Firebase Güvenlik Kuralları testi için mükemmel bir araçtır. Güncellemelerinizi yerel olarak test etmek ve uygulamanızın Kurallarının istediğiniz davranışı sergilediğini onaylamak için Local Emulator Suite'i kullanın.

Güncellemelerinizi dağıtma

Kurallarınızı güncelleyip test ettikten sonra kaynakları üretime dağıtın.

Cloud Firestore Güvenlik Kuralları için firebase.json dosyanızı inceleyip güncelleyerek .rules dosyalarını varsayılan ve ek adlandırılmış veritabanlarınızla ilişkilendirin.

Kurallarınızı tek başına seçerek dağıtmak için aşağıdaki komutları kullanın veya kuralları normal dağıtım sürecinizin bir parçası olarak dağıtın.

Cloud Firestore

// Deploy rules for all databases configured in your firebase.json
firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>

Realtime Database

// Deploy your .rules file
firebase deploy --only database

Cloud Storage

// Deploy your .rules file
firebase deploy --only storage

Firebase konsolunu kullanma

Ayrıca Kural kaynaklarını düzenleyip Firebase konsolundan sürümler olarak dağıtabilirsiniz. Sözdizimsel test, Firebase konsolu kullanıcı arayüzünde düzenleme yaparken gerçekleştirilir ve anlamsal test, Kurallar Playground kullanılarak yapılabilir.

Kurallarınızı düzenleme ve güncelleme

  1. Firebase konsolunu açın ve projenizi seçin.
  2. Ardından ürün gezinme menüsünden Realtime Database, Cloud Firestore veya Storage'ı seçin. Ardından, Kural düzenleyiciye gitmek için Kurallar'ı tıklayın.
  3. Kurallarınızı doğrudan düzenleyicide düzenleyin.

Güncellemelerinizi test etme

Anlamsal Kural davranışını, düzenleyici kullanıcı arayüzünde test etmenin yanı sıra doğrudan Firebase konsolunda Rules Playground'u kullanarak projenizin veritabanını ve depolama kaynaklarını kullanarak test edebilirsiniz. Kural düzenleyicide Kurallar Playground ekranını açın, ayarları değiştirin ve Çalıştır'ı tıklayın. Düzenleyicinin üst kısmında onay mesajını bulun.

Güncellemelerinizi dağıtma

Güncellemelerinizin beklediğiniz gibi olduğundan emin olduğunuzda Yayınla'yı tıklayın.

Yönetici SDK'sını kullanma

Node.js kuralları için Yönetici SDK'sını kullanabilirsiniz. Bu programatik erişimle şunları yapabilirsiniz:

  • Kuralları yönetmek için özel araçlar, komut dosyaları, kontrol panelleri ve CI/CD ardışık düzenleri uygulayın.
  • Birden çok Firebase projesinde kuralları daha kolay bir şekilde yönetin.

Kuralları programatik olarak güncellerken uygulamanızın erişim denetiminde istenmeyen değişiklikler yapmaktan kaçınmak çok önemlidir. Özellikle kuralları güncellerken veya dağıtırken Yönetici SDK'si kodunuzu güvenliği aklınızda bulundurarak yazın.

Unutulmaması gereken bir diğer önemli nokta da Firebase Güvenlik Kuralları sürümlerinin tam olarak yayılmasının birkaç dakika sürmesidir. Kuralları dağıtmak için Yönetici SDK'sını kullanırken, uygulamanızın dağıtımı henüz tamamlanmamış kurallara hemen dayandığı yarış koşullarından kaçındığınızdan emin olun. Kullanım alanınız, kontrol kurallarına erişmek için sık sık güncelleme yapılmasını gerektiriyorsa Cloud Firestore'u kullanarak çözümleri değerlendirin. Cloud Firestore, sık güncellemelere rağmen yarış koşullarını azaltmak için tasarlanmıştır.

Ayrıca şu sınırları da göz önünde bulundurun:

  • Kurallar serileştirildiğinde 256 KiB UTF-8 kodlanmış metinden küçük olmalıdır.
  • Bir projede toplamda en fazla 2.500 dağıtılmış kural kümesi olabilir. Bu sınıra ulaşıldığında, yeni kural kümeleri oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.

Cloud Storage veya Cloud Firestore kural kümelerini oluşturma ve dağıtma

Güvenlik kurallarını Admin SDK ile yönetmeye yönelik tipik bir iş akışı üç ayrı adım içerebilir:

  1. Kural dosyası kaynağı oluşturma (isteğe bağlı)
  2. Kural kümesi oluşturma
  3. Yeni kural kümesini serbest bırakın veya dağıtın

SDK, bu adımların Cloud Storage ve Cloud Firestore güvenlik kuralları için tek bir API çağrısında birleştirilmesini sağlayan bir yöntem sunar. Örnek:

    const source = `service cloud.firestore {
      match /databases/{database}/documents {
        match /carts/{cartID} {
          allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
          allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
        }
      }
    }`;
    // Alternatively, load rules from a file
    // const fs = require('fs');
    // const source = fs.readFileSync('path/to/firestore.rules', 'utf8');

    await admin.securityRules().releaseFirestoreRulesetFromSource(source);

Aynı kalıp, releaseFirestoreRulesetFromSource() ile Cloud Storage kuralları için de çalışır.

Alternatif olarak, kurallar dosyasını bellek içi nesne olarak oluşturabilir, kural kümesini oluşturabilir ve bu etkinliklerin daha yakın kontrolü için kural kümesini ayrı olarak dağıtabilirsiniz. Örnek:

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

Realtime Database kural kümelerini güncelleme

Realtime Database kural kümelerini Yönetici SDK'si ile güncellemek için admin.database kapsamındaki getRules() ve setRules() yöntemlerini kullanın. Kural kümelerini JSON biçiminde veya yorum eklenmiş bir dize olarak alabilirsiniz.

Bir kural kümesini güncellemek için:

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score",
          "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

Kural kümelerini yönet

Yönetici SDK'si, büyük kural kümelerini yönetebilmeniz için mevcut tüm kuralları admin.securityRules().listRulesetMetadata ile listelemenize olanak tanır. Örnek:

    const allRulesets = [];
    let pageToken = null;
    while (true) {
      const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
      allRulesets.push(...result.rulesets);
      pageToken = result.nextPageToken;
      if (!pageToken) {
        break;
      }
    }

Zaman içinde 2.500 kural kümesi sınırına ulaşan çok büyük dağıtımlar için sabit bir zaman döngüsündeki en eski kuralları silmek üzere mantık oluşturabilirsiniz. Örneğin, 30 günden daha uzun süre dağıtılmış tüm kural kümelerini silmek için:

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.createTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);

REST API'yi kullanma

Yukarıda açıklanan araçlar, projenizdeki birden fazla Cloud Firestore veritabanı için Firebase Güvenlik Kuralları yönetimi de dahil olmak üzere çeşitli iş akışları için uygundur. Ancak Firebase Güvenlik Kurallarını, management API'nin kendisini kullanarak yönetmek ve dağıtmak isteyebilirsiniz. Management API size en yüksek esnekliği sunar.

Ayrıca şu sınırları da göz önünde bulundurun:

  • Kurallar serileştirildiğinde 256 KiB UTF-8 kodlanmış metinden küçük olmalıdır.
  • Bir projede toplamda en fazla 2.500 dağıtılmış kural kümesi olabilir. Bu sınıra ulaşıldığında, yeni kural kümeleri oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.

REST ile Cloud Firestore veya Cloud Storage kural kümeleri oluşturma ve dağıtma

Bu bölümdeki örnekler, Cloud Storage Kuralları için de geçerli olsa da Firestore Kurallarını kullanır.

Örneklerde, API çağrıları yapmak için cURL de kullanılmıştır. Kimlik doğrulama jetonları oluşturma ve iletme adımları atlanır. Referans belgeleriyle entegre edilmiş API Explorer'ı kullanarak bu API ile denemeler yapabilirsiniz.

Yönetim API'sini kullanarak kural kümesi oluşturmaya ve dağıtmaya ilişkin tipik adımlar şunlardır:

  1. Kural dosyası kaynakları oluşturma
  2. Kural kümesi oluşturma
  3. Yeni kural kümesini serbest bırakın (dağıtın).

Kaynak oluştur

secure_commerce Firebase projeniz üzerinde çalıştığınızı ve kilitli Cloud Firestore Kurallarını east_store adlı projenizdeki bir veritabanına dağıtmak istediğinizi varsayalım.

Bu kuralları bir firestore.rules dosyasında uygulayabilirsiniz.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Kural kümesi oluşturma

Şimdi de bu dosya için base64 kodlu bir parmak izi oluşturun. Daha sonra projects.rulesets.create REST çağrısıyla kural kümesi oluşturmak için gereken yükü doldurmak üzere bu dosyadaki kaynağı kullanabilirsiniz. Burada, firestore.rules içeriğini REST yüküne eklemek için cat komutunu kullanın.

İzlemek için, bunu east_store veritabanınızla ilişkilendirmek üzere attachment_point özelliğini east_store olarak ayarlayın.

curl -X POST -d '{
  "source": {
    "files": [
      {
        "content": "' $(cat storage.rules) '",
        "name": "firestore.rules",
        "fingerprint": <sha fingerprint>
      },
    "attachment_point": "firestore.googleapis.com/databases/east_store"
    ]
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

API, bir doğrulama yanıtı ve bir kural grubu adı döndürür (örneğin, projects/secure_commerce/rulesets/uuid123).

Kural kümesi serbest bırakma (dağıtma)

Kural kümesi geçerliyse son adım, yeni kural kümesini adlandırılmış bir sürümde dağıtmaktır.

curl -X POST -d '{
  "name": "projects/secure_commerce/releases/cloud.firestore/east_store"  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

Firebase Güvenlik Kuralları sürümlerinin tam olarak yayılmasının birkaç dakika sürdüğünü unutmayın. Dağıtım için yönetim REST API'sini kullanırken, uygulamanızın dağıtımı henüz tamamlanmamış kurallara hemen dayandığı yarış koşullarından kaçındığınızdan emin olun.

Realtime Database kural kümelerini REST ile güncelleme

Realtime Database, kuralları yönetmek için kendi REST arayüzünü sunar. REST üzerinden Firebase Realtime Database Kurallarını Yönetme bölümünü inceleyin.

REST ile kural kümelerini yönetme

Kural kümeleri ve sürümleri oluşturmak için kullanılan REST yönteminin yanı sıra, büyük kural dağıtımlarının yönetilmesine yardımcı olmak amacıyla Management API'si şunları yapmak için yöntemler sunar:

  • kuralları listeleme, alma ve silme
  • kuralları sürümleri listeleme, alma ve silme

Zaman içinde 2.500 kural kümesi sınırına ulaşan çok büyük dağıtımlar için sabit bir zaman döngüsündeki en eski kuralları silmek üzere mantık oluşturabilirsiniz. Örneğin, 30 günden uzun süredir dağıtılan tüm kural kümelerini silmek için projects.rulesets.list yöntemini, createTime anahtarlarında Ruleset nesnelerinin JSON listesini ayrıştırabilir ve ardından ruleset_id tarihine kadar karşılık gelen kural kümelerinde project.rulesets.delete yöntemini çağırabilirsiniz.

Güncellemelerinizi REST ile test etme

Son olarak management API sayesinde üretim projelerinizde Cloud Firestore ve Cloud Storage kaynaklarında söz dizimsel ve semantik testler yapabilirsiniz.

API'nin bu bileşeniyle yapılan testler şunlardan oluşur:

  1. TestCase nesne grubunu temsil edecek bir TestSuite JSON nesnesi tanımlama
  2. TestSuite gönderiliyor
  3. Ayrıştırılması TestResult nesne döndürüldü

testcase.json dosyasında tek bir TestCase bulunan TestSuite nesnesi tanımlayalım. Bu örnekte, Kurallar dili kaynağını REST yüküyle birlikte, bu kurallar üzerinde çalışacak test paketiyle birlikte satır içinde iletiyoruz. Bir Kural değerlendirme beklentisi ve kural grubunun test edileceği istemci isteğini belirtiriz. Ayrıca, istekle eşleşmeyen ifadeler de dahil olmak üzere, rapora dahil edilmesi gereken tüm Kurallar dil ifadelerinin sonuçlarını belirtmek için "TAM" değerini kullanarak test raporunun ne kadar tamamlandığını belirtebilirsiniz.

 {
  "source":
  {
    "files":
    [
      {
        "name": "firestore.rules",
        "content": "service cloud.firestore {
          match /databases/{database}/documents {
            match /users/{userId}{
              allow read: if (request.auth.uid == userId);
            }
            function doc(subpath) {
              return get(/databases/$(database)/documents/$(subpath)).data;
            }
            function isAccountOwner(accountId) {
              return request.auth.uid == accountId 
                  || doc(/users/$(request.auth.uid)).accountId == accountId;
            }
            match /licenses/{accountId} {
              allow read: if isAccountOwner(accountId);
            }
          }
        }"
      }
    ]
  },
  "testSuite":
  {
    "testCases":
    [
      {
        "expectation": "ALLOW",
        "request": {
           "auth": {"uid": "123"},
           "path": "/databases/(default)/documents/licenses/abcd",
           "method": "get"},
        "functionMocks": [
            {
            "function": "get",
            "args": [{"exact_value": "/databases/(default)/documents/users/123"}],
            "result": {"value": {"data": {"accountId": "abcd"}}}
            }
          ]
      }
    ]
  }
}

Daha sonra bu TestSuite öğesini, projects.test yöntemiyle değerlendirilmesi için gönderebiliriz.

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

Döndürülen TestReport (test BAŞARI/HATA durumu, hata ayıklama mesajlarının listeleri, ziyaret edilen kural ifadelerinin listeleri ve bunların değerlendirme raporlarını içerir) erişime düzgün şekilde izin verildiğini BAŞARILI durumuyla onaylar.

Hizmetler arası Cloud Storage Güvenlik Kuralları için izinleri yönetme

Güvenlik koşullarını değerlendirmek için Cloud Firestore belge içeriklerini kullanan Cloud Storage Güvenlik Kuralları oluşturursanız Firebase konsolunda veya Firebase CLI'da iki ürünü bağlamak için izinleri etkinleştirmeniz istenir.

Bu tür hizmetler arası güvenliği devre dışı bırakmaya karar verirseniz:

  1. Öncelikle, özelliği devre dışı bırakmadan önce kurallarınızı düzenleyerek Cloud Firestore'a erişmek için Kural işlevlerini kullanan tüm ifadeleri kaldırın. Aksi takdirde, özellik devre dışı bırakıldıktan sonra Kural değerlendirmeleri, Depolama alanı isteklerinizin başarısız olmasına neden olur.

  2. "Firebase Kuralları Firestore Hizmet Aracısı" rolünü silmek için Google Cloud Console'daki IAM sayfasını kullanın. Bunun için Rolleri iptal etme rehberindeki talimatları uygulayın.

Bir sonraki sefer Firebase CLI'dan veya Firebase konsolundan hizmetler arası Kuralları kaydettiğinizde özelliği yeniden etkinleştirmeniz istenir.