Amazon Web Services ブログ

Amazon CloudFront用のAWS マネージドプレフィックスリストを使用したオリジンへのアクセス制限

本記事は、Solutions Architect の Karan Desai と Mike Lim によって投稿された「Limit access to your origins using the AWS-managed prefix list for Amazon CloudFront」と題された記事の翻訳となります。

Amazon CloudFront は、エッジロケーションの世界的なネットワークを利用した低レイテンシーかつ高速なデータ転送で、コンテンツを配信するための簡単で費用対効果の高い方法を提供します。CloudFront からのリクエストがオリジン(コンテンツの発信元、例えば Amazon Elastic Compute Cloud(Amazon EC2)インスタンス)にアクセスできるようにするためには、オリジンのセキュリティポリシーが CloudFront に属するすべての IP アドレス範囲からのアクセスを許可している必要があります。AWS は CloudFront を含む現在の IP アドレスを JSON 形式で公開しており、これらの IP 範囲は頻繁に変更される可能性があります。そのため、セキュリティグループ内の許可する IP アドレス範囲を常に手動で更新するのは面倒になる場合があります。これを避けるために、オリジンでのインバウンドアクセスをすべての IP アドレスに対して開放することを検討されるかもしれません。しかし、これは AWS Best Practices for DDoS Resiliency では推奨されていません。オリジンをすべての IPアドレス に対して開放しておくと、攻撃者はオリジンリソースに直接攻撃を仕掛けることができるため、CloudFront が提供し CloudFront に展開された保護機能をバイパスすることができてしまいます。

回避策として、CloudFront の IP アドレス範囲が変更された際にセキュリティグループを更新するプロセスを自動化し、CloudFront からオリジンへのアクセスを制限するソリューションも構築されています。この場合、追加の設定と Lambda 関数を実行するためのコストが発生します。この作業を簡略化するために、今回 CloudFront のAWS マネージドプレフィックスリストを導入し、オリジンへのHTTP/HTTPSのインバウンドトラフィックをCloudFront のオリジン向け IP アドレス範囲からのみに制限することができるようになりました。AWS マネージドプレフィックスリストは、AWSが作成・管理しており、追加費用なしで利用することが可能です。( Amazon VPC ) セキュリティグループルール、サブネットのルートテーブル、AWS Firewall Manager の共通セキュリティグループルール、その他マネージドプレフィックスリストを使用できる AWS リソースで CloudFront マネージドプレフィックスリストを参照することが可能です。

セキュリティグループでマネージドプレフィックスリストを使用する

CloudFront マネージドプレフィックスリストは、EC2 インスタンスや Application Load Balancer などのオリジンリソースにアタッチするセキュリティグループのインバウンドルールの一部として使用することができます。

CloudFront マネージドプレフィックスリストは、セキュリティグループ内で 55 ルールとしてカウントされることに注意してください。セキュリティグループのデフォルトのクォータは 60 ルールであり、インバウンドルールでCloudFront マネージドプレフィックスリストを 1 つ追加した場合、5 ルールしか追加できる余地がありません。CloudFront マネージドプレフィックスリストを使用して HTTP と HTTPS の両方のリクエストを制限したい場合は、2 つの別々のルールを追加する必要があり、合計で 110 ルールとしてカウントされます。必要であれば、このクォータの増加を要求する (リージョンは必要に応じて変更してください) ことができます。代わりに、オリジンへのアクセスに HTTPS のみを使用するように CloudFront オリジンプロトコルポリシーを構成することで、1 つのインバウンドポート(できれば HTTPS )のみを開き、を使用することができます。

AWS コンソールを使用して CloudFront マネージドプレフィックスリストを追加するには、セキュリティグループを使用するオリジンリソースがある AWS リージョンの VPC 下にあるセキュリティグループセクションに移動してください。

新しいセキュリティグループを作成するか、既存のセキュリティグループを更新することができます。インバウンドルールセクションで、タイプを HTTP または HTTPS として要件に応じて選択し、ソースは global.cloudfront.origin-facing という文字列を含むプレフィックスリストを検索してください。プレフィックスリスト ID は AWS のリージョンによって異なるため、以下のスクリーンショットに表示されているものとは異なる場合があります。

