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