こんにちは、@Manabu です。
AWSの中でも、よく使用するS3の設定について詳しくみたことがなかったので、改めて確認したことを記事にしてみました。
あまり意識しなくてもアクセスできればいいというのは、怖いものです。
S3で管理しているリソースについても、アクセス制限を正しく設定できるように、この記事を参考に改めて見直してみましょう。
S3バケットポリシーとは?
バケットポリシーは、S3バケットとその中のオブジェクトに対するアクセス権限を制御するためのルールを定義したものです。
バケットポリシーはJSON形式のテキストファイルで記述され、バケットごとに設定することができます。
これにより、どのユーザー(特定のユーザーやアカウント)がどの操作(読み取り・書き込み・削除など)ができるなどの、非常に柔軟かつ詳細なアクセス制御が可能です。
バケットポリシーでできることの例
以下のような制御を設定することができます。
・特定のIPアドレスからのみアクセスを許可する: 例えば、会社のネットワーク内からのみS3バケットにアクセスできるように制限することができます。これにより、外部からの不正アクセスを防ぐことができます。
• 特定のオペレーションを禁止する: 例えば、データの削除操作(s3:DeleteObject)を全てのユーザーに対して禁止することができます。これにより、誤って重要なデータが削除されるリスクを回避できます。
• 特定の時間帯にのみアクセスを許可する: 例えば、業務時間内(9:00~18:00)だけバケットへのアクセスを許可し、それ以外の時間帯はアクセスを制限することができます。これは、セキュリティ対策として特に有効です。
• 特定のサービスにのみアクセスを許可する: 例えば、特定のAWSサービス(Lambda関数やEC2インスタンスなど)のみがS3バケットにアクセスできるように制限することができます。これにより、他のサービスやユーザーからの不正アクセスを防止できます。
• バケットへの書き込み操作を特定のユーザーに限定する: 例えば、マーケティングチームだけが新しいファイルをアップロードできるようにし、他のユーザーは読み取りのみを許可することができます。
バケットポリシーの基本構造
S3バケットポリシーはJSON形式で記述され、複数の要素から構成されています。それぞれの要素が、バケットに対するアクセス権を細かく制御するための役割を持っています。
ここでは、バケットポリシーの基本構造と主要な要素について解説します。
Version
バケットポリシーのバージョンを指定するためのフィールドです。AWSはポリシーの形式を進化させてきたため、どの形式で書かれたポリシーなのかを明示するために使用されます。
現在では、ほとんどのポリシーで“2012-10-17”というバージョンが使われています。
"Version": "2012-10-17"
Statement
1つ以上のアクセス制御ルール(ステートメント)を定義するために使用されます。Statementには、さらに複数のサブ要素が含まれ、それぞれのサブ要素がどのようにアクセスを制御するかを指定します。
Effect
アクセスを許可するか、拒否するかを指定します。
Allowを指定するとアクセスを許可し、Denyを指定するとアクセスを拒否します。ポリシーが複雑になり、許可と拒否を組み合わせることで、細かい制御が可能です。
"Effect": "Allow"
Principal
ポリシーが適用されるエンティティ(ユーザー、ロール、サービスなど)を指定します。
例えば、特定のIAMユーザーやAWSアカウント、または*を使ってすべてのユーザーを指定することができます。
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/ExampleUser"
}
プリンシパルの設定については、以下を参照してください。
Action
許可または拒否する具体的な操作(アクション)を指定します。
例えば、s3:GetObjectはオブジェクトの読み取り操作、s3:PutObjectはオブジェクトのアップロード操作を指します。複数のアクションを指定することも可能です。
"Action": "s3:GetObject"
その他のアクションは以下の公式サイトから参考にしてください。
Resource
ポリシーが適用される具体的なS3バケットやオブジェクトを指定します。
S3のリソースはARN(Amazon Resource Name)で表現されます。特定のバケット全体や、バケット内の特定のオブジェクトに対してポリシーを適用することができます。
"Resource": "arn:aws:s3:::example-bucket/*"
リソースタイプについての記載は以下を参考にしてください。
Condition(任意)
特定の条件が満たされた場合にのみポリシーを適用するためのフィールドです。
例えば、特定のIPアドレスからのアクセスのみを許可する、特定の時間帯にのみアクセスを許可するなど、より細かい制御が可能です。
"Condition": {
"IpAddress": {
"aws:SourceIp": "192.0.2.0/24"
}
}
その他のコンディションの設定については、以下の公式サイトを参考にしてください。
サンプルバケットポリシー
上記の設定を組み合わせて、以下のような書き方をします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example-bucket/*"
}
]
}
例えば、こちらのポリシーは、全世界に対して特定のバケット内のオブジェクトの読み取り(s3:GetObject)を許可するものです。
まとめ
S3のバケットポリシーについて、どんな内容なのか解説しました。
AWSのベストプラクティスにもあるように、権限は最小限であるべきだと思いますので、最適化したバケットポリシーが設定できるといいですね。