🦛

AWS S3 [2]

2024/08/08に公開

昨日の続き。
難しくて、心が折れてるけどやろう...

S3のアクセス方法

ユーザーが作成したバケットや、バケット内オブジェクトにアクセスするには、
以下の方法がある。

AWS SDK(Software Development Kit)

  • AWSが提供する公式ライブラリの一つ。
  • S3などのAWSサービスの操作を、プログラミング言語で利用しやすくなる。
    (例)ユーザーがプログラム言語でS3にアクセスする時、使われる。

https://aws.amazon.com/jp/what-is/sdk/

AWS CLI

  • LinuxやWindowsのコマンドラインで
    S3などのAWSサービスの操作を行うことができる。
    (例)開発や運用のエンジニアが、S3の操作をバッチにしたりテンプレートにする際に使われる。

    ※ バッチ処理とは
    バッチ処理は、連続したプログラムを、手動での介入なしに1台または複 数台のコンピュータで実行。つまり、リアルタイムな処理ではなくて、事前 に予定していた処理を自動的に実行させることを意味する。

https://aws.amazon.com/jp/cli/

マネジメントコンソール

  • WEBブラウザでAWSの各リソースを操作する

サードパーティー製GUIツール

  • 手動でS3を操作する場合に利用する

サービス連携

  • 他AWSサービスのバックアップやデータ保存場所として、S3は使用できる

S3アクセス管理

S3では、バケットやオブジェクトのアクセスを管理できる。
[IAMポリシー][バケットポリシー][ACL]の3種類がある。
状況によって使い分けが必要になる。

IAMポリシー/バケットポリシーの記法

IAMポリシーとバケットポリシーは、JSON形式で記述する。

(例)

{
  "Version":"2012-10-17",
  "Id":"PolicyForCloudFrontPrivateContent",
  "Statement":[
    {
      "Sid":" Grant a CloudFront Origin Identity access to support private content",
      "Effect":"Allow",
      "Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::examplebucket/*"
    }
  ]
}

Action

  • Actionは、GET(ダウンロード)やPUT(アップロード)など
    実際の行動を設定するエレメントで、
    "許可または拒否したいアクションを指定する(複数のアクションを指定できる)"
    アクションは、サービスの名前空間、コロン、アクション名で構成される。

  • S3オブジェクトをダウンロードする際のGETオペレーションに対応するアクションは、 s3:GetObjectになる。

  • その他、S3のポリシーで使用するアクションとオペレーションとの対応は、公式サイトのページで確認できる。

    https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies-actions

エレメントとは

セクション内において、データを読み込む、データを加工する、データを出力するなど、セクション内の細かい処理単位。

Effect

  • 設定したい効果を許可(Allow)または
    拒否(Deny)のいずれかで指定する。
    必須の要素!!!!!

Resource

  • ポリシーを適用したいバケットやオブジェクトを指定する。(複数のリソースを指定できる。)
  • リソース(作ったり動かしたりするのに必要)は、
    多くの場合、Amazonリソースネーム(ARN)を使って特定する。

ARN

アカウント内のAWSリソースを一意に識別するAWS共通の記法。
AWSサービス名、リージョン、アカウント、リソース名などコロンつなげる。

(例)
「examplebucket」のバケット内にある全オブジェクトを指定する

"Resource":"arn:aws:s3:::examplebucket/*"

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference-arns.html

Principal

IAMポリシーサンプル

AWSアカウントの全バケットのアクセスを許可するIAMポリシー

(公式ホームページから)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": ["s3:ListAllMyBuckets"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::*"]
    }
  ]
}

< 解説 >

  1. Actions3:ListAllMyBucketsを記述することで、
    自身のAWSアカウントの全バケットを表示できるようにする。
    (この権限を付与しておかないと "権限不足で開けなくなる" )

  2. Sidには、任意の名前を指定

  3. Resourceは "*(ワイルドカード)"をつけて、全バケットを指定する

バケットポリシーサンプル

同じアカウント内に存在するCloudFrontディストリビューションに対して、
[examplebucket]バケット内の全オブジェクトの読み取り許可を付与するポリシー。

(公式ホームページより)
{
  "Version":"2012-10-17",
  "Id":"PolicyForCloudFrontPrivateContent",
  "Statement":[
    {
      "Sid":" Grant a CloudFront Origin Identity access to support private content",
      "Effect":"Allow",
      "Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::examplebucket/*"
    }
  ]
}

< 解説 >

  1. Actionには、オブジェクトを読み取るアクションが指定されている
  2. Principalには、正規ユーザーID(難読化されたAWSアカウントID)を指定する。
    このIDは、CloudFrontのディストリビュージョンを表す。

CloudFrontとは

