S3とは
S3のおさらい
Amazon S3(Simple Storage Service)とは、AWSが提供するオブジェクトストレージサービスです。
ファイルやデータをインターネット経由で保存・取得できる、いわば「クラウド上の倉庫」のようなサービスです。
S3は以下のような特徴があります。
- 容量無制限でデータを保存可能
- 高い耐久性(99.999999999%)でデータを保護
- 従量課金制で、使った分だけ支払い
- Webサイトの画像、動画、ログファイル、バックアップなど幅広い用途に対応
データを格納しておく箱をバケット、格納されるデータをオブジェクトと呼びます。
その他詳細については、AWS公式ドキュメントをご確認ください。
Amazon S3 とは
なぜ設定ミスが起きやすいのか?
冒頭でも触れた通り、被害例の多くは設定ミスによるものです。
それは使いやすい反面、セキュリティ設定が複雑なことが理由として挙げられると思います。
S3ではIAMポリシー、バケットポリシー、ACLなど複数のアクセス制御方法が存在します。
設定を後回しにして挙句、開発やテストで設定した内容で本番環境も使い始めてしまうことがあります。
クラウドを使う上で陥りがちになる落とし穴で、「テスト用だから後回しでよい」「社内ネットワークしか繋がらないから安全」「とりあえずフル権限を付与すればよい」と考える人も多いと思います。
データ漏洩を防ぐ対策として、以下の3つの観点で対策を行います。
- アクセス制御:誰がアクセスできるのか
- データの暗号化:データを保護する
- ログ・監視設定:何が起きているかを知る
セキュリティの基本的な考え方
①アクセス制御:誰がアクセスできるのか
1つ目は、アクセスできる人や単位を明確に定めることです。
例えば、社内の人だけ、特定の部署・プロジェクトメンバーのみ であったりと、
まずは どのバケットに対して、誰がアクセスできるのか を決めることが重要です。
S3ではアクセス制御の代表的なものとして以下のような手段があります。
- IAMポリシー
- IAMユーザーやIAMロールに付与する権限
- バケットポリシー
- バケット単位で設定する権限
- パブリックアクセスブロック
- バケットの全世界公開を防ぐ機能
②データの暗号化:データを保護する
2つ目は、データを暗号化することです。
S3は、バケットに保管されるときなどの保管時の暗号化 と EC2などと通信する際の通信時の暗号化 があります。
暗号化の種類として、大きく分けて3つの方式があります。
- SSE-S3
- AWSで用意された暗号化キーを用いる
- 2023年1月以降に作成されたS3バケットはデフォルトでSSE-S3が適用される
- SSE-KMS※
- AWS KMSでユーザーが作成した暗号化キーを用いる
- 細かい制御が可能でキーの利用履歴の追跡も可能
- DSSE-KMS
- AWS KMS で作成されたキーで二重暗号化を行うことでより強固な暗号化方式
- 高度なセキュリティレベルが要求されるケースに適した暗号化方式
※SSE-KMSは厳密には SSE-KMS(AWSマネージドキー)、SSE-KMS(カスタマーマネージドキー)の2つに分類されます。
上記ではSSE-KMS(カスタマーマネージドキー)を想定しております。詳細について知りたい方は公式ドキュメントをご確認ください。
AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用
以前まで使用されていた SSE-C(ユーザー提供キーによる暗号化方式)は、セキュリティ上の問題から2026年4月6日以降、新規S3バケットではデフォルトで無効化されます。
新規バケットのデフォルトSSE-C設定に関するよくある質問
③ログ・監視設定:何が起きているかを知る
3つ目は、監視設定を行うことです。
監視設定は何か起こった際にすぐに気づけるような仕組みだったり、ログ取得は監査目的としても有用です。
どの粒度で対策するか ということも重要ではありますが、
誰がいつアクセスしたか、不審な動作をしているアクセスパターンはないか、権限変更の履歴はどうか などは考慮すべき項目です。
データ漏洩を保護する3つの基本設定
初心者の方は、まず3つの設定を行うことで、データ漏洩のリスクを大幅に減らすことができます。これらは無料で設定可能で既存のシステムに影響を与えません。
本章では設定方法をご紹介します。
① パブリックアクセスブロック
② 暗号化の確認
③ HTTPS通信の強制
①パブリックアクセスブロック
データの意図しない公開を防ぐ、最も重要な設定です。
ここ数年は何も意識せずにS3バケットを作成すると設定されるので設定済みの方も多いと思います。
以下設定手順です。
※検証環境のためマスクをしております
マネジメントコンソールの設定方法
①S3のコンソールを開く

②対象バケットを選択して[アクセス許可]タブを開く

③[パブリックアクセスブロック]の[編集]を押下する
※[パブリックアクセスをすべてブロック]が オン になっていれば設定は不要です

④[パブリックアクセスをすべてブロック]にチェックを入れる

⑤[変更の保存]を押下する

⑥[確認]と入力して[確認]を押下する

⑦変更された旨が表示されればOK

AWS CLIの設定方法
aws s3api put-public-access-block \
--bucket your-bucket-name \
--public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
※your-bucket-name は自身の環境に置き換えてください。
コマンドが成功した場合は出力は返りません。
※将来的にS3バケットを公開する予定がない場合は、アカウント単位で設定することも可能です。詳細は公式ドキュメントをご確認ください。
アカウントのパブリックアクセスブロック設定の構成
② 暗号化の確認
データを格納するとき、保管するときに暗号化するための重要な設定です。
※2023年1月以降、新規バケットは自動的に暗号化されますが、念のため確認しましょう
稀に古いS3バケットでは暗号化が無効の場合があるので、忘れずに確認しましょう!
以下確認手順です。
マネジメントコンソールの設定方法
①対象バケットを選択して[プロパティ]を開く


