Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Kelola dan terapkan Aturan Keamanan Firebase

Firebase memberi Anda beberapa alat untuk mengelola Aturan Anda, masing-masing berguna dalam kasus tertentu, dan masing-masing menggunakan API pengelolaan Aturan Keamanan Firebase back-end yang sama.

Apa pun alat yang digunakan untuk menjalankannya, API manajemen:

  • Mencerna sumber Aturan : sekumpulan aturan, biasanya file kode yang berisi pernyataan Aturan Keamanan Firebase.
  • Menyimpan sumber yang diserap sebagai kumpulan aturan yang tidak dapat diubah .
  • Melacak penerapan setiap set aturan dalam rilis . Layanan yang mendukung Aturan Keamanan Firebase mencari rilis untuk sebuah proyek guna mengevaluasi setiap permintaan untuk sumber daya yang aman.
  • Menyediakan kemampuan untuk menjalankan tes sintaksis dan semantik dari kumpulan aturan.

Gunakan Firebase CLI

Dengan Firebase CLI , Anda dapat mengunggah sumber lokal dan menyebarkan rilis . Firebase Local Emulator Suite CLI memungkinkan Anda melakukan pengujian sumber lokal secara penuh .

Menggunakan CLI memungkinkan Anda untuk menjaga aturan Anda di bawah kontrol versi dengan kode aplikasi Anda dan menerapkan aturan sebagai bagian dari proses penerapan yang ada.

Buat file konfigurasi

Saat mengonfigurasi proyek Firebase menggunakan Firebase CLI, Anda membuat file konfigurasi .rules di direktori proyek Anda. Gunakan perintah berikut untuk mulai mengonfigurasi proyek Firebase Anda:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Basis Data Waktu Nyata

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Penyimpanan awan

// Set up Storage in your project directory, creates a .rules file
firebase init storage

Edit dan perbarui aturan Anda

Edit sumber aturan Anda langsung di file konfigurasi .rules . Pastikan bahwa setiap pengeditan yang Anda lakukan di Firebase CLI tercermin di Firebase console, atau Anda secara konsisten membuat pembaruan menggunakan Firebase console atau Firebase CLI. Jika tidak, Anda dapat menimpa pembaruan apa pun yang dibuat di Firebase console.

Uji pembaruan Anda

Local Emulator Suite menyediakan emulator untuk semua produk yang mendukung Aturan Keamanan. Mesin Aturan Keamanan untuk setiap emulator melakukan evaluasi aturan sintaksis dan semantik, sehingga melebihi pengujian sintaksis yang ditawarkan API manajemen Aturan Keamanan.

Jika Anda bekerja dengan CLI, Suite adalah alat yang sangat baik untuk pengujian Aturan Keamanan Firebase. Gunakan Rangkaian Emulator Lokal untuk menguji pembaruan Anda secara lokal dan mengonfirmasi bahwa Aturan aplikasi Anda menunjukkan perilaku yang Anda inginkan.

Terapkan pembaruan Anda

Setelah Anda memperbarui dan menguji Aturan Anda, terapkan sumber ke produksi. Gunakan perintah berikut untuk secara selektif menerapkan Aturan Anda sendiri atau menerapkannya sebagai bagian dari proses penerapan normal Anda.

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

Basis Data Waktu Nyata

// Deploy your .rules file
firebase deploy --only database

Penyimpanan awan

// Deploy your .rules file
firebase deploy --only storage

Gunakan konsol Firebase

Anda juga dapat mengedit sumber Aturan dan menerapkannya sebagai rilis dari konsol Firebase. Pengujian sintaksis dilakukan saat Anda mengedit di UI Firebase console, dan pengujian sintaksis tersedia menggunakan Rules Playground.

Edit dan perbarui aturan Anda

  1. Buka konsol Firebase dan pilih proyek Anda.
  2. Kemudian, pilih Realtime Database , Cloud Firestore atau Storage dari navigasi produk, lalu klik Rules untuk membuka editor Rules.
  3. Edit aturan Anda langsung di editor.

Uji pembaruan Anda

Selain menguji sintaks di UI editor, Anda dapat menguji perilaku Aturan semantik, menggunakan database proyek dan sumber daya penyimpanan, langsung di konsol Firebase, menggunakan Rules Playground . Buka layar Rules Playground di editor Rules, ubah pengaturan dan klik Run . Cari pesan konfirmasi di bagian atas editor.

Terapkan pembaruan Anda

Setelah Anda yakin bahwa pembaruan Anda sesuai dengan yang Anda harapkan, klik Publikasikan .

Gunakan Admin SDK

Anda dapat menggunakan Admin SDK untuk kumpulan aturan Node.js . Dengan akses terprogram ini, Anda dapat:

  • Terapkan alat khusus, skrip, dasbor, dan saluran CI/CD untuk mengelola aturan.
  • Kelola aturan dengan lebih mudah di beberapa proyek Firebase.

