S3에서 이미지를 업로드하기 위한 버킷을 만들었고 이 버킷에 이미지를 업로드, 조회, 삭제를 하기 위해서는 버킷 정책을 추가해줘야한다.
https://growth-coder.tistory.com/114
위 포스팅에서는 업로드, 조회를 위해서 아래와 같이 버킷 정책에서 GetObject와 PutObject를 허용해줬다.
{
"Version": "2012-10-17",
"Id": "Policy1676906643252",
"Statement": [
{
"Sid": "Stmt1676906641908",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::dlalwl-upload/*"
}
]
}
이렇게 버킷 정책을 생성하고 추가로 버킷 객체 삭제 권한을 주기 위해서 아래와 같이 버킷 정책의 Action에 DeleteObject를 추가해줬다.
{
"Version": "2012-10-17",
"Id": "Policy1676906643252",
"Statement": [
{
"Sid": "Stmt1676906641908",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::dlalwl-upload/*"
}
]
}
그런데 업로드와 조회는 잘 되는데 삭제를 시도할때면 계속 403 Access Denied 에러가 발생했다.
버킷 정책을 잘못 적었나 싶어서 여러번 DeleteObject를 추가했지만 403 Access Denied 에러가 발생했다.
이유를 도저히 알 수 없었는데 문제는 S3 버킷 정책이 아니라 IAM 사용자 정책이었다.
https://growth-coder.tistory.com/116
위 포스팅에서 S3 버킷에 접근하기 위해 IAM 사용자를 생성해서 AmazonS3FullAccess 권한 정책을 생성하고 액세스 키를 발급했었다.
이 액세스 키를 발급받고 나서 스프링에서 사용하기 위해 스프링의 application.properties에 액세스 키와 시크릿 키를 저장했었다.
그리고 실수로 내 public 깃허브 레포지토리에 액세스 키와 시크릿 키가 담긴 application.properties를 push 해버리는 바람에 AWS에서 이를 감지하고 IAM 사용자 정책에 내가 추가한 적 없는 AWSCompromisedKeyQuarantineV2 정책을 자동으로 추가한 것이었다.
그리고 이에 대한 내용을 AWS 계정에 등록했던 메일로 보내주었다.
액세스 키가 노출되었기 때문에 예상치 못한 추가 과금이 일어나는 것을 방지하기 위해 자동으로 권한 정책을 추가한 것이었다.
추가된 AWSCompromisedKeyQuarantineV2 정책을 보면 여러가지 Action이 Deny 되어있는데 그 중 하나가 DeleteObject이다.
<AWSCompromisedKeyQuarantineV2 정책>
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"cloudtrail:LookupEvents",
"ec2:RequestSpotInstances",
"ec2:RunInstances",
"ec2:StartInstances",
"iam:AddUserToGroup",
"iam:AttachGroupPolicy",
"iam:AttachRolePolicy",
"iam:AttachUserPolicy",
"iam:ChangePassword",
"iam:CreateAccessKey",
"iam:CreateInstanceProfile",
"iam:CreateLoginProfile",
"iam:CreatePolicyVersion",
"iam:CreateRole",
"iam:CreateUser",
"iam:DetachUserPolicy",
"iam:PassRole",
"iam:PutGroupPolicy",
"iam:PutRolePolicy",
"iam:PutUserPermissionsBoundary",
"iam:PutUserPolicy",
"iam:SetDefaultPolicyVersion",
"iam:UpdateAccessKey",
"iam:UpdateAccountPasswordPolicy",
"iam:UpdateAssumeRolePolicy",
"iam:UpdateLoginProfile",
"iam:UpdateUser",
"lambda:AddLayerVersionPermission",
"lambda:AddPermission",
"lambda:CreateFunction",
"lambda:GetPolicy",
"lambda:ListTags",
"lambda:PutProvisionedConcurrencyConfig",
"lambda:TagResource",
"lambda:UntagResource",
"lambda:UpdateFunctionCode",
"lightsail:Create*",
"lightsail:Delete*",
"lightsail:DownloadDefaultKeyPair",
"lightsail:GetInstanceAccessDetails",
"lightsail:Start*",
"lightsail:Update*",
"organizations:CreateAccount",
"organizations:CreateOrganization",
"organizations:InviteAccountToOrganization",
"s3:DeleteBucket",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:PutLifecycleConfiguration",
"s3:PutBucketAcl",
"s3:PutBucketOwnershipControls",
"s3:DeleteBucketPolicy",
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:PutAccountPublicAccessBlock",
"s3:PutBucketPolicy",
"s3:ListAllMyBuckets"
],
"Resource": [
"*"
]
}
]
}
그렇기 때문에 버킷 정책에 DeleteObject를 Allow 설정을 하더라도 적용이 되지 않은 것이었다.
해결 방안은 간단하다.
1. 외부 노출 코드 삭제
나같은 경우 액세스 키가 담긴 application.properties 파일이 깃허브에 노출되어있었기 때문에 우선 application.properties 파일을 깃허브에서 삭제했다.
나는 가장 최근 커밋에서 application.properties 파일에 액세스 키를 추가했기 때문에 가장 최근 커밋에서 application.properties 파일을 삭제했다.
그리고 이러한 일이 다시 발생하는 것을 막기 위해 .gitignore 파일에 application.properties 파일을 등록하여 깃허브에 push되지 않도록 설정했다.
2. 액세스 키 재발급
액세스 키가 이미 노출되었기 때문에 기존 액세스 키를 계속 사용하는 것은 위험하다.
액세스 키를 재발급 받고 application.properties에 새로 발급받은 액세스 키와 시크릿 키로 바꿔주었다.
3. AWSCompromisedKeyQuarantineV2 정책
AWSCompromisedKeyQuarantineV2 정책에 DeleteObject가 Deny 되어있기 때문에 IAM 사용자 권한 정책에서 해당 정책을 삭제한다.
4. 버킷 정책에 DeleteObject 허용
{
"Version": "2012-10-17",
"Id": "Policy1676906643252",
"Statement": [
{
"Sid": "Stmt1676906641908",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::dlalwl-upload/*"
}
]
}
Effect는 Deny가 아닌 Allow여야 하고 Action에 DeleteObject를 추가한다.
이제 다시 서버를 실행하고 확인해보면 403 Access Denied 뜨지 않고 버킷에서 객체가 제대로 삭제되는 모습을 볼 수 있다.
그리고 메일을 확인해보면 액세스 키 삭제에 관한 메일이 도착해있다.
결론
액세스 키가 외부에 노출되면 AWS에서 자동으로 IAM 권한 정책에 여러 제한이 걸린 정책을 추가하기 때문에 내가 원하는 작업을 수행하지 못할 수 있다.
항상 액세스 키를 외부에 노출하지 말도록 하자.
'공부 > AWS' 카테고리의 다른 글
[AWS][Lambda] API gateway와 Lambda 함수 연결해서 api 배포하기 (2) (0) | 2023.04.04 |
---|---|
[AWS][Lambda] Lambda 개념 및 Lambda 함수 생성 방법 (1) (0) | 2023.04.02 |
[AWS] 스프링에서 S3 버킷에 이미지 업로드하기 (0) | 2023.02.24 |
[AWS] Identity Center를 활용한 관리자 IAM 사용자 생성 (관리자 IAM 사용자를 사용하는 이유) (2) | 2023.02.22 |
[AWS] Amazon S3 개념 및 파일 업로드 해보기 (0) | 2023.02.20 |
댓글