インターフェイスVPCエンドポイントの設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

今回は、Amazon EC2サービスがVPCエンドポイントを使用するように設定されていない状態について、そのリスクと対策を解説します。

ポリシーの説明

Amazon EC2 の Security Hub コントロール – AWS Security Hub

[EC2.10] Amazon EC2 サービス用に作成された VPC エンドポイントを使用するようにAmazon EC2 を設定することをお勧めします

このコントロールは、Amazon EC2 のサービスエンドポイントが各 VPC に対して作成しているかどうかをチェックします。VPC に Amazon EC2 サービス用に作成した VPC エンドポイントがない場合、コントロールは失敗します。

なおこのコントロールは、単一のアカウントのリソースを評価します。アカウント外のリソースは記述できません。 AWS Config と Security Hub はクロスアカウントチェックを実行しないため、アカウント間で共有されている VPCs FAILEDの検出結果が表示されます。Security Hub では、これらの FAILED 結果を抑制することを推奨します。

一方でコストが発生する箇所でもあるので、総合的に評価した上で設定の有効化有無は決めましょう。

リスク

Amazon EC2は、AWSクラウドでスケーラブルなコンピューティング能力を提供するサービスであり、そのAPIはインスタンスの起動、停止、変更、セキュリティグループの設定など、EC2リソースのほぼすべての操作を制御します。EC2サービスへのアクセスにVPCエンドポイント(インターフェイスエンドポイント)を使用していない場合、以下のようなセキュリティおよび運用上のリスクが発生します。

  • インターネットを介したAPIトラフィック: VPCエンドポイントを使用しない場合、VPC内のEC2インスタンスやLambda関数などのリソースからEC2 APIへの呼び出しは、インターネットゲートウェイを介してパブリックネットワークを経由することになります。これは、不正傍受や悪意のある活動のリスクを高める可能性があります。
  • 他のAWSリージョンへの意図しないAPI呼び出し: パブリックエンドポイントを介してEC2 APIにアクセスする場合、誤って他のリージョンのEC2 APIエンドポイントにリクエストを送信してしまう可能性があります。これにより、意図しないリソースの作成、変更、削除が発生し、設定ミスやセキュリティインシデントにつながることがあります。
  • データ転送コストの増加: EC2 APIへのトラフィックがインターネットゲートウェイを介してルーティングされる場合、データ転送のコストが発生する可能性があります。VPCエンドポイントはAWSネットワーク内にトラフィックを保持するため、コスト効率が向上します。
  • ネットワークアーキテクチャの複雑化: インターネット経由でのAPIアクセスを許可するためには、ルーティングテーブルやNATゲートウェイ、プロキシサーバーなどの追加設定が必要になる場合があります。VPCエンドポイントを使用することで、ネットワークアーキテクチャが簡素化され、管理が容易になります。

対策

EC2サービス用のVPCエンドポイントを設定することは、EC2 APIへのアクセスをAWSネットワーク内に限定し、セキュリティ、コスト、運用効率を向上させるための重要なベストプラクティスです。

  • インターフェイスVPCエンドポイントの利用: Amazon EC2 APIオペレーションにプライベートにアクセスするには、AWS PrivateLinkを利用したインターフェイスVPCエンドポイントを使用します。これにより、VPCとEC2サービス間のすべてのネットワークトラフィックがAmazonネットワークに制限され、インターネットを経由しなくなります。
  • プライベートIPアドレスの使用: インターフェイスエンドポイントは、VPC内にENI (Elastic Network Interface) を作成し、プライベートIPアドレスを付与します。これにより、VPC内のリソースはプライベートIPアドレスを介してEC2 APIに接続できるようになります。
  • エンドポイントポリシーによるアクセス制御: VPCエンドポイントには、エンドポイントポリシーをアタッチできます。このポリシーを使用して、どのIAMプリンシパルが、どのソースVPCから、どのEC2 APIアクションを実行できるかを詳細に制御できます。これにより、よりきめ細かいアクセス制御が可能になり、セキュリティ体制が強化されます。
  • DNS解決の自動設定: VPCエンドポイントを作成すると、VPCのプライベートDNSが自動的に設定され、EC2 APIのエンドポイント名(例: ec2.us-east-1.amazonaws.com)が、VPCエンドポイントのプライベートIPアドレスに解決されるようになります。これにより、アプリケーションコードを変更することなく、プライベートアクセスに切り替えることができます。
  • セキュリティグループによる保護: VPCエンドポイントにアタッチするセキュリティグループを設定し、VPC内の信頼できるリソース(例: EC2インスタンス、Lambda関数)からのEC2 APIへのアクセスのみを許可するように制限します。

修復方法

AWSコンソールでの修復手順

AWSコンソールを使用して、EC2サービス用のVPCエンドポイントを設定します。