Saat memperbarui aturan secara terprogram, sangat penting untuk menghindari membuat perubahan yang tidak diinginkan pada kontrol akses untuk aplikasi Anda. Tulis kode Admin SDK Anda dengan mengutamakan keamanan, terutama saat memperbarui atau menerapkan aturan.

Hal penting lainnya yang perlu diingat adalah bahwa rilis Aturan Keamanan Firebase membutuhkan waktu beberapa menit untuk menyebar sepenuhnya. Saat menggunakan Admin SDK untuk menerapkan aturan, pastikan untuk menghindari kondisi balapan di mana aplikasi Anda langsung bergantung pada aturan yang penerapannya belum selesai. Jika kasus penggunaan Anda memerlukan pembaruan rutin untuk mengakses aturan kontrol, pertimbangkan solusi menggunakan Cloud Firestore, yang dirancang untuk mengurangi kondisi balapan meskipun sering diperbarui.

Perhatikan juga batasan ini:

  • Aturan harus lebih kecil dari 256 KiB teks yang disandikan UTF-8 saat diserialisasi.
  • Sebuah proyek dapat memiliki paling banyak 2500 total set aturan yang diterapkan. Setelah batas ini tercapai, Anda harus menghapus beberapa aturan lama sebelum membuat yang baru.

Buat dan terapkan kumpulan aturan Cloud Storage atau Cloud Firestore

Alur kerja umum untuk mengelola aturan keamanan dengan Admin SDK dapat mencakup tiga langkah terpisah:

  1. Buat sumber file aturan (opsional)
  2. Buat seperangkat aturan
  3. Lepaskan, atau terapkan, kumpulan aturan baru

SDK menyediakan metode untuk menggabungkan langkah-langkah ini menjadi satu panggilan API untuk aturan keamanan Cloud Storage dan Cloud Firestore. Sebagai contoh:

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

Pola yang sama ini berfungsi untuk aturan Cloud Storage dengan releaseFirestoreRulesetFromSource() .

Atau, Anda dapat membuat file aturan sebagai objek dalam memori, membuat kumpulan aturan, dan menerapkan kumpulan aturan secara terpisah untuk kontrol lebih dekat dari peristiwa ini. Sebagai contoh:

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

Perbarui kumpulan aturan Database Realtime

Untuk memperbarui kumpulan aturan Realtime Database dengan Admin SDK, gunakan metode getRules() dan setRules() dari admin.database . Anda dapat mengambil kumpulan aturan dalam format JSON, atau sebagai string dengan komentar yang disertakan.

Untuk memperbarui kumpulan aturan:

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score",
          "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

Kelola kumpulan aturan

Untuk membantu mengelola kumpulan aturan besar, Admin SDK memungkinkan Anda membuat daftar semua aturan yang ada dengan admin.securityRules().listRulesetMetadata . Sebagai contoh:

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

Untuk penerapan yang sangat besar yang mencapai batas 2500 set aturan dari waktu ke waktu, Anda dapat membuat logika untuk menghapus aturan terlama pada siklus waktu tetap. Misalnya, untuk menghapus semua kumpulan aturan yang diterapkan selama lebih dari 30 hari:

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

Gunakan REST API

Alat yang dijelaskan di atas sangat cocok untuk berbagai alur kerja, tetapi Anda mungkin ingin mengelola dan menerapkan Aturan Keamanan Firebase menggunakan API manajemen itu sendiri. API manajemen memberi Anda fleksibilitas terbesar.

Ketahuilah bahwa rilis Aturan Keamanan Firebase memerlukan waktu beberapa menit untuk menyebar sepenuhnya. Saat menggunakan REST API manajemen untuk menerapkan, pastikan untuk menghindari kondisi balapan di mana aplikasi Anda langsung bergantung pada aturan yang penerapannya belum selesai.

Perhatikan juga batasan ini:

  • Aturan harus lebih kecil dari 256 KiB teks yang disandikan UTF-8 saat diserialisasi.
  • Sebuah proyek dapat memiliki paling banyak 2500 total set aturan yang diterapkan. Setelah batas ini tercapai, Anda harus menghapus beberapa aturan lama sebelum membuat yang baru.

Buat dan terapkan kumpulan aturan Cloud Storage atau Cloud Firestore dengan REST

Contoh di bagian ini menggunakan Aturan Penyimpanan, meskipun berlaku juga untuk Aturan Cloud Firestore.

Contoh juga menggunakan cURL untuk melakukan panggilan API. Langkah-langkah untuk menyiapkan dan meneruskan token autentikasi dihilangkan. Anda dapat bereksperimen dengan API ini menggunakan API Explorer yang terintegrasi dengan dokumentasi referensi .

