Firebase
ActionsSDK
GoogleHome
actionsongoogle

GoogleHomeアプリのセキュリティ検討

こんにちは。

ActionsSDK + Firebase Functions + Firebase Realtime Databseの構成でアプリを作った時のセキュリティの検討内容です。
セキュリティに詳しい方はもっと良い方法ご存知かもしれませんが、とりあえずたたき台晒し台として記事にしておきます:wink::v:

構成

下記構成において、構成要素にそれぞれに対するセキュリティを検討する。

Google Home - Action on Google - Firebase Functions - Firebase Realtime Database

out.png

Actions on Googleのセキュリティ

  • 特に検討項目なし

Firebase Functionsのセキュリティ

基本的には外部公開情報となるAPIへの攻撃のみを検討すればよさそう

ロジックの機密性と安全性を維持
多くの場合、デベロッパーはクライアント側での不正行為を防ぐために、サーバー上でアプリケーション ロジックを制御することを好みます。また、そのコードをリバース エンジニアリングできるようにすることは望ましくない場合もあります。Cloud Functions はクライアントから完全に隔離されているため、非公開であり、常に必要とするとおりに動作します。

やりたいこと

Functionsのリソースを消費せずに、悪意のある第三者の過剰アクセスを防ぐ

Firebaseの公式資料

https://firebase.google.com/docs/auth/?hl=ja

プロジェクトを不正行為から守るため、Firebase では同じ IP アドレスでアプリケーションが短時間に使用できる新しいメールとパスワード、匿名での申し込みの数を制限しています。Firebase コンソールから、この割り当てを一時的に変更するようリクエストしたり、スケジュール設定したりできます。

検討してる方の記事

中間サーバーを用意する?

  • AWSだとAPI Gatewayというところで制御する技術みたい
  • Googleでは?:APIgeeというreverseproxyサービス
    • Qiitaの記事
    • やりたいことはこれでできそう。まだ試してない!
    • ルーティングも出来るみたいなので、複数プロジェクト立ち上げて、Functionsを振り分ければ、無料運用でもスケールもできそう

Homeアプリではどうする?

簡単にはfunctions内の処理にてGoogleHome以外からのアクセスを弾くようにする。

  • Functions内でアクセス制御する方法
    • Functionsのリソースは消費する
    • DialogflowのInlineEditorのデフォルトソースにてアクセス制御やっている
      • ただし、ActionsSDKの場合はDialogflowとjson構造が違うため流用は不可です

もうちょっと対応するならアカウントリンキングを利用してFunctionsへの匿名アクセスを許さない構成にするのがよさそう。ただ、これはGoogleHomeアプリの初回接続時の手続きが冗長になるというデメリットあり。

Firebase Realtime Databaseのセキュリティ

Firebase ConsoleからRealtime Databaseのルールが設定できる。

Firebase Realtime Database ルールについて
Firebase Realtime Database ルールでは、データベースへの読み取り / 書き込みアクセス権を持つユーザー、データが構造化される仕組み、存在するインデックスを決定します。(中略)デフォルトで設定されるルールの制限によって、データベースに対する読み取りと書き込みが完全にできるのは、認証ユーザーだけです。これによってデータベースは不正行為から保護されます。ルールをカスタマイズするか、認証を設定するまで、この保護は継続します。

やりたいこと

GoogleHomeではFunctionsからのアクセスのみread/write許容する

実現手段

RealtimeDBルールは全て許可しない設定にする。
Functionsにてfirebase adminを利用している場合は、特権状態で完全なアクセスが可能。

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

他参考になりそうな資料

https://qiita.com/otakky/items/1363e7b4c706dc9cd096

終わりに

悪意のある第三者がいなけりゃ世の中かなり楽ですね…:disappointed:
悲しんでても仕方ないので、セキュリティについてはお金と時間を勘案してできるところから対応していきたいです。
検討段階では調べ切れずに採用しなかったのですが、APIgeeってのをwebhookに噛ますと何となくよさそうに思いました。
次は使ってみたいと思います。

それでは。