Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

  • Bir dizi kurala Firebase Güvenlik Kuralları ifadeleri içeren tipik bir kod dosyasına: Bir Kural kaynağı alıp kullanır.
  • Mağazalar değişmez bir kural takım olarak kaynağınızı alıp.
  • Bir serbest bırakma her kural kümesi dağıtım 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 yayınını arar.
  • Bir kural kümesi sözdizimsel ve anlamsal testler yeteneği sağlar.

Firebase CLI'yi kullanın

İle Firebase CLI , yerel kaynakları ve dağıtma bültenleri yükleyebilirsiniz. CLI en Firebase Yerel Emulator Suite kaynaklarının tam lokal sınamaları yapmalarına olanak verir.

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

Eğer Firebase proje Firebase CLI kullanarak yapılandırırken, bir oluşturmak .rules proje dizininde yapılandırma dosyası. 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

Doğrudan Kurallarınızın kaynağını düzenleyin .rules yapılandırma dosyası. Firebase CLI'de yaptığınız tüm düzenlemelerin Firebase konsoluna yansıtıldığından veya sürekli olarak Firebase konsolunu ya da Firebase CLI'yi kullanarak 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 öykünücü için 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 testlerin ötesine geçer.

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

Güncellemelerinizi dağıtın

Kurallarınızı güncelleştirip test ettikten sonra kaynakları üretime dağıtın. 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 your .rules file
firebase deploy --only firestore:rules

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

Sen düzenleme kuralları kaynaklar da yapabilirsiniz ve Firebase konsoldan bültenleri olarak dağıtın. Sözdizimsel test Firebase konsol arayüzünde size düzenleme olarak gerçekleştirilir ve Symantic test Kuralları Playground kullanarak mevcuttur.

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

  1. Firebase konsolunu ve projeyi seçin.
  2. Ardından, Kurallar editörü gitmek için Kurallar 'ı, ürün gezinmesinde Gerçek Zamanlı Veritabanı, Bulut FireStore veya Depolama seçin.
  3. Kurallarınızı doğrudan düzenleyicide düzenleyin.

Güncellemelerinizi test edin

Editör arayüzünde sözdizimi test etmenin yanı, kullanarak, doğrudan Firebase konsolunda, projenizin veritabanı ve depolama kaynakları kullanarak, semantik kurallar davranışını test edebilirsiniz Kurallar Playground . Kurallar editörü Kurallar Bahçesi ekranını açın ayarlarını değiştirebilir ve Çalıştır tıklayın. Editörün üst kısmındaki onay mesajını arayın.

Güncellemelerinizi dağıtın

Eğer güncellemeler beklediğiniz olduğunu memnun yaptıktan sonra, tıklama yayınlayın.

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

Sen node.js rulesets için Yönetici SDK'yı kullanabilir. Bu programlı erişim ile şunları yapabilirsiniz:

  • Kuralları yönetmek için özel araçlar, komut dosyaları, panolar ve CI/CD işlem hatları 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. 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 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, kontrol kurallarına erişmek için sık güncellemeler gerektiriyorsa, sık güncellemelere rağmen yarış koşullarını azaltmak için tasarlanmış Cloud Firestore kullanan çözümleri düşünün.

Ayrıca şu limitlere dikkat edin:

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

Yönetici SDK'sı 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 seti oluşturun
  3. Yeni kural kümesini serbest bırakın veya dağıtın

SDK, Cloud Storage ve Cloud Firestore güvenlik kuralları için bu adımları 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);

İle Bulut Depolama kurallara Aynı desen çalışmaları releaseFirestoreRulesetFromSource() .

Alternatif olarak, kurallar dosyasını bir bellek içi nesne olarak oluşturabilir, kural kümesini oluşturabilir ve bu olayların daha yakından denetimi 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üncelleyin

Kullanmak, Yönetici SDK ile Gerçek Zamanlı Veri Tabanı rulesets güncellemek için getRules() ve setRules() yöntemlerini admin.database . Kural kümelerini JSON biçiminde 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