AWSのコンテンツ配信サービス。
S3上にある画像や動画、ファイルを高速に配信する際に利用する。

  1. Resourceのリソース指定部分には、バケット内の全オブジェクトを示す
    examplebucket/*が指定されている。(* ワイルドカードが全部指定ってことっぽい)

ACL (Access Control List)

ACLは、基本的にはバケットポリシーと似たことを行える。
が、違いがあり、

  • ACLは、
    個別のオブジェクトやバケットに対する簡単で、直接的なアクセス制御に適していて、よりシンプルで制限があるため、
    小規模な設定や公開アクセス設定に便利。
  • バケットポリシーは、
    バケット全体に対する詳細で、柔軟なアクセス制御を提供し、
    大規模な設定や複雑な条件付きアクセス制御に適している。

ACLの設定方法

  • ユーザーがバケット🧺やオブジェクトを作成すると、
    AmazonS3はそれらにたいして必ず1つのACLを作成する。

  • デフォルトのACLでは、そのバケットやオブジェクトの所有者(作成者のAWSアカウント)にフルアクセスが許可されている。

  • 1つのACLには、最大100個のGrant(権限のルール)を含めることができる。

Grantee(被付与者)

被付与者とは、
AWSアカウントまたは事前定義済みのいずれかの
Amazon S3グループのこと。
Eメールアドレスまたは、正規ユーザーIDを使用してAWSアカウントに許可を付与する。
ただし、
付与のリクエストでメールアドレスを指定すると

Amazon S3はそのアカウントの正規ユーザーIDを確認してACLに追加する。

結果、ACLにはAWSアカウントのEメールアドレスではなく、
常に正規ユーザーIDが含まれる。

Permission(権限)

あらかじめ、5つのキーワードが定義されている。
バケットのACLで使われる場合と、
オブジェクトのACLで使われる場合とでは、許可される操作が異なる。
下記で確認できる。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/acl-overview.html#permissions

ポリシーの評価論理(優先順位)

ブロックパブリックアクセス

1人のユーザーの設定ミスによって、
バケットやオブジェクトが意図しないうちに公開(パブリックアクセス)されてしまう可能性もある。
ブロックパブリックアクセスは、ACLやバケットポリシーでのアクセス設定に関わらず、最優先で、パブリックアクセスを禁止したり、パブリックアクセスの許可を設定できないように制御できる。

AWSアカウントIDを確認するには、

  1. ナビゲーションメニュー
  2. 自身のアカウント名を選択
  3. アカウントメニューの[アカウント設定]を選択

暗号化によるデータ保護

S3におけるデータ保護には、
[転送時のデータを保護する]
[保管時のデータを保護する]
2つがある。

転送時のデータを保護する

  • クライアントとAmazonS3の間でデータを送受信するときに使う。
  • クライアントがAWSのマネジメントコンソールや
    AWS CLIAWS SDKでS3にデータを送受信する場合、
    追加の設定を行わなくてもSSL(Secure Sockets Layer)によって
    データが暗号化されるので、データは保護されていると考えて良い。

保管時のデータを保護する

保管時については、S3のサーバー側の暗号化を利用できる
この機能は、クライアントがS3にデータをアップロードする際に
S3に対してリクエストできる

サーバー側の暗号化がリクエストされると、
S3上で暗号化して保管

取り出す時は、S3が暗号化を元に戻す

クライアントがサーバー側の暗号化をリクエストしなくても、
デフォルトで、全てのデータを暗号化するような強制設定も可能

クライアント側の暗号化

転送時と保管時のデータ保護を同時に実現できる方法として、
クライアント側の暗号化がある。
データをS3に送る前に、
クライアントでデータの暗号化を行う。
この場合、クライアント側で使用する暗号化キーや暗号ツールの管理を
自分自身で行う必要があり、
その分のコストやリスクも自分自身で負うことになる。

暗号キータイプ

暗号キータイプには、
[Amazon S3 マネージドキー(SSE-S3)]
[AWS Key Management Service キー(SSE-KMS)]
がある。

Amazon S3 マネージドキー(SSE-S3)

S3が管理する暗号化キーを使用する
ASE-256という暗号化方式で暗号化している。

AWS Key Management Service キー(SSE-KMS)

AWSの別サービス(AWS KMS)と連携するオプションで、
S3がKMS側で管理されている暗号化キーを使う設定。
合わせて、バットキーを有効にすることで、暗号化する際のKMSへのリクエストに対するコストを減少することができる。

https://aws.amazon.com/jp/kms/pricing/

Webサイトホスティング

S3では、作成したバケットをそのまま静的webサイトとして公開できる。

※1と2については、一般公開されるWebサイトを運用する場合は、大きな問題になる可能性があるので、S3単体でのWebサイトホスティングは、一時的な学習やテスト用と割り切って使用するとよいみたい。

バージョニング

バージョニングとは、一般的にはファイルの変更をトラッキングして
変更前と変更後のファイルを別々のバージョンとして格納し、
比較や復元ができるようにする機能。

S3のバージョニングは、
同じバケット内で1つのオブジェクトの変更をトラッキングして、
複数のバージョンを保持する機能。

終わり...😭

Discussion