Application Load Balancer (ALB) のアクセス制御は、リスナーで IP ホワイトリストとブラックリストを使用して、クライアントリクエストに対して詳細なフィルタリングを提供します。アクセス制御リスト (ACL) を作成し、IP エントリを追加し、その ACL をリスナーに関連付けることで、特定の送信元からのトラフィックを許可または拒否できます。
ACL とセキュリティグループの比較
ALB は、アクセス制御リスト (ACL) とセキュリティグループという 2 つのアクセス制御メソッドを提供します。
|
項目 |
ACL |
ALB セキュリティグループ |
|
制御の粒度 |
送信元 IP に基づきます。個々のリスナーに適用されます。 |
送信元 IP、プロトコル、ポートに基づきます。ALB インスタンス全体に適用されます。 |
|
IPv6 サポート |
サポートされていません。IPv4 エントリのみ追加できます。 |
IPv4 と IPv6 の両方のアドレスをサポートしています。 |
|
デフォルトの動作 |
ホワイトリストモードでは、ACL にない IP アドレスからのリクエストは拒否されます。ブラックリストモードでは、ACL にない IP アドレスからのリクエストは許可されます。 |
デフォルトですべてのトラフィックを許可します。アクセスを制限するには、0.0.0.0/0 に対する拒否ルールを明示的に追加する必要があります。 |
|
利用シーン |
単純な IP ホワイトリストおよびブラックリストに使用します。この方法は設定が簡単で、ルール優先度の理解は不要です。 |
ポートレベルの制御、IPv6 サポート、または ICMP 制御が必要なシナリオ。 |
前提条件
ALB インスタンスを作成し、リスナーを設定済みであること。
ACL の作成
アクセス制御リスト (ACL) は、IP エントリのコレクションです。ACL を作成してエントリを追加した後、リスナーに関連付けることで、ホワイトリストまたはブラックリストによるアクセス制御を実装できます。
コンソール
-
ALB コンソールの [アクセス制御] ページに移動します。上部のナビゲーションバーで、ターゲットインスタンスがデプロイされているリージョンを選択し、ACL の作成 をクリックします。
-
アクセス制御リストの作成 ダイアログボックスで、ACL の名前を入力し、OK をクリックします。
-
ACL が作成されたら、アクセス制御 ページで、ターゲット ACL の ID をクリックして詳細ページを開きます。エントリ タブで、次のいずれかの方法で IP エントリを追加します。
-
単一エントリの追加: エントリの追加 をクリックします。ダイアログボックスで、IP アドレス/CIDR ブロック と 備考 を入力し、追加 をクリックします。
-
バッチでのエントリ追加: ACL エントリの追加 をクリックします。次の形式でエントリを入力します。
-
1 行に 1 つのエントリを入力します。
-
IP アドレスまたは CIDR ブロックと備考を区切るには、縦棒 (|) を使用します。例: 192.168.1.0/24|test-remark。
-
一度に最大 20 個のエントリを追加できます。
-
バッチに ACL 内に既に存在するエントリが含まれている場合、バッチ追加操作は失敗します。重複するエントリを削除して、バッチを再送信してください。
-
-
エントリを追加した後、エントリリストからエントリを削除またはエクスポートできます。
API
-
CreateAcl を呼び出して ACL を作成します。
-
AddEntriesToAcl を呼び出して IP エントリを追加します。
-
RemoveEntriesFromAcl を呼び出して IP エントリを削除します。
アクセス制御の有効化または無効化
リスナーに対してホワイトリストまたはブラックリストを設定できます。
-
ホワイトリスト: ACL 内の IP アドレスからのアクセスのみを許可し、他のすべてのリクエストを拒否します。
-
ブラックリスト: ACL 内の IP アドレスからのアクセスを拒否し、他のすべてのリクエストを許可します。
ホワイトリストとブラックリストのどちらを設定した場合でも、関連付けられた ACL に IP エントリが含まれていない場合、アクセス制御は無効となり、リスナーはすべてのリクエストを転送します。サービスの中断を防ぐため、ホワイトリストを設定する前に、ACL に許可したい IP アドレスが含まれていることを確認してください。
コンソール
-
ALB コンソールの [インスタンス] ページに移動します。上部のナビゲーションバーで、ターゲットインスタンスがデプロイされているリージョンを選択し、インスタンス ID をクリックします。
-
リスナー タブで、ターゲットリスナーを見つけます。アクセス制御 列で、有効化 または 閉じる をクリックします。
-
有効化: ダイアログボックスで、アクセス制御モード (ホワイトリスト または ブラックリスト) と ACL を選択し、保存 をクリックします。
-
閉じる:確認ダイアログボックスで、OK をクリックします。
-
リスナー詳細ページの アクセス制御 セクションでも、アクセス制御を有効化または無効化できます。
API
-
AssociateAclsWithListener を呼び出して ACL をリスナーに関連付けます。
-
DissociateAclsFromListener を呼び出して ACL とリスナーの関連付けを解除します。
よくある質問
ホワイトリストが機能しない
原因: ACL がリスナーに関連付けられていないか、ACL に IP エントリがありません。空の ACL はすべてのトラフィックを許可します。
ソリューション: ALB インスタンスの リスナー タブで、ターゲットリスナーの アクセス制御 列に 有効 と表示されていることを確認します。また、関連付けられた ACL に IP エントリが含まれていることも確認します。
ホワイトリストに 0.0.0.0/0 を追加できない
原因: ACL は 0.0.0.0/0 エントリの追加をサポートしていません。コンソールでフォーマットエラーが報告されます。
ソリューション: 正しい方法は、アクセス制御を無効化し、必要なときに再度有効化することです。
ブラックリストが機能しない
原因: リクエストが CDN または WAF を介して ALB に転送されています。ALB に見える送信元 IP は、実際のクライアント IP アドレスではなく、CDN または WAF の送信元 IP です。
ソリューション: ALB のアクセス制御はレイヤー 4 で動作し、リクエストパケットの送信元 IP アドレスにのみ一致します。リクエストが CDN や WAF などのプロキシによって転送される場合、送信元 IP はプロキシの送信元 IP になります。そのため、ALB のブラックリストではクライアント IP アドレスをブロックできません。WAF または CDN レイヤーでブラックリストを設定してください。
ブラックリストで X-Forwarded-For の IP をブロックできない
原因: ALB のアクセス制御はレイヤー 4 で動作し、リクエストパケットの送信元 IP アドレスにのみ一致します。レイヤー 7 の X-Forwarded-For HTTP ヘッダーは解析しません。
ソリューション: WAF のカスタムルールを使用することでこれを実装できます。マッチフィールド を X-Forwarded-For、論理記号 を 次を含む、マッチコンテンツ をターゲット IP アドレス、Rule Action を 遮断 に設定します。詳細については、「カスタムルールの一致条件の設定」をご参照ください。
バックエンド NGINX の allow/deny ルールが機能しない
原因: トラフィックが ALB を経由してプロキシされると、バックエンドサーバーは送信元 IP として ALB インスタンスのローカル IP (ALB インスタンスが存在する vSwitch から割り当てられたプライベート IP アドレス) を受信します。NGINX の allow/deny ルールはこの送信元 IP に基づいているため、クライアントの IP アドレスと一致させることができません。
ソリューション:
-
(推奨) ALB のアクセス制御機能を使用して、ALB レイヤーで直接 IP ホワイトリストまたはブラックリストを設定します。
-
NGINX で、
X-Forwarded-Forリクエストヘッダーから実際のクライアント IP アドレスを取得し、実際の IP アドレスに基づいて allow/deny ルールを設定します。
ドメインまたはパスによるアクセス制限
説明: ACL はリスナーレベルで動作し、ドメイン名やパスで区別することはできません。有効にすると、ACL はリスナーに関連付けられているすべてのドメインに影響します。
代替ソリューション: Standard または WAF 有効の ALB インスタンスでは、転送ルールを使用できます。転送条件で、ドメイン名/パス と SourceIp の条件を設定して、一致するリクエストに対して 固定レスポンスを返す (403 など) ようにします。単一の転送ルールの SourceIp 条件は、最大 5 つの IP アドレスまたは CIDR ブロックをサポートし、0.0.0.0/x 形式はサポートしていません。IP アドレスの数が多い場合や、Basic ALB インスタンスを使用している場合は、WAF の使用を推奨します。WAF でカスタムルールを作成して、ホスト/パスと IP 条件を組み合わせてアクセス制御を行うことができます。
海外からの IP アドレスのブロック
説明: ALB のアクセス制御はジオブロッキング機能を提供しておらず、IP アドレスの国を自動的に識別することはできません。
代替ソリューション: 既知の海外 IP 範囲を手動でブラックリストに追加することはできますが、この方法は自動的に更新されず、エントリ数の制限を受けます。WAF のジオブロッキング機能の使用を推奨します。
多層プロキシシナリオにおけるアクセス制御
レイヤー 7 プロキシが ALB インスタンスの前にデプロイされている場合、レイヤー 4 で動作する ALB のアクセス制御機能は、直前のホップのプロキシの送信元 IP アドレスしか見ることができず、実際のクライアント IP アドレスを識別できません。そのため、適切なレイヤーでアクセス制御を設定する必要があります。CNAME レコードを使用して WAF が接続されているシナリオ (クライアント → CDN → WAF → ALB → Elastic Compute Service (ECS)) を例に、各レイヤーの送信元 IP アドレスとアクセス制御の推奨事項を以下に示します。
WAF 有効の ALB インスタンスは、保護のために SDK を使用します。WAF はトラフィック転送に関与しないため、WAF の送信元 IP ホップは存在しません。CDN などのレイヤー 7 プロキシが ALB インスタンスの前にデプロイされていない場合、このセクションで説明されている問題は適用されません。
|
レイヤー |
可視の送信元 IP |
アクセス制御の推奨事項 |
|
WAF |
|
このレイヤーで IP ホワイトリストとブラックリストを設定します。正しく設定すると、WAF は実際のクライアント IP アドレスに基づいてリクエストをブロックし、ジオブロッキングもサポートします。 |
|
ALB |
WAF の送信元 IP。 |
ALB インスタンスでホワイトリストを設定し、WAF の送信元 IP 範囲からのアクセスのみを許可します。これにより、攻撃者が WAF をバイパスして ALB インスタンスのパブリック IP アドレスに直接アクセスするのを防ぎます。WAF の送信元 IP 範囲は、WAF コンソールの [アクセス管理] ページで確認できます。 |
|
バックエンド ECS |
ALB インスタンスのローカル IP アドレス (ALB インスタンスが存在する vSwitch から割り当てられたプライベート IP アドレス)。 |
バックエンドの ECS インスタンスで、ALB インスタンスのローカル IP CIDR ブロックが iptables やその他のサードパーティのセキュリティソフトウェアによってブロックされていないことを確認してください。そうしないと、ヘルスチェックとリクエスト転送の両方が失敗します。 |
課金
アクセス制御機能は無料です。ALB インスタンスの課金の詳細については、「ALB の課金」をご参照ください。
クォータ
|
項目 |
エディション |
クォータ |
|
ACL に関連付け可能なリスナー数 |
Basic/Standard/WAF 有効 |
50 |
|
リスナーに関連付け可能な ACL 数 |
Basic/Standard/WAF 有効 |
3 |
|
リージョンで作成可能な ACL 数 |
Basic/Standard/WAF 有効 |
1000 |
|
ACL に追加可能なエントリ数 |
Basic/Standard/WAF 有効 |
500 |
|
ALB インスタンスに関連付け可能な ACL エントリ数 |
Basic/Standard/WAF 有効 |
800 |
|
リスナーに関連付け可能な ACL エントリ数 |
Basic |
300 |
|
Standard/WAF 有効 |
500 |
これらのクォータはハードリミットであり、増やすことはできません。詳細については、「ALB のクォータと制限」をご参照ください。