Firebase Güvenlik Kurallarını yönetme ve dağıtma

Firebase, Rules hesabınızı yönetmek için kullanabileceğiniz çeşitli araçlar sunar. Bu araçların her biri her biri aynı arka uç Firebase'i kullanarak kullanılabilir. Güvenlik Kuralları yönetim API'si.

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

  • Kural kaynağı besler: Kural grubu, genellikle Firebase Security Rules ekstre.
  • Kaynağı sabit kural olarak beslenen mağazalar.
  • Bir sürümdeki her kural grubunun dağıtımını izler. Firebase Güvenliği Kuralların etkin olduğu hizmetler, her isteği değerlendirmek için sürümü arar. güvenli bir kaynak olmasını istiyorsunuz.
  • Bir kural grubunun söz dizimsel ve anlamsal testlerini çalıştırma olanağı sağlar.

Firebase KSA'yı kullan

Firebase KSA ile şunları yapabilirsiniz: Yerel kaynaklar yükleyin ve sürümleri dağıtın. KSA'lar Firebase Local Emulator Suite, kaynaklar için tam yerel test yapmanıza olanak tanır.

KSA'yı kullanmak, kurallarınızı mevcut dağıtım sürecinizin bir parçası olarak uygulama kodu dağıtma ve kural dağıtma gibi konulardan bahsetmek istiyorum.

Yapılandırma dosyası oluşturma

Firebase projenizi Firebase KSA'yı kullanarak yapılandırdığınızda, proje dizininizde bir .rules yapılandırma dosyası oluşturun. Şunları kullanın: komutuna ekleyerek Firebase projenizi yapılandırmaya başlayı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 KSA'da yaptığınız düzenlemelerin Firebase konsolu veya Firebase konsolunuza veya Firebase CLI'a gidin. Aksi takdirde, Firebase konsolunda yapılan güncellemeler.

Güncellemelerinizi test etme

Local Emulator Suite, Güvenlik Kurallarının etkinleştirildiği tüm uygulamalar için emülatörler sağlar ürünler. Her emülatör için Güvenlik Kuralları motoru, ve anlamsal değerlendirmede bulunup bu testin Security Rules management API teklifleri

KSA ile çalışıyorsanız Suite, Firebase Security Rules için mükemmel bir araçtır teşvik etmek anlamına gelir. Güncellemelerinizi test etmek için Local Emulator Suite aracını kullanın yerel olarak ve uygulamanızdaki Rules öğesinin bu davranışı sergilediğini doğrulayın gerekir.

Güncellemelerinizi dağıtın

Rules öğenizi güncelleyip test ettikten sonra kaynakları şuraya dağıtın: çok önemlidir.

Cloud Firestore Security Rules için .rules dosyayı varsayılan ve gözden geçirip güncelleyerek ek adlandırılmış veritabanları firebase.json dosyası.

Rules öğenizi tek başına seçerek dağıtmak için aşağıdaki komutları kullanın: normal dağıtım sürecinizin bir parçası olarak dağıtabilirsiniz.

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 kullan

Ayrıca Rules kaynağı düzenleyebilir ve bunları şuradan sürümler olarak dağıtabilirsiniz: Firebase konsolunda gösterilir. Sözdizimsel test, siz Firebase konsolunun kullanıcı arayüzü ve semantik testi için Rules Oyun Alanı.

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

  1. Firebase konsolunu açın ve projenizi seçin.
  2. Ardından, Realtime Database, Cloud Firestore veya Depolama alanı'nı seçin. Gezinme menüsünü, ardından Kurallar'ı tıklayarak Rules düzenleyici.
  3. Kurallarınızı doğrudan düzenleyicide düzenleyin.
ziyaret edin.

Güncellemelerinizi test etme

Düzenleyici kullanıcı arayüzünde söz dizimini test etmenin yanı sıra anlamsal Rules davranışı ile projenizin veritabanı ve depolama kaynakları, Firebase konsolunda Rules Playground. Kurallar Oyun Alanı'nı açın. ekranında Rules ayarları değiştirin ve Çalıştır'i 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 için Admin SDK kullanabilirsiniz kuralları içerir. 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ı programlı bir şekilde güncellerken, uygulamanızın erişim denetiminde istenmeyen değişiklikler. Admin SDK kod özellikle de kuralları güncellerken veya dağıtırken güvenliği ön planda tutun.

Unutulmaması gereken bir diğer önemli nokta da Firebase Security Rules yayınlarının bir kaç dakika sürecektir. Dağıtım için Admin SDK kullanılırken uygulamanızın hemen bağımlı olduğu yarış koşullarından kaçının. kuralları üzerinde denetimi yoktur. Kullanım alanınız erişim denetimi kurallarında sık sık güncelleme yapılmasını istiyorsanız Cloud Firestore, Bu kampanya, sık sık güncellenmesine rağmen yarış koşullarını azaltmak için tasarlanmıştır.

Şu sınırları da unutmayın:

  • Kurallar, seri haline getirildiğinde 256 KiB, UTF-8 kodlamalı metinden küçük olmalıdır.
  • Bir projenin toplamda en fazla 2.500 dağıtılmış kural kümesi olabilir. Bu sınır yeni kural kümeleri oluşturmadan önce bazı eski kural kümelerini silmeniz gerekir.

Cloud Storage veya Cloud Firestore kural kümeleri oluşturup dağıtma

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

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

