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

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

Çağrıyı çağırmak için hangi aracın kullanıldığına bakılmaksızın yönetim API'si:

  • Kural kaynağı besler: Bir kural grubu, genellikle Firebase Güvenlik Kuralları ifadelerini içeren bir kod dosyası.
  • Kaynağı sabit kural olarak beslenen mağazalar.
  • Bir sürümdeki her kural grubunun dağıtımını izler. Firebase Güvenlik Kuralları'nın etkin olduğu hizmetler, güvenli bir kaynak için yapılan her isteği değerlendirmek amacıyla bir projenin sürümünü arar.
  • Bir kural grubunun söz dizimsel ve anlamsal testlerini çalıştırma olanağı sağlar.

Firebase CLI'ı kullanma

Firebase CLI ile yerel kaynaklar yükleyebilir ve sürümleri dağıtabilirsiniz. CLI'nin Firebase Local Emulator Suite hizmeti sayesinde kaynaklar için tam yerel test yapabilirsiniz.

CLI'yı kullanmak, kurallarınızı uygulama kodunuzla sürüm denetiminde tutmanıza ve mevcut dağıtım sürecinizin bir parçası olarak kuralları dağıtmanıza olanak tanır.

Yapılandırma dosyası oluşturma

Firebase CLI'yı kullanarak Firebase projenizi yapılandırdığınızda, proje dizininizde bir .rules yapılandırma dosyası oluşturursunuz. Firebase projenizi yapılandırmaya başlamak için şu 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 düzenlemelerin Firebase konsoluna yansıtıldığından veya Firebase konsolunu ya da Firebase CLI'ı kullanarak sürekli olarak 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 etkin olduğu tüm ürünler için emülatörler sağlar. Her 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'nin sunduğu söz dizimi testlerini aşar.

KSA 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 Yerel Emulator Suite'i kullanın.

Güncellemelerinizi dağıtın

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ı seçerek tek başına dağıtmak veya normal dağıtım sürecinizin bir parçası olarak dağıtmak için aşağıdaki komutları kullanı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üzenleyebilir ve bunları Firebase konsolundan sürümler olarak dağıtabilirsiniz. Sözdizimsel test, siz Firebase konsolunun kullanıcı arayüzünde düzenleme yaparken gerçekleştirilir ve anlamsal test için Kurallar Playground'u kullanabilirsiniz.

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çip Kurallar'ı tıklayarak Kural düzenleyiciye gidin.
  3. Kurallarınızı doğrudan düzenleyicide düzenleyin.

Güncellemelerinizi test etme

Düzenleyici kullanıcı arayüzünde söz dizimini test etmenin yanı sıra projenizin veritabanı ve depolama kaynaklarını doğrudan Firebase konsolunda ve Kurallar Playground'u kullanarak anlamsal kural davranışını da 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ğıtın

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

Admin SDK'yı 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 fazla Firebase projesinde kuralları daha kolay yönetin.

Kuralları programatik olarak güncellerken, uygulamanızın erişim denetiminde istenmeyen değişiklikler yapmaktan kaçınmanız çok önemlidir. Özellikle kuralları güncellerken veya dağıtırken, Admin SDK kodunuzu güvenlik altına alarak yazın.

Unutulmaması gereken bir diğer önemli nokta da Firebase Security Rules sürümlerinin tam olarak yayılmasının birkaç dakika sürdüğüdür. Kuralları dağıtmak için Admin SDK'yı 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, erişim kontrol kurallarının sık sık güncellenmesini gerektiriyorsa sık güncellemelere rağmen yarış koşullarını azaltmak için tasarlanan Cloud Firestore'u kullanan çözümlerden yararlanabilirsiniz.

Ayrıca şu sınırları da unutmayın:

  • Kurallar, seri haline getirildiğinde 256 KiB, UTF-8 kodlamalı metinden küçük olmalıdır.
  • Bir projede toplam 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ümeleri oluşturma ve dağıtma

Admin SDK ile güvenlik kurallarını 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 yayınlama veya dağıtma

SDK, Cloud Storage ve Cloud Firestore güvenlik kuralları için bu adımları tek bir API çağrısında birleştiren bir yöntem sağlar. Ö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() içeren Cloud Storage kuralları için de geçerlidir.