Langkah-langkah umum untuk membuat dan menerapkan kumpulan aturan menggunakan API manajemen adalah:

  1. Buat sumber file aturan
  2. Buat seperangkat aturan
  3. Lepaskan (deploy) set aturan baru

Anggaplah Anda sedang mengerjakan proyek Firebase secure_commerce dan ingin menerapkan Aturan Penyimpanan Cloud yang terkunci. Anda dapat menerapkan aturan ini dalam file storage.rules .

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Sekarang, buat sidik jari yang disandikan base64 untuk file ini. Anda kemudian dapat menggunakan sumber dalam file ini untuk mengisi muatan yang diperlukan untuk membuat kumpulan aturan dengan panggilan REST projects.rulesets.create . Di sini, kita menggunakan perintah cat untuk memasukkan isi storage.rules ke dalam payload REST.

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 mengembalikan respons validasi dan nama aturan, misalnya projects/secure_commerce/rulesets/uuid123 . Jika aturan tersebut valid, langkah terakhir adalah menyebarkan aturan baru dalam rilis bernama.

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'

Perbarui kumpulan aturan Realtime Database dengan REST

Realtime Database menyediakan antarmuka REST sendiri untuk mengelola Aturan. Lihat Mengelola Aturan Firebase Realtime Database melalui REST .

Kelola kumpulan aturan dengan REST

Untuk membantu mengelola penerapan aturan besar, selain metode REST untuk membuat kumpulan aturan dan rilis, API manajemen menyediakan metode untuk:

  • daftar, dapatkan, dan hapus kumpulan aturan
  • daftar, dapatkan, dan hapus rilis aturan

Untuk penerapan yang sangat besar yang mencapai batas 2500 set aturan dari waktu ke waktu, Anda dapat membuat logika untuk menghapus aturan terlama pada siklus waktu tetap. Misalnya, untuk menghapus semua kumpulan aturan yang diterapkan selama lebih dari 30 hari, Anda dapat memanggil metode projects.rulesets.list , mengurai daftar JSON objek Ruleset pada kunci createTime mereka, lalu memanggil project.rulesets.delete pada kumpulan aturan yang sesuai dengan ruleset_id .

Uji pembaruan Anda dengan REST

Terakhir, API manajemen memungkinkan Anda menjalankan pengujian sintaksis dan semantik pada sumber daya Cloud Firestore dan Cloud Storage dalam proyek produksi Anda.

Pengujian dengan komponen API ini terdiri dari:

  1. Mendefinisikan objek JSON TestSuite untuk mewakili satu set objek TestCase
  2. Mengirimkan TestSuite
  3. Parsing mengembalikan objek TestResult

Mari kita definisikan objek TestSuite dengan satu TestCase dalam file testcase.json . Dalam contoh ini, kami meneruskan sumber bahasa Aturan sebaris dengan payload REST, di samping rangkaian pengujian untuk dijalankan pada aturan tersebut. Kami menentukan ekspektasi evaluasi Aturan, dan permintaan klien yang akan diuji dengan set aturan. Anda juga dapat menentukan seberapa lengkap laporan pengujian, menggunakan nilai "FULL" untuk menunjukkan hasil untuk semua ekspresi bahasa Aturan harus disertakan dalam laporan, termasuk ekspresi yang tidak cocok dengan permintaan.

 {
  "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"}}}
            }
          ]
      }
    ]
  }
}

Kami kemudian dapat mengirimkan TestSuite ini untuk evaluasi dengan metode projects.test .

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

TestReport yang dikembalikan (berisi status SUCCESS/FAILURE pengujian, daftar pesan debug, daftar ekspresi Aturan yang dikunjungi dan laporan evaluasinya) akan mengonfirmasi dengan status SUCCESS bahwa akses diizinkan dengan benar.

Kelola izin untuk Aturan Keamanan Cloud Storage lintas layanan

Jika Anda membuat Aturan Keamanan Cloud Storage yang menggunakan konten dokumen Cloud Firestore untuk mengevaluasi kondisi keamanan , Anda akan diminta di Firebase console atau Firebase CLI untuk mengaktifkan izin untuk menghubungkan kedua produk.

Jika Anda memutuskan untuk menonaktifkan keamanan lintas layanan tersebut:

  1. Pertama, sebelum menonaktifkan fitur, edit aturan Anda, hapus semua pernyataan yang menggunakan fungsi Aturan untuk mengakses Cloud Firestore. Jika tidak, setelah fitur dinonaktifkan, evaluasi Aturan akan menyebabkan permintaan Penyimpanan Anda gagal.

  2. Gunakan halaman IAM di Google Cloud Console untuk menghapus peran "Firebase Rules Firestore Service Agent" dengan mengikuti panduan Cloud untuk mencabut peran .

Anda akan diminta untuk mengaktifkan kembali fitur tersebut saat berikutnya Anda menyimpan Aturan lintas layanan dari Firebase CLI atau Firebase console.