Skip to main content

AWSでS3バケットを保護する方法

著者

2024年7月12日

0 分で読めます

Amazon Web Services(AWS)のSimple Storage Service(S3)は、クラウドストレージの中核的な存在となっています。高い拡張性、可用性、パフォーマンスを備え、あらゆる規模の企業に選ばれています。しかし、ほかのクラウドサービスと同様に、セキュリティが何より重要です。そこで考えるべきなのが、「S3バケットをどう保護するか」という課題です。

S3バケットの保護は、不正アクセスからデータを守るだけではありません。さまざまなセキュリティ基準や規制への準拠も必要です。セキュリティ設定のミスが1つあるだけでデータ侵害につながり、金銭的損失や企業の評判への悪影響を招く可能性があります。

AWS上のS3バケットを保護することは、クラウドセキュリティに欠かせないステップです。このブログ記事では、S3バケットを安全に保ち、ベストプラクティスに準拠させるための実践的な手順を紹介します。S3バケットの脆弱性の理解、セキュリティのベストプラクティス、Snykを使ったセキュリティ対策の自動化などを取り上げます。

S3バケットの脆弱性を理解する

S3バケットは堅牢で拡張性に優れたストレージソリューションですが、適切に設定・監視されていないと、セキュリティリスクになる可能性があります。よくあるS3バケットの脆弱性と、バケットが公開された場合に起こりうる影響を見ていきましょう。

バケット権限の設定ミス

S3バケットでよく見られる脆弱性の1つが、権限の設定ミスです。意図せずS3バケットが一般公開され、誰もが保存データにアクセスしたり、ダウンロードしたり、削除したりできる状態になることがあります。

たとえば、パブリックアクセスを許可するバケットポリシーは、次のようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicRead",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::YourBucket/*"
    }
  ]
}

上記のポリシーでは、Principalフィールドが*に設定されており、誰でも対象となります。また、Actionフィールドはs3:*に設定されており、すべてのアクションが許可されます。これは、バケット権限の設定ミスの明確な例です。

暗号化されていないデータ

もう1つよくある脆弱性は、S3バケット内のデータを暗号化せずに保存することです。攻撃者がバケットにアクセスすると、データを簡単に読み取られる可能性があります。AWSでは、データを保護するためにサーバー側とクライアント側の両方の暗号化オプションを提供しています。S3バケット内の機密データが保存時に暗号化されていることを確認しましょう。

Snykを使うと、Terraformやその他の対応するクラウド定義ファイルに含まれるクラウド設定の不備を検出できます。たとえば、HTTPを使用したリクエストをS3バケットポリシーが拒否していないという設定不備を検出できます。

Snyk IaCのスキャン結果には、セキュリティ上の問題が示されています。クラウド設定の誤りにより、S3バケットが安全なHTTP通信(HTTPS)を使用しないリクエストからのトラフィックを受け入れる状態になっています。

ログ記録と監視の不足

適切なログ記録と監視がなければ、S3バケットへの不正アクセスや変更を検出するのは困難です。AWSにはCloudTrailやCloudWatchなどのサービスがありますが、適切に設定し、継続的に監視する必要があります。こうした対策がなければ、セキュリティ侵害やデータへの不正アクセスの兆候を見逃しかねません。

S3バケットセキュリティのベストプラクティス

S3バケットが公開された場合、深刻な影響が生じる可能性があります。保存されているデータによっては、データ侵害、知的財産の喪失、規制上の罰金、組織の評判への悪影響につながるおそれがあります。

こうした脆弱性を防ぎ、S3バケットを保護するには、データの暗号化、バケット権限の適切な設定、ログ記録と監視の導入など、S3セキュリティのベストプラクティスに従うことが重要です。Snykなどのツールは、クラウド設定の不備を特定し、クラウドインフラにおけるセキュリティ上の問題の修正を支援します。

データを安全に保つうえで、S3バケットの保護は欠かせないステップです。ここでは、AWSでS3バケットを保護するためのベストプラクティスを詳しく解説します。

バケット権限を適切に設定する

AWSでS3バケットを保護するうえで、特に重要なステップの1つがバケット権限の適切な設定です。最小権限の原則を理解して実践し、AWS Identity and Access Management(IAM)ロールを効果的に活用し、バケットポリシーでアクセスを制限します。

最小権限の原則:概要と実装

最小権限の原則(PoLP)は、ユーザーに職務の遂行に必要な最低限のアクセス権のみを付与するコンピューターセキュリティの概念です。AWS S3バケットに適用する場合、バケットへのアクセスが必要なユーザー、ロール、サービスに対して、必要な権限のみを付与することを意味します。