Alternatif olarak, kural dosyasını bellek içi nesne olarak oluşturup kontrol edebilir ve kural grubunu ayrı ayrı dağıtabilirsiniz. Örneğin:

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

Realtime Database kural kümesini güncelle

Realtime Database kural kümesini Admin SDK ile güncellemek için getRules() ve admin.database için setRules() yöntemler. Kural kümelerini JSON biçiminde alabilirsiniz biçiminde veya yorumların yer aldığı bir dize olarak gösterilir.

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

Admin SDK, büyük kural kümelerinin yönetilmesine yardımcı olmak için mevcut tüm kuralları listelemenize olanak tanır. admin.securityRules().listRulesetMetadata ile. Ö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 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 için mantık oluşturur. Örneğin, 30 günden daha uzun süre dağıtılan tüm kural kümelerini silin:

    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, şunlar da dahil olmak üzere çeşitli iş akışları için uygundur: Projenizde birden fazla Cloud Firestore veritabanı için Firebase Security Rules yönetimi, ancak Management API'yi kullanarak Firebase Security Rules hizmetini 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ır 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şturup dağıtma

Bu bölümdeki örnekler Firestore Rules kullanır ancak bu örnekler Cloud Storage Rules.

Örnekler, API çağrıları yapmak için cURL'yi de kullanır. Ayarlama ve geçiş adımları Kimlik doğrulama jetonları atlanır. Şu API'yi kullanarak bu API ile deneme yapabilirsiniz: API Explorer, referans belgeler.

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 Rules uygulamasını hesabınızdaki bir veritabanına dağıtmak için east_store adlı proje.

Bu kuralları bir firestore.rules içinde uygulayabilirsiniz dosyası olarak kaydedebilirsiniz.

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. Daha sonra iki kaynak kullanarak bir kural kümesi oluşturmak için gereken yükü doldurmak projects.rulesets.create REST araması. Buraya eklemek için cat komutunu kullanın. firestore.rules içeriğini REST yüküne ekleyin.

İ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 bir kural kümesi 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 kullanabilirsiniz.

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 tamamen kullanıma sunulmasının birkaç dakika sürebileceğini unutmayın yayılır. Dağıtım yapmak için yönetim REST API'sini kullanırken uygulamanızın, dağıtımının tam olarak yapılmadığı kurallara hemen dayandığı koşullar henüz tamamlanmamıştır.

Realtime Database kural kümesini REST ile güncelleme

Realtime Database, Rules yönetimi için kendi REST arayüzünü sunar. Görüntüleyin REST aracılığıyla Firebase Realtime Database Rules yönetimi.

Kural kümelerini REST ile yönetme

Büyük kural dağıtımlarını yönetmek için REST yönteminin yanı sıra yönetim API'si şu işlemleri yapmaya yönelik yöntemler sağlar:

  • 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ımlar için sabit bir zaman döngüsündeki en eski kuralları silmek için mantık oluşturur. Örneğin, 30 günden daha uzun süre dağıtılan tüm kural kümelerini silerseniz projects.rulesets.list yönteminde Ruleset nesnelerin JSON listesini ayrıştır createTime tuşlarını, ardından project.rulesets.delete ilgili kural kümelerini ruleset_id tarihine kadar tıklayın.

Güncellemelerinizi REST ile test edin

Son olarak, management API'yi kullanarak Üretiminizde Cloud Firestore ve Cloud Storage kaynak bilgi edinmenizi sağlar.

ile ilgili kılavuzumuza göz atın.

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ü

Şimdi, aşağıdaki tabloda tek bir TestCase içeren TestSuite nesnesi tanımlayalım: testcase.json dosyası. Bu örnekte Rules çalıştırılacak test paketiyle birlikte REST yüküyle satır içi dil kaynağı bu kurallara uymalısınız. Bir Kurallar değerlendirme beklentisi belirleriz ve müşteri de kural grubunun test edileceği istektir. Ayrıca, reklamlarınızın test raporunu tamamlamak için "FULL" değerini tüm anahtar kelimeler için sonuçları Rapora şu Rules dildeki ifadeler dahil edilmelidir: istekle eşleşmeyen ifadeler.

 {
  "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 ile birlikte değerlendirilmek üzere gönderebiliriz yöntemidir.

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/FAILURE) durumunu, hata ayıklama mesajları, ziyaret edilen kural ifadelerinin listeleri ve değerlendirme raporları) erişimi BAŞARILI durumuna getirir ve erişime uygun şekilde izin verildiğini onaylar.

Cloud Storage Security Rules hizmetleri arası izinleri yönetin

Cloud Firestore doküman içeriğini kullanan Cloud Storage Security Rules oluşturursanız güvenlik koşullarını nasıl değerlendirebileceğinizi, Firebase konsolunda veya Firebase CLI'de şunu etkinleştirmeniz istenir: iki ürünü birbirine bağlamak için gerekli izinleri almış olur.

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 tüm Cloud Firestore öğesine erişmek için Rules işlevlerini kullanan ifadeler. Aksi takdirde, özellik devre dışı bırakıldıktan sonra Rules değerlendirme Storage isteklerinizin başarısız olmasına neden olabilir.

  2. Google Cloud Console'daki IAM sayfasını kullanarak "Firebase Kurallar Firestore Hizmet Aracısı" rolünü üstlenmek için rolleri iptal edebilir.

Bir sonraki sefer kaydettiğinizde bu özelliği yeniden etkinleştirmeniz istenir Firebase KSA veya Firebase konsolundan hizmetler arası kurallar oluşturun.