Firebase, Security Rules yönetmek için çeşitli araçlar sunar. Bu araçların her biri belirli durumlarda kullanışlıdır ve aynı arka uç Firebase Güvenlik Kuralları yönetim API'sini kullanır.
Yönetim API'si, hangi araç kullanılarak çağrılırsa çağrılsın:
- Kurallar kaynağını alır: Genellikle Firebase Security Rules ifadelerini içeren bir kod dosyası olan bir dizi kural.
- Kaynak, değişmez bir kural grubu olarak alınır.
- Yayın içindeki her kural grubunun dağıtımını izler. Firebase Security Kuralları'nın etkin olduğu hizmetler, güvenli bir kaynak için her isteği değerlendirmek üzere projenin yayınını arar.
- Bir kural kümesinin söz dizimi ve anlamsal testlerini çalıştırma olanağı sağlar.
Firebase KSA'sını kullanma
Firebase KSA ile yerel kaynaklar yükleyebilir ve sürümleri dağıtabilirsiniz. CLI'nın Firebase Local Emulator Suite kaynakların tam yerel testini yapmanıza olanak tanır.
KSA'yı kullanarak kurallarınızı uygulama kodunuzla birlikte sürüm denetimi altında tutabilir ve mevcut dağıtım sürecinizin bir parçası olarak dağıtabilirsiniz.
Yapılandırma dosyası oluşturma
Firebase projenizi Firebase CLI'yı 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:
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 tüm düzenlemelerin Firebase konsoluna yansıtıldığından veya güncellemeleri tutarlı bir şekilde Firebase konsolunu ya da Firebase CLI'yı kullanarak yaptığınızdan emin olun. Aksi takdirde, Firebase konsolunda yapılan güncellemelerin üzerine yazabilirsiniz.
Güncellemelerinizi test etme
Local Emulator Suite, Güvenlik Kuralları'nın etkinleştirildiği tüm ürünler için emülatörler sağlar. Her bir emülatörün güvenlik kuralları motoru, kuralların hem söz dizimsel hem de anlamsal değerlendirmesini yapar. Bu nedenle, güvenlik kuralları yönetim API'sinin sunduğu söz dizimsel testleri aşar.
CLI ile çalışıyorsanız Suite, Firebase Security Rules testi için mükemmel bir araçtır. Güncellemelerinizi yerel olarak test etmek ve uygulamanızın Local Emulator Suite'larının istediğiniz gibi davrandığını onaylamak için Security Rules kullanın.
Güncellemelerinizi dağıtma
Security Rules öğenizi güncelleyip test ettikten sonra kaynakları üretime dağıtın.
Cloud Firestore Security Rules için .rules dosyalarını varsayılan ve ek adlandırılmış veritabanlarınızla ilişkilendirmek üzere firebase.json dosyanızı inceleyip güncelleyin.
Security Rules'nızı ayrı ayrı dağıtmak veya normal dağıtım sürecinizin bir parçası olarak dağıtmak için aşağıdaki komutları kullanın.
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 kullanma
Ayrıca Security Rules kaynakları düzenleyebilir ve bunları Firebase konsolundan yayın olarak dağıtabilirsiniz. Söz dizimi testi, Firebase konsol kullanıcı arayüzünde düzenleme yaparken gerçekleştirilir. Semantik test ise Security Rules Playground kullanılarak yapılabilir.
Kurallarınızı düzenleme ve güncelleme
- Firebase konsolunu açıp projenizi seçin.
- Ardından, ürün gezinme menüsünden Realtime Database, Cloud Firestore veya Depolama alanı'nı seçin, ardından Security Rules düzenleyicisine gitmek için Kurallar'ı tıklayın.
- Kurallarınızı doğrudan düzenleyicide düzenleyin.
Güncellemelerinizi test etme
Söz dizimini düzenleyici kullanıcı arayüzünde test etmenin yanı sıra projenizin veritabanı ve depolama kaynaklarını kullanarak anlamsal Security Rules davranışı doğrudan Firebase konsolunda Security Rules Playground'u kullanarak test edebilirsiniz. Security Rules düzenleyicisinde Kurallar Deneme Alanı ekranını açın, ayarları değiştirin ve Çalıştır'ı tıklayın. Düzenleyicinin üst kısmında onay mesajını bulun.
Güncellemelerinizi dağıtma
Güncellemelerinizin istediğiniz gibi olduğuna kanaat getirdiğinizde Yayınla'yı tıklayın.
Admin SDK'sını kullanma
Node.js için Admin SDK kural kümelerini kullanabilirsiniz. Bu programatik erişim sayesinde şunları yapabilirsiniz:
- Kuralları yönetmek için özel araçlar, komut dosyaları, kontrol panelleri ve CI/CD ardışık düzenleri uygulayın.
- Kuralları birden fazla Firebase projesinde daha kolay yönetin.
Kuralları programatik olarak güncellerken uygulamanızın erişim denetiminde istenmeyen değişiklikler yapmaktan kaçınmak çok önemlidir. Özellikle kuralları güncellerken veya dağıtırken Admin SDK kodunuzu güvenliği ön planda tutarak yazın.
Firebase Security Rules yayınlarının tam olarak yayılmasının birkaç dakika sürdüğünü de unutmayın. Kuralları dağıtmak için Admin SDK kullanırken uygulamanızın, dağıtımı henüz tamamlanmamış kurallara hemen bağımlı olduğu yarış durumlarından kaçınmaya dikkat edin. Kullanım alanınızda erişim kontrolü kurallarının sık sık güncellenmesi gerekiyorsa sık güncellemelerden bağımsız olarak yarış durumlarını azaltmak için tasarlanmış Cloud Firestore kullanan çözümleri değerlendirin.
Ayrıca aşağıdaki sınırlara da dikkat edin:
- Kurallar, UTF-8 kodlu metin olarak seri hale getirildiğinde 256 KiB'tan küçük olmalıdır.
- Bir projede en fazla 2.500 dağıtılmış kural grubu olabilir. Bu sınıra ulaşıldığında yeni kural kümeleri oluşturmadan önce eski kural kümelerinden bazılarını silmeniz gerekir.
Cloud Storage veya Cloud Firestore kural kümeleri oluşturma ve dağıtma
Admin SDK ile güvenlik kurallarını yönetmeye yönelik tipik bir iş akışı üç ayrı adımdan oluşur:
- Kural dosyası kaynağı oluşturma (isteğe bağlı)
- Kural grubu oluşturma
- Yeni kural kümesini yayınlayı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ştirme yöntemi sunar. Ö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() ile Cloud Storage kuralları için de geçerlidir.
Alternatif olarak, kurallar dosyasını bellek içi bir nesne olarak oluşturabilir, kurallar kümesini oluşturabilir ve bu etkinliklerin daha yakından kontrol edilmesi için kurallar 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);
Realtime Database kurallarını güncelleme
Realtime Database kural kümelerini Admin SDK ile güncellemek için admin.database'in getRules() ve setRules() yöntemlerini kullanın. Kural kümelerini JSON biçiminde veya yorumlar dahil edilmiş bir dize olarak alabilirsiniz.
Bir kural grubunu 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ümelerini yönetmenize yardımcı olmak için 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 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ünde en eski kuralları silecek bir 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'yi kullanma
Yukarıda açıklanan araçlar, projenizdeki birden fazla Cloud Firestore veritabanının Firebase Security Rules yönetimi de dahil olmak üzere çeşitli iş akışları için uygundur. Ancak Firebase Security Rules'yı yönetim API'sini kullanarak yönetmek ve dağıtmak isteyebilirsiniz. Yönetim API'si size en fazla esnekliği sağlar.
Ayrıca aşağıdaki sınırlara da dikkat edin:
- Kurallar, UTF-8 kodlu metin olarak seri hale getirildiğinde 256 KiB'tan küçük olmalıdır.
- Bir projede en fazla 2.500 dağıtılmış kural grubu olabilir. Bu sınıra ulaşıldığında yeni kural kümeleri oluşturmadan önce eski kural kümelerinden bazılarını silmeniz gerekir.
REST ile Cloud Firestore veya Cloud Storage kural kümeleri oluşturma ve dağıtma
Bu bölümdeki örnekler Firestore Security Rules kullanır ancak Cloud Storage Security Rules için de geçerlidir.
Örneklerde API çağrıları yapmak için cURL de kullanılır. Kimlik doğrulama jetonlarını ayarlama ve iletme adımları atlanmıştır. Bu API'yi, referans belgeleriyle entegre API Gezgini'ni kullanarak deneyebilirsiniz.
Yönetim API'sini kullanarak bir kural grubu oluşturma ve dağıtma ile ilgili tipik adımlar şunlardır:
- Kural dosyası kaynakları oluşturma
- Kural grubu oluşturma
- Yeni kural grubunu yayınlayın (dağıtın).
Kaynak oluşturma
secure_commerce Firebase projenizde çalıştığınızı ve Cloud Firestore Security Rules adlı işlevleri, projenizdeki east_store adlı veritabanına dağıtmak istediğinizi varsayalım.
Bu kuralları firestore.rules dosyasında uygulayabilirsiniz.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Kural grubu oluşturma
Şimdi bu dosya için base64 kodlu bir parmak izi oluşturun. Ardından, projects.rulesets.create REST çağrısıyla bir kural grubu oluşturmak için gereken yükü doldurmak üzere bu dosyadaki kaynağı kullanabilirsiniz. Burada, cat komutunu kullanarak firestore.rules içeriğini REST yüküne ekleyin.
İzleme için bunu east_store veritabanınızla ilişkilendirmek üzere 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, doğrulama yanıtı ve kural grubu adı döndürür. Örneğin:
projects/secure_commerce/rulesets/uuid123
Kural kümesi yayınlama (dağıtma)
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 Security Rules yayınlarının tam olarak yayılmasının birkaç dakika sürebileceğini 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çınmaya dikkat edin.
REST ile Realtime Database kural kümelerini güncelleme
Realtime Database, Security Rules yönetimi için kendi REST arayüzünü sağlar. Firebase'i Realtime Database Security Rules REST aracılığıyla yönetme bölümüne bakın.
REST ile kural kümelerini yönetme
Yönetim API'si, kural kümeleri ve yayınlar oluşturmaya yönelik bir REST yönteminin yanı sıra büyük kural dağıtımlarını yönetmeye yardımcı olmak için aşağıdaki yöntemleri de sağlar:
- Kural kümelerini listeleme, alma ve silme
- kuralları listeleme, alma ve silme releases
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ünde en eski kuralları silecek bir mantık oluşturabilirsiniz. Örneğin, 30 günden uzun süredir dağıtılan tüm kural kümelerini silmek için projects.rulesets.list yöntemini çağırabilir, Ruleset nesnelerinin createTime anahtarlarındaki JSON listesini ayrıştırabilir, ardından ruleset_id ile karşılık gelen kural kümelerinde project.rulesets.delete yöntemini çağırabilirsiniz.
Güncellemelerinizi REST ile test etme
Son olarak, Management API, üretim projelerinizdeki Cloud Firestore ve Cloud Storage kaynaklarında söz dizimsel ve anlamsal testler çalıştırmanıza olanak tanır.
API'nin bu bileşeniyle yapılan testler şunlardan oluşur:
- Bir dizi
TestCasenesnesini temsil etmek içinTestSuiteJSON nesnesi tanımlama TestSuitegönderiliyor- Döndürülen
TestResultnesneleri ayrıştırma
TestSuite nesnesini testcase.json dosyasında tek bir TestCase ile tanımlayalım. Bu örnekte, Security Rules
dil kaynağını, bu kurallarda çalıştırılacak test paketiyle birlikte REST yüküyle satır içi olarak iletiyoruz. Bir kural değerlendirme beklentisi ve kurallar grubunun test edileceği istemci isteği belirtiriz. Ayrıca, test raporunun ne kadar
kapsamlı olduğunu da belirtebilirsiniz. Tüm
Security Rules dil ifadelerinin sonuçlarının rapora dahil edilmesi gerektiğini belirtmek için "FULL" değerini kullanabilirsiniz. Bu, istekle eşleşmeyen ifadeleri de
içerir.
{ "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, projects.test yöntemiyle değerlendirilmek üzere gönderilebilir.
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ŞARILI/BAŞARISIZ durumunu, hata ayıklama mesajlarının listelerini, ziyaret edilen kurallar ifadelerinin listelerini ve değerlendirme raporlarını içerir)
durum BAŞARILI ile erişimin düzgün şekilde izin verildiğini onaylar.
Hizmetler arası Cloud Storage Security Rules için izinleri yönetme
Cloud Storage Security Rules oluşturursanız Cloud Firestore doküman içeriklerini kullanarak güvenlik koşullarını değerlendirmek için Firebase konsolunda veya Firebase KSA'da iki ürünü bağlamak üzere izinleri etkinleştirmeniz istenir.
Bu tür hizmetler arası güvenliği devre dışı bırakmaya karar verirseniz:
Öncelikle, özelliği devre dışı bırakmadan önce kurallarınızı düzenleyerek Security Rules işlevlerini kullanarak Cloud Firestore'ye erişen tüm ifadeleri kaldırın. Aksi takdirde, özellik devre dışı bırakıldıktan sonra Security Rules değerlendirmeleri, depolama alanı isteklerinizin başarısız olmasına neden olur.
Google Cloud Console'daki IAM sayfasını kullanarak rolleri iptal etme ile ilgili Cloud kılavuzundaki adımları uygulayarak "Firebase Rules Firestore Service Agent" rolünü silin.
Bir sonraki sefer Firebase CLI'dan veya Firebase konsolundan hizmetler arası kuralları kaydettiğinizde özelliği yeniden etkinleştirmeniz istenir.