👏

AWSでVPC内からVPC外のAWSサービスへ通信する場合はVPCエンドポイントを使ってポリシーを設定しようという話

2023/03/08に公開

はじめに

AWSでは、VPC内のプライベートな環境で稼働するリソース(EC2など)からVPC外でパブリックに提供されるサービス(S3など)へアクセスする方法に、以下の2種類があります。

  • グローバルIPアドレスを割り当てたリソースからInternet Gatewayを経由したアクセス
  • VPCエンドポイントを経由したアクセス

前者のようにグローバルIPを使用したアクセス方法でも、通信はインターネットを経由せず、AWSのプライベートネットワーク内での通信です。(VPCのよくある質問
そのため、セキュリティ的には上記2つの方法に違いはないような気がします。

ただ、内部からの不正を考えた場合、前者の方法では対策できないケースがあります。
この点について書かれたサイトが見当たらなかったので、ここに書いてみようと思います。

VPC内からVPC外のAWSサービスへの通信を許可した場合の内部不正経路

まず、VPC内にグローバルIPを割り当てたリソースからInternet Gatewayを経由したVPC外のAWSサービスへの通信として、以下の図のようなAWSアカウントAの構成を考えます。

セキュリティ設定としては、以下のように接続元・接続先でアクセス権の制御を行います。
 接続元(EC2):IAMロールを使用して、許可する接続先リソース(S3バケット)と操作などを指定
 接続先(S3):バケットポリシーを使用して、許可する接続元と操作などを指定

また、インターネットへの接続経路にはAWS Network Firewallやプロキシサーバを配置することで、許可された安全なサイトにしかアクセスできない設定とします。

ここで以下のような権限を持つ内部不正者を考えます。
・AWSアカウントAのIAMユーザは割り当てられておらず、アカウントAのリソースの参照・更新は実施不可
・社内ネットワークを経由して、EC2へリモートログイン可能

社内ネットワークも適切に設定されており、内部の情報を外部に持ち出すことはできないケースにおいても、以下のように内部不正者が管理するAWSアカウントBを利用することで情報を持ち出すことができてしまいます。

このような不正アクセスはS3バケットへの通信のみでなく、CloudWatchやSystems Managerでも
EC2へ導入するエージェント(CloudWatch AgentやSSM Agent)に対してオンプレサーバを管理するのと同じ設定を行えば、異なるAWSアカウントを疎通することが可能です。

このような異なるAWSアカウントへの接続は、AWS Network Firewallやプロキシサーバで防ぐことはできず、アカウントAの管理者はこの内部不正を禁止することはできません。

内部不正への対策

次に、VPC内からVPCエンドポイントを経由したVPC外のAWSサービスへ通信として、以下の図のような構成を考えます。

この構成でもVPCエンドポイントのポリシーをデフォルト設定(フルアクセス)とすると、上に記載したのと同じ方法で異なるAWSアカウントにアクセスできてしまいますが、カスタムポリシーを設定することで通信を制御することができます。

具体的には以下のポリシーを設定することで、アカウントA以外のAWSアカウントへのアクセスを防ぐことが可能ですので、内部不正の対策となります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalAccount": "<アカウントAのID>"
        }
      }
    }
  ]
}

異なるアカウントへのアクセスを許可する場合には、「"aws:PrincipalAccount" : "<許可するアカウントID>"」を複数並列で記載することで、明示的に許可します。

注意が必要なのはS3のゲートウェイエンドポイントに対するポリシー設定です。

Amazon Linux 2のリポジトリなどAWSに関連するリソースを一般に公開しているサイトがS3で提供されているケースがあります。VPCからインターネット向けの経路とS3のゲートウェイエンドポイントの両方が設定されている環境では、S3の一般公開サイトへHTTP/HTTPSでアクセスする際にもゲートウェイエンドポイントを経由した通信となります。この通信ではIAMの認証は不要でAWSアカウントの情報はやりとりされないため、上記のポリシーにより通信が拒否されてしまいます。

このような通信を許可するには、Amazon Linux 2のリポジトリの情報などを参照して、運用で使用するS3バケットへのアクセスを許可する設定を追加してください。

最後に

AWSで内部不正を防ぐためのVPCエンドポイントポリシーについて記載してみました。
セキュアなシステムを構成する際に参考にしていただければと思います。

Discussion