230904_ AWS S3 버킷 정책과 DeleteObject

hoy_·2023년 9월 4일
0

Today, I Learned

목록 보기
36/36

09/04 문제 해결 과정


AWS S3에서 데이터 삭제가 정상적으로 처리되지 않는 현상


AWS S3 업로드/삭제 테스트를 하던 중 삭제 기능이 작동하지 않음을 확인했다.

작업하고 있는 프로젝트 특성상 주로 게시판을 나눠 작업하고, 날짜 별 이미지 관리가 중요하기 때문에 폴더를 나누어 관리하도록 했다.


위와 같은 이유 때문에 로직에 문제가 생긴 것인지 확인하기 위해 디버그를 돌렸다.

String result = "success";

		try {
			String keyName = uploadFilePath + "/" + uuidFileName;
			boolean isObjectExist = amazonS3Client.doesObjectExist(bucketName, keyName);
			if (isObjectExist) {
				amazonS3Client.deleteObject(bucketName, keyName);
			} else {
				result = "file not found";
			}
		} catch (Exception e) {
			log.debug("Delete File failed", e);
		}

		return result;


@RequestParam 에 넘겨주는 값으로 URL을 만들어 deleteObject 를 실행한다.

위 코드의 결과로 success가 정상 출력되지만 확인해보면 버킷에 들어있는 데이터는 지워지지 않는 상황, AWS S3 설정의 문제라고 파악했다.

해당 버킷의 정책은 다음과 같다.


{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::4riplus/*"
		}
	]
}

Action에서 모든 기능을 허용하고 있기 때문에 Delete만 실행되지 않을 이유가 없었다.


버킷 정책을 바꾸고 URL 수정과 디버깅을 여러차례 해봐도 이유를 알 수 없었는데, 원인은 버킷 정책이 아니라 IAM 사용자 정책이었다.


기존에 S3에 접근하기 위해 IAM에 AmazonS3FullAccess 권한 정책을 생성하고 액세스 키를 발급했다.

액세스 키와 시크릿 키는 application.properties 에 저장하여 사용하게 된다.

그런데 처음 백오피스 repository를 분리할 때의 실수로 gitignore 설정이 풀려있었고, application.properties 가 git에 노출되어 있는 상태이기 때문에 이를 감지한 AWS가 외부의 추가적인 비용 발생을 막고자 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": [
                "*"
            ]
        }
    ]
}

AWSCompromisedKeyQuarantineV2 의 보안 정책
DeleteObject 기능이 Deny 되어있다.


해결 방법은 비교적 간단하다.
  1. 외부로 노출된 코드 삭제

    • application.properties gitignore 설정을 걸어준다.
  2. 액세스 키를 재발급 받는다.

  3. IAM의 AWSCompromisedKeyQuarantineV2 정책을 제거한다.

  4. 버킷 정책을 점검한다.



덧붙여 액세스 키나 시크릿 키가 외부에 노출된 경우 AWS에서 메일을 보내준다.

profile
배우는 사람

0개의 댓글