앞서 S3의 버켓 수준의 정책을 정책 생성기를 통해서 지정한 적이 있다.
전체 사용자에 대해서 getObject만 허용하는 정책이었다.
{
"Version": "2012-10-17",
"Id": "Policy1594463565651",
"Statement": [
{
"Sid": "Stmt1594463549355",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::s3testing/*"
}
]
}
이번에는 공식 문서를 통해 조금 더 세부적인 내용의 S3 정책을 알아보도록하자.
Statement 이하의 Resource는 ARN 형식으로 리소스를 식별한다.
S3는 다음과 같은 형식을 띄고 있다.
// ARN 형식
arn:partition:service:region:namespace:relative-id
// S3
arn:aws:s3:::bucket_name/key_name
// S3 examplebucket 버킷 아래의 모든 파일
arn:aws:s3:::examplebucket/*
// 계정의 모든 S3 버킷
arn:aws:s3:::*
// example1bucket, example2bucket 등
arn:aws:s3:::example?bucket/*
Principal은 해당 정책이 적용되는 유저를 말합니다. 만약 root 계정 외에 다른 서브 계정이 많은 기업이라면 이런 권한 속성이 중요하겠죠. 또, 해당 버킷이 만약에 웹 서비스를 한다면 모든 유저(*)에게 열어둬야겠죠?
"Principal":{"AWS":"arn:aws:iam::AccountNumber-WithoutHyphens:root"}
// 모든 유저(웹을 이용하는 불특정 다수)
"Principal":"*"
Action 부분은 무엇을 허용/금지할 것인지에 대한 구체적인 행동을 나타냅니다.
액션 뿐만 아니라 그 외의 속성에 주는 값들은 아래 문서를 통해 자세한 설명을 읽어볼 수 있습니다.
(https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/list_amazons3.html)
이제 아마존 공식 문서에서 예시로 든 구체적인 정책을 살펴보겠습니다. Condition 속성이 적용된 경우가 많습니다.
IP 밴
특정한 아이피만 S3에 접근할 수 없도로 막은 정책입니다.
s3에 대한 모든 액션은 Deny하도록 했으며 조건은 54.240.143.0/24 아이피일 경우입니다.
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::examplebucket/*",
"Condition": {
"NotIpAddress": {"aws:SourceIp": "54.240.143.0/24"}
}
}
]
}
HTTP Referer 체크를 통한 액세스 제한
http referer란 무엇인가
말 그대로 언급(refer)한 곳이다. 어디를 거쳐 현재 위치로 오게 되었는 지를 알 수 있다.
네이버에서 구글로 이동하면 구글이 받은 request 헤더의 referer로 naver가 남는 셈이다.
A라는 웹 페이지에 B 사이트로 이동하는 하이퍼링크가 존재한다고 하자. 이때 웹 사이트 이용자가 이 하이퍼링크를 클릭하게 되면 웹 브라우저에서 B 사이트로 참조 주소(리퍼러)를 전송하게 된다. B 사이트의 관리자는 이 전송된 리퍼러를 보고 방문객이 A 사이트를 통해 자신의 사이트에 방문한 사실을 알 수 있다. (위키피디아)
많은 이미지를 서빙하는 웹은 referer를 체크하여 특정 접근을 막아둘 필요가 있습니다.
http referer를 체크하여 적절한 경로를 통해 접근하지 않으면 s3를 이용할 수 없게 하는 정책입니다.
www.example.com이나 example.com을 경유해 접속하지 않으면 이용할 수 없게 만들었습니다.
우리 웹에서만 이 이미지를 쓸 수 있도록 하겠다! 라면 이런 방법을 쓰시면 되겠습니다.
{
"Version":"2012-10-17",
"Id":"http referer policy example",
"Statement":[
{
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*",
"Condition":{
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
}
}
]
}
'AWS > ☁️ AWS' 카테고리의 다른 글
Elastic Beanstalk(EB)를 통한 배포 인프라 자동화 (0) | 2020.08.14 |
---|---|
S3 객체의 메타데이터 설정 (0) | 2020.07.12 |
인스턴스 스토어 사용 및 EBS와의 비교 (0) | 2020.07.11 |
EBS 스냅샷을 이용한 EBS 생성, AMI 생성, 리전 이동 (+ AMI) (0) | 2020.07.11 |
S3 CORS 구성 (0) | 2020.06.22 |