Amazon S3 のセキュリティのベストプラクティス
Amazon S3 には、独自のセキュリティポリシーを策定および実装する際に考慮すべきさまざまなセキュリティ機能が用意されています。以下のベストプラクティスは一般的なガイドラインであり、完全なセキュリティソリューションを提供するものではありません。これらのベストプラクティスは顧客の環境に必ずしも適切または十分でない可能性があるので、処方箋ではなく、あくまで有用な推奨事項とお考えください。
Amazon S3 のセキュリティベストプラクティス
以下は、セキュリティ問題の防止に役立つ Amazon S3 でのベストプラクティスです。
- アクセスコントロールリスト (ACL) の無効化
-
S3 オブジェクト所有権は、Amazon S3 バケットレベルの設定で、バケットにアップロードされたオブジェクトの所有権を制御し、ACL を無効または有効にするのに使用できます。デフォルトでは、オブジェクト所有権は[バケット所有者の強制] 設定に設定され、すべての ACL は無効になっています。ACL が無効になっている場合、バケット所有者はバケット内のすべてのオブジェクトを所有し、アクセス管理ポリシーのみを使用してデータへのアクセスを管理します。
Amazon S3 の最近のユースケースの大部分ではアクセスコントロールリスト (ACL) を使用する必要がなくなりました。オブジェクトごとに個別に制御する必要があるまれな状況を除き、ACL を無効にすることをお勧めします。バケットのすべてのオブジェクトの ACL を無効にして、所有権を取得するには、S3 オブジェクト所有権のバケット所有者の強制設定を適用します。ACL を無効にすると、別の AWS アカウント によってアップロードされたオブジェクトを含むバケットを簡単に維持できます。
ACL が無効になっている場合、データのアクセスコントロールは次のようなポリシーに基づきます。
-
AWS Identity and Access Management IAM ユーザーポリシー
-
S3 バケットポリシー
-
仮想プライベートクラウド (VPC) エンドポイントポリシー
-
AWS Organizations サービスコントロールポリシー (SCP)
ACL の無効化により、アクセス許可の管理と監査が簡素化されます。デフォルトでは、ACL は無効になっています。既存のバケットに対して ACL を無効にすることもできます。既存のバケットに既にオブジェクトが含まれている場合、ACL を無効にすると、オブジェクトとバケット ACL はアクセス評価プロセスの一部ではなくなります。この場合、アクセスはポリシーに基づいて許可または拒否されます。
ACL を無効にする前に、次のことを確認してください。
-
バケットポリシーを確認して、アカウント外のバケットへのアクセス権を付与するすべての方法をカバーすることを確認します。
-
バケット ACL をデフォルト (バケット所有者にフルコントロール) にリセットします。
ACL を無効にすると、以下の動作が発生します。
-
バケットは、ACL を指定しない
PUT
リクエスト、またはバケット所有者のフルコントロール ACL を含むPUT
リクエストのみを受け付けます。これらの ACL には、bucket-owner-full-control
既定 ACL または XML で表現された ACL と同等の形式が含まれます。 -
バケット所有者の完全制御 ACL をサポートする既存のアプリケーションには影響はありません。
-
他の ACL (例えば、特定 AWS アカウント のへのカスタム許可) を含む
PUT
要求は失敗し、AccessControlListNotSupported
エラーコードとともに HTTPHTTP ステータスコード400 (Bad Request)
を返します。
詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化。」を参照してください。
-
- Amazon S3 バケットに正しいポリシーが使用され、バケットが公開されていないことを確認する
-
インターネット上のだれもが S3 バケットを読み書きできるように明示的にリクエストしない限り、S3 バケットが非公開であることを確認する必要があります。以下に示しているのは、パブリックアクセスをブロックするために実行できるいくつかのステップです。
-
S3 パブリックアクセスのブロックを使用します。S3 パブリックアクセスブロックでは、Amazon S3 リソースへのパブリックアクセスを制限する一元管理を簡単に設定することができます。これらの一元管理は、リソースの作成方法に関係なく適用されます。詳細については、「Amazon S3 ストレージへのパブリックアクセスのブロック」を参照してください。
-
"Principal": "*"
(事実上「誰でも」という意味) などのワイルドカード ID を許可する Amazon S3 バケットポリシーを特定します。また、ワイルドカードアクション"*"
(ユーザーが Amazon S3 バケットで任意のアクションを実行できるようにする) ポリシーも探します。 -
同様に、「全員」または「任意の認証済み AWS ユーザー」への読み取り、書き込み、またはフルアクセスを許可する Amazon S3 バケットのアクセスコントロールリスト (ACL) を探します。
-
ListBuckets
API オペレーションを使用して、すべての Amazon S3 バケットをスキャンします。次に、GetBucketAcl
、GetBucketWebsite
、GetBucketPolicy
を使用して、各バケットがアクセスコントロールと設定がコンプライアンス要件を満たしているかどうかを判断します。 -
AWS Trusted Advisor を使用して、Amazon S3 の実装を検査します。
-
s3-bucket-public-read-prohibited および s3-bucket-public-write-prohibited マネージド AWS Config ルール を使用して、継続的な検出コントロールを実施することを検討します。
詳細については、「Amazon S3 用 Identity and Access Management」を参照してください。
-
- Amazon GuardDuty を使用して Amazon S3 バケットに対する潜在的な脅威を特定する
-
Amazon GuardDuty は、AWS 環境内のアカウント、コンテナ、ワークロード、データに対する潜在的な脅威を特定する脅威検知サービスです。Amazon GuardDuty は、機械学習 (ML) モデルと異常および脅威検出機能を使用して、さまざまなデータソースを継続的に監視し、環境内の潜在的なセキュリティリスクと悪意のあるアクティビティを特定して優先順位を付けます。GuardDuty を有効にすると、AWS CloudTrail 管理イベント、VPC フローログ、DNS ログを含む基盤データソースの脅威検出が提供されます。脅威検出を S3 バケット内のデータプレーンイベントに拡張するには、GuardDuty S3 Protection 機能を有効にします。この機能は、データ流出や Tor ノードを介した S3 バケットへの疑わしいアクセスなどの脅威を検出します。また GuardDuty は、環境での通常のベースラインパターンを確立し、潜在的な異常な動作を特定すると、侵害された可能性のある S3 バケットまたは AWS 認証情報の修復に役立つコンテキスト情報も提供します。詳細については、「GuardDuty」を参照してください。
- 最小特権アクセスの実装
-
アクセス許可を付与する場合、どのユーザーにどの Amazon S3 リソースに対するアクセス許可を付与するかは、ユーザーが決定します。つまり、該当リソースに対して許可する特定のアクションを有効にするということです。このため、タスクを実行するために必要な許可のみを付与することをお勧めします。最小限の特権アクセスの実装は、セキュリティリスクはもちろん、エラーや悪意ある行動によってもたらされる可能性のある影響を減らす上での基本となります。
以下のツールは、最小限の特権アクセスを実装するために使用できます。
上記のメカニズムを採用する場合に何を考慮すべきかに関するガイダンスについては、Amazon S3 用 Identity and Access Management を参照してください。
- Amazon S3 アクセスを必要とするアプリケーションと AWS のサービス に IAM ロールを使用する
-
Amazon EC2 または他の AWS のサービス のアプリケーションが Amazon S3 リソースにアクセスするためには、AWS API リクエストに有効な AWS 認証情報が含まれている必要があります。AWS 認証情報を、アプリケーションまたは Amazon EC2 インスタンスに直接保存しないことをお勧めします。これらは自動的にローテーションされない長期的な認証情報であり、漏洩するとビジネスに大きな影響が及ぶ場合があります。
代わりに、IAM ロールを使用して、Amazon S3 にアクセスする必要があるアプリケーションまたはサービスの一時的な認証情報を管理します。ロールを使用する場合は、Amazon EC2 インスタンスまたは AWS のサービス (AWS Lambda など) に長期の認証情報 (ユーザー名とパスワード、アクセスキーなど) を配布する必要はありません。ロールは、アプリケーションが他の AWS リソースの呼び出しを行うときに使用できる一時的な許可を付与します。
詳細については、IAM ユーザーガイドにある下記のトピックを参照してください。
- 保管時のデータ暗号化の検討
-
Amazon S3 で保管時のデータを保護するには、次のようなオプションがあります。
-
サーバー側の暗号化 – すべての Amazon S3 バケットにはデフォルトで暗号化が設定されており、S3 バケットにアップロードされたすべての新しいオブジェクトは保存時に自動的に暗号化されます。Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) は、Amazon S3 のすべてのバケットでのデフォルトの暗号化設定です。別のタイプの暗号化を使用するには、S3
PUT
リクエストで使用するサーバー側の暗号化のタイプを指定するか、宛先バケットにデフォルトの暗号化設定を設定できます。Amazon S3 には、次のサーバー側の暗号化オプションもあります。
-
AWS Key Management Service (AWS KMS) キー (SSE-KMS) によるサーバー側の暗号化
-
AWS Key Management Service (AWS KMS) キーによる二層式サーバー側の暗号化 (DSSE-KMS)
-
顧客提供のキーを用いたサーバー側の暗号化 (SSE-C)。
詳細については、「サーバー側の暗号化によるデータの保護」を参照してください。
-
-
クライアント側の暗号化 – クライアント側でデータを暗号化し、暗号化したデータを Amazon S3 にアップロードします。この場合、暗号化プロセス、暗号化キー、関連ツールはお客様が管理してください。サーバー側の暗号化と同様に、クライアント側の暗号化は、データ自体を保存するメカニズムとは異なるメカニズムで保存されているキーを使用してデータを暗号化することで、リスクを軽減するのに役立ちます。
Amazon S3 は複数のクライアント側の暗号化オプションを提供します。詳細については、クライアント側の暗号化を使用したデータの保護 を参照してください。
-
- 送信時のデータの暗号化を強制する
-
HTTPS (TLS) を使用すると、潜在的な攻撃者が中間者攻撃または同様の攻撃を使用してネットワークトラフィックを盗聴または操作することを防止できます。Amazon S3 バケットのポリシーで aws:SecureTransport 条件を使用して、HTTPS (TLS) 経由での暗号化された接続のみを許可することをお勧めします。
重要
AWS はパブリックに信頼された証明書の固定をサポートしていないため、アプリケーションでは Amazon S3 TLS 証明書を固定しないことをお勧めします。S3 は証明書を自動的に更新し、更新は証明書の有効期限が切れる前に行われます。証明書の更新では、新しいパブリックキーとプライベートキーのペアが生成されます。新しいパブリックキーで最近更新された S3 証明書を固定する場合、アプリケーションが新しい証明書を使用するまで S3 に接続できません。
また、s3-bucket-ssl-requests-only マネージド AWS Config ルールを使用した継続的な検出コントロールの実装を検討してください。
- S3 オブジェクトロックの検討
-
S3 オブジェクトロックでは、Write Once Read Many (WORM) モデルを使用してオブジェクトを保存できます。S3 オブジェクトロックは、データの誤った削除や不適切な削除を防ぐのに役立ちます。例えば、AWS CloudTrail ログを保護するために S3 オブジェクトロックを使用できます。
詳細については、「S3 オブジェクトロックの使用」を参照してください。
- S3 バージョニングの有効化
-
S3 バージョニングとは、同じバケット内でオブジェクトの複数のバリアントを保持する手段です。バージョニングを使用して、 バケットに保存されたあらゆるオブジェクトのあらゆるバージョンを保存、取得、復元することができます。バージョニングを使用すれば、意図しないユーザーアクションからもアプリケーション障害からも、簡単に復旧できます。
また、s3-bucket-versioning-enabled マネージド AWS Config ルールを使用した継続的な検出コントロールの実装を検討してください。
詳細については、「S3 バケットでのバージョニングの使用」を参照してください。
- S3 クロスリージョンレプリケーションの検討
-
Amazon S3 はデフォルトで地理的に異なる複数のアベイラビリティーゾーンにデータを保存しますが、コンプライアンス要件によっては、さらに離れた場所にデータを保存することが要求される場合があります。S3 クロスリージョンレプリケーション (CRR) を使うと、データを遠く離れた AWS リージョン にレプリケートできるため、これらの要件を満たすのに役立ちます。CRR では、異なる AWS リージョンのバケット間でオブジェクトを自動的に非同期コピーできます。詳細については、「オブジェクトのレプリケーション」を参照してください。
注記
CRR では、ソースとターゲットの両方の S3 バケットでバージョニングが有効になっている必要があります。
また、s3-bucket-replication-enabled マネージド AWS Config ルールを使用した継続的な検出コントロールの実装を検討してください。
- Amazon S3 アクセス用の VPC エンドポイントの検討
-
Amazon S3 の 仮想プライベートクラウド (VPC) エンドポイントは、Amazon S3 への接続のみを許可する VPC 内の論理エンティティです。VPC エンドポイントは、トラフィックがオープンインターネットを通過するのを防ぐのに役立ちます。
Amazon S3 の VPC エンドポイントは、Amazon S3 データへのアクセスを制御するいくつかの方法を提供します。
-
S3 バケットポリシーを使用して、特定の VPC エンドポイントを通じて許可されるリクエスト、ユーザー、またはグループを管理できます。
-
S3 バケットポリシーを使用して、S3 バケットへのアクセスが可能な VPC または VPC エンドポイントをコントロールできます。
-
インターネットゲートウェイのない VPC を使用すると、データの流出を防ぐのに役立ちます。
詳細については、「バケットポリシーを使用した VPC エンドポイントからのアクセスコントロール」を参照してください。
-
- マネージド AWS セキュリティサービスを使用したデータセキュリティの監視
-
いくつかのマネージド AWS セキュリティサービスは、Amazon S3 データのセキュリティとコンプライアンスのリスクを特定、評価、監視するのに役立ちます。これらのサービスは、こうしたリスクからデータを保護するのにも役立ちます。これらのサービスには、単一の AWS アカウント Amazon S3 リソースから数千のアカウントにまたがる組織向けのリソースに拡張できるように設計された、自動検知、モニタリング、保護機能が含まれます。
詳細については、「マネージド AWS セキュリティサービスによるデータセキュリティのモニタリング」を参照してください。
Amazon S3 のモニタリングと監査のベストプラクティス
以下は、潜在的なセキュリティ上の弱点とインシデントを検出するために役立つ Amazon S3 でのベストプラクティスです。
- すべての Amazon S3 バケットを特定して監査
-
IT アセットの特定はガバナンスとセキュリティの重要な側面です。セキュリティの状態を評価し、潜在的な弱点に対処するには、すべての Amazon S3 リソースが見えていなければなりません。リソースを監査するには、以下を実行することをお勧めします。
-
タグエディターを使用してセキュリティまたは監査で注意を要するリソースを識別してタグ付けするには、これらのリソースを検索する必要があるときにそれらのタグを使用します。詳細については、「AWS リソースのタグ付けユーザーガイド」の「タグ付けするリソースの検索」を参照してください。
-
S3 インベントリを使用して、ビジネス、コンプライアンス、および規制上のニーズに応じて、オブジェクトのレプリケーションと暗号化のステータスを監査し、レポートします。詳細については、「Amazon S3 インベントリ」を参照してください。
-
Amazon S3 リソースのリソースグループを作成します。詳細については、「AWS Resource Groups ユーザーガイド」の「 リソースグループとは」を参照してください。
-
- AWS モニタリングツールによるモニタリングの実装
-
モニタリングは、Amazon S3 および AWS ソリューションの信頼性、セキュリティ、可用性、パフォーマンスを維持する上で重要なエレメントです。AWS では、Amazon S3 およびその他の AWS のサービス をモニタリングするのに役立つツールとサービスを提供しています。例えば、Amazon S3 の Amazon CloudWatch メトリクス (特に、
PutRequests
、GetRequests
、4xxErrors
、DeleteRequests
) をモニタリングできます。詳細については、Amazon CloudWatch によるメトリクスのモニタリングおよびAmazon S3 のモニタリングを参照してください。別の例については、例: Amazon S3 バケットのアクティビティ を参照してください。この例では、バケットのポリシー、バケットのライフサイクル、またはバケットのレプリケーション設定の
PUT
またはDELETE
に対して、あるいはバケット ACL のPUT
に対して Amazon S3 API コールが行われたときにトリガーされる CloudWatch アラームを作成する方法について説明します。 - Amazon S3 サーバーアクセスログを有効にする
-
サーバーアクセスのログには、バケットに対するリクエストの詳細が記録されます。サーバーアクセスログは、セキュリティやアクセス監査の参考になることがあり、顧客基盤について知り、Amazon S3 の請求を理解するのに役立ちます。サーバーアクセスログ記録を有効にする手順については、サーバーアクセスログによるリクエストのログ記録 を参照してください。
また、s3-bucket-logging-enabled AWS Config マネージドルールを使用する継続的な検出コントロールの実装を検討してください。
- AWS CloudTrail の使用
-
AWS CloudTrail は、Amazon S3 のユーザー、ロール、または AWS のサービス によって実行されたアクションのレコードを提供します。CloudTrail によって収集されたデータを使用して、以下の情報を判断できます。
-
Amazon S3 に対して行われたリクエスト
-
リクエストが行われた IP アドレス
-
リクエストを行ったユーザー
-
リクエストが行われた時間
-
リクエストに関するその他の詳細
例えば、データアクセスに影響する
PUT
アクション (特にPutBucketAcl
、PutObjectAcl
、PutBucketPolicy
およびPutBucketWebsite
) の CloudTrail エントリを特定できます。AWS アカウントをセットアップすると、CloudTrail はデフォルトで有効になっています。CloudTrail コンソールで最近のイベントを確認できます。Amazon S3 バケットのアクティビティとイベントの継続的なレコードを作成するには、CloudTrail コンソールで証跡を作成できます。詳細については、「AWS CloudTrail ユーザーガイド」の「データイベントをログ記録する」を参照してください。
証跡を作成する際に、データイベントをログ記録するように CloudTrail を設定できます。データイベントは、リソース上またはリソース内で実行されたリソースオペレーションのレコードです。Amazon S3 では、データイベントは、個々のバケットのオブジェクトレベルの API アクティビティを記録します。CloudTrail は、
GetObject
、DeleteObject
、PutObject
などの Amazon S3 オブジェクトレベルの API オペレーションのサブセットをサポートしています。CloudTrail と Amazon S3 との連携の詳細については、AWS CloudTrail を使用した Amazon S3 API コールのログ記録 を参照してください。Amazon S3 コンソールでは、S3 バケットとオブジェクトの CloudTrail イベントログ記録の有効化 に S3 バケットを設定することもできます。AWS Config に用意されている管理ルール (
cloudtrail-s3-dataevents-enabled
) を使用すると、少なくとも 1 つの CloudTrail 証跡が S3 バケットのデータイベントのログに記録していることを確認できます。詳細については、cloudtrail-s3-dataevents-enabled デベロッパーガイドのAWS Config を参照してください。 -
- AWS Config の有効化
-
このトピックに示すベストプラクティスのいくつかでは、AWS Config ルールの作成を提案しています。AWS Config では、AWS リソースの設定を評価、監査、診断するのに役立ちます。AWS Config では、リソースの設定をモニタリングし、目的とする安全な設定に対して、記録された設定を評価できます。AWS Config では、次のことを実行できます。
-
設定の変更と AWS リソース間の関係を確認します。
-
詳細なリソース設定履歴の調査
-
内部ガイドラインに指定されている設定に対して全体的なコンプライアンスを決定します。
AWS Config を使用すると、コンプライアンス監査、セキュリティ分析、変更管理、運用上のトラブルシューティングを簡素化できます。詳細については、AWS Config デベロッパーガイドのコンソールを使用した AWS Config の設定 を参照してください。記録するリソースタイプを指定するときは、必ず Amazon S3 リソースを含めてください。
重要
AWS Config マネージドルールは Amazon S3 リソースを評価する際に汎用バケットのみをサポートします。AWS Config ディレクトリバケットの設定変更は記録されません。詳細については、「AWS Config デベロッパーガイド」の「AWS Config マネージドルール」と「AWS Config マネージドルールリスト」を参照してください。
AWS Config を使用する方法の例については、「AWS セキュリティブログ」の「パブリックアクセスを許可する Amazon S3 バケットを AWS Config でモニタリングおよび応答する方法
」を参照してください。 -
- Amazon Macie を使用した機密データの検出
-
Amazon Macie は、機械学習とパターンマッチングを使用して機密データを発見するセキュリティサービスです。Macie はデータセキュリティリスクを可視化し、それらのリスクに対する自動保護を可能にします。Macie を使用すると、Amazon S3 データアセット内の機密データの検出とレポートを自動化して、組織が Amazon S3 に保存しているデータを詳細に把握できます。
Macie を使用して機密データを検出するには、多くの国または地域の機密データタイプの大規模かつ増加しているリストを検出するように設計された組み込み型の基準と手法を使用できます。これらの機密データタイプには、複数の種類の個人を特定できる情報 (PII)、財務データ、認証情報データが含まれます。一致するテキストパターンを定義する正規表現を使用したり、オプションで結果を絞り込む文字シーケンスや近接ルールなど、自分で定義したカスタム基準を使用することもできます。
Macie が S3 オブジェクト内の機密データを検出すると、Macie はセキュリティ上の検出結果を生成して通知します。この検出結果により、影響を受けたオブジェクト、Macie が見つけた機密データの種類と出現回数、および影響を受けた S3 バケットとオブジェクトの調査に役立つ追加情報が得られます。詳細については、「Amazon Macie ユーザーガイド」を参照してください。
- S3 ストレージレンズの使用
-
S3 ストレージレンズは、オブジェクトストレージの使用状況とアクティビティを組織全体で可視化するために使用できるクラウドストレージ分析機能です。また、S3 Storage Lens は、メトリクスを分析して、ストレージコストを最適化し、データ保護に関するベストプラクティスを適用するために使用できるコンテキストに応じた推奨事項を提供します。
S3 Storage Lens で、組織全体でどれだけのストレージがあるか、または最も急速に成長しているバケットとプレフィックスは何かなどの、要約されたインサイトを生成できます。S3 Storage Lens メトリクスを使用して、コスト最適化の機会を特定し、データ保護とアクセス管理のベストプラクティスを実装し、アプリケーションワークロードのパフォーマンスを向上させることができます。
例えば、S3 ライフサイクルルールがないバケットを特定して、7 日以上経過した不完全なマルチパートアップロードを中止できます。また、S3 レプリケーションや S3 バージョニングの使用など、データ保護のベストプラクティスに従っていないバケットを特定することもできます。詳細については、「Amazon S3 ストレージレンズについて」を参照してください。
- AWS セキュリティアドバイザリをモニタリングする
-
AWS アカウント について Trusted Advisor に投稿されたセキュリティ勧告を定期的に確認することをお勧めします。特に、「オープンアクセス許可」のある Amazon S3 バケットに関する警告を探します。このステップは、describe-trusted-advisor-checks を使用して、プログラムで実行できます。
さらに、各 AWS アカウント に登録されているメインの E メールアドレスを注意してモニタリングしてください。AWS は、この E メールアドレスを使用して、ユーザーに影響を与える可能性のあるセキュリティ問題が発生した場合に連絡します。
広範な影響を与える AWS の運用上の問題は AWS Health Dashboard - Service health
に投稿されます。運用上の問題も、AWS Health Dashboard を通じて個々のアカウントに投稿されます。詳細については、「AWS Healthドキュメント」を参照してください。