
Amazon S3向けセキュリティツールキット
Amazon S3 のためのセキュリティツールキット

🍊 Instacart で実戦投入済み
以下を実行:
pip install s3tk
AWS CLI または AWS Vault を使用して AWS 認証情報を設定できます:
pip install awscli
aws configure
各コマンドに必要な IAM ポリシー を参照してください。
バケットをスキャンして以下を確認:
s3tk scan
特定のバケットのみ実行
s3tk scan my-bucket my-bucket-2
ワイルドカードでも動作
s3tk scan "my-bucket*"
正しいログバケットとプレフィックスを確認
s3tk scan --log-bucket my-s3-logs --log-bucket other-region-logs --log-prefix "{bucket}/"
CloudTrail オブジェクトレベルのログ記録をチェック [試験的]
s3tk scan --object-level-logging
ログ、バージョニング、またはデフォルトの暗号化をスキップ
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
障害発生時にメール通知を受け取る(SNS 経由)
s3tk scan --sns-topic arn:aws:sns:...
バケットポリシーを一覧表示
s3tk list-policy
特定のバケットのみ実行
s3tk list-policy my-bucket my-bucket-2
名前付きステートメントを表示
s3tk list-policy --named
注意: これにより以前のポリシーは置き換えられます
プライベートアップロードのみ許可
s3tk set-policy my-bucket --no-object-acl
ポリシーを削除
s3tk delete-policy my-bucket
特定のバケットで公開アクセスをブロック
s3tk block-public-access my-bucket my-bucket-2
テストするには --dry-run フラグを使用
すべてのバケットでログを有効化
s3tk enable-logging --log-bucket my-s3-logs
特定のバケットのみ
s3tk enable-logging my-bucket my-bucket-2 --log-bucket my-s3-logs
ログプレフィックスを設定(デフォルトは {bucket}/)
s3tk enable-logging --log-bucket my-s3-logs --log-prefix "logs/{bucket}/"
テストするには --dry-run フラグを使用
ログ記録に関する注意点:
すべてのバケットでバージョニングを有効化
s3tk enable-versioning
特定のバケットのみ
s3tk enable-versioning my-bucket my-bucket-2
テストするには --dry-run フラグを使用
すべてのバケットでデフォルト暗号化を有効化
s3tk enable-default-encryption
特定のバケットのみ
s3tk enable-default-encryption my-bucket my-bucket-2
これにより既存のオブジェクトは暗号化されません。その場合は encrypt コマンドを使用してください
テストするには --dry-run フラグを使用
バケット内のすべてのオブジェクトの ACL をスキャン
s3tk scan-object-acl my-bucket
特定のオブジェクトのみ
s3tk scan-object-acl my-bucket --only "*.pdf"
特定のオブジェクトを除外
s3tk scan-object-acl my-bucket --except "*.jpg"
バケット内のすべてのオブジェクトの ACL をリセット
s3tk reset-object-acl my-bucket
これによりすべてのオブジェクトがプライベートになります。今後適用する方法についてはバケットポリシーを参照してください
テストするには --dry-run フラグを使用
特定のオブジェクトの指定方法はオブジェクト ACL のスキャンと同じ
バケット内のすべてのオブジェクトをサーバーサイド暗号化で暗号化
s3tk encrypt my-bucket
デフォルトでは S3 管理キー を使用します。KMS 管理キー を使用する場合:
s3tk encrypt my-bucket --kms-key-id arn:aws:kms:...
顧客提供キー を使用する場合:
s3tk encrypt my-bucket --customer-key secret-key
テストするには --dry-run フラグを使用
特定のオブジェクトの指定方法はオブジェクト ACL のスキャンと同じ
注意: オブジェクトはカスタム ACL を失います
バケット内の暗号化されていないオブジェクトのバージョンをすべて削除
s3tk delete-unencrypted-versions my-bucket
安全性のため、現在のバージョンのオブジェクトは削除されません
テストするには --dry-run フラグを使用
特定のオブジェクトの指定方法はオブジェクト ACL のスキャンと同じ
Route 53 をスキャンしてバケットを所有していることを確認
s3tk scan-dns
そうしないと、サブドメイン乗っ取りに対して脆弱になる可能性があります
認証情報は ~/.aws/credentials または環境変数で指定できます。環境変数の説明についてはこのガイドを参照してください。
使用するプロファイルを指定:
AWS_PROFILE=your-profile s3tk
各コマンドに必要な権限は以下の通りです。必要なステートメントのみを含めてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Scan",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketAcl",
"s3:GetBucketPolicy",
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketLogging",
"s3:GetBucketVersioning",
"s3:GetEncryptionConfiguration"
],
"Resource": "*"
},
{
"Sid": "ScanObjectLevelLogging",
"Effect": "Allow",
"Action": [
"cloudtrail:ListTrails",
"cloudtrail:GetTrail",
"cloudtrail:GetEventSelectors",
"s3:GetBucketLocation"
],
"Resource": "*"
},
{
"Sid": "ScanDNS",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": "*"
},
{
"Sid": "ListPolicy",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "SetPolicy",
"Effect": "Allow",
"Action": [
"s3:PutBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "DeletePolicy",
"Effect": "Allow",
"Action": [
"s3:DeleteBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "BlockPublicAccess",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketPublicAccessBlock"
],
"Resource": "*"
},
{
"Sid": "EnableLogging",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketLogging"
],
"Resource": "*"
},
{
"Sid": "EnableVersioning",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketVersioning"
],
"Resource": "*"
},
{
"Sid": "EnableDefaultEncryption",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutEncryptionConfiguration"
],
"Resource": "*"
},
{
"Sid": "ResetObjectAcl",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObjectAcl",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "Encrypt",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "DeleteUnencryptedVersions",
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:GetObjectVersion",
"s3:DeleteObjectVersion"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
Amazon Athena は S3 ログのクエリに最適です。テーブルを作成してクエリを実行:
SELECT
parse_datetime(requestdatetime, 'dd/MMM/yyyy:HH:mm:ss Z') AS time,
key,
remoteip,
useragent
FROM
s3_access_logs_db.mybucket_logs
WHERE
requester = '-'
AND httpstatus LIKE '2%'
AND key LIKE 'some-keys%'
ORDER BY 1
Amazon Athena は CloudTrail ログのクエリにも最適です。テーブルを作成してクエリを実行:
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
シンプルに保ち、最小権限の原則に従ってミスの可能性を減らします。
GetObject を含めない)プライベートアップロードのみ許可
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
バケットオブジェクトを反復処理するコマンド(scan-object-acl、reset-object-acl、encrypt、delete-unencrypted-versions)では、レイテンシを最小限にするために EC2 サーバー上で s3tk を実行してください。
set-policy、block-public-access、enable-logging、enable-versioning、enable-default-encryption コマンドは便宜のために提供されています。バケットの管理には Terraform を推奨します。
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-bucket"
acl = "private"
logging {
target_bucket = "my-s3-logs"
target_prefix = "my-bucket/"
}
versioning {
enabled = true
}
}
resource "aws_s3_bucket_public_access_block" "my_bucket" {
bucket = "${aws_s3_bucket.my_bucket.id}"
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
以下を実行:
pip install s3tk --upgrade
マスターブランチを使用するには:
pip install git+https://github.com/ankane/s3tk.git --upgrade
以下を実行:
docker run -it ankane/s3tk aws configure
認証情報をコミット:
docker commit $(docker ps -l -q) my-s3tk
そして実行:
docker run -it my-s3tk s3tk scan
変更ログを参照
このプロジェクトの改善にご協力ください。以下の方法で貢献できます:
開発を始めるには:
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev