Amazon S3 버킷 정책 예시
Amazon S3 버킷 정책 예시 (Examples of Amazon S3 bucket policies)
버킷 정책은 리소스 기반 정책으로, 리소스 소유자가 버킷과 버킷의 객체에 대한 액세스 권한을 부여하는 데 사용해요. 버킷 정책이 버킷에 연결되면 버킷 소유자가 소유한 버킷의 모든 객체에 정책이 적용돼요.
다음 예시는 버킷 정책으로 수행할 수 있는 일반적인 작업을 보여줘요. 예시에 사용된 자리 표시자(placeholder)를 본인의 정보로 바꾼 뒤 사용하세요.
출처: 문서
본문
예시 1: 다른 계정이 버킷에 객체를 업로드할 수 있도록 허용
다음 버킷 정책은 다른 AWS 계정(계정 B)이 버킷에 객체를 업로드할 수 있게 허용해요. Principal 요소에 다른 계정의 루트를 지정하고 s3:PutObject 작업을 허용하며 Resource에 버킷의 모든 객체(bucket-name/*)를 지정해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
이 예시는 다른 계정의 루트 사용자에게 권한을 부여해요. 계정 내 특정 사용자나 역할에게 권한을 부여하려면 루트 대신 해당 사용자 또는 역할의 ARN을 지정하세요. 권한을 더 세밀하게 제한하려면 조건 요소를 추가해 특정 조건(예: 특정 IP 주소, 특정 소스)에서만 작업을 허용할 수 있어요.
예시 2: 버킷 소유자가 업로드된 객체를 완전히 제어하도록 보장
버킷 소유자가 다른 계정이 업로드한 객체에 대해 완전한 제어를 유지하도록 하려면 다음 정책을 사용하세요. 이 정책은 객체 업로드에 bucket-owner-full-control 캐닝 ACL을 요구해, 버킷 소유자가 업로드된 객체를 소유하고 완전히 제어하도록 보장해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
예시 3: 다른 계정이 버킷에서 객체를 읽을 수 있도록 허용
다음 버킷 정책은 다른 AWS 계정의 사용자가 버킷의 객체를 읽을 수 있게 허용해요. s3:GetObject 작업을 허용하며 객체 읽기(다운로드) 권한을 부여해요. 이 정책은 객체를 나열하는 권한은 부여하지 않으므로, 사용자가 객체 이름을 알고 있어야 해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/Dave"
},
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
]
}
예시 4: 객체를 나열할 권한 부여
버킷의 객체를 나열하려면 s3:ListBucket 권한이 필요해요. 다음 정책은 다른 계정의 사용자에게 버킷의 객체를 나열할 권한을 부여해요. Resource는 버킷 자체(amzn-s3-demo-bucket)를 지정하며, s3:ListBucket 작업을 허용해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/Dave"
},
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
}
]
}
읽기와 나열 권한을 함께 부여하려면 s3:GetObject와 s3:ListBucket을 모두 같은 정책의 Action 배열에 지정하면 돼요.
예시 5: 모든 권한 거부
버킷 또는 객체에 대한 모든 액세스를 거부하려면 Deny 효과를 사용하세요. 다음 정책은 지정된 계정이 버킷과 그 객체에서 모든 S3 작업을 수행하는 것을 거부해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket/*"
]
}
]
}
참고 거부(Deny)는 다른 정책이 허용(Allow)을 부여하더라도 우선 적용돼요. 즉 특정 보안 주체나 조건에 대해 명시적 거부를 설정하면 더 넓은 허용 정책보다 우선해요.
예시 6: 프리픽스를 기준으로 객체 액세스 제한
다음 정책은 logs/ 프리픽스로 시작하는 객체에만 액세스를 제한해요. Resource에 arn:aws:s3:::amzn-s3-demo-bucket/logs/*를 지정해 해당 프리픽스 아래의 객체에만 s3:GetObject 작업을 허용해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/Dave"
},
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/logs/*"
}
]
}
예시 7: 보안 전송 프로토콜(HTTPS) 요구
다음 정책은 요청이 HTTPS(보안 전송)를 통해 이루어지지 않으면 모든 S3 작업을 거부해요. aws:SecureTransport 조건 키를 사용하며, 값이 false인 경우(Https가 아닌 경우) 거부해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
이 정책은 HTTPS를 통한 요청은 허용하고, HTTP와 같이 보안되지 않은 전송을 통한 요청은 거부해요. SSL/TLS를 통한 요청만 허용하려면 이 거부 조건을 사용하세요.
예시 8: 특정 IP 주소로부터의 액세스 제한
aws:SourceIp 조건 키를 사용해 특정 IP 주소 범위에서만 요청을 허용하거나 거부할 수 있어요. 다음 정책은 지정된 IP 범위 밖에서 이루어지는 요청을 거부해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "54.240.143.0/24"
}
}
}
]
}
이 정책은 54.240.143.0/24 CIDR 범위를 제외한 모든 IP 주소로부터의 요청을 거부해요. 특정 IP에서만 허용하려면 허용(Allow) 정책을 작성하고 IpAddress 조건에 해당 IP 범위를 지정하세요.
예시 9: 소스 VPC 또는 VPC 엔드포인트로 액세스 제한
aws:SourceVpc 및 aws:SourceVpce 조건 키를 사용해 특정 VPC 또는 VPC 엔드포인트에서 발생하는 요청으로 제한할 수 있어요. 다음 정책은 지정된 VPC 엔드포인트(vpce-11223344556677889)에서 오지 않는 모든 요청을 거부해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket",
"arn:aws:s3:::amzn-s3-demo-bucket/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-11223344556677889"
}
}
}
]
}
VPC 기반 액세스 제어의 자세한 예시는 버킷 정책으로 VPC 엔드포인트에서의 액세스 제어를 참고하세요.
참고 사항 및 모범 사례
- Principal에 와일드카드 사용 주의 -
"Principal": "*"를Allow효과와 함께 사용하면 누구나 리소스에 액세스할 수 있어요. 공개 액세스를 의도하지 않는 한 명시적으로 허용할 계정, 사용자, 역할을 나열하세요. - 최소 권한 원칙 - 필요한 작업과 리소스에 대해서만 권한을 부여해요. 와일드카드 액션(
s3:*)의 사용을 최소화하고 특정 작업을 지정하세요. - 조건 키 활용 - IP 주소, VPC, HTTPS, 소스 ARN 등 조건을 사용해 액세스를 더 세밀하게 제한할 수 있어요.
- 버킷 정책 크기 제한 - 버킷 정책은 20KB로 제한돼요. 복잡한 액세스 권한이 필요한 경우 액세스 포인트나 S3 Access Grants와 같은 다른 액세스 관리 도구를 고려하세요.