こんにちは、Enterprise Cloud部 ソリューションアーキテクト1課 宮形 です。
2024年今年も AWS Summit Japan の開催が近づき、日々熱量が高まるのを感じますね。私も参加する予定ですので、ガバメントクラウド関係で役立つ情報があればBLOG等で発信したいと思っております。
今回BLOGでは、ガバメントクラウドや地方自治体様など厳しいセキュリティ要件でのAWSご利用において、頻繁に利用されると思われる VPCエンドポイント について、仕様を正しく理解して安全にご利用いただくためのポイントについてご紹介します。実はVPCエンドポイントは正しく設定しないと、意図せず外部に情報が洩れる抜け道となる可能性があるのです。
VPCエンドポイントから外部に情報が洩れるケースとは
VPCエンドポイントはインターネットに接続しないプライベートな環境において利用されることが多く、デジタル庁から提供される資料「ガバメントクラウド利用における推奨構成(AWS編)」*1 にも表記が多くみられます。
このVPCエンドポイントですがデフォルト状態で作ってしまうとセキュリティ対策が十分設定されておらず、外部のAWSアカウントとのデータ交換が可能な状態となっています。ここを悪用されると外部への情報漏洩に繋がる可能性があります。そのケースと対策方法についてご紹介します。
まずはVPCエンドポイントの機能を正しく理解
AWS PrivateLink の概念 - Amazon Virtual Private Cloud
- VPC内のAWSリソースがプライベートIPアドレスを使用してVPC外のAWSサービスへ接続する通信経路を提供
- 通信がインターネット外部に出ないようにする
これらが代表的なVPCエンドポイントの機能になります。誤解してはいけないのが、通信先のVPC外のAWSサービスは同じAWSリージョンであれば外部のAWSアカウントであっても通信が可能であることです。
外部へ情報が洩れるケース
下記の状況で外部のAWSアカウントに情報を持ち出しすることが可能か試してみます。
- VPCエンドポイントにポリシーが設定されていない(フルアクセス)
- VPCエンドポイントの接続先FQDNまたはIPアドレスを知っている
- 外部のAWSアカウント認証情報を知っている(例では アクセスキーを利用。IAMロールのARNでも可能)
- 外部のAWSアカウントにS3バケットを用意している (例では miyagata-s3bucket-external-XXXXXX )
インターネット未接続のVPC上のEC2から、外部のAWSアカウント上にあるS3バケットへファイルをアップロードします。外部のAWSアカウントの認証情報にはアクセスキー・シークレットキーを用います。EC2側の AWS CLI に認証情報を設定した後に aws s3 cp
コマンドでテキストファイルをS3バケットへコピーします。
> cat sample.txt hello world! > aws s3 ls --endpoint-url https://bucket.vpce-XXXXXXXXXXXX.s3.ap-northeast-1.vpce.amazonaws.com : 2024-06-14 02:13:10 miyagata-s3bucket-external-XXXXXX > aws s3 cp sample.txt s3://miyagata-s3bucket-external-XXXXXX/ --endpoint-url https://bucket.vpce-XXXXXXXXXXXX.s3.ap-northeast-1.vpce.amazonaws.com : upload: ./sample.txt to s3://miyagata-s3bucket-external-XXXXXX/sample.txt
aws s3 cp
コマンドはエラーなく成功します。外部のAWSアカウントのAWSマネジメントコンソール上には、S3バケット(例では miyagata-s3bucket-external-XXXXXX) の中にアップロードしたテキストファイルが保存されており閲覧できることが確認できます。
この行為を行うためには外部のAWSアカウントの認証情報を知っており、EC2のOS上で操作を行う必要がありますので、勝手に起こることは無いとは思われます。しかし、職員や運用管理補助者の従事者が悪意をもっておりEC2のOSを操作することができれば簡単に実施できます。マルウェアやマクロ等にプログラムとして組み込むことも十分可能だと思われます。
対策方法
VPCエンドポイントにはJSON形式でポリシーを設定することができます。下記は特定のS3バケット (例では miyagata-s3bucket-internal-XXXXXX)のみ通信を許可する設定例となります。意図しない外部のAWSアカウント上のAWSリソースへの通信にVPCエンドポイントが利用されることを防止できます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": [ "arn:aws:s3:::miyagata-s3bucket-internal-XXXXXX", "arn:aws:s3:::miyagata-s3bucket-internal-XXXXXX/*" ] } ] }
VPCエンドポイントのポリシーの設定方法をご紹介します。AWSマネジメントコンソールのVPCコンソールへ移動し、左のナビゲーションペインより「エンドポイント」を展開します。 一覧より該当のVPCエンドポイントを選択し「アクション」→「ポリシーを管理」を押下します。
「ポリシーを編集」の画面が開きます。「カスタム」を選択し、JSON形式のポリシーを記載します。「保存」を押下します。VPCエンドポイントの設定は以上で完了です。
このVPCエンドポイントにおいてはポリシー内で指定したS3バケット以外への通信は全て拒否されますので AccessDenied
が返るようになります。
VPCエンドポイントのデフォルト状態ではこのポリシーが「フルアクセス」となっていますので、既に構築したり設計された内容を今一度ご確認いただくことをお勧めします。
弊社の過去BLOGでVPCエンドポイントのポリシー記載方法をご紹介しておりますので、ぜひこちらもご覧ください。
まとめ
いかがでしたでしょうか。「VPCエンドポイント=閉域」ではありませんが、ポリシーを適用に設定することで外部に意図せず情報が洩れる事態を防止し、安心してご利用いただけることがご理解いただけたかと思います。
本BLOGが皆様への少しでもの参考になれば幸いです。
*1:デジタル庁 - ガバメントクラウド先行事業(市町村の基幹業務システム等)の中間報告を掲載しました:https://www.digital.go.jp/news/ZYzU5DYY