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ğını alır: bir dizi kural, genellikle Firebase Güvenlik Kuralları ifadelerini içeren bir kod dosyası.
  • Alınan kaynağı değişmez bir kural kümesi olarak saklar.
  • 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 kaynağa yönelik her isteği değerlendirmek için bir projenin sürümü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 Local Emulator Suite'i, 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'yi 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 veya Firebase CLI'yi kullanarak sürekli olarak güncelleme 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 öykünücünün Güvenlik Kuralları motoru, kuralların hem sözdizimsel hem de anlamsal değerlendirmesini gerçekleştirir, böylece Güvenlik Kuralları yönetimi API'sinin sunduğu sözdizimsel testleri 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ı 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çmeli olarak 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 kullanma

Ayrıca Kural kaynaklarını düzenleyebilir ve bunları Firebase konsolundan sürümler halinde dağıtabilirsiniz. Sözdizimsel testler, Firebase konsolu kullanıcı arayüzünde düzenleme yaptığınız sırada gerçekleştirilir ve anlamsal testler, Kural Oyun Alanı kullanılarak yapılabilir.

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

  1. Firebase konsolunu açın ve projenizi seçin.
  2. Ardından, ürün navigasyonundan Gerçek Zamanlı Veritabanı , 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ı arayüzünde söz dizimini test etmenin yanı sıra, projenizin veritabanını ve depolama kaynaklarını kullanarak doğrudan Firebase konsolunda Kural Oyun Alanı'nı kullanarak anlamsal Kural davranışını da test edebilirsiniz. Kural düzenleyicisinde 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 olduğunuzda 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 programlı erişimle şunları yapabilirsiniz:

  • Kuralları yönetmek için özel araçlar, komut dosyaları, kontrol panelleri ve CI/CD işlem hatları uygulayın.
  • Birden fazla Firebase projesinde kuralları daha kolay yönetin.

Kuralları programlı olarak güncellerken uygulamanızın erişim kontrolünde istenmeyen değişiklikler yapmaktan kaçınmak çok önemlidir. Yönetici SDK kodunuzu, özellikle kuralları güncellerken veya dağıtırken güvenliği ön planda tutarak yazın.

Akılda tutulması gereken bir diğer önemli nokta da Firebase Güvenlik Kuralları sürümlerinin tamamen 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 tamamlanmayan kurallara anında bağlı olduğu yarış koşullarından kaçındığınızdan emin olun. Kullanım durumunuz kontrol kurallarına erişim için sık güncellemeler gerektiriyorsa sık güncellemelere rağmen yarış koşullarını azaltmak için tasarlanan Cloud Firestore'u kullanan çözümleri düşünün.

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

  • Kurallar serileştirildiğinde 256 KiB UTF-8 kodlu metinden küçük olmalıdır.
  • Bir projede toplamda en fazla 2500 dağıtılmış kural kümesi bulunabilir. 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

Yönetici SDK'sıyla güvenlik kurallarını yönetmeye yönelik tipik bir iş akışı üç ayrı adım içerebilir:

  1. 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ştirmeye yönelik 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ı model, releaseFirestoreRulesetFromSource() özelliğine sahip 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 olayların daha yakından denetlenmesi için kural kümesini ayrı olarak dağıtabilirsiniz. Ö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üncelleme

Gerçek Zamanlı Veritabanı kural kümelerini Admin SDK ile güncellemek için admin.database getRules() ve setRules() yöntemlerini kullanın. Kural kümelerini JSON formatında veya yorumların dahil olduğu 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

Büyük kural kümelerini yönetmenize yardımcı olmak için Admin SDK, admin.securityRules().listRulesetMetadata ile mevcut tüm kuralları listelemenize olanak tanır. Ö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 mantık oluşturabilirsiniz. Örneğin, 30 günden daha 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'yi kullanın

Yukarıda açıklanan araçlar, projenizdeki birden çok Cloud Firestore veri tabanı için Firebase Güvenlik Kuralları yönetimi de dahil olmak üzere çeşitli iş akışlarına ç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 da dikkat edin:

  • Kurallar serileştirildiğinde 256 KiB UTF-8 kodlu metinden küçük olmalıdır.
  • Bir projede toplamda en fazla 2500 dağıtılmış kural kümesi bulunabilir. 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 örneklerde Firestore Kuralları kullanılmaktadır ancak bunlar Bulut Depolama Kuralları için de geçerlidir.

Örneklerde ayrıca API çağrıları yapmak için cURL kullanılır. Kimlik doğrulama belirteçlerini ayarlama ve geçirme adımları atlanmıştır. Referans belgelere entegre edilmiş API Explorer'ı 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şturma
  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 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;
    }
  }
}

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 gereken 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 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 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 tamamlanmayan kurallara anında bağlı olduğu yarış koşullarından kaçındığınızdan emin olun.

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

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

REST ile kural kümelerini yönetme

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

  • Kural kümelerini listeleyin, alın ve silin
  • Kural sürümlerini listeleyin, alın ve silin

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 mantık oluşturabilirsiniz. Örneğin, 30 günden daha uzun süre dağıtılan 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 ilgili kural kümelerinde ruleset_id ile project.rulesets.delete çağırabilirsiniz. .

Güncellemelerinizi REST ile test edin

Son olarak yönetim API'si, üretim projelerinizde 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 aşağıdakilerden oluşur:

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

testcase.json dosyasında tek bir TestCase içeren bir TestSuite nesnesi tanımlayalım. Bu örnekte, Kurallar dili kaynağını, bu kurallar üzerinde çalışacak test paketinin yanı sıra REST yüküyle satır içi olarak aktarıyoruz. Bir Kural değerlendirme beklentisini ve kural kümesinin 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 dili ifadelerine ilişkin sonuçları 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ŞARI/BAŞARISIZ durumunu, hata ayıklama mesajları 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 onaylayacaktır.

Hizmetler arası Bulut Depolama Güvenlik Kurallarına ilişkin izinleri yönetin

Güvenlik koşullarını değerlendirmek için Cloud Firestore belge içeriklerini kullanan Bulut Depolama Güvenlik Kuralları oluşturursanız, Firebase konsolunda veya Firebase CLI'de iki ürünü bağlama izinlerini 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, Cloud Firestore'a erişmek için Kural işlevlerini kullanan tüm ifadeleri kaldırarak kurallarınızı düzenleyin. Aksi takdirde özellik devre dışı bırakıldıktan sonra Kural değerlendirmeleri Depolama isteklerinizin başarısız olmasına neden olacaktır.

  2. Rolleri iptal etmeye yönelik Bulut kılavuzunu izleyerek "Firebase Kuralları Firestore Hizmet Aracısı" rolünü silmek için Google Cloud Console'daki IAM sayfasını kullanın.

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