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

Firebase, Kurallarınızı yönetmeniz için her biri belirli durumlarda yararlı olan ve her biri aynı arka uç Firebase Güvenlik Kuralları yönetim API'sini kullanan çeşitli araçlar sağlar.

Çağırmak için hangi araç kullanılırsa kullanılsın, yönetim API'si:

  • Bir Kural kaynağı alır : bir kural kümesi, genellikle Firebase Güvenlik Kuralları deyimlerini içeren bir kod dosyası.
  • Alınan kaynağı değişmez bir kural kümesi olarak depolar.
  • Bir sürümdeki her kural kümesinin dağıtımını izler. Firebase Güvenlik Kuralları'nın etkin olduğu hizmetler, güvenli bir kaynak için her isteği değerlendirmek üzere bir projenin yayınını arar.
  • Bir kural kümesinin sözdizimsel ve anlamsal testlerini çalıştırma yeteneği sağlar.

Firebase CLI'yi kullanın

Firebase CLI ile yerel kaynakları yükleyebilir ve sürümleri dağıtabilirsiniz. CLI'nin Firebase Yerel Öykünücü Paketi, kaynakların tam yerel testini gerçekleştirmenize olanak tanır.

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

Bir yapılandırma dosyası oluşturun

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:

Bulut Firestore

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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

Kurallarınızı düzenleyin ve güncelleyin

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

Firebase CLI'de yaptığınız tüm düzenlemelerin Firebase konsoluna yansıtıldığından veya Firebase konsolunu ya da Firebase CLI'yi kullanarak sürekli güncellemeler yaptığınızdan emin olun. Aksi takdirde, Firebase konsolunda yapılan güncellemelerin üzerine yazabilirsiniz.

Güncellemelerinizi test edin

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 için Güvenlik Kuralları motoru, kuralların hem sözdizimsel hem de anlamsal değerlendirmesini gerçekleştirerek Güvenlik Kuralları yönetim API'sinin sunduğu sözdizimsel testi 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 doğrulamak için Local 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ı gözden geçirip 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 veya normal dağıtım sürecinizin bir parçası olarak dağıtmak için aşağıdaki komutları kullanın.

Bulut 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>

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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

Firebase konsolunu kullanın

Ayrıca Kural kaynaklarını düzenleyebilir ve bunları Firebase konsolundan yayınlar olarak dağıtabilirsiniz. Sözdizimsel test , siz Firebase konsolu kullanıcı arayüzünde düzenleme yaparken gerçekleştirilir ve anlamsal test, Rules Playground kullanılarak kullanılabilir.

Kurallarınızı düzenleyin ve güncelleyin

  1. Firebase konsolunu açın ve projenizi seçin.
  2. Ardından, ürün gezinti alanından Realtime Database , Cloud Firestore veya Storage'ı seçin ve ardından Kurallar düzenleyicisine gitmek için Kurallar'a tıklayın.
  3. Kurallarınızı doğrudan düzenleyicide düzenleyin.

Güncellemelerinizi test edin

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

Güncellemelerinizi dağıtın

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

Yönetici SDK'sını kullanın

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

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

Kuralları programlı 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, Admin SDK kodunuzu güvenliği en önde tutarak yazın.

Akılda tutulması gereken bir diğer önemli nokta, 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 bağlı olduğu yarış koşullarından kaçındığınızdan emin olun. Kullanım durumunuz, erişim denetimi kuralları için sık güncellemeler gerektiriyorsa, sık güncellemelere rağmen yarış koşullarını azaltmak için tasarlanmış Cloud Firestore'u kullanan çözümleri düşünün.

Ayrıca şu sınırlara dikkat edin:

  • Kurallar, serileştirildiğinde UTF-8 kodlu metnin 256 KiB'sinden küçük olmalıdır.
  • Bir projede toplam dağıtılan en fazla 2500 kural kümesi olabilir. Bu sınıra ulaşıldığında, yenilerini oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.

Cloud Storage veya Cloud Firestore kural kümeleri oluşturun ve dağıtın

Admin SDK ile güvenlik kurallarını yönetmek için tipik bir iş akışı, üç ayrı adımı içerebilir:

  1. Bir kural dosyası kaynağı oluşturun (isteğe bağlı)
  2. Bir kural kümesi oluşturun
  3. Yeni kural kümesini yayınlayın veya dağıtın

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

    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 Bulut Depolama kuralları için çalışır.

Alternatif olarak, kurallar dosyasını bir bellek içi nesne olarak oluşturabilir, kural setini oluşturabilir ve bu olayların daha yakından kontrolü için kural setini ayrı olarak konuşlandırabilirsiniz. Örneğin:

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

Gerçek Zamanlı Veritabanı kural kümelerini güncelleyin

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 dahil olduğu bir dize olarak alabilirsiniz.

Bir kural setini 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

Admin SDK, büyük kural kümelerini yönetmenize yardımcı olmak için admin.securityRules().listRulesetMetadata ile mevcut tüm kuralları listelemenizi sağlar. Örneğin:

    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;
      }
    }

