[AWS] JSON 정책 문서 정리

유니·2022년 6월 2일
2

AWS

목록 보기
1/1

IAM 정책

정책 유형 (자주 사용하는 정책 순)

  • 자격 증명 기반 정책(Identity-based-policies)
  • 리소스 기반 정책(Recource-based-policies)
  • 권한 경계(Permissions boundaries)
  • Organizations SCPs
  • 액세스 제어 목록(ACL: Access control lists)
  • 세션 정책(Session policies)

이 중에 ACL을 제외한 모든 IAM의 정책에서 JSON 정책 구조를 사용합니다.

JSON 정책 문서 구조


최상위 element 안에 다수개의 statement로 이루어져있는 구조입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "FirstStatement",
      "Effect": "Allow",
      "Action": ["iam:ChangePassword"],
      "Resource": "*"
    },
    {
      "Sid": "SecondStatement",
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*"
    },
    {
      "Sid": "ThirdStatement",
      "Effect": "Allow",
      "Action": [
        "s3:List*",
        "s3:Get*"
      ],
      "Resource": [
        "arn:aws:s3:::confidential-data",
        "arn:aws:s3:::confidential-data/*"
      ],
      "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
    }
  ]
}

밑에서 각 정책 요소들이 어떤 의미를 갖는지 알아본 후 돌아와서 이 규칙이 어떤 의미였는지 평가해봅시다.