前提:

  • EC2 APIへのアクセスが必要な既存のVPCが存在すること。
  • VPCエンドポイントを配置するサブネットがVPC内に存在すること。
  1. VPCサービスへ移動: AWSコンソールにログインし、Amazon VPC サービスを開きます。
  2. エンドポイントへ移動: 左側のナビゲーションペインで「Virtual Private Cloud」の下にある「エンドポイント」を選択します。
  3. エンドポイントの作成:エンドポイントを作成」をクリックします。
  4. エンドポイントの詳細設定:
    • 名前タグ (オプション): 任意の名前を付けます(例: ec2-api-vpc-endpoint)。サービスカテゴリ: 「AWS サービス」を選択します。サービス名: ドロップダウンリストから「com.amazonaws.[your-region].ec2」(例: com.amazonaws.us-east-1.ec2)を選択します。これはEC2 APIへのインターフェイスエンドポイントです。VPC: エンドポイントを作成したいVPCを選択します。サブネット: VPCエンドポイントに関連付けるサブネットを1つ以上選択します。高可用性のため、複数のアベイラビリティーゾーンにまたがるサブネットを選択することをお勧めします。IPアドレスタイプ: IPv4 を選択します。セキュリティグループ: エンドポイントに関連付けるセキュリティグループを選択または作成します。このセキュリティグループは、VPC内のEC2インスタンスなどからEC2 APIへのHTTPS (ポート443) トラフィックを許可するように設定する必要があります。ポリシー: 「フルアクセス」または「カスタム」を選択します。カスタムポリシーを使用する場合は、エンドポイントを介してEC2 APIにアクセスできるIAMプリンシパルや許可するAPIアクションを詳細に定義します。セキュリティ強化のため、最小権限の原則に基づいたカスタムポリシーを推奨します。DNS 名を有効にする: 通常は「DNS名を有効にする」にチェックを入れます。これにより、EC2 APIの標準DNS名がプライベートIPアドレスに解決されるようになります。
  1. エンドポイントの作成: 設定を確認し、「エンドポイントを作成」をクリックします。

エンドポイントが利用可能になると(状態がAvailableになる)、VPC内のリソースはインターネットを経由せず、AWSネットワーク内でEC2 APIにプライベートにアクセスできるようになります。

Terraformでの修復手順

TerraformでEC2サービス用のVPCエンドポイントを設定するには、aws_vpc_endpoint リソースを使用します。

# (例) VPCの定義
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  enable_dns_hostnames = true # エンドポイントのDNS解決に必要
  enable_dns_support   = true # エンドポイントのDNS解決に必要
  tags = {
    Name = "main-vpc"
  }
}

# (例) サブネットの定義
resource "aws_subnet" "private_subnet_a" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "${data.aws_region.current.name}a"
  tags = {
    Name = "private-subnet-a"
  }
}

resource "aws_subnet" "private_subnet_b" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "${data.aws_region.current.name}b"
  tags = {
    Name = "private-subnet-b"
  }
}

# (例) VPCエンドポイント用のセキュリティグループ
resource "aws_security_group" "ec2_endpoint_sg" {
  name        = "ec2-endpoint-sg"
  description = "Allow inbound HTTPS from VPC for EC2 endpoint"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = [aws_vpc.main.cidr_block] # VPC CIDRからのHTTPSアクセスを許可
    description = "Allow HTTPS from VPC"
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"] # アウトバウンドはすべて許可(必要に応じて制限)
  }

  tags = {
    Name = "ec2-endpoint-sg"
  }
}

# EC2サービス用のインターフェイスVPCエンドポイント
resource "aws_vpc_endpoint" "ec2_service_endpoint" {
  vpc_id              = aws_vpc.main.id
  service_name        = "com.amazonaws.${data.aws_region.current.name}.ec2" # EC2サービス名
  vpc_endpoint_type   = "Interface"
  private_dns_enabled = true # プライベートDNSを有効にする

  # エンドポイントを配置するサブネット
  subnet_ids = [
    aws_subnet.private_subnet_a.id,
    aws_subnet.private_subnet_b.id,
  ]

  # エンドポイントにアタッチするセキュリティグループ
  security_group_ids = [aws_security_group.ec2_endpoint_sg.id]

  # エンドポイントポリシー (オプション: アクセス制御を細かく設定)
  # policy = jsonencode({
  #   Version = "2012-10-17",
  #   Statement = [
  #     {
  #       Effect    = "Allow",
  #       Principal = "*", # 特定のIAMユーザー/ロールに限定を推奨
  #       Action    = "ec2:*", # 許可するEC2 APIアクションを限定
  #       Resource  = "*"
  #     }
  #   ]
  # })

  tags = {
    Name = "EC2ServiceEndpoint"
  }
}

# 現在のAWSリージョンを取得
data "aws_region" "current" {}

上記のTerraformコードでは、aws_vpc_endpoint リソースを使用してEC2サービス用のインターフェイスVPCエンドポイントを設定しています。

  • vpc_id: エンドポイントを作成するVPCのIDを指定します。
  • service_name: EC2サービスのAPIエンドポイントのサービス名を指定します。形式は com.amazonaws.[your-region].ec2 です。
  • vpc_endpoint_type = "Interface": インターフェイスエンドポイントであることを明示します。
  • private_dns_enabled = true: これを true に設定することで、EC2 APIの標準DNS名が自動的にVPCエンドポイントのプライベートIPアドレスに解決されるようになります。
  • subnet_ids: エンドポイントのENIを配置するサブネットを指定します。高可用性のため、複数のAZにまたがるサブネットを推奨します。
  • security_group_ids: エンドポイントに適用するセキュリティグループを指定します。このセキュリティグループは、VPCからのHTTPS (ポート443) トラフィックを許可する必要があります。
  • policy (オプション): エンドポイントポリシーを定義し、アクセス制御を詳細化できます。

aws_vpc.main.cidr_blockaws_subnet.private_subnet_a.id などのプレースホルダーは、実際の環境に合わせて修正してください。

最後に

この記事では、EC2サービス用にVPCエンドポイントを設定することの重要性について解説しました。VPCエンドポイントは、EC2 APIへのアクセスをAWSプライベートネットワーク内に限定し、セキュリティ、コンプライアンス、および運用効率を大幅に向上させるための非常に重要なインフラストラクチャコンポーネントです。 貴社のEC2 APIアクセスは、VPCエンドポイントを使用してプライベートにルーティングされていますか?この機会にぜひ設定を確認・強化してみてください。 こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る