Yardım büyük rulesets yönetmek için, Yönetici SDK ile mevcut tüm kuralları listelemek sağlayan admin.securityRules().listRulesetMetadata . Ö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;
      }
    }

Zaman içinde 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, daha uzun 30 gün boyunca konuşlandırılan rulesets 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, çeşitli iş akışları için çok uygundur, ancak yönetim API'sinin kendisini kullanarak Firebase Güvenlik Kurallarını yönetmek ve dağıtmak isteyebilirsiniz. Yönetim API'si size en büyük esnekliği sağlar.

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

Ayrıca şu limitlere dikkat edin:

  • Kurallar, seri hale getirildiğinde 256 KiB UTF-8 kodlu metinden küçük olmalıdır.
  • Bir projede en fazla 2500 toplam dağıtılmış 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 Storage veya Cloud Firestore kural kümeleri oluşturun ve dağıtın

Bu bölümdeki örnekler, Depolama Kurallarını kullanır, ancak bunlar Cloud Firestore Kuralları için de geçerlidir.

Örnekler, API çağrıları yapmak için cURL'yi de kullanır. Kimlik doğrulama belirteçlerini ayarlama ve geçirme adımları atlanır. Sen Explorer ile entegre API kullanarak bu API ile deneme yapabilirsiniz referans belgeleri .

Yönetim API'sini kullanarak bir kural kümesi oluşturmak ve dağıtmak için tipik adımlar şunlardır:

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

Diyelim ki sizin üzerinde çalışıyoruz varsayalım secure_commerce Firebase projesi ve Bulut Depolama Kuralları kilitli dağıtmak istiyorum. Bir bu kuralları uygulayabilirsiniz storage.rules dosyası.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Şimdi, bu dosya için base64 ile kodlanmış bir parmak izi oluşturun. Daha sonra bir kural setine oluşturmak için gerekli yükü doldurmak için bu dosyadaki kaynağını kullanabilirsiniz projects.rulesets.create DİNLENME çağrısı. Burada, kullandığımız cat içeriğini eklemek için komutu storage.rules DİNLENME yüküne.

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

API, örneğin bir doğrulama yanıtı ve bir kural takımı ismi, döner projects/secure_commerce/rulesets/uuid123 . 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/prod/v23   "  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123",
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

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

Realtime Database, Kuralları yönetmek için kendi REST arayüzünü sağlar. Bkz DİNLENME yoluyla Firebase Gerçek Zamanlı Veri Tabanı Kuralları yönetme .

REST ile kural kümelerini yönetin

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

  • Liste, almak ve silme kural setleri
  • Liste, almak ve silme kurallar bültenleri

Zaman içinde 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, daha uzun 30 gün boyunca konuşlandırılan rulesets silmek, Arayabileceğin projects.rulesets.list , yöntem JSON listesi ayrıştırmak Ruleset onların üzerinde nesneleri createTime tuşları, daha sonra çağrı project.rulesets.delete tarafından gelen rulesets üzerinde ruleset_id .

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 tanımlama TestSuite JSON nesnesi bir dizi temsil etmek TestCase nesneleri
  2. gönderme TestSuite
  3. İade Ayrıştırma TestResult nesneleri

En bir tanımlayalım TestSuite tek nesneyi TestCase bir de testcase.json dosyası. Bu örnekte, Kurallar dili kaynağını, bu kurallar üzerinde çalışacak test paketinin yanı sıra REST yüküyle aynı hizada geçiriyoruz. Bir Kural değerlendirme beklentisi ve kural kümesinin test edileceği müşteri talebini belirtiriz. Ayrıca, istekle eşleşmeyen ifadeler de dahil olmak üzere, rapora dahil edilmesi gereken tüm Kural 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"}}}
            }
          ]
      }
    ]
  }
}

Biz o zaman bu gönderebilirsiniz TestSuite ile değerlendirilmesinde kullanılır projects.test yöntemle.

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

İade TestReport (test başarı / başarısızlık durumlarını, hata ayıklama mesajları listeleri, ziyaret edilen Kurallar ifadeler ve bunların değerlendirilmesi raporlarının listeleri içeren) erişim düzgün izin verildiğini durum BAŞARI ile teyit ederim.