• 카테고리

    질문 & 답변
  • 세부 분야

    데브옵스 · 인프라

  • 해결 여부

    미해결

서비스에서의 s3 생성시에 대한 레퍼런스 또는 조언 요청드립니다.

21.06.05 13:00 작성 조회수 281

0

[배경]

현재 제 서비스에서 ec2 에 있는 웹서버(public subnet)에서 s3에 이미지 파일을 업로드하고 다운로드 받으려 합니다.

웹서버는 특정s3에 접근 할 수 있는 iam_key(user)를 가지고 있습니다.

현재는

생성한 s3 버킷의 버킷정책에

모든 주체에게 생성한 버킷의 (버킷명/*)모든 객체한테 s3:getObject 부여했습니다

[질문 1]

이때 s3를 만들고 싶은데 s3의 4가지 퍼블릭 엑세스 차단을 어떻게 설정해야 할지 모르겟습니다. 또한 이 설정들이 의미하는 바가 무엇인지 구체적인 상황으로 이해가 안됩니다.

 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단

임의의 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단

 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단

임의의 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 및 교차 계정 액세스 차단

[질문 2]

특정 웹서버 또는 퍼블릭 서브넷에서만 s3 접근할 수 있게 하고 싶은데 어떻게 하면 좋을지 고민입니다.

좋은 레퍼런스나 조언을 주시면 좋겠습니다.

답변 5

·

답변을 작성해보세요.

1

안녕하세요?

제가 질문을 정확히 이해했다면 그 경우에는 정책 세팅은 아무것도 필요하지 않습니다. sourceIP도 필요하지 않구요. 방법 1을 사용하는 것이 맞습니다.

EC2는 이미 AccessKey나 Role을 가지고 있기 때문에 SDK 를 이용해서 가져오면 됩니다.

예를 들어 파이썬이라면 이렇게 두 줄만 사용하면 되구요.

s3 = boto3.client('s3')
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME')

혹시라도 방법 2를 사용해야 한다면 조금 더 나은 방법은 private IP를 이용해서 subnet의 CIDR을 사용하는 방법이 있는데요. 이 경우에는 VPC endpoint라는 서비스를 추가적으로 사용해야 합니다.

https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoints-s3.html

이 링크 참고하시면 될 것 같아요.

열심히 공부해 주셔서 감사합니다.

1

호눅스님, 바쁘신 와중에 제 질문을 읽어주시고 답변을 달아주셔서 너무 감사합니다.

제가 여쭈고 싶은것은

사용자가 웹 서버를 통해 접근했을 때, 웹 서버가 컨텐츠 접근을 할 수 있도록 구현하고 싶습니다.

S3 엑세스 방법을

호눅스님이 제안하신 방법 중 해당하는 s3버킷에 접근할 수 있는 ip를 특정하는 방법에 대해서 여쭤보았습니다.

다만 웹 서버들의 ip를 특정할 때, sourceIp에 웹 서버의 public ip를 일일이 적는 것이 맞는지? 또는 웹서버가 있는 public subnet의 public ip를 적을 수 있는지? 여쭤보고 싶었습니다.

1

첫번째 질문에 대한 답볍은 기본적으로는 불가능합니다. 여러가지 편법을 사용할 수는 있지만 굳이 필요하지는 않구요.

질문내용을 보니 사용자가 웹 서버를 통해 접근했을 때만 컨텐츠 접근을 할 수 있도록 구현하고 싶은 것 같은데요. 그럴 경우 S3 단독으로 사용하는 것이 아니라 직접 기능을 구현하셔야 합니다. 보통 API gateway - lambda 의 조합으로 구현하거나, ec2 에서 해당하는 API를 구현해서 제공해 줘야 하는데, 해당 내용은 좀 더 AWS 및 백엔드 프레임워크에 대한 이해가 더 필요할 것 같습니다.

1

감사합니다. 호눅스님

여러 번 실험을 해보니, 각 기능을 모두 이해 못했지만, 어느상황에 어떻게 사용해야하는 지 익혔습니다.

특정 ip만 ip 허용해 주는 방법 2에 있어서,  질문이 하나 더 있습니다.

sourceIp는 어떤 IP를 넣어 주어야 하는 걸까요?

만약 userIp라면

유저는 불특정 다수인데 이렇게 하면, 모든 유저가 다운로드 받을 수 있게 활용하지 못할 거라 생각합니다.

sourceIp가 웹서버가 있는 ip여야 한다고 생각합니다.

제 생각이 맞다면  여기서 추가 질문이 있습니다.

저는 웹서버 또한 오토스케일링과 같은 이유로 변할 것이라 생각합니다.

아마 퍼블릭 보안그룹이나 퍼블릭 서브넷을 통하여 허용 해주어야 한다고 생각하는데,

퍼블릭 보안그룹이나 퍼블릭 서브넷의  public IP CIDR 표현은 어떻게 알 수 있을까요?

너무 잘 설명해주셔서 감사합니다. :) 

1

강의에도 나와 있지만 ec2 웹서버에는 iam key 보다는 IAM role을 이용해 설정을 하시는 것이 좋습니다.

관련 강의 다시 한 번 살펴 보시면 도움이 될 것 같습니다. 물론 지금 현재 세팅으로 사용해도 보안상의 이슈외에 큰 문제는 없습니다.

방법 1:

ACL 관련 설정은 기본값 그대로 모두 차단으로 해 놓고 사용해도 s3의 파일들에 접근할 수 있습니다. 

이 경우 웹 서버에서 사용하는 언어의 SDK를 이용해서 S3의 컨텐츠를 가져오시면 됩니다.

별도의 GetObject 권한도 필요 없습니다.

방법2:  IP 제한

이 경우에는  모든 ACL 설정을 허용으로 두고 아래의 버킷 policy 처럼 특정 IP에만 허용하면 됩니다.

아래 정책과 링크를 참고해 보세요. 

{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "IpAddress": {"aws:SourceIp": "54.240.143.0/24"} } } ] }

https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html