紙一重の積み重ね

アラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【SaaS on AWS 2022 講演メモ】SaaS on AWS における認証認可の実装パターン ~ AWS サービスで実現するマルチテナント ~ #ISVSaaS

はじめに

2022年10月26日に開催された SaaS on AWS 2022 の講演メモです。

一言感想

SaaS プロダクトの認証認可を、Cognito に任せてしまう、というのは考えたことがあります。ユーザープール等デフォルトクォータに注意が必要、というのはとても大きな学びでした。Cognito は、とにかく素早く作ってリリースするために、立ち上げ直後の SaaS には有用なのではないかと感じました。

登壇者

AWS 柴田 龍平さん

登壇メモ

  • SaaS ビジネスでは、イノベーションサイクルを高速に低コストで回す
    • 認証認可の戦略も重要なPoint
  • SaaS の認証認可で考えるべきこと
    • アクセス制御
    • テナント分離
    • スケーラブルなテナント識別
    • 既存の IdP との連携
    • 実装コストの低さ
  • SaaS でよくあるアクセス制御のパターン
    • 以下、3つの掛け算となる
      • テナント分離
        • 別テナントのデータ保護
          • ここの保護ができないと、ビジネス上の重大なリスクとなる
          • ここの実現方法は他の要素と切り離して考える
      • 契約プラン
        • 上位プランでのみ提供する機能がある
      • ユーザーロール
        • テナント内管理者のみユーザー管理を許可する
  • スケーラブルなテナント識別
    • 認証サービスが発行するトークン JWT に、ユーザーとテナントの情報を格納する
      • テナント特定の負荷が減らせる
  • テナント毎のコンプライアンス要件
    • 独自のパスワードポリシー
    • MFAの必須化
      • 典型的な要件を、テナント階層ごとに整理するのが良い
  • IdP との連携
    • 独自仕様は回避すること!!
    • SAML 2.0 や、 Open ID Connect などの標準仕様を活用する
    • 手軽に実装できるマネージドサービスや、パートナーソリューションの活用も検討する
  • ユーザー認証のためのパターン
    • Cognito
      • 運用負荷:低
    • パートナーソリューション(クラウドサービス)
      • 運用負荷:低
    • パッケージを利用(OSSや、商用パッケージ)
      • EC2や、Fargate で稼動
      • 運用負荷:中
    • ライブラリなどを使って独自実装
      • ビジネスの差別化要因になる場合
      • 自社 IDaaS として開発
  • 外部 IdP とのフェデレーション実装の簡略化
    • Cognito Auth API でアプリから見た 外部 IdP の IF を抽象化できる
  • 実装オプション
    • カスタム認証フローを利用
    • サーバサイド認証を利用
  • Cognito でのマルチテナント
    • ユーザープールベース
      • テナント毎二ユーザープールを分離
      • テナント毎に、パスワードボリシー、MFA設定を変更できる
      • アカウントごとのデフォルトクォータ
        • ユーザープール数は1000
        • テナントが多くなると厳しい
    • カスタム属性ベースのマルチテナント
      • 単一のユーザープールを使いつつ、カスタム属性を持つ
        • custom: tenant_id など
    • グループベースのマルチテナント
      • ユーザープール内のデフォルトクォータ
        • グループ数は10000
    • アプリクライアントベース
      • テナント毎にアプリクライアント(鍵)を作成する
  • テナントルーティングロジックの実装
    • ドメインベースでのアクセス
      • サブドメインで分離
  • SaaS におけるレイヤー毎のアクセス制御
    • クライアント
    • Gateway
      • 認証済みユーザーのみ許可
      • JWT の検証
        • API Gateway
          • REST API
            • Cognito User Pools オーソライザー
            • Lambda オーソライザー
    • コンピュート
      • テナントを識別し、ビジネスロジックを実行
    • Storage/DB
      • S3
        • バケットの分割(サイロ)
      • Aurora
        • インスタンスの分離(サイロ)
        • 行レベルセキュリティ
  • テナント分離のための一時的な IAM ロール引受
    • JWT → AWS STS → 権限が絞り込まれたクレデンシャルで、DBに書き込み
  • ABAC を用いた IAM ロール / ポリシーの管理性向上
    • エーバック、と読む
    • 複数テナントで共有する IAM ロール・ポリシーで、動的なテナント情報の属性を利用する(ABAC)ことで、クォータ回避ができる