②[デフォルトの暗号化]をみて暗号化設定がされていることを確認

AWS CLIの設定方法
aws s3api get-bucket-encryption --bucket your-bucket-name
※your-bucket-name は自身の環境に置き換えてください。
設定されている場合、以下のような出力が返ってきます。
{
"ServerSideEncryptionConfiguration": {
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}
]
}
}
③ HTTPS通信の強制
暗号化されていない通信(HTTP)を拒否する設定です。
マネジメントコンソール、AWS CLIやWinSCPなどでバケットに対して操作を行う場合は、基本的にHTTPS通信が採用されます。
しかし明示的に指定すればHTTP通信も可能な状態です。
バケット単位での設定が必要ですが重要な設定ですので押さえておきましょう。
以下のバケットポリシーを用います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyInsecureConnections",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
①S3のコンソールを開く

②対象バケットを選択して[アクセス許可]タブを開く

③[バケットポリシー]の[編集]を押下する

④上記のJSONを張り付ける
your-bucket-nameを実際のバケット名に変更してください

⑤[変更の保存]を押下する

⑥更新された旨のメッセージが表示されればOK

AWS CLIの設定方法
①上記のポリシーをJSONファイルとして保存する
②以下のコマンドを実行する
aws s3api put-bucket-policy --bucket your-bucket-name --policy file://policy.json
※your-bucket-name と file:// 以降は自身の環境に置き換えてください。
リージョンに存在するすべてのバケットに対して設定を強制させる方法もあるので、次回以降のコラムで紹介しようと思います。
さらにセキュリティを強化する
これまでに紹介した3つの対策は基本的な設定ですので、既に設定済みの人も多くいると思います。
そんな人のためにさらにセキュリティを強化すべく、目的別の追加対策を紹介します。
【監視】IAM Access Analyzer
まずは監視を強化したい人向けの機能紹介です。
おすすめしたいのが IAM Access Analyzer です。
IAMの機能として、外部からアクセス可能な設定を自動検出するものです。
検出対象はIAM、S3、KMSやSQSなど多岐に渡ります。
他にも複数の機能があり、上記の自動検出機能は無料で利用できます。
設定方法やその他詳細は公式ドキュメントをご確認ください。
外部エンティティと共有されているリソースを識別する
【監視】Amazon GuardDuty
2つ目が Amazon GuardDutyです。
AWSの様々なログを監視し攻撃が疑われる不審なAPIイベントを検出してくれるサービスです。
例えば、通常とは異なる場所からS3のデータが大量にダウンロードを試みようとしているイベントや、数分間に大量のコンソールログイン試行のイベントなどを検出してくれます。
30日間の無料トライアルがあるので気になる方は試してみてください。
GuardDuty単体でもセキュリティ対策として効果はありますが、オプション機能の S3 Malware Protection が特におすすめです。
その名の通りS3バケットをマルウェアから保護するための機能で、S3バケットにオブジェクトが格納されるたびにスキャンしてマルウェアの感染を未然に防ぎます。
利用には追加料金が発生しますが、マルウェア感染の被害を考えると有効化して損はないと思います。
料金や機能などの詳細は公式ドキュメントをご確認ください。
GuardDuty Malware Protection for S3
【復旧】バージョニング
続いて復旧面を強化したい人向けにご紹介するのが、バージョニング と呼ばれる機能です。
ファイルの変更履歴を自動保存する、いわばバージョン管理の機能です。
有効化することで、誤削除や上書きから復旧することが可能です。
セキュリティ対策としてはランサムウェアに感染した場合の復旧手段を簡単に確保することが可能です。
バージョンを管理するので管理の数だけ保存料金が発生するので、ライフサイクルポリシーを活用することも合わせて推奨いたします。
バージョニングに関する詳細やライフサイクルポリシーの活用方法は以下の公式ドキュメントをご確認ください。
S3 バージョニングによる複数のバージョンのオブジェクトの保持
S3 ライフサイクルでの S3 バージョニングの使用
【復旧】【コンプライアンス】オブジェクトロック
続いては監査対応などコンプライアンスの面からもセキュリティ対策を強化したい人におすすめの機能で、
オブジェクトロックと呼ばれるものです。
この機能は指定期間の削除や変更を禁止する、いわゆるWORM(Write-Once-Read-Many)モデルの機能です。
設定次第では一番強い権限を持つユーザーでも削除や変更操作を禁止されます。
有効化によってデータの改ざん防止にも役立つので、復旧面でセキュリティ対策を強化できます。
監査要件や社内ポリシーで保存期間が定められている文書を保管するS3に適用したり、金融や医療関係など規制の厳しい業界で利用されるケースが多いです。
※オブジェクトロックを使用するには、バケットのバージョニングを有効にする必要があります。
設定方法や機能の詳細は公式ドキュメントをご確認ください。
S3 Object Lock を使用したオブジェクトのロック
まとめ
S3のセキュリティ機能は無料で始められるものもありますし、多くが低コストで提供されています。
データ漏洩時の損失と比較すればセキュリティ設定にかかるコストは微々たるものです。
セキュリティ設定と聞くと面倒と思うかもしれないですが、必ず意識しなければいけないポイントです。
その一歩目としてまずは今回紹介した機能から始めてみてはいかがでしょうか。
このコラムを読んでS3のセキュリティについて少しでも意識してもらえれば嬉しいです。