AWSリージョンのプレフィックスリストID の値は、Amazon VPC コンソールから確認することができます。マネージドプレフィックスリストセクションで、プレフィックスリスト名 com.amazonaws.global.cloudfront.origin-facing のエントリーを探します。次のスクリーンショットは、シンガポールリージョンのpl-31a34658という値を示しています。

さらに、AWS Command Line Interface(AWS CLI)を使用して、以下のコマンドを実行することで、AWS リージョンのプレフィックスリスト ID を確認することができます。

aws ec2 describe-managed-prefix-lists --query 'PrefixLists[?PrefixListName==`com.amazonaws.global.cloudfront.origin-facing`]' --region <insert region name>


AWS CloudFormation を使用してセキュリティグループを作成したい場合は、このサンプルテンプレートを使用し、CloudFront マネージドプレフィックスリストを含めるように要件に応じて編集することができます。

# /*
# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
# * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# *
# * Change History:
# * 2022-02-09: Created. Supported in all regions except Jakarta (ap-southeast-3), Osaka (ap-northeast-3), # * China and GovCloud regions
# */

AWSTemplateFormatVersion: 2010-09-09
Description: |
  CloudFront HTTPS ingress only SG via managed prefix list
  (https://aws.amazon.com/about-aws/whats-new/2022/02/amazon-cloudfront-managed-prefix-list/).
  Prefix list may not be supported for some regions
  (Run aws ec2 describe-managed-prefix-lists to verify presence of "com.amazonaws.global.cloudfront.origin-facing" PrefixListName)

Parameters:
  securityGroupName:
    Type: String
    Description: Security Group Name
    Default: CloudFront ingress only
  vpcID:
    Type: AWS::EC2::VPC::Id
    Description: VPC

Mappings:
  # aws ec2 describe-managed-prefix-lists  --region <REGION> | jq -r '.PrefixLists[] | select (.PrefixListName == "com.amazonaws.global.cloudfront.origin-facing") | .PrefixListId'
  AWSRegions2PrefixListID:
    ap-northeast-1:
      PrefixList: pl-58a04531
    ap-northeast-2:
      PrefixList: pl-22a6434b
    #ap-northeast-3
    #
    ap-south-1:
      PrefixList: pl-9aa247f3
    ap-southeast-1:
      PrefixList: pl-31a34658
    ap-southeast-2:
      PrefixList: pl-b8a742d1
    #ap-southeast-3:
    #  PrefixList:
    ca-central-1:
      PrefixList: pl-38a64351
    eu-central-1:
      PrefixList: pl-a3a144ca
    eu-north-1:
      PrefixList: pl-fab65393
    eu-west-1:
      PrefixList: pl-4fa04526
    eu-west-2:
      PrefixList: pl-93a247fa
    eu-west-3:
      PrefixList: pl-75b1541c
    sa-east-1:
      PrefixList: pl-5da64334
    us-east-1:
      PrefixList: pl-3b927c52
    us-east-2:
      PrefixList: pl-b6a144df
    us-west-1:
      PrefixList: pl-4ea04527
    us-west-2:
      PrefixList: pl-82a045eb
Resources:
  securityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Ref securityGroupName
      GroupDescription: Only allow CloudFront ingress
      VpcId: !Ref vpcID
      SecurityGroupEgress:
        - Description: Allow all outbound traffic
          IpProtocol: "-1"
          CidrIp: 0.0.0.0/0
      SecurityGroupIngress:
        - Description: Allow HTTPS from com.amazonaws.global.cloudfront.origin-facing
          IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          SourcePrefixListId:  !FindInMap [AWSRegions2PrefixListID, !Ref 'AWS::Region', PrefixList]
      Tags:
        - Key: StackName
          Value: !Sub ${AWS::StackName}
        - Key: StackId
          Value: !Sub ${AWS::StackId}
        - Key: Name
          Value: !Ref securityGroupName
Outputs:
  SecurityGroup:
    Value: !Sub "https://console.aws.amazon.com/ec2/home?region=${AWS::Region}#SecurityGroups:search=${securityGroup}"

VPCルートテーブルでマネージドプレフィックスリストを利用する

CloudFront のオリジンリソース以外の全てのVPC のルートテーブルで、CloudFront マネージドプレフィックスリストを使用することができます。例えば、CloudFront のオリジンリソースからの他のすべての発信インターネットトラフィックをブロックすることができます。

CloudFront マネージドプレフィックスリストは、ルートテーブルで 55 ルートとカウントされます。デフォルトのクォータは 50 ルートなので、ルートテーブルにプレフィックスリストを追加する前に、クォータの増加を要求する (リージョンは必要に応じて変更してください) 必要があります。

AWS コンソールを使用してCloudFront マネージドプレフィックスリストを追加するには、ルートテーブルを使用するVPC がある AWS リージョンで、VPC 下にあるルートテーブルセクションに移動してください。

ルートテーブルを新規に作成したり、既存のテーブルのルートを編集したりできます。ルートを編集セクションで、ルートを追加を選択します。送信先に、文字列 global.cloudfront.origin-facing を含むプレフィックスリストをドロップダウン リストから選択します。ターゲットには、これらのルーティングルールを適用するインターネットゲートウェイを選択し、変更を保存します。

AWS Firewall Manager でマネージドプレフィックスリストを使用する

AWS Firewall Manager を使用すると、組織内の複数のアカウントやリソースに対するセキュリティグループ関連付けを自動で一元的に制御することができます。例えば、CloudFront マネージドプレフィックスからのインバウンドアクセスのみを許可するセキュリティグループを含む共通セキュリティグループポリシーを定義することができます。そして、Firewall Manager は、このセキュリティグループを複数の AWS アカウントで選択した Application Load Balancer と EC2 インスタンスに自動的に適用できます。

AWSコンソールを使用してこれを作成するには、管理者アカウントで Firewall Manager に移動します。この投稿の「セキュリティグループでマネージドプレフィックスリストを使用する」セクションで説明したものと同じ手順で、新しいセキュリティグループを作成します。Security policies に移動し、新しいポリシーを作成します。Policy details セクションで Security group を選択し、Security group policy type セクションで Common security groups を選択し、Region で任意のリージョンを選択します。Policy rules のセクションで、先ほど作成したセキュリティグループを選択し、ポリシーに追加します。Policy actionでは、非準拠のリソースを自動修復してFirewall Managerの対象となるすべてのリソースに新しいセキュリティポリシーを適用するか、非準拠のリソースのみを特定し手動で更新するかを選択することができます。

Application Load Balancer、Classic Load Balancer、EC2 インスタンス、Elastic Network Interface にこのセキュリティグループを適用し、それらすべてのインバウンドアクセスを CloudFront のオリジン向け IP アドレス範囲にのみに制限するために、Firewall Manager のポリシー範囲を定義することが可能です。

まとめ

CloudFront マネージドプレフィックスリストを使用して、オリジンへのアクセスを CloudFront からのトラフィックのみに制限する方法を学びました。マネージドプレフィックスリストは、GovCloud、中国、アジアパシフィック(ジャカルタ)を除くすべての地域で、AWS コンソール、および AWS SDK からすぐに利用することができます。

CloudFront マネージドプレフィックスリストには、Locations and IP address ranges of CloudFront edge servers に記載されている 100 以上のプレフィックスと比較して、プレフィックスが少ないことにお気づきかもしれません。これは、プレフィックスリストが CloudFront のエッジとリージョンのロケーションから AWS オリジン向けサーバーを含んだサブセットであるためです。ip-ranges.json からサービスコード値 CLOUDFRONT_ORIGIN_FACING と CLOUDFRONT でそれぞれプレフィックスをフィルタリングすることが可能です。

このAWS マネージドプレフィックスリストは、ネットワーク層での保護を提供しますが、インフラとデータのセキュリティ戦略全体の 1 部に過ぎません。さらに、クラウドでのセキュリティを確実にするために、CloudFront の他の方法を実装する必要があります。さらに、アプリケーション層での徹底的な防御のために AWS WAF の利用を検討したり、包括的なセキュリティ対策の一環として、疑わしいトラフィックをブロックするために AWS Network Firewall や Amazon GuardDuty を利用することも可能です。組織全体のアクセスを大規模に管理するには、Firewall Manager を使用します。Firewall Manager の詳細については、このセキュリティに関する記事を参照してください。

翻訳は Solutions Architect の長谷川 純也が担当しました。原文はこちらです