본문 바로가기
AWS 기술/Storage

S3 정책 (Endpoint와 특정 확장자 객체만 업로드) + IAM Role 활용

by 콤텍시스템

 

* S3 bucket 정책

Endpoint와 특정 확장자(jpg)파일만 업로드 할 수 있도록 하는 정책

 

특정 확장자의 객체만 S3에 업로드 할 수 있도록 하는 정책 예제

 https://aws.amazon.com/ko/premiumsupport/knowledge-center/s3-allow-

 certain-file-types/

 

추가로 특정 IAM Role을 가진 서비스만 접근 가능하고, 그 외에는 모두 Deny 는 정책

{

"Version": "2012-10-17",

"Id": "Policy1464968545158",

"Statement": [

{

"Sid": "Stmt1464968483619",

"Effect": "Allow", "Principal": {

"AWS": "arn:aws:iam::111111111111:user/exampleuser"

},

"Action": "s3:PutObject", "Resource": [

"arn:aws:s3:::DOC:EXAMPLE-BUCKET/*.jpg",

"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",

"arn:aws:s3:::DOC-XAMPLE-BUCKET/*.gif"

]

},

{

"Sid": "Stmt1464968483619",

"Effect": "Deny",

"Principal": "*",

"Action": "s3:PutObject", "NotResource": [

"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",

“arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",

"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"

]

}

]

}

 

위 정책에서

"AWS": "arn:aws:iam::111111111111:user/exampleuser" 이 부분을 특정한 유저가 없 경우 아래와 같이 설정해서 적용해 놓을 수 있.

"AWS": "*" 이 정책은 모두 허용 되어있는 상황이다.

 

하지만 정책은 Public Bucket에만 적용되는 정책이다.

Private Bucket에는 Public Bucket과는 다르게 Principal All Allow put 먹히지 않는다.

Principal 명시적인 유저 or 조건이 있어야 한다. (Condition으로 Endpoint 주소를 넣으면 된.)

 

* 라우팅

S3 Endpoint Service를 생성하게 되면 라우팅테이블에 자동으로 Endpoint가 추가된다.

0.0.0.0/0을 모두 IGW로 간다고 가정한다면 Endpoint로 가는 경로와 우선순위가 어 떻게 되는지에 대해 라우팅 테이블을 하나만 쓸 경우 헷갈릴 수 있다.

결론은 같은 리전의 S3서비스로 향하는 subnet은 Endpoint 경로를 타고 가게된다 .

 

아래 정책은 private bucket에 대한 정책이다.

{

"Version": "2012-10-17",

"Id": "Policy1464968545158",

"Statement": [

{

"Sid": "Stmt1464968483619",

"Effect": "Allow", "Principal": {

"AWS": "arn:aws:iam::123456789111:user/user1"

},

"Action": "s3:PutObject",

"Resource": "arn:aws:s3:::My_Bucket_Name/.jpg"

},

{

"Sid": "Stmt1464968483619",

"Effect": "Deny",

"Principal": "*",

"Action": "s3:PutObject",

"NotResource": "arn:aws:s3:::My_Bucket_Name/*.jpg"

}

]

}

put에 대해 jpg파일이 아닌 것들에 대해서는 deny를 해주는 정책이다.

 

 

* Private Bucket 구성 후 Endpoint 경로 + 특정 확장자만 허용하는 정책

{

"Version": "2012-10-17",

"Id": "Policy1464968545158",

"Statement": [

{

"Sid": "Stmt1464968483619",

"Effect": "Allow",

"Principal": "",

"Action": "s3:PutObject", "Resource": [

"arn:aws:s3:::My_Bucket_Name/.jpg", "arn:aws:s3:::My_Bucket_Name/.jpeg", "arn:aws:s3:::My_Bucket_Name/.png", "arn:aws:s3:::My_Bucket_Name/.gif", "arn:aws:s3:::My_Bucket_Name/.mp4"

],

"Condition": { "StringEquals": {

"aws:SourceVpce": "vpce-0123456d652b0e74"

}

}

},

{

"Sid": "Stmt1464968483619",

"Effect": "Deny",

"Principal": "",

"Action": "s3:PutObject", "NotResource": [ "arn:aws:s3:::My_Bucket_Name/.jpg", "arn:aws:s3:::My_Bucket_Name/.jpeg", "arn:aws:s3:::My_Bucket_Name/.png", "arn:aws:s3:::My_Bucket_Name/.gif", "arn:aws:s3:::My_Bucket_Name/.mp4"

],

"Condition": {

"StringEquals": {

"aws:SourceVpce": "vpce-0123456d652b0e74"

}

}

}

]

}

S3 Endpoint 경로로 온 것들에 대해 특정 확장자를 제어하는 정책이다.

S3 EndpointID값을 넣어줬다. S3 Endpoint Interface 방식의 경우에는 ID값이 아닌 DNS정보를 넣어주어야 한다.

 

여기서 추가로 S3 Enpoint 통해 들어온 것에 대해 모두 허용하고 싶지 않을 있다. IAM Role기반으로 Allow or Deny 적용할 있다.

 

* IAM Role기반으로 Allow or Deny

{

"Version": "2012-10-17",

"Id": "Policy1464968545158",

"Statement": [

{

"Sid": "Stmt1464968483619",

"Effect": "Allow",

"Principal": "",

"Action": "s3:PutObject",

"Resource": "arn:aws:s3:::My_Bucket_Name/.jpg", "Condition": {

"StringEquals": {

"aws:SourceVpce": "vpce-0123456007b634"

}

}

},

{

"Sid": "Stmt1464968483619",

"Effect": "Deny",

"Principal": "",

"Action": "s3:PutObject",

"NotResource": "arn:aws:s3:::My_Bucket_Name/.jpg",

"Condition": {

"StringEquals": {

"aws:SourceVpce": "vpce-0123456007b634"

}

}

},

{

"Sid": "Restrict-acess-to-specific-IAM-role", "Effect": "Deny",

"Principal": "",

"Action": "",

"Resource": "arn:aws:s3:::My_Bucket_Name/*", "Condition": {

"ArnNotEquals": {

"aws:PrincipalArn": "arn:aws:iam::123456789012:role/ec2fors3_full"

}

}

}

]

}

위 정책은 Endpoint 경로를 해 온 IAM role (ec2fors3_full)을 가진 userput 작업에 대해 jpg파일만 허용하고 그 외에는 모두 Deny하는 정책이다.

 

 

* Test 확인

역할이 잘 적용되어 있는 경우 jpg파일만 올라간다.

 

해당 머신에 다른 Role이 적용된 경우 모두 Deny된다.

 

이렇게 bucket 정책으로 제어도 가능하지만, Endpoint Service 정책으로도 제어가 가능하다.

댓글