지난 프로젝트를 통해 Spring에서 AWS S3 파일 업로드 기능을 구현했었다.
문제는 파일 업로드는 정상적으로 동작하지만 파일 삭제가 되지 않았던 것이다. Spring의 S3 파일 삭제 코드를 실행하면 다음과 같은 에러가 출력된다.
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; ...
혹시 S3 버킷 정책에 문제가 있는 걸까 싶어 AWS 콘솔에서 S3 버킷 정책을 확인해봤다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::testbucket-20231231/*"
}
]
}
특별히 문제는 없어보이지만, "Action": "s3:*"이 삭제에 대한 권한을 구체적으로 명시한 것이 아니라 너무 느슨한 권한을 부여한 것은 아닌가 싶어 다음과 같이 "s:DeleteObject"을 추가했다.
"Action": [
"s3:*",
"s3:DeleteObject"
],
그럼에도 여전히 프로그램을 실행하면 삭제 코드에서 Access Denied 된다. 무엇이 문제인지 몰라 다음과 같이 여러 권한을 한꺼번에 부여해봤다.
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:Get*",
"s3:List*",
"s3:ListBucket",
"s3:PutObject*",
"s3:*"
],
그랬더니 이번에는 AWS 콘솔에서 '변경 사항 저장'을 클릭하면 다음 알 수 없는 오류 문구가 출력되면서 저장되지 않는다.

'Resource에 Action이 적용되지 않는다.' "Resource"에서 "arn:aws:s3:::testbucket-20231231/*"은 해당 버킷의 모든 객체에 대해 권한을 부여하는 것을 의미한다. 객체 뿐만이 아닌 버킷 자체에 대해 권한을 부여하기 위해 "arn:aws:s3:::testbucket-20231231"을 추가해봤다.
"Resource": [
"arn:aws:s3:::testbucket-20231231",
"arn:aws:s3:::testbucket-20231231/*"
]
이제 정상적으로 변경 사항이 저장되었다. 그럼에도 삭제 코드는 여전히 정상적으로 실행되지 않는다.
이번에는 AWS 콘솔에서 IAM 권한 정책을 확인해봤다.

기존에 추가했던 정책은 AmazonS3FullAccess 뿐이었는데, AWSCompromisedKeyQuarantineV2 정책이 추가되어 있었다. 이게 무슨 정책인가 하여 알아보니 Github에 Access Key가 노출되면 해당 정책이 AWS에서 자동으로 부여하는 정책이었고, 확인해보니 이와 관련된 메일도 받았었다.

해당 메일은 간략히 다음과 같은 내용이다.
1단계: 애플리케이션에서 노출된 액세스 키를 사용하는 경우 키를 교체해야 합니다.
2단계: CloudTrail 로그에 원치 않는 활동이 있는지 확인합니다.
3단계: AWS 계정에 원치 않는 AWS 사용이 있는지 검토합니다.
4단계: 계정에 대한 액세스를 복원하고 일시 중단을 방지하고, 해당되는 경우 결제 조정을 신청하려면 기존 지원 사례 또는 신규 계정 생성에 응답하여1~3단계를 완료했는지 확인해야 합니다.
이에 따라 새로운 Access Key를 받아 적용하면 S3 파일 삭제 기능은 접근 거부 없이 정상적으로 실행된다.