Firebase, 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çla ç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.
- Alınan kaynağı değiştirilemez bir kural grubu olarak depolar.
- Her kural grubunun yayınlanmasını izler. Firebase Security Rules'un etkin olduğu hizmetler, güvenli bir kaynak için her isteği değerlendirmek üzere projenin yayınını arar.
- Bir kural grubunun söz dizimi ve anlamsal testlerini çalıştırma olanağı sunar.
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.
CLI'yı kullanarak kurallarınızı uygulama kodunuzla birlikte sürüm kontrolü 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
Kurallar kaynağınızı doğrudan .rules
yapılandırma dosyasında düzenleyin.
Firebase KSA'da yaptığınız düzenlemelerin Firebase konsoluna yansıtıldığından veya güncellemeleri tutarlı bir şekilde Firebase konsolunu ya da Firebase CLI'yi 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 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 test için mükemmel bir araçtır. Güncellemelerinizi yerel olarak test etmek ve uygulamanızın Local Emulator Suite istediğiniz gibi davrandığını onaylamak için Rules kullanın.
Güncellemelerinizi dağıtma
Rules güncelleyip test ettikten sonra kaynakları üretime dağıtın.
Cloud Firestore Security Rules için .rules
dosyalarını, firebase.json
dosyanızı inceleyip güncelleyerek varsayılan ve ek adlandırılmış veritabanlarınızla ilişkilendirin.
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 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 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'yı seçin, ardından 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 Rules davranışı doğrudan Firebase konsolunda Rules Playground'u kullanarak test edebilirsiniz. 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.
Yönetici SDK'sını kullanma
Node.js için Admin SDK kural kümelerini kullanabilirsiniz. Bu programlı 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.
- Kuralları birden fazla Firebase projesinde daha kolay yönetin.
Kuralları programatik olarak güncellerken uygulamanızın erişim kontrolünde istenmeyen değişiklikler yapmaktan kaçınmak çok önemlidir. Özellikle kuralları güncellerken veya dağıtırken Admin SDKkodunuzuAdmin SDK güvenliği ön planda tutarak yazın.
Aklınızda bulundurmanız gereken bir diğer önemli nokta ise Firebase Security Rules yayınlarının tam olarak yayılmasının birkaç dakika süreceğidir. 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ış koşulları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 şu sınırlara da dikkat edin:
- Kurallar, serileştirildiğ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şabilir:
- Kural dosyası kaynağı oluşturma (isteğe bağlı)
- Kural grubu oluşturma
- Yeni kural grubunu 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 kural kümelerini 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 içeren 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 yönetimi de dahil olmak üzere çeşitli iş akışları için uygundur. Ancak Firebase Security Rules'ı yönetim API'siyle yönetip dağıtmak isteyebilirsiniz.Firebase Security Rules Management API, en fazla esnekliği sunar.
Ayrıca şu sınırlara da dikkat edin:
- Kurallar, serileştirildiğ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 Rules kullanır ancak Cloud Storage 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 edilmiş 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 east_store
adlı projenizdeki bir veritabanına kilitlenmiş Cloud Firestore Rules 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. Daha sonra, 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 grubu geçerliyse son adım, yeni kural grubunu 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ı birkaç dakika sürer. Dağıtım için Management REST API'yi 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, Rules yönetimi için kendi REST arayüzünü sağlar. Firebase'i Realtime Database Rules REST aracılığıyla yönetme başlıklı makaleyi inceleyin.
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 sağlar:
- Kural kümelerini listeleme, alma ve silme
- Yayın kuralları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ü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.
test etme hakkındaki kılavuzumuza göz atın.API'nin bu bileşeniyle test etme işlemi şunlardan oluşur:
- Bir
TestSuite
JSON nesnesi tanımlayarak birTestCase
nesne kümesini temsil etme TestSuite
gönderiliyorTestResult
nesne ayrıştırıldı
testcase.json
dosyasında tek bir TestCase
içeren bir TestSuite
nesnesi tanımlayalım. Bu örnekte, 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ı olacağını da belirtebilirsiniz. İsteğe eşleşmeyen ifadeler de dahil olmak üzere tüm Rules dil ifadelerinin sonuçlarının rapora dahil edilmesi gerektiğini belirtmek için "FULL" değerini kullanın.
{ "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) BAŞARILI durumuyla erişimin düzgün şekilde izin verildiğini onaylar.
Hizmetler arası Cloud Storage Security Rules için izinleri yönetme
Cloud Firestore doküman içeriklerini kullanarak güvenlik koşullarını değerlendiren Cloud Storage Security Rules oluşturursanız Firebase konsolunda veya Firebase KSA'da iki ürünü bağlamak için 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 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 Rules değerlendirmeleri, depolama isteklerinizin başarısız olmasına neden olur.
Rolleri iptal etme ile ilgili Cloud kılavuzundaki adımları uygulayarak Google Cloud Console'daki IAM sayfasını kullanarak "Firebase Rules Firestore Service Agent" rolünü silin.
Firebase CLI'dan veya Firebase konsolundan hizmetler arası kuralları bir sonraki kaydettiğinizde özelliği yeniden etkinleştirmeniz istenir.