Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırı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 Kural kaynağı alır : bir kurallar 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 kaynağa yönelik her isteği değerlendirmek için 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 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 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 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. Güncellemelerinizi yerel olarak test etmek için Local Emulator Suite'i kullanın ve uygulamanızın Kurallarının istediğiniz davranışı gösterdiğini onaylayın.

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

Ayrıca Kural kaynaklarını düzenleyebilir ve bunları Firebase konsolundan yayınlar olarak dağıtabilirsiniz. Sözdizim testi , Firebase konsolu kullanıcı arayüzünde düzenleme yaparken gerçekleştirilir ve Kurallar Oyun Alanı kullanılarak anlambilimsel test yapılabilir.

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

  1. Firebase konsolunu açın ve projenizi seçin.
  2. Ardından, ürün gezinme bölümünden Realtime Database , Cloud Firestore veya Storage'ı seçin, 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özdizimini test etmenin yanı sıra, projenizin veritabanını ve depolama kaynaklarını kullanarak semantik Kurallar davranışını, Rules Playground'u kullanarak doğrudan Firebase konsolunda test edebilirsiniz. Kurallar düzenleyicide Kurallar Oyun Alanı ekranını açın, ayarları değiştirin ve Çalıştır öğesine tıklayın. Editörün ü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 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, 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.

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

Bu aynı model, releaseFirestoreRulesetFromSource() ile Bulut Depolama kuralları için çalışır.

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

Gerçek Zamanlı Veritabanı kural kümelerini Yönetici SDK'sı ile güncellemek için getRules() ve admin.database setRules() yöntemlerini kullanın. 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

Büyük kural kümelerinin yönetilmesine yardımcı olmak için Yönetici SDK'sı, 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;
      }
    }

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, 30 günden uzun süredir 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, ç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 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.

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. Referans belgelerle entegre edilmiş API Gezgini'ni kullanarak bu API'yi deneyebilirsiniz.

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)

secure_commerce projeniz üzerinde çalıştığınızı ve kilitli Bulut Depolama Kuralları dağıtmak istediğinizi varsayalım. Bu kuralları bir storage.rules dosyasında uygulayabilirsiniz.

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. Ardından, projects.rulesets.create REST çağrısıyla bir kural kümesi oluşturmak için gereken yükü doldurmak için bu dosyadaki kaynağı kullanabilirsiniz. Burada, storage.rules içeriğini REST yüküne eklemek için cat komutunu kullanıyoruz.

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, 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 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. Firebase Gerçek Zamanlı Veritabanı Kurallarını REST ile 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:

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

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, 30 günden daha uzun bir süredir dağıtılan tüm kural kümelerini silmek için project.rulesets.list yöntemini çağırabilir, projects.rulesets.list anahtarlarında JSON Ruleset nesneleri listesini ayrıştırabilir ve ardından createTime ile ilgili kural ruleset_id project.rulesets.delete öğesini ç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 kümesini temsil etmek için 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, 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 tüm Kural dili ifadelerinin rapora dahil edilmesi gerektiğini 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 değerlendirme 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ŞARI/BAŞARISIZ durumu, hata ayıklama mesajları listeleri, ziyaret edilen Kural ifadeleri listeleri ve bunların değerlendirme raporlarını içeren), BAŞARI durumuyla erişime uygun şekilde izin verildiğini onaylayacaktır.

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 Bulut Depolama Güvenlik Kuralları oluşturursanız, Firebase konsolunda veya Firebase CLI'de iki ürünü birbirine 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 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 isteklerinizin başarısız olmasına neden olacaktır.

  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 veya Firebase konsolundan hizmetler arası Kuralları bir sonraki kaydettiğinizde özelliği yeniden etkinleştirmeniz istenecektir.