
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 플래그 사용
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
master를 사용하려면:
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