Alternatif olarak, kural dosyasını bellek içi nesne olarak oluşturabilir, kural kümesini oluşturabilir ve bu etkinlikleri daha iyi kontrol etmek 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 Admin SDK ile güncellemek için admin.database öğesinin getRules() ve setRules() yöntemlerini kullanın. Kural kümelerini, JSON biçiminde veya yorumların yer aldığı 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önetme

Yönetici SDK'si, büyük kural kümelerinin yönetilmesine yardımcı olmak 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ımlarda, sabit bir zaman döngüsünde en eski kuralları silmek için mantık oluşturabilirsiniz. Örneğin, 30 günden 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 dahil olmak üzere çeşitli iş akışlarına uygundur. Ancak Management API'yi kullanarak Firebase Security Rules'u yönetmek ve dağıtmak isteyebilirsiniz. Management API size en yüksek esnekliği sağlar.

Ayrıca şu sınırları da unutmayın:

  • Kurallar, seri haline getirildiğinde 256 KiB, UTF-8 kodlamalı metinden küçük olmalıdır.
  • Bir projede toplam 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, Firestore Kurallarını kullanır ancak Cloud Storage Kuralları için de geçerlidir.

Örnekler, API çağrıları yapmak için cURL'yi de kullanır. Kimlik doğrulama jetonları oluşturma ve iletme adımları atlanır. Referans belgelerle entegre 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 yayınlayın (dağıtın).

Kaynak oluştur

secure_commerce Firebase projeniz üzerinde çalıştığınızı ve kilitli Cloud Firestore Kuralları'nı projenizdeki east_store adlı 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, bu dosya için base64 kodlu bir parmak izi oluşturun. Ardından, projects.rulesets.create REST çağrısıyla bir kural kümesi oluşturmak için gereken yükü doldurmak amacıyla bu dosyadaki kaynağı kullanabilirsiniz. Burada, firestore.rules içeriğini REST yüküne eklemek için cat komutunu kullanın.

İzleme amacıyla, bunu east_store veritabanınızla ilişkilendirmek için attachment_point değerini 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 kural grubu adı döndürür (örneğin, projects/secure_commerce/rulesets/uuid123).

Kural kümesi yayınlama (dağıtma)

Kural grubu 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 Security Rules sürümlerinin tam olarak dağıtılmasının birkaç dakika sürebileceğini unutmayın. Dağıtım için Management REST API'yi 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 ile Firebase Gerçek Zamanlı Veritabanı Kurallarını Yönetme bölümünü inceleyin.

Kural kümelerini REST ile yönetme

Management API'si, büyük kural dağıtımlarının yönetilmesine yardımcı olmak amacıyla, kural kümeleri ve sürüm oluşturmaya yönelik REST yönteminin yanı sıra şu konularda da yöntemler sunar:

  • kuralları listeleme, alma ve silme
  • kural yayınlarını listeleme, alma ve silme

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

Güncellemelerinizi REST ile test edin

Son olarak management API, üretim projelerinizde Cloud Firestore ve Cloud Storage kaynaklarında söz dizimsel ve anlamsal testler çalıştırmanızı sağlar.

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ırma işlemi TestResult nesne döndürdü

testcase.json dosyasında tek bir TestCase içeren TestSuite nesnesi tanımlayalım. Bu örnekte, Kurallar dili kaynağını REST yüküyle birlikte ve bu kurallar üzerinde çalışacak test paketiyle birlikte iletiriz. Bir Kurallar 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 Kural dil ifadelerinin sonuçlarını belirtmek için "TAM" değerini kullanarak test raporunun ne kadar tamamlanacağı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"}}}
            }
          ]
      }
    ]
  }
}

Ardından bu TestSuite öğesini, projects.test yöntemiyle değerlendirilmek 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ŞARILI/HATALI durumu, hata ayıklama mesajlarının listelerini, ziyaret edilen Kural ifadelerinin listelerini ve bunların değerlendirme raporlarını içerir), erişime uygun ş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. İlk olarak, özelliği devre dışı bırakmadan önce kurallarınızı düzenleyin ve 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, Storage isteklerinizin başarısız olmasına neden olur.

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

Hizmetler arası kuralları Firebase CLI veya Firebase konsolundan bir sonraki kaydettiğinizde bu özelliği yeniden etkinleştirmeniz istenir.