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
- Firebase konsolunu açın ve projenizi seçin.
- 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.
- 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:
- Kural dosyası kaynağı oluşturun (isteğe bağlı)
- Bir kural kümesi oluşturun
- 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 edildiği 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:
- Kural dosyası kaynakları oluşturma
- Bir kural kümesi oluşturun
- 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:
- Bir dizi
TestCase
nesnesini temsil edecek birTestSuite
JSON nesnesi tanımlama -
TestSuite
gönderme - 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çeriğini 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:
İ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.
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.