[ 살펴보기 ] AWS - S3 Permission

[ 살펴보기 ] AWS - S3 Permission

·

5 min read

Bucket Policy

Bucket Policy를 통해 해당 bucket에 write와 read등 어떤 행위를 허용할 것인지 설정할 수 있다. 다음 예제 Bucket Policy를 살펴보자.

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::01010:user/Akua"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::demo-bucket/*",
            ]
        }
    ]
}

위에 명시된 policy는 Akua라는 aws 계정에 amzn-s3-demo-bucket라는 s3 bucket에 대한 GetObject ( read files ), PutObject ( write files ) 권한을 허용하는 policy의 예제다.

예제에서 사용된 IAM JSON Policy의 각각 element가 의미하는 바는 다음과 같다.

  • Version : policy를 처리할 때 사용할 langauge syntax rule을 지정한다. 현재 policy language version은 2012-10-17이므로 policy를 생성할 때 Version은 항상 2012-10-17로 설정해준다.

    이전의 version은 2008-10-17이고 2008-10-17 version을 사용하면 2012-10-17 version에 추가된 policy features를 사용할 수 없으므로 새로운 policy를 만들 때는 2008-10-17 version을 사용하지 않는다.

  • Id : Policy를 식별하기 위한 id 값이다. 특정 S3 bucket의 permission과 같이 resource-based policy에서 설정할 수 있다.

  • Statement : 적용할 policy의 상세내용을 담고 있다. 하나의 policy statement만 설정할 수도 있고, 여러개의 policy statement를 설정할 수도 있다.

  • Sid : Policy statement를 구분하기 위한 Statement Id다. Policy statement를 설명하는 값으로 사용할 수 있으며 필수값은 아니다. Statement에 여러개의 policy statement가 사용될 때 Sid를 사용한다면 각 policy statement의 Sid는 고유한 값이여야 한다.

  • Effect : Policy statement에 명시된 actions에 대한 허용, 거부 여부를 결정한다. 명시적으로 허용을 설정하지 않으면 암묵적으로 거부가 적용된다. 적용할 수 있는 값은 Allow 또는 Deny가 있으며 대소문자를 구분한다.

  • Principal : Policy statement에 명시된 자원이나 actions에 누가 접근할 수 있는지 설정한다. IAM User, IAM Role, AWS Account등을 설정할 수 있다. Principal 역시 S3 bucket permission과 같이 resource-based policy에서 설정할 수 있다. 만약 복수의 Principal을 설정하고자 한다면 다음과 같이 Array를 통해 설정한다.

      "Principal": {
        "AWS": [
          "arn:aws:iam::AWS-account-ID:user/user-name-1", 
          "arn:aws:iam::AWS-account-ID:user/user-name-2"
        ]
      }
    

    추가로 설정할 수 있는 Principal 종류는 Documentation을 통해 확인할 수 있다.

  • Action : Policy가 적용되는 s3 bucket에 어떤 행위를 허용할 것인지 설정한다. 예를들어 s3 bucket의 자원을 얻기 위해 부여하기 위해 GetObject action을 설정하거나 s3 bucket에 새로운 자원을 생성하기 위해 PutObject action을 설정할 수 있다. Action은 사용할 service namesapce와 해당 service의 action 이름을 조합하여 아래와 표현한다.

      "Action": "s3:GetObject"
    
      "Action": "ec2:StartInstances"
    

    여러개의 action을 설정할 때는 다음과 같이 Array에 포함시키면 된다.

      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
    
  • Resource : Policy가 적용될 S3 bucket 자체 혹은 S3 bucket 안에 존재하는 자원을 지정한다. ARN (Amazon Resource Name) format을 통해 지정하며 S3 ARN format은 다음과 같다.

      arn:aws:s3:::bucket_name
    

    만약 demo-bucket이라는 이름을 가진 s3 bucket에 policy를 적용하고 싶다면 다음과 같이 설정한다.

      "Resource": "arn:aws:s3:::demo-bucket/*"
    

    여러개의 Resource는 설정하고 싶다면 Array를 통해 다수 recouce를 지정할 수 있다. 예를 들어 demo-bucket의 구조가 다음과 같다고 가정해보자.

      /demo-bucket
          /address
          /email
          /name
    

    그리고 policy를 적용하고 싶은 자원이 /address, /email 아래 경로에 있는 자원들이라면 다음과 같이 설정할 수 있다.

      "Resource": [
         "arn:aws:s3:::demo-bucket/address/*",
         "arn:aws:s3:::demo-bucket/email/*"
      ]
    

    Resource를 지정할 때 사용하는 ARN format은 service마다 약간 차이가 있을 수 있으니 설정하고자 하는 service의 documentation을 참조하자.

Access Control List