Zamanla 2500 kural kümesi sınırına ulaşan çok büyük dağıtımlar için, sabit bir zaman döngüsünde en eski kuralları silmek için bir mantık oluşturabilirsiniz. Örneğin, 30 günden uzun süre dağıtılan 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'sini kullanın

Yukarıda açıklanan araçlar, projenizdeki birden çok Cloud Firestore veritabanı için Firebase Güvenlik Kuralları yönetimi dahil olmak üzere çeşitli iş akışları için çok uygundur, ancak Firebase Güvenlik Kurallarını yönetim API'sinin kendisini kullanarak yönetmek ve dağıtmak isteyebilirsiniz. Yönetim API'si size en büyük esnekliği sağlar.

Ayrıca şu sınırlara dikkat edin:

  • Kurallar, serileştirildiğinde UTF-8 kodlu metnin 256 KiB'sinden küçük olmalıdır.
  • Bir projede toplam dağıtılan en fazla 2500 kural kümesi olabilir. Bu sınıra ulaşıldığında, yenilerini oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.

REST ile Cloud Firestore veya Cloud Storage kural kümeleri oluşturun ve dağıtın

Bu bölümdeki örnekler, Bulut Depolama Kuralları için de geçerli olsalar da Firestore Kurallarını kullanır.

Örnekler ayrıca API çağrıları yapmak için cURL kullanır. Kimlik doğrulama belirteçlerini ayarlama ve geçirme adımları atlanmıştır. Referans belgelerle entegre edilmiş API Gezgini'ni kullanarak bu API ile denemeler yapabilirsiniz.

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

  1. Kural dosyası kaynakları oluştur
  2. Bir kural kümesi oluşturun
  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 projenizdeki east_store adlı bir veritabanına kilitli Cloud Firestore Kurallarını 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;
    }
  }
}

Bir kural kümesi oluşturun

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

İzleme için, bunu east_store veritabanınızla ilişkilendirmek üzere, attachment_point 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 kümesi adı döndürür; örneğin projects/secure_commerce/rulesets/uuid123 .

Bir kural kümesini serbest bırakın (dağıtın)

Kural seti geçerliyse son adım, yeni kural setini 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 tamamen 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 bağlı olduğu yarış koşullarından kaçındığınızdan emin olun.

Gerçek Zamanlı Veritabanı kural kümelerini REST ile güncelleyin

Realtime Database, Kuralları yönetmek için kendi REST arayüzünü sağlar. Bkz . Firebase Gerçek Zamanlı Veritabanı Kurallarını REST Yoluyla Yönetme .

REST ile kural kümelerini yönetin

Yönetim API'si, büyük kural dağıtımlarının yönetilmesine yardımcı olmak için, kural kümeleri ve sürümler oluşturmaya yönelik bir REST yöntemine ek olarak aşağıdakileri yapmak için yöntemler sağlar:

  • kural kümelerini listeleme, alma ve silme
  • kural yayınlarını listeleme, alma ve silme

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

Güncellemelerinizi REST ile test edin

Son olarak, yönetim API'si, üretim projelerinizdeki Cloud Firestore ve Cloud Storage kaynakları üzerinde sözdizimsel ve anlamsal testler çalıştırmanıza olanak tanır.

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

  1. Bir TestCase nesnesi grubunu temsil edecek bir TestSuite JSON nesnesi tanımlama
  2. TestSuite gönderme
  3. Döndürülen TestResult nesnelerini ayrıştırma

Bir testcase.json dosyasında tek bir TestCase ile bir TestSuite nesnesi tanımlayalım. Bu örnekte, bu kurallar üzerinde çalışacak test paketinin yanı sıra Kurallar dili kaynağını REST yükü ile satır içi iletiyoruz. Bir Kural değerlendirme beklentisi ve kural setinin test edileceği müşteri talebini belirtiyoruz. Ayrıca, istekle eşleşmeyen ifadeler de dahil olmak üzere, rapora dahil edilmesi gereken tüm Kurallar dili ifadelerinin sonuçlarını belirtmek için "FULL" değerini kullanarak test raporunun ne kadar eksiksiz olduğunu 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 projects.test yöntemiyle değerlendirmeye 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/BAŞARISIZ durumunu, 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ŞARI durumuyla onaylar.

Hizmetler arası Bulut Depolama Güvenlik Kuralları için izinleri yönetin

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'de iki ürünü bağlamak için izinleri etkinleştirmeniz istenir.

Bu tür bir 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, Depolama taleplerinizin başarısız olmasına neden olur.

  2. Rolleri iptal etmek için Bulut kılavuzunu izleyerek "Firebase Rules Firestore Service Agent" rolünü silmek için Google Cloud Console'daki IAM sayfasını kullanın.

Firebase CLI'den veya Firebase konsolundan hizmetlerarası Kuralları bir sonraki kaydettiğinizde özelliği yeniden etkinleştirmeniz istenecektir.