S3 버킷 액세스를 HTTPS로 제한해 보기
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 S3 버킷 액세스를 HTTPS로 제한해 보는 방법을 정리해 봤습니다.
S3 버킷 액세스 테스트
S3 버킷으로 액세스를 하기 위해 AWS CLI를 사용할 생각입니다.
AWS CLI의 경우 일반적으로 HTTPS를 사용하여 AWS 서비스에 요청을 보냅니다.
또 한, S3 버킷의 경우 일반적으로 HTTP, HTTPS의 액세스를 모두 허용하고 있습니다.
먼저 테스트를 위해「s3-https-test-bucket」라는 버킷을 생성하고「test.png」파일을 업로드한 상태입니다.
AWS CLI로「test.png」로 액세스 해 보도록 하겠습니다.
aws s3 ls s3://s3-https-test-bucket/test.png 2023-02-25 22:09:44 131058 test.png
HTTPS로 문제 없이 액세스할 수 있는 것을 확인할 수 있습니다.
이어서 HTTP로 액세스 해 보도록 하겠습니다.
aws s3 ls s3://s3-https-test-bucket/test.png --endpoint-url http://s3.ap-northeast-1.amazonaws.com 2023-02-25 22:09:44 131058 test.png
HTTP도 문제 없이 액세스 되는 것을 확인할 수 있습니다.
이제 HTTPS만 액세스 가능하도록 S3 버킷 정책을 수정해 보겠습니다.
HTTPS만 액세스 가능하도록 정책 수정
HTTPS 액세스만 가능하도록 버킷 정책을 다음과 같이 수정합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSSLRequestsOnly", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::s3-https-test-bucket", "arn:aws:s3:::s3-https-test-bucket/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }
CloudFormation으로 S3 버킷을 생성할 경우 버킷 정책은 아래와 같습니다.
ServerLogsBucketPolicy: Type: 'AWS::S3::BucketPolicy' Properties: Bucket: !Ref testHttpsBucket PolicyDocument: Version: "2012-10-17" Statement: - Action: - 's3:*' Effect: Deny Sid: AllowSSLRequestsOnly Resource: - !Sub 'arn:aws:s3:::${testHttpsBucket}' - !Sub 'arn:aws:s3:::${testHttpsBucket}/*' Principal: '*' Condition: Bool: "aws:SecureTransport": false
정책 설정이 끝났으면, 이제 AWS CLI로 다시 액세스해 보겠습니다.
aws s3 ls s3://s3-https-test-bucket/test.png 2023-02-25 22:09:44 131058 test.png
HTTPS로는 문제 없이 액세스 가능 한 것을 확인할 수 있습니다.
aws s3 ls s3://s3-https-test-bucket/test.png --endpoint-url http://s3.ap-northeast-1.amazonaws.com An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
이어서 HTTP로 액세스를 시도해 보면「AccessDenied」에러가 발생하는 것을 확인할 수 있습니다.
S3 버킷은 기본적으로 HTTPS, HTTP 액세스가 허용된 상태이기 때문에 보안적인 측면을 고려해 HTTPS 액세스만을 허용하도록 정책을 수정할 필요가 있다고 생각합니다.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 [email protected]로 보내주시면 감사하겠습니다.