S3의 permisson을 설정하는 또 다른 방법으로 Access Control List가 있다( ACLs ). Bucket 또는 Bucket의 object level로 설정할 수 있으며 ACLs를 통해 권한을 설정할 시 Bucket의 resource에 request가 발생하면 S3는 ACLs 설정을 체크하고 reqeust를 보낸 주체가 resource에 대한 권한이 있는지 확인한다.

하지만 대부분의 경우 S3의 권한은 ACLs을 통한 관리 보다 Bucket Policy를 통해 관리하는 것이 권장된다. 그러므로 특수한 경우가 아니라면 ACLs은 disable 시켜놓고 bucket policy를 통해 S3 권한을 관리하는 것이 좋다. 예제에서는 ACLs에 대해서 간단하게만 살펴보자.

Bucket 생성 시 Object Ownership의 default option은 ACLs disabled로 설정되어 있고 Bucket owner enforced 설정이 적용된다. Bucket owner enforced 설정이 적용되어 있을 때 Bucket의 owner가 bucket에 있는 모든 objects를 소유한다.

특정 Bucket에 ACLs을 사용하기 위해선 해당 Bucket의 Permission Tab에서 Object Ownership 설정을 ACLs enabled로 변경해주어야 한다.

Object Ownership을 ACLs enabled로 변경해주면 해당 Bucket의 Permission Tab에서 ACLs를 수정하는 버튼을 통해 수정 페이지로 이동하여 특정 AWS account나 group에 대해 해당 Bucket에 대한 read 혹은 write와 같은 권한을 설정할 수 있다. Bucket 뿐만 아니라 Bucket에 있는 각각의 object 역시 ACLs을 통해 권한 설정을 할 수 있다.

아래서 소개할 Block public access (bucket settings) 설정에 따라 ACLs을 통한 public access 설정이 막힐 수 있으므로 주의하자.

Block Public Access

Block Public Access 설정을 통해 S3 bucket에 설정된 public access의 허용 여부를 설정할 수 있다.

여기서 Public이란 AWS에서 정의하는 All Users ( 제약없이 모든 client ) 또는 Authenticated User groups ( 모든 AWS 계정 )에 권한을 줄 때 bucket 또는 bucket의 object는 public으로 취급된다. ( S3 - The meaning of public )

Block Public Access에서 조정할 수 있는 설정은 다음과 같다.

  • BlockPublicAcls : ACLs을 통해 기존에 설정되어 있는 public access는 그대로 적용되지만 public access를 허용하는 새로운 ACLs 생성 또는 수정을 하지 못하게 막는다.

  • IgnorePulbicAcls : public access를 허용하는 새로운 ACLs의 생성 또는 수정을 막지는 않지만. ACLs을 통해 public access를 설정해도 모두 무시된다. ( 즉, public access를 허용하지 않는다 )

  • BlockPublicPolicy : Bucket Policy를 통해 기존에 설정되어 있는 public access는 그대로 적용되지만 public access를 허용하는 새로운 Bucket Policy의 추가나 수정을 하지 못하게 막는다.

  • RestrictPublicBuckets : public access를 허용하는 새로운 bucket policy의 생성 및 수정을 막지는 않지만 bucket policy로 public access를 설정해도 모두 무시된다. ( 즉, public access를 허용하지 않는다 )

예제를 통해 Block Public Access의 동작을 살펴보자. 예제는 Bucket Policy를 기준으로 한다.

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::demo-bucket/*",
            ]
        }
    ]
}

위의 bucket policy는 Principal을 *로 설정했기에 demo-bucket 안에 있는 모든 object에 대한 public access를 허용한다. 만약 위의 bucket policy를 기준으로 Block Public Access 설정의 BlockPublicPolicy를 활성화하면 기존 public access는 허용하되 bucket policy를 수정할 때 public access를 포함하는 구문이 있으면 오류를 발생시킨다. 위의 bucket policy도 다시 수정 버튼을 눌러 public access를 유지한 채로 저장하려고 하면 오류가 발생하는 것을 확인할 수 있다.

하지만 위의 bucket policy 기준 Block Public Access 설정의 RestrictPublicBuckets을 활성화하면 bucket policy를 수정할 때 public access를 허용하는 구문이 있어도 오류가 발생하진 않는다. 다만 RestrictPublicBuckets 설정으로 인해 bucket policy의 public access는 S3에서 무시되어 결과적으로 public access가 동작하지 않는다.

그렇기에 보다 나은 보안성을 위해 가능하면 Block Public Access 설정을 모두 활성화 한 뒤 Bucket Policy에서 특정 대상에게만 권한을 설정하는 방법이 권장된다.

아래는 포스트 초반에 봤던 Bucket Policy의 예제다. 아래의 경우에는 Akua라는 IAM user에게만 demo-bucket에 있는 objects에 대한 권한을 설정하고 있다.

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::01010:user/Akua"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::demo-bucket/*",
            ]
        }
    ]
}