S3 버킷 정책 설정하기

버킷 정책을 JSON 형식으로 설정해볼건데, 정책 생성기를 사용하여 특정 AWS 사용자

생성할 버킷 정책 : 내가 만든 버킷(myk-s3-bucket)에 Object를 put/get 할 수 있고, 버킷의 위치와 버킷 리스트를 가져 올수 있는 정책을 설정할 것이다. 단, 내 IP에서만 이 행위들을 할 수 있게 설정해보자.

버킷 > 권한 > 버킷 정책으로 이동

스크린샷 2024-08-28 오후 3.13.41.png

편집으로 들어가서 정책생성기를 이용하면 편리하게 정책을 JOSN형태로 생성할 수 있다. (아쉽게도 한글 지원은 하지 않는다.)

스크린샷 2024-08-28 오후 3.14.47.png

  • Select Type of Policy : S3 Bucket Policy (S3 버킷 정책)
  • Effect : Allow (허용할 권한을 생성할 것이기 때문에)
  • Principal : AWS 유저의 ARN (정책을 적용할 AWS 유저를 지정한다. → IAM에서 해당 유저의 ARN을 복사하면 된다, 여러 유저라면 ‘,’로 지정하면 되고 전체 IAM 유저를 지정하려면 ‘*’를 입력)

    스크린샷 2024-08-28 오후 3.18.42.png

  • Actions : get Obejct, put Object (정책에 해당하는 action을 지정)
  • Amazon Resource Name : arn:aws:s3:::myk-s3-bucket/* (정책을 적용할 리소스 지정)
    • 버킷 정책 편집에 내 버킷 ARN을 복사한 후 버킷 아래의 모든 Object들에 적용할 거기 때문에 /* 붙여줌

      스크린샷 2024-08-28 오후 3.20.48.png

    • 특정 폴더별 혹은 객체로 지정하려면 /folder_name/* 혹은 /folder_name/object_name으로 지정

스크린샷 2024-08-28 오후 3.16.46.png

접근 허용할 IP를 지정하려면 Add Conditions를 선택하여 해당 옵션을 주면 된다.

  • Condition : IpAddress
  • Key : aws:SourceIp
  • Value : 허용할 IP 입력 (나의 IP로 입력했다.)

스크린샷 2024-08-28 오후 3.23.24.png

입력한 후 Add Condition 클릭 후 Add Statement를 클릭하면 방금 생성한 정책이 정책 생성기 리스트에 추가된다.

스크린샷 2024-08-28 오후 3.27.02.png

이제 GetBucketLocation, ListBucket을 추가한다.

따로 하는 이유는 GetObejct, PutObject는 적용할 리소스가 객체 단위이므로 “Resouerce”값에 arn:aws:s3:::버킷명/* 으로 지정해주었다.

하지만, GetBucketLocation, ListBucket는 적용할 리소스가 버킷 단위이므로 “Resouerce”값에 /*가 들어간다면 생성시 에러가 난다.

그래서 나는 먼저 GetObject, PutObject를 추가 후에 생성하였다.

  • Actions : GetBucketLocation, ListBucket
  • Amazon Resource Name : arn:aws:s3:::myk-s3-bucket

    스크린샷 2024-08-28 오후 3.31.08.png

Generate Policy를 누르면 우리가 생성한 버킷 정책을 JSON형태로 한번에 보여준다.

이걸 복사해서 버킷 정책 편집 화면에 붙여넣자.

생성된 버킷 정책 JSON

{
    "Version": "2012-10-17",
    "Id": "Policy1724825386935",    // 정책 ID
    "Statement": [
        {
            "Sid": "Stmt1724825131984",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::746669191631:user/aws-learner"
            },
            "Action": [           // 버킷에 수행할 액션(행동)
                "s3:PutObject",   // 객체 업로오기
                "s3:GetObject"    // 객체 가져오기
            ],
            "Resource": "arn:aws:s3:::myk-s3-bucket/*",   // 대상이 되는 리소스
            "Condition": {    // 조건
                "IpAddress": {   // 아래 IP들을 허용
                    "aws:SourceIp": "218.157.44.117"
                }
            }
        },
        {
            "Sid": "Stmt1724825386050",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::746669191631:user/aws-learner"
            },
            "Action": [
                "s3:GetBucketLocation",   // 버켓 위치 가져오기
                "s3:ListBucket"           // 버켓 리스트 확인
            ],
            "Resource": "arn:aws:s3:::myk-s3-bucket",   // 대상이 되는 리소스
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "218.157.44.117"
                }
            }
        }
    ]
}

AWS CLI로 S3의 버킷 목록 조회해보기

스크린샷 2024-08-28 오후 4.17.05.png

S3에 파일 업로드

스크린샷 2024-08-28 오후 4.25.08.png

AWS CLI로 업로드되었는지 AWS 콘솔에서 확인하기

스크린샷 2024-08-28 오후 4.25.24.png

암호화 정책 설정

버킷에 객체를 업로드(Put Object)할 때 자동으로 암호화를 할 수 있는 버킷과 암호화가 안된 객체를 업로드 할 시에 호출을 거부하는 버킷을 생성해보자.

나는 암호화용 버킷을 새로 만들었다.

  • 기본 암호화 : 내장 암호화 방식, 버킷 안에서만 암호화가 유효하다
  • 버킷 정책 : 버킷에 대한 액세스 및 권한을 제어하는데 사용한다.
    • 정책을 설정하면 지정된 암호화 헤더가 없는 객체를 버킷에 넣는 API 호출을 거부한다.
    • 버킷 정책은 기본 암호화 전에 평가된다.

따라서, 버킷의 기본 암호화를 KMS로 지정하고, 버킷 정책으로 암호화 안된 객체는 거부하는 정책을 생성할 것이다.

버킷 생성

버킷을 생성할 때, 암호화는 KMS 유형으로 지정했고, KMS 키는 AWS에서 기본으로 제공하는 키를 사용했다.

  • KMS 키의 내용을 확인하고 싶을때는 AWS > KMS > AWS 관리형 키 > aws/s3에서 확인해보면 된다고 한다.

스크린샷 2024-08-28 오후 3.45.10.png

버킷 정책 설정

정책 생성기에서 버킷 정책을 생성했다.

  • Select Type of Policy : S3 Bucket Policy
  • Effect : Deny (암호화 헤더가 호출은 거부할것이므로)
  • Principal : * (모든 사용자에게 적용)
  • Actions : Put Obejct
  • ARN : 버킷_ARN/*

스크린샷 2024-08-28 오후 4.35.23.png

2가지 Condition을 추가해준다.

  • kms 암호화 방식이 아니면 deny하는 조건

스크린샷 2024-08-28 오후 4.39.09.png

  • header에 위와 같은 키값이 없다면 (Null 이라면) true로 발생시켜 요청을 deny하는 조건

스크린샷 2024-08-28 오후 4.49.32.png

위 두가지 설정을 끝내고 정책을 생성해준다.

{
  "Id": "Policy1724831428004",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1724831425204",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::myk-encryption-bucket/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "aws:kms"
        },
        "Null": {
          "s3:x-amz-server-side-encryption": "true"
        }
      },
      "Principal": "*"
    }
  ]
}

이제 버킷의 기본 암호화와 버킷 정책 설정이 끝났으니 테스트를 해본다.

이미지 객체를 AWS 콘솔에서 암호화 없이 직접 업로드 한 결과 업로드 실패가 뜬것을 확인할 수 있다.

스크린샷 2024-08-28 오후 4.52.09.png

AWS CLI로 별도 암호화 설정 없이 업로드를 해보면 역시 deny된 것을 확인 할 수 있다.

스크린샷 2024-08-28 오후 4.57.29.png

반대로 kms 암호화하여 업로드를 하면 성공할 수 있다.

스크린샷 2024-08-28 오후 4.58.18.png

태그: ,

카테고리:

업데이트:

댓글남기기