保护 Google Firebase 免受 DDOS/攻击者的侵害并防止意外账单

Asp*_*ger 7 firebase firebase-security firebase-realtime-database

我正在考虑使用 firebase 实时数据库,但有一些事情我担心:

  • 高额意外账单
  • 系统错误

我正在考虑做一些事情:

  • 第 1 层:Firebase 前面的 CloudFare CDN。
  • 第 2 层:对写/读操作进行基于时间的速率限制的安全规则。
  • 第 3 层:只有经过良好身份验证的用户才能调用 firebase 端点。
  • 紧急层:我跟踪读写操作的数量。如果这些超过某个阈值,我会禁用我的项目的计费功能。

这足够安全吗?

如何保护我的 Firebase 免受读/写漏洞或 DDoS 攻击?

tra*_*mer 3

围绕这三个步骤的一般方法是很好的实践。

请考虑 Firebase 是基于云的,因此它的曝光度是世界的前沿和中心,以下是对 Firebase 的一些具体建议以及如何引入看门狗实践:

避免不安全的规则

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }


}
Run Code Online (Sandbox Code Playgroud)

注意规则级联,确保遍历整个树来检查规则

{
    "rules": {
        "users": {
            "$uid": {
                ".read": "auth.uid == $uid || root.child('users').child(auth.uid).child('isAdmin').val() == true",
                ".write": "root.child('users').child(auth.uid).child('isAdmin').val() == true",
                ".indexOn": ["email"]
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

就像下面的代码一样,因为创建授权允许创建恶意用户(可能是由机器人)

恕我直言 - 我会制作本手册,或者至少将其与用户注册 IP 和蜜罐之类的内容进行检查

const getCustomClaimsByEmail = require('../utilities/get-custom-claims-by-email');
const setCustomClaims = require('../utilities/set-custom-claims');

module.exports = ({ admin, environment }) => user => {
  const db = admin.firestore();
  const usersCollection = db.collection(environment.schema.users);
  const customClaimsRef = admin.database().ref(environment.schema.customClaims);
  const auth = admin.auth();
  const email = extractEmailFromUser(user);

  return Promise.resolve()
    .then(getCustomClaimsByEmail(customClaimsRef, email))
    .then(setCustomClaims(auth, user.uid))
    .then(claims => {
      const update = mapUserUpdate(claims, user);
      return usersCollection.doc(user.uid).set(update, { merge: true });
    });
};

function mapUserUpdate(claims, user) {
  const email = extractEmailFromUser(user);

  return {
    claims,
    email,
    emailVerified: user.emailVerified,
    lastSignInTime: user.metadata.lastSignInTime,
    creationTime: user.metadata.creationTime,
    providerData: user.providerData,
  };
}

function extractEmailFromUser(user) {
  return user.email || user.providerData.find(({ email }) => email).email;
}
Run Code Online (Sandbox Code Playgroud)

现在到你的 DDOS / 流量,

您可以通过遵循此清单来避免滥用流量,并在启动期间遵循这些清单