はじめに
不特定多数に公開するWebアプリではない場合、セキュリティの観点からするとできればサインイン画面まで到達する前にアクセス制限をかけ、そもそもWebアプリまで到達できないようにしたい。 サインイン認証をMFAなどで強固にすることで不正アクセスの対策にはなるが、そもそもアクセスされてサインイン試行されまくるとそれだけでサーバーに負荷がかかる。
そこで今回はAWSマネージなサービスだけでアクセス制限を実現する方法を整理したいと思います。
アクセス制限する方法
クライアントからのアクセスを制限する方法はいくつか考えられる。
- 接続元のIPアドレスによる制限
- クライアント証明書による認証
- 外部IdPによる認証
AWSサービスによってこれらの利用可否が異なるので、整理します。
AWSサービスごとの利用可能なアクセス制限方法
ざっくりまとめると次の表のとおり。
IPによる制限 | クライアント証明書 | 外部認証 | その他 | |
---|---|---|---|---|
API Gateway | 〇 | 〇 | △Cognitoのみ | Lambdaオーソライザで作り込みが可能 |
ALB | 〇 | × | 〇 OIDC対応 | |
WAF | 〇 | × | × | SQLインジェクションなどアプリレイヤーでのセキュリティ強化 |
API Gateway
- 接続元のIPアドレスによる制限が可能。リソースポリシーを使用することで実現可能。
- mTLSによるクライアント証明書の認証が可能
- APIキーによる制限
- APIキーを知っていれば結局どこの誰からでもアクセスできるため強度としては不十分。
- Cognitoユーザープールによる認証。アクセスしてくるユーザーをCognitoで管理することが前提となる。
ALB(Application Load Balancer)
- 接続元IPアドレスによる制限が可能。
- WAFでも制限できる。WAFを使うほうがより高度な設定/制限が可能なため便利。
- OpenID Connect(OIDC)やCognitoによるユーザー認証が使える。ALBアクセス時にユーザー認証を要求する。 認証済みのリクエストのみをALBのターゲット(Webアプリ)に送信する。
- クライアント証明書による認証はできない。
WAF
- 接続元のIPのアドレスによる制限が可能
- クライアント証明書認証は不可
- 外部IdPによる認証は不可
なお、WAFを適用できるAWSサービスは以下のとおり
まとめ
いろんなサービスで少しずつ取れる手段が異なるので注意が必要。 うまく自身の構成で使うことができれば簡単かつ管理不要でセキュリティ強度を高めることができるので積極的に使っていきたいところ。 AWS IoTで使われているような、クライアント証明書の発行とアクセス認証をセットで簡単に使えるといいなぁと期待しています。