JSON 정책 요소

  • Version
    사용하고자 하는 정책언어의 버전을 지정합니다. 최신버전(2012-10-17)을 사용하는 것이 권장됩니다.
    최신버전 : 2012-10-17 구버전 : 2008-10-17
    ex) "Version": "2012-10-17"

  • Id
    정책 식별자를 지정합니다. ID가 필요한 경우 UUID(GUID) 값이나 그 일부를 ID로 사용하여 고유성을 확보하는 것이 좋습니다.
    AWS 서비스중에는 이 요소를 필요로 하거나 고유성 요건을 요구하는 경우가 있습니다.(Amazon SQS또는 Amazon SNS 등)
    ex) "Id": "cd3ad3d9-2776-4ef1-a904-4c229d1642ee"

  • Statement 필수
    정책 요소의 컨테이너 역할을 합니다. 단일 문 또는 개별 문의 배열을 포함 할 수 있습니다.
    ex) "Statement": [{...},{...},{...}]

  • Sid
    설명문(statement)의 Id입니다.
    IAM에서 Sid는 IAM API에 노출되지 않습니다. 따라서 이 ID를 근거로 특정 문을 가져올 수는 없습니다.
    AWS 서비스중에는 이 요소를 필요로 하거나 고유성 요건을 요구하는 경우가 있습니다.(Amazon SQS또는 Amazon SNS 등)
    ex) "Sid:"1"

  • Effect 필수
    문의 허용(allow) 또는 명시적 거부(explicit deny) 중 하나를 지정합니다.
    허용 : Allow 거부 : Deny
    기본적으로 리소스 액세스는 거부된 상태이며 허용하려면 Effect 요소를 Allow로 설정해야합니다.
    ex) "Effect": "Allow"

  • Principal
    리소스 기반 정책을 생성하는 경우 리소스에 대한 액세스가 허용되거나 거부되는 보안 주체(계정, 사용자, 역할, 페더레이션 사용자) 를 지정합니다.
    보안 주체 이름이나 ARN의 일부를 나타내기 위해 와일드카드(*)를 사용할 수 없습니다. 보안 주체는 항상 특정 사용자가 되어야하기 때문입니다.
    다음과 같이 보안 주체를 지정할 수 있습니다.
    1️⃣ AWS 계정 및 루트 사용자
    AWS 계정 ID 지정
    "Principal": { "AWS": "arn:aws:iam::AWS-account-ID:root" }
    "Principal": { "AWS": "AWS-account-ID" }
    Canonical ID 지정
    "Principal": { "CanonicalUser": "canonical-ID" }
    2️⃣ IAM 역할
    "Principal": { "AWS": "arn:aws:iam::AWS-account-ID:role/role-name" }
    3️⃣ 역할 세션
    수임된 역할 세션 보안 주체
    "Principal": { "AWS": "arn:aws:sts::AWS-account-ID:assumed-role/role-name/role-session-name" }
    웹 자격 증면 세션 보안 주체
    "Principal": { "Federated": "cognito-identity.amazonaws.com" }
    SAML 세션 보안 주체
    "Principal": { "Federated": "arn:aws:iam::AWS-account-ID:saml-provider/provider-name" }
    4️⃣ IAM 사용자
    "Principal": { "AWS": "arn:aws:iam::AWS-account-ID:user/user-name" }
    5️⃣ 페더레이션 사용자 세션
    "Principal": { "AWS": "arn:aws:sts::AWS-account-ID:federated-user/user-name" }
    6️⃣ AWS 서비스
    "Principal": { "Service": [ "service-name1.amazonaws.com", "service-name2.amazonaws.com" ] }
    7️⃣ 모든 보안 주체
    "Principal": "*"
    "Principal" : { "AWS" : "*" }
    8️⃣ 배열을 이용하여 여러개의 계정을 지정하기

    "Principal": { 
        "AWS": [
          "arn:aws:iam::123456789012:root",
          "999999999999",
          "CanonicalUser": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
        ]
    }
  • NotPrincipal
    보안 주체 목록에서 예외를 지정할 수 있습니다.
    NotPrincipal 을 써야하는 시나리오는 극히 드뭅니다. 따라서 사용을 결정하기 전에 다른 권한 부여 옵션을 살펴보는 것이 바람직합니다.
    ex) NotPrincipal 에 명시된 계정들만 제외한 모든 보안주체의 리소스 액세스를 명시적으로 거부하는 예시

    "Effect": "Deny",
    "NotPrincipal": {"AWS": ["arn:aws:iam::444455556666:user/Bob", "arn:aws:iam::444455556666:root"]},
  • Action Action 혹은 NotAction 중 하나는 필수
    정책이 허용하거나 거부하는 작업 목록을 포함합니다.
    "Action": "작업 접두사:작업 이름"
    ex) 단일 액션 / 다수의 액션 / 와일드 카드를 사용한 액션을 명시하는 예시

    "Action": "sqs:SendMessage"
    "Action": [ "sqs:SendMessage", "sqs:ReceiveMessage", "ec2:StartInstances", "iam:ChangePassword", "s3:GetObject" ]
    "Action": "s3:*"
  • NotAction Action 혹은 NotAction 중 하나는 필수
    지정된 작업 목록을 제외한 모든 액션을 지정할 수 있습니다.
    ex) 사용자가 IAM을 제외한 모든 AWS 서비스에서 작업에 액세스하도록 허용하는 예시

    "Effect": "Allow",
    "NotAction": "iam:*",
    "Resource": "*"
  • Resource Resource 혹은 NotResource 중 하나는 필수
    IAM 권한 정책을 생성하는 경우 작업이 적용되는 리소스 목록을 지정합니다.
    ex) s3의 특정 버킷 내 포함된 모든 항목을 나타내는 예시

    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  • NotResource
    지정된 리소스 목록을 제외한 모든 리소스를 지정할 수 있습니다.
    ex) HRBucket 버킷의 Payroll 폴더를 제외하고 모든 s3 리소스에 대한 액세스를 거부하는 예시

    "Effect": "Deny",
    "Action": "s3:*",
      "NotResource": [
        "arn:aws:s3:::HRBucket/Payroll",
        "arn:aws:s3:::HRBucket/Payroll/*"
      ]
  • Condition
    정책에서 권한을 부여하는 상황을 지정합니다.
    "Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}
    condition-operator: 조건 연산자
    condition-key: 조건 키
    condition-value: 조건 값
    조건 연산자(condition-operaotr)

    문자열 조건 연산자설명
    StringEquals정확한 일치, 대소문자 구분
    StringNotEquals불일치
    StringEqualsIgnoreCase정확한 일치, 대소문자 무시
    StringNotEqualsIgnoreCase불일치, 대소문자 무시
    StringLike대소문자 구분 일치, 와일드카드(*, ?) 포함 가능
    StringNotLike대소문자 구분 불일치, 와일드카드(*, ?) 포함 가능

    ex) 이름이 johndoe인 사용자를 지정

    "Condition" : {"StringEquals" : { "aws:username" : "johndoe" }}
    숫자 조건 연산자설명
    NumericEquals일치
    NumericNotEquals불일치
    NumericLessThan미만
    NumericLessThanEquals이하
    NumericGreaterThan초과
    NumericGreaterThanEquals이상

    ex) 한번에 최대 10개까지 객체를 나열할 수 있다고 지정

    "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}}
    날짜 조건 연산자설명
    DateEquals특정 날짜 일치
    DateNotEquals특정 날짜 불일치
    DateLessThan특정 날짜/시간 이전
    DateLessThanEquals특정 날짜/시간 또는 이전
    DateGreaterThan특정 날짜/시간 이후
    DateGreaterThanEquals특정 날짜/시간 또는 이후

    ex) 요청을 생성하는 데 사용된 임시 보안 자격 증명이 2020년 이후에 발급되었음을 지정

    "Condition": {"DateGreaterThan": {"aws:TokenIssueTime": "2020-01-01T00:00:01Z"}}
    불린 조건 연산자설명
    Bool부울 일치

    ex) 요청에 SSL을 사용해야 한다고 지정

    "Condition": {"Bool": {"aws:SecureTransport": "true"}}
    이진 조건 연산자설명
    BinaryEquals이진 형식의 키 값 일치

    ex) 지정한 키 값을 정책 내 이진 값의 base-64 인코딩 표시와 바이트 단위로 비교

    "Condition" : {
    	"BinaryEquals": {
        	"key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA=="
      	}
    }     
    IP 주소 조건 연산자설명
    IpAddress지정된 IP주소 또는 범위
    NotIpAddress지정된 IP주소 또는 범위를 제외한 모든 IP 주소

    ex) IP주소 범위를 지정(CIDR 형식을 따라야 함)

    "Condition": {
    	"IpAddress": {
        	"aws:SourceIp": [
            	"203.0.113.0/24",
            	"2001:DB8:1234:5678::/64"
          	]
      	}
    }
    ARN 조건 연산자설명
    ArnEquals, ArnLikeARN 대소문자 구분 일치. 와일드카드(*, ?) 포함 가능
    ArnNotEquals, ArnNotLikeARN 불일치

    모든 서비스가 이 연산자를 사용하여 ARN 비교를 지원하는 것은 아닙니다. ARN 조건 연산자가 작동하지 않으면 문자열 조건 연산자를 사용합니다.
    ex) aws:SourceArn 값이 arn:aws:sns:REGION:123456789012:TOPIC-ID 와 일치함을 지정

    "Condition": {"ArnEquals": {"aws:SourceArn": "arn:aws:sns:REGION:123456789012:TOPIC-ID"}}

    ifExists 조건 연산자
    Null 조건을 제외한 모든 조건 연산자의 이름 끝에 ifExists를 추가할 수 있습니다.(예: StringLikeIfExists)
    요청 콘텍스트에 정책 키가 있으면 정책에 지정된 대로 키를 처리하고 키가 없으면 true로 평가합니다.
    ex) ec2:InstanceType 조건 키가 있는 경우 해당 조건을 검사하고 없는 경우는 true로 평가하는 조건

    "Condition": {
      "StringLikeIfExists": {
        "ec2:InstanceType": [
          "t1.*",
          "t2.*",
          "m3.*"
        ]}}
    

    Null 연산자
    Null 조건 연산자를 사용하면 조건 키의 유무를 검사할 수 있습니다.
    정책문에서는 true(키가 부재하며 값이 null임) 또는 false(키가 존재하며 값이 null이 아님)을 사용합니다.
    ex) aws:TokenIssueTime 키가 존재하면 안됨을 나타내는 조건

    "Condition":{"Null":{"aws:TokenIssueTime":"true"}}

참고링크
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html
https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html

profile
추진력을 얻는 중

0개의 댓글