一个面向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 标志进行测试
指定部分对象的方式与 scan-object-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 标志进行测试
指定部分对象的方式与 scan-object-acl 相同
注意: 对象将丢失任何自定义 ACL
删除存储桶中所有对象的未加密版本
s3tk delete-unencrypted-versions my-bucket
为安全起见,这不会删除任何对象的当前版本
使用 --dry-run 标志进行测试
指定部分对象的方式与 scan-object-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