AWS IAMを使ってPoLPを実装し、S3バケットを保護する方法の例を紹介します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRead",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:root"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my_secure_bucket/*"
    }
  ]
}

このポリシーでは、指定したアカウントのルートユーザーに対して、my_secure_bucket内のオブジェクトの読み取りのみを許可しています。ほかの権限は付与せず、最小権限の原則に従っています。

AWS Identity and Access Management(IAM)ロールを理解し、効果的に使う

AWS IAMロールは、信頼するエンティティに権限を付与するための安全な方法です。セキュリティ認証情報を共有する代わりに、IAMロールに権限を付与できます。AWSで権限を管理するうえで、より安全で拡張性の高い方法です。

IAMロールを効果的に使ってS3バケットを保護する方法の例を紹介します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowS3Access",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:role/my_secure_role"
      },
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::my_secure_bucket/*"
    }
  ]
}

このポリシーでは、my_secure_role IAMロールにmy_secure_bucketのすべてのS3権限を付与します。これにより、バケットへのアクセスが必要なエンティティにこのロールを割り当てられるため、セキュリティ認証情報を共有する必要がありません。

アクセスを制限するバケットポリシーのヒント

バケットポリシーは、S3バケットへのアクセスを管理する強力なツールです。きめ細かな権限や制限を設定できるため、S3バケットを効果的に保護できます。

バケットポリシーを使ってS3バケットを保護する方法をいくつか紹介します。

  • IPアドレスに基づいてアクセスを制限する条件を使用する。

  • s3:DeleteObjectなどの機密性の高い操作へのアクセスを明示的に拒否する。

  • NotAction要素を使い、指定したアクション以外のすべてを拒否する。

S3バケットの保護に関する詳細な調査結果や推奨事項については、Snykの無料アカウントを作成してください。Snykでは、クラウドインフラを効果的に保護するための無料の学習リソースやツールを豊富に提供しています。

デフォルトの暗号化を有効にする

S3バケットのセキュリティを確保する効果的な方法の1つが、デフォルトの暗号化を有効にすることです。2023年以降、S3バケットに保存されるオブジェクトは自動的に暗号化されます。

有効にする手順は次のとおりです。

  1. AWS Management Consoleに移動し、Amazon S3コンソールを開きます。

  2. 「バケット名」リストで、デフォルトの暗号化を有効にするバケットの名前を選択します。

  3. プロパティタブを選択します。

  4. デフォルトの暗号化セクションで、編集を選択します。

  5. 有効化を選択します。

  6. 暗号化タイプリストから、暗号化方式を選択します。

  7. 変更を保存を選択します。

AWS CLIを使ってデフォルトの暗号化を有効にする方法もあります。

aws s3api put-bucket-encryption --bucket MyBucket --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}'

上記のコマンドラインの例は、AWS CLIを使ってデフォルトの暗号化を有効にする方法を示しています。

AWS管理キー(SSE-S3)とカスタマーマネージドキー(SSE-KMS)の選択

S3バケットを保護する方法を考える際、暗号化キーには主にAWS管理キー(SSE-S3)とカスタマーマネージドキー(SSE-KMS)の2つの選択肢があります。

AWS管理キー(SSE-S3)は、最もシンプルな選択肢です。SSE-S3を使用すると、Amazonがキーの管理と保護を行います。キーのローテーション、権限の管理、キー使用状況の監査など、暗号化キーを自分で管理する複雑さを避けたい場合に適しています。

一方、カスタマーマネージドキー(SSE-KMS)では、より細かな制御と柔軟性が得られます。SSE-KMSでは、独自の暗号化キーを作成・管理し、その使用方法を定めるポリシーを制御できます。独自のキー管理を求めるコンプライアンス要件がある場合に適しています。

aws s3api put-bucket-encryption --bucket MyBucket --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "arn:aws:kms:us-west-2:111122223333:key/abcd1234-a123-456a-a12b-a123b4cd56ef"}}]}'

上記のコマンドラインの例は、カスタマーマネージドキーを使ってデフォルトの暗号化を有効にする方法を示しています。

安全な通信を強制するポリシーを活用する

クラウドセキュリティにおいて、転送中のデータを保護する最も効果的な方法の1つがHTTPSの強制です。HTTPSはブラウザーとサーバー間のデータを暗号化し、第三者による傍受や閲覧を困難にします。この章では、転送中のデータにHTTPSを強制し、SSLを使用しないリクエストを拒否するバケットポリシーを設定して、S3バケットを保護する方法を解説します。

S3バケットでHTTPSを強制するには、バケットポリシーを更新します。HTTPSを強制するバケットポリシーの例を示します。

{
  "Version": "2012-10-17",
  "Id": "HttpsOnly",
  "Statement": [
    {
      "Sid": "HTTPSOnly",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::your-bucket-name/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

このポリシーでは、HTTPS経由ではないリクエスト("aws:SecureTransport": "false")について、すべてのS3アクション("Action": "s3:*")を拒否します。your-bucket-nameは、使用するS3バケット名に置き換えてください。

アクセスログ記録と監視を実装する

S3バケットの保護方法を考えるうえで、重要な要素の1つが堅牢なログ記録と監視の実装です。これにより、S3バケット内のアクティビティを可視化し、潜在的なセキュリティ脅威や侵害を検出できます。このセクションでは、S3バケットのアクセスログ記録の有効化と設定、AWS CloudTrailによるAPIアクティビティの監視、Amazon CloudWatchを使った不審なアクティビティのアラーム設定について説明します。

S3バケットの暗号化(SSE-S3など)には追加費用がかかり、無料ではない点に注意してください。

アクセスログの記録は、S3バケットの保護に欠かせません。S3バケットへのすべてのリクエストを記録し、別のS3バケットにログを保存します。有効化と設定の手順は次のとおりです。

  1. AWS Management Consoleに移動し、Amazon S3コンソールを開きます。

  2. 「バケット名」リストで、ログ記録を有効にするバケットの名前を選択します。

  3. プロパティタブを選択します。

  4. ログ記録セクションで「編集」を選択します。

  5. ログの保存先バケットセクションに、ログの保存先となるバケット名を入力します。

  6. (任意)ターゲットプレフィックスセクションで、プレフィックスを追加できます。複数のバケットのログを同じ保存先バケットに保管する場合に便利です。

  7. 変更を保存を選択します。

aws s3api put-bucket-logging --bucket MyBucket --bucket-logging-status file://logging.json

上記のコマンドで使用するlogging.jsonは、次の内容を含むファイルです。

{
  "LoggingEnabled": {
    "TargetBucket": "log-bucket",
    "TargetPrefix": "MyBucketLogs/"
  }
}

AWS CloudTrailを使ってAPIアクティビティを監視する

AWS CloudTrailは、AWSアカウントのガバナンス、コンプライアンス、運用監査、リスク監査を可能にするサービスです。AWS Management Console、AWS SDK、コマンドラインツール、その他のAWSサービスを通じて行われた操作など、AWSアカウントのアクティビティ履歴を提供します。

S3バケットでCloudTrailを有効にするには、次の手順に従います。

  1. CloudTrailコンソールを開きます。

  2. 証跡を選択し、続けて証跡の作成を選択します。

  3. 「証跡名」に、証跡の名前を入力します。

  4. すべてのリージョンのイベントを記録するには、「すべてのリージョンに適用」ではいを選択します。

  5. 管理イベントで読み取り/書き込みイベントを選択し、記録する管理イベントを指定します。データイベントだけを対象にする場合は、これらを設定しないか、「なし」を選択できます。

  6. データイベントの設定:

    1. 下にスクロールして、データイベントセクションを表示します。

    2. S3バケットの追加をクリックし、データイベントを記録するS3バケットを指定します。

    3. 記録するデータイベントとして、読み取り、書き込み、またはすべてを選択できます。包括的に監視するには、「すべて」を選択します。

    4. CloudTrailログの配信先となるS3バケットを指定します。

  7. 「S3バケット」で、CloudTrailログの保存先として既存のバケットを選択するか、新しいバケットを作成します。

  8. 作成を選択します。

AWS CLIを使って証跡を作成することもできます。

aws cloudtrail create-trail --name MyDataEventTrail --s3-bucket-name my-cloudtrail-logs-bucket --no-include-global-service-events

Amazon CloudWatchを使って不審なアクティビティのアラームを設定する

Amazon CloudWatchは、DevOpsエンジニア、開発者、サイト信頼性エンジニア(SRE)、ITマネージャー向けに構築された監視・オブザーバビリティサービスです。CloudWatchを使うと、データや実用的なインサイトを活用してアプリケーションを監視し、システム全体のパフォーマンス変化を把握して対応し、リソースの利用を最適化し、運用状況を統合的に確認できます。

アラームの状態が変化したときにAmazon SNSメッセージを送信するアラームを作成するには、次のようにput-metric-alarmコマンドを使用します。

aws cloudwatch put-metric-alarm --alarm-name "s3-bucket-activity" --metric-name "NumberOfObjects" --namespace "AWS/S3" --statistic "SampleCount" --period 300 --threshold 1000 --comparison-operator "GreaterThanThreshold" --dimensions Name=BucketName,Value=my-bucket --evaluation-periods 1 --alarm-actions arn:aws:sns:us-west-2:111122223333:MyTopic

このコマンドでは、my-bucketバケット内のオブジェクト数を監視するアラームを設定しています。5分間にオブジェクト数が1,000を超えると、SNSメッセージが送信されます。

これらの手順を実施することで、S3バケットのセキュリティを大幅に強化できます。S3バケットの保護は一度行えば終わりではなく、定期的な監視と更新が必要な継続的なプロセスであることを忘れないでください。クラウドインフラの保護についてさらにサポートが必要な場合は、クラウドインフラのセキュリティ脆弱性を検出して修正できる強力なツール、Snyk IaCをご検討ください。

S3バケットを定期的に監査する

S3バケットを定期的に監査することも、AWSリソースのセキュリティを確保するための重要な手順です。このプロセスでは、専用のツールやサービスを使用するとともに、バケットの権限やパブリックへの公開状況を定期的に確認します。

S3バケットの監査に役立つツールやサービスはいくつかあります。AWSには、この目的に活用できる組み込みサービスが用意されています。

AWS Trusted Advisor:AWSのベストプラクティスに沿ったリソースのプロビジョニングを支援する、リアルタイムのガイダンスを提供するツールです。Trusted Advisorのチェックにより、AWSインフラを最適化し、セキュリティとパフォーマンスを向上させ、全体的なコストを削減できるほか、サービスの制限も監視できます。

aws support describe-trusted-advisor-checks --language en

AWS Config:AWSアカウント内のAWSリソースの設定を詳細に把握できるサービスです。リソース同士の関連性や過去の設定内容も確認できるため、設定や関連性が時間とともにどのように変化したかを把握できます。

aws configservice start-config-rules-evaluation --config-rule-names "s3-bucket-public-read-prohibited" "s3-bucket-public-write-prohibited"

AWS組み込みツールに加えて、Snyk IaCなどのツールを使えば、セキュリティチェックを追加し、クラウドの設定ミスを検出できます。

バケットの権限とパブリックへの公開状況を定期的に確認する

S3バケットの権限を定期的に確認することは、「S3バケットを保護する方法」において重要なポイントです。誰がバケットにアクセスできるのか、またどのレベルのアクセス権があるのかを確認します。

aws s3api get-bucket-acl --bucket my-bucket

バケットがパブリックに公開されているかどうかも確認しましょう。S3バケットはパブリックアクセスを許可するよう設定できますが、どうしても必要な場合を除き、避けるべきです。

aws s3api get-bucket-policy --bucket my-bucket

パブリックアクセスが必要な場合は、バケットへのアクセスを特定のIPアドレスに限定するバケットポリシーなど、追加のセキュリティ対策を必ず講じてください。

S3バケットを定期的に監査し、見直すことは、安全なAWS環境を維持するうえで重要です。この記事で紹介したツールやプラクティスを活用すれば、S3バケットを安全に保ち、データを保護できます。

SnykでS3バケットのセキュリティを自動化する

Snyk IaCを使ってS3バケットを保護する方法を知りたいですか?Snykは、設定に問題のあるS3バケットを自動で検出して修正するため、クラウド環境のセキュリティとレジリエンスを高められます。

Snykのクラウドセキュリティ機能

Snykのクラウドセキュリティ機能は、クラウド環境を保護する包括的なソリューションです。継続的なセキュリティ監視、設定ミスの特定、自動修正を提供します。そのため、クラウドセキュリティプロセスの自動化を目指すDevOpsチームやセキュリティチームに最適なツールです。

Snykで設定ミスのあるS3バケットの検出と修正を自動化する

S3バケットの設定ミスは、データ漏えいや不正アクセスにつながる可能性があります。Snykを使えば、このような設定ミスの検出と修正を自動化できます。Snyk Infrastructure as Code(IaC)と包括的なセキュリティルールを活用することで、組織は手作業を最小限に抑えながら、セキュリティ態勢を大幅に強化できます。

ステップ1:IaCプロジェクトをSnykにインポートする

最初に、Infrastructure as CodeプロジェクトをSnykにインポートします。これにより、Terraform、Kubernetesマニフェスト、AWS CloudFormationなどのインフラ設定ファイルをSnykでスキャンし、潜在的なセキュリティ問題を検出できるようになります。

  1. Snykのダッシュボードに移動し、Projectsを選択します。

  2. 「プロジェクトを追加」ドロップダウンをクリックし、GitHubなどのソース管理システム(SCM)を選択します。

  3. AWSインフラの設定を含むリポジトリを選択し、スキャンするためにSnykに追加します。

s3.tfという名前のTerraform v4ファイルにある、次のS3バケット定義を見てみましょう。

resource "aws_s3_bucket" "example" {
  # ... other configuration ...
}

resource "aws_s3_bucket_acl" "example" {
  bucket = aws_s3_bucket.example.id
  acl    = "public-read-write"
}

このファイルをsnyk iac test s3.tfでスキャンすると、S3バケットのセキュリティ上、注意が必要な、許可範囲が広すぎるACL設定が報告されます。同様に、Snykアプリを使用すると、SnykのUIにも検出結果が表示されます。

Snykは週に1回、プロジェクトを自動で再テストし、継続的なセキュリティ監視を実現します。

ステップ2:設定ミスを特定して修正する

SnykのIaCスキャン機能は、aws_s3_bucketやaws_s3_bucket_policyなど、さまざまなAWSリソースタイプに対応しています。スキャンすると、暗号化されていないS3バケットやパブリックアクセスブロックが適切に設定されていないバケットなどの設定ミスを特定し、次の情報とともに報告します。

  • 問題の深刻度

  • 脆弱性のあるコードの一部

  • 詳細な修正方法

S3バケットでは、データ漏えいにつながる可能性のあるパブリックアクセスの有効化などの問題を検出できます。Snykの修正ガイダンスに従えば、こうした問題に迅速に対処できます。

GitHubやBitbucketなどのSCMからインポートしたInfrastructure as Code設定ファイルを表示すると、セキュリティ侵害につながる可能性のあるクラウド設定ミスが視覚的に示されます。たとえば、次のS3バケット設定では、バケットへのパブリックアクセスが制限されていません。

Snyk IaCは、インターネットに公開されているS3バケットを検出します。データ漏えいにつながる可能性があるセキュリティ上の問題です。

ステップ3:継続的な監視と修正

Snykは問題を検出するだけでなく、修正方法もガイドするため、修正に必要な時間と労力を大幅に削減できます。Snykの定期的なテストとCI/CDパイプラインとの連携により、設定ミスからAWS環境を継続的に保護できます。

セキュリティチームは、報告されるクラウド設定ミスの深刻度設定をさらに調整できます。チームのニーズやセキュリティ態勢に合わせて、Infrastructure as Codeのセキュリティポリシーをカスタマイズできます。

Snyk IaCの深刻度設定とポリシー構成

SnykをAWS環境に連携することで、S3バケットやその他のAWSリソースにおける設定ミスの検出、監視、修正を自動化し、プロアクティブなセキュリティ態勢を実現できます。この連携はセキュリティを強化するだけでなく、クラウドインフラ全体のコンプライアンスとガバナンスの効率化にも役立ちます。

AWS S3バケットのセキュリティ対策:次のステップ

バケットのバージョニングの有効化、バケットポリシーの使用、データの暗号化など、ここで紹介したセキュリティ対策は、単なるベストプラクティスではありません。データを安全に保つために必要な手順です。これらの対策を実施することで、S3バケットへの不正アクセスのリスクを大幅に低減できます。

S3バケットを保護する方法についての解説を終えるにあたり、セキュリティは継続的なプロセスであることを忘れないでください。クラウドセキュリティを取り巻く状況は常に変化しており、最新情報を把握することが重要です。AWS S3バケットの保護をさらに進めるために、役立つ追加リソースをいくつかご紹介します。

  • SSRFの脆弱性に関するSnyk Learnのレッスン:サーバーサイドリクエストフォージェリ(SSRF)は、クラウドインフラに影響を及ぼす可能性のある、よく見られるセキュリティ脆弱性です。SSRFの仕組みを理解することで、S3バケットをより適切に保護できます。SSRFの脆弱性に関するSnyk Learnのレッスンでは、このトピックを詳しく解説しています。

  • S3バケットのセキュリティに関するAWSドキュメント:AWSは、S3バケットの保護方法について幅広いドキュメントを提供しています。ベストプラクティスやチュートリアル、セキュリティ機能の詳細な説明などが掲載されており、S3バケットのセキュリティを強化したい方にとって役立つリソースです。

S3バケットの保護は、決して難しいものではありません。Snykなどのツールを活用すれば、S3バケットを安全に保ち、アプリケーションのセキュリティを維持できます。手遅れになるまで待たず、今すぐS3バケットの保護を始めましょう。最善の防御は、適切な攻撃です。クラウドセキュリティの世界では、S3バケットが攻撃対象になる前に、先手を打って保護することを意味します。