S3バケットのライフサイクルポリシーが設定されていない

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、S3バケットのライフサイクルポリシーが設定されていない問題について、リスクと対策を解説します。

ポリシーの説明
S3バケットのライフサイクルポリシーは、オブジェクトの保存期間やストレージクラスを自動的に管理するための重要な機能です。適切なライフサイクルポリシーを設定することで、以下のメリットが得られます:
- コスト最適化: アクセス頻度に基づいてオブジェクトを適切なストレージクラスに自動移行
- コンプライアンス対応: 法的要件やポリシーに基づいたデータ保持期間の自動管理
- ストレージ管理の自動化: 手動でのデータ削除や移動の必要性を排除
- バージョン管理: オブジェクトの古いバージョンを自動的に削除
修復方法
コンソールでの修復手順
- AWSマネジメントコンソールにログインし、Amazon S3サービスに移動します
- 左側のナビゲーションから「バケット」を選択します
- ライフサイクルポリシーを設定するバケット名をクリックします
- 「管理」タブを選択します
- 「ライフサイクルルール」セクションで「ライフサイクルルールを作成する」をクリックします

- ルールの基本設定:
- ルール名: わかりやすい名前を入力(例: “log-archival-policy”)
- ルールのステータス: 「有効」を選択
- ルールのスコープ設定:
- バケット全体に適用する場合: 「このルールをバケット内のすべてのオブジェクトに適用する」を選択
- 特定のオブジェクトに適用する場合: プレフィックス、タグ、オブジェクトサイズでフィルタリング
- ライフサイクルアクションの設定:
- ストレージクラスの移行:
- 30日後: Standard → Standard-IA
- 90日後: Standard-IA → Glacier Instant Retrieval
- 180日後: Glacier Instant Retrieval → Glacier Flexible Retrieval
- 365日後: Glacier Flexible Retrieval → Glacier Deep Archive
- オブジェクトの有効期限: コンプライアンス要件に応じて設定(例: 2555日 = 7年)
- 不完全なマルチパートアップロードの削除: 7日後
- ストレージクラスの移行:
- 「ルールを作成」をクリックして保存します
Terraformでの修復手順
# S3バケットの作成
resource "aws_s3_bucket" "example" {
bucket = "my-lifecycle-enabled-bucket"
tags = {
Name = "My Lifecycle Enabled Bucket"
Environment = "Production"
Compliance = "Required"
}
}
# バージョニングの有効化(推奨)
resource "aws_s3_bucket_versioning" "example" {
bucket = aws_s3_bucket.example.id
versioning_configuration {
status = "Enabled"
}
}
# ライフサイクルポリシーの設定
resource "aws_s3_bucket_lifecycle_configuration" "example" {
bucket = aws_s3_bucket.example.id
# ルール1: ログファイルのライフサイクル
rule {
id = "log-files-lifecycle"
status = "Enabled"
filter {
prefix = "logs/"
}
# ストレージクラスの移行
transition {
days = 30
storage_class = "STANDARD_IA"
}
transition {
days = 90
storage_class = "GLACIER_IR" # Glacier Instant Retrieval
}
transition {
days = 180
storage_class = "GLACIER" # Glacier Flexible Retrieval
}
transition {
days = 365
storage_class = "DEEP_ARCHIVE"
}
# 7年後に削除(コンプライアンス要件に応じて調整)
expiration {
days = 2555 # 7年
}
# 古いバージョンの管理
noncurrent_version_transition {
noncurrent_days = 30
storage_class = "STANDARD_IA"
}
noncurrent_version_transition {
noncurrent_days = 90
storage_class = "GLACIER"
}
noncurrent_version_expiration {
noncurrent_days = 180
}
}
# ルール2: 一時ファイルの管理
rule {
id = "temp-files-cleanup"
status = "Enabled"
filter {
and {
prefix = "temp/"
tags = {
Temporary = "true"
}
}
}
# 7日後に削除
expiration {
days = 7
}
}
# ルール3: 不完全なマルチパートアップロードのクリーンアップ
rule {
id = "abort-incomplete-multipart-uploads"
status = "Enabled"
abort_incomplete_multipart_upload {
days_after_initiation = 7
}
}
# ルール4: バックアップファイルの管理
rule {
id = "backup-files-lifecycle"
status = "Enabled"
filter {
prefix = "backups/"
}
# 30日後にGlacierへ移行
transition {
days = 30
storage_class = "GLACIER"
}
# 1年後にDeep Archiveへ移行
transition {
days = 365
storage_class = "DEEP_ARCHIVE"
}
# 10年後に削除(保持ポリシーに応じて調整)
expiration {
days = 3650 # 10年
}
}
}
# S3 Intelligent-Tieringの設定(オプション)
resource "aws_s3_bucket_intelligent_tiering_configuration" "example" {
bucket = aws_s3_bucket.example.id
name = "entire-bucket"
tiering {
access_tier = "ARCHIVE_ACCESS"
days = 90
}
tiering {
access_tier = "DEEP_ARCHIVE_ACCESS"
days = 180
}
}
重要な設定ポイント
- ストレージクラスの選択:
STANDARD
: 頻繁にアクセスされるデータSTANDARD_IA
: 30日以上アクセスされないデータGLACIER_IR
: 即座に取得可能なアーカイブGLACIER
: 数分〜数時間で取得可能DEEP_ARCHIVE
: 長期保存用(12時間以内に取得)
- コンプライアンス要件の考慮:
- 法的要件に基づいた保持期間の設定
- データ分類による異なるポリシーの適用
- コスト最適化:
- アクセスパターンに基づいた段階的な移行
- Intelligent-Tieringの活用による自動最適化
最後に
この記事では、S3バケットのライフサイクルポリシーが設定されていない問題について、リスクと対策を解説しました。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。