OpsJAWSということで、セキュリティ運用をテーマに、S3のVPCエンドポイントについて触れたいと思います。
VPC エンドポイントとは
公式のドキュメントによれば、
VPC エンドポイント
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints.html
VPC エンドポイント では、PrivateLink を使用する AWS サービスや VPC エンドポイントサービスに VPC をプライベートに接続できます。インターネットゲートウェイ、NAT デバイス、VPN 接続、または AWS Direct Connect 接続は必要ありません。VPC のインスタンスは、サービスのリソースと通信するためにパブリック IP アドレスを必要としません。VPC と他のサービス間のトラフィックは、Amazon ネットワークを離れません。
とあります。つまり、VPCのプライベートサブネットから直接AWSのサービスにアクセスできる有り難い機能です。
今回、次に示すVPCエンドポイントを利用したユースケースを考えてみます。
インターネット接続のないVPCからS3にアクセスする
オンプレミスの企業ネットワークの延伸としてVPCを利用する環境を想定します。
VPCの要件は次の3つとします。
- VPCはインターネット接続しない
- VPCと企業ネットワークとは閉塞網など(DirectConnect)で接続
- VPC内のEC2からはS3(verysecure-bucket)を使いたい
VPCはインターネットゲートウェイをアタッチしないので、S3にアクセスするにはオンプレミスの企業ネットワーク経由でインターネットに抜けるか、VPCエンドポイントを利用するかの2択になります。
今回、前者は対象外とし、VPCエンドポイントを利用してS3にアクセスするケースを考えてみます。
この場合、下図のようにVPCエンドポイントを作成し、ルートテーブルにVPCエンドポイントへのルートを追加します。これでS3へのルートは確保されるため、EC2からS3へのアクセスが可能となります。
よりセキュアな構成にするためには、S3バケットには、このVPC以外からのアクセスを拒否するバケットポリシーを設定します。これにより、インターネットや他のVPCなどの別のネットワークからアクセスできなくなります。これでセキュリティも万全ですね
特定の VPC へのアクセスの制限
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html#example-bucket-policies-restrict-access-vpc
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Access-to-specific-VPC-only",
"Action": "s3:*",
"Effect": "Deny",
"Resource": ["arn:aws:s3:::verysecure-bucket",
"arn:aws:s3:::verysecure-bucket/*"],
"Condition": {
"StringNotEquals": {
"aws:sourceVpc": "vpc-xxxxxxxx"
}
},
"Principal": "*"
}
]
}
悪意のある者が別のS3バケットにデータを持ち出す
では、タイトルに掲げた悪意のある者が、この環境から他のS3バケット(図のtakeout-bucket)にデータをアップロードできるのでしょうか?
場合によっては、できてしまいます
ただしこれは、VPCエンドポイント作成時に、とりあえずフルアクセスにしていた場合など、エンドポイントに適切なアクセスコントロールを行っていない場合に限ります(ずるいですね、ここの説明を省いてました)。
解決方法
解決方法は簡単で、VPCエンドポイントポリシーでアクセス可能な対象Resourceを絞るだけです。
なお、Actionの絞り込みについては別途検討が必要です。
{
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::verysecure-bucket",
"arn:aws:s3:::verysecure-bucket/*"
]
}
]
}
おわりに
これだけです… タイトルが大袈裟すぎてすみません
当然と言われれば当然なのですが、、ふと思い立って書いてみました。
VPCエンドポイントは大変便利な機能ですが、バックドアにならないよう適切にコントロールしましょう!
公式ドキュメントはここになります。
Amazon S3 のエンドポイントポリシーの使用
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints-s3.html#vpc-endpoints-policies-s3
Amazon Linux のYumリポジトリはS3であることは知られてますが、ここではリポジトリへのGET要求のみに限定するエンドポイントポリシーの書き方が記されてました。
{
"Statement": [
{
"Sid": "AmazonLinuxAMIRepositoryAccess",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::packages.*.amazonaws.com/*",
"arn:aws:s3:::repo.*.amazonaws.com/*"
]
}
]
}
本記事は個人の見解であり、所属組織の立場、意見を代表するものではありません。
何かのお役に立てれば幸いです。