みなさん、こんにちは。スカイゲートテクノロジズのサイバー事業部です。弊社のプロダクト開発では、AWSをはじめGCPやAzureをマルチクラウドで利用しています。弊社では、プロダクト開発の他にも、お客様のAWS環境のセキュリティハーデニングや運用支援などを実施しています。そこで大体、話題になるのがAmazon S3のセキュリティです。バケットポリシーに始まり、IAMやACLも含めるとかなりややこしいですよね。と言うわけで、今日はS3のセキュリティ機能のポイントについて解説します!S3のアクセス制御早速ですが、S3には、バケットやオブジェクトを保護するために、次の3つのアクセス制御が用意されています。IAMポリシーバケットポリシーACLいずれのポリシーも、バケット全体を保護する方法と、バケットないにあるファイル(オブジェクト)を指定して制御する方法とが用意されています。この中ではACLが最も古い制御です。どの単位で制御する?ユースケースにもよりますが、弊社では原則として、バケット全体をコントロールし、細かなオブジェクト単位での制御は避けるように設計しています。バケットをポリシー単位で作り分けておけば、ほとんどのケースに対応ができます。どの制御を使えばいい?基本的に、IAMポリシーとバケットポリシーを利用し、ACLは極力使わないほうが良いでしょう。一部の例外はありますが、ほとんどのケースでこの2つで事足りるはずです。ACLよりもバケットポリシーの方が強力なため、バケットポリシーに置き換えてしまえば管理対象を減らすことができます。IAMポリシー VS バケットポリシーIAMポリシーの特徴IAM User単位・Role単位で制御できるS3に限らず、あらゆるコントロールをまとめてポリシーとして使うことができるAssume Roleにも適用されるAdministratorポリシーやS3 Full Accessポリシーなど強力なアクセス権限のポリシーの利用には注意が必要バケットポリシーの特徴バケット単位・オブジェクト単位で制御できるAction, Effect, Resource, Principalの組み合わせで柔軟に制御できる明示的な拒否によって強力な権限を持つプリンシパルからのアクセスを拒否することができるIAMポリシーとバケットポリシーの優先度表にしてみるとこんな感じですね。まとめると・・・①デフォルトではアクセスできない(暗黙的拒否)②IAMポリシーまたはバケットポリシーのいずれかに「許可」が入っているとアクセスができる(明示的許可)例えば、S3 Full Accessポリシーが付与されていると「IAMポリシーの許可」になるので、バケットポリシーに許可が入っていなくとも、どのバケットにもアクセスできます一般的に、AdministratorやS3 Full AccessポリシーをIAMユーザに付与してはいけない、と言われているのはこのためですね。③IAMポリシーまたはバケットポリシーのいずれかに「拒否」が入っていると、許可を打ち消してアクセスを制限する(明示的拒否)確実に保護すべき情報が含まれるバケットは、この明示的拒否を用います。つまり、IAMポリシーとバケットポリシーは、いずれかに許可が入ってればアクセスOK、でも拒否が少しでも入っていればアクセスNG、という形になっていることがわかります。やや取り扱いが難しい明示的拒否バケットポリシーでは、拒否=Deny Effectを設定することで、たとえS3 Full Accessポリシーを持っているユーザーであっても、拒否することができます。しかし、「このEC2からだけはアクセスしたい」「本社のIPアドレスから管理者ロールだけは許可したい」といった例外を指定する場合、工夫が必要です。NotPrincipal句の利用「このEC2からだけはアクセスしたい」と言う場合には、EC2にIAMロールを割り当て、そのIAMロールのみS3にアクセス可能な状態、といった設計になるかと思います。この場合には、Deny Effectの中の NotPrincipal 句を入れることで対応ができます。%3Cpre%3E%3Ccode%3E%0A%22Statement%22%3A%20%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22Sid%22%3A%20%22Deny-except-from-my-ec2%22%2C%0A%20%20%20%20%20%20%22Effect%22%3A%20%22Deny%22%2C%0A%20%20%20%20%20%20%22NotPrincipal%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22AWS%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%22arn%3Aaws%3Aiam%3A%3A123456781234%3Arole%2Fmy-ec2%22%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%22Action%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%22s3%3AListBucket%22%2C%20%22s3%3AGetObject%22%2C%20%22s3%3APutObject%22%2C%20%22s3%3ADeleteObject%22%0A%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%22Resource%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%22arn%3Aaws%3As3%3A%3A%3Amy-secret-bucket%22%2C%0A%20%20%20%20%20%20%20%20%22arn%3Aaws%3As3%3A%3A%3Amy-secret-bucket%2F*%22%0A%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%7D%2C%0A%20%20%7D%0A%5D%0A%3C%2Fcode%3E%3C%2Fpre%3EEC2ロールには、S3のアクセス可能なポリシーをアタッチしておきます。これにより、このS3は、特定のロールが割り当てられたEC2しかアクセスできなくなります。IPアドレス制限はCondition句同じように、本社のIPアドレスからはアクセスしたい、と言う場合には、Deny Effectの中の Condition 句を用い、 NotIpAddress プロパティなどで除外をします。%3Cpre%3E%3Ccode%3E%0A%22Condition%22%3A%20%7B%0A%20%20%20%20%22NotIpAddress%22%3A%20%7B%0A%20%20%20%20%20%20%22aws%3ASourceIp%22%3A%20%22123.123.xxx.xxx%2F32%22%0A%20%20%20%20%7D%0A%7D%0A%3C%2Fcode%3E%3C%2Fpre%3Eいかがだったでしょうか?S3は機能が豊富で柔軟な設定や設計ができますが、全てを理解するのは結構難しいですよね。セキュリティに限って言えば、今回取り上げたアクセス制御以外にも、サーバサイド暗号化やライフサイクル、ロギングや監査などが重要な要素になってきます。アクセス制御を使いこなして、セキュアなS3利用を進めていきましょう!わからないことがあったり、不安が残る場合は、弊社ではお客様のAWS環境のセキュリティハーデニングや運用支援などを実施しています。以下からお気軽にご相談ください!%3Cdiv%20class%3D%22iframely-embed%22%3E%3Cdiv%20class%3D%22iframely-responsive%22%20style%3D%22height%3A%20140px%3B%20padding-bottom%3A%200%3B%22%3E%3Ca%20href%3D%22https%3A%2F%2Fwww.skygate-tech.com%2Fprofessional-service%2Fsre-cloud-security-dev-sec-ops%22%20data-iframely-url%3D%22%2F%2Fiframely.net%2FRAJV0IR%3Fcard%3Dsmall%22%3E%3C%2Fa%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3Cscript%20async%3D%22%22%20src%3D%22%2F%2Fiframely.net%2Fembed.js%22%3E%3C%2Fscript%3E