본문 바로가기
AWS/IAM

현업에서 사용하는 AWS IAM IP 제한 정책

by study4me 2024. 3. 11.
반응형

AWS IAM을 더 안전하게 사용하기 위해서 Source의 IP가 특정될 경우 IP 제한 정책을 적용할 수 있다.
현업에서 주로 서버의 Private IP, NAT IP, Internet Gateway IP, 사업장 Public IP 등으로 제한한다.
다만 Source의 IP가 정해진 범위 없이 랜덤 하게 변경될 경우에는 IP 제한 정책을 적용하기에 무리가 있다.

 

 

1. IAM IP 제한 정책 (ver. 특정 IP 외 모두 접근 Deny)

주로 특정 IP 외에는 모두 Access Deny 하는 정책을 사용하고 있다.
아래 Statement를 해석하자면, 13.1.1.1/32, 13.2.2.2/32, 10.0.0.1/32, 10.0.0.2/32, 10.1.0.0/16에 해당하지 않는 IP들 and ViaAWSService가 false인 모든 Action에 대해서 Deny 하겠다.
여기서 Source IP는 Public IP를 의미한다. 보통 NAT의 Public IP가 된다.
VpcSourceIp는 AWS VPC 내 Private IP를 의미하고 VPC Endpoint를 통해 Service에 Private 하게 접근 가능해야 한다. Onprem의 Private IP는 해당되지 않는다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AccessIPControl",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "13.1.1.1/32",
            "13.2.2.2/32"
          ],
          "aws:VpcSourceIp": [
            "10.0.0.1/32",
            "10.0.0.2/32",
            "10.1.0.0/16"
          ]
        },
        "Bool": {
          "aws: ViaAWSService": "false"
        }
      }
    }
  ]
}


위 정책을 이해하기 위해서 읽으면 좋은 공식 문서다.
[1] https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html
[2] https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-vpcsourceip
[3] https://repost.aws/ko/knowledge-center/block-s3-traffic-vpc-ip
[4] https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-viaawsservice
[5] https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_elements_condition.html
[6] https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_condition-logic-multiple-context-keys-or-values.html
[7] https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html

 

 

심화 및 부가 설명

기본적으로 IAM Policy의 Condition은 아래와 같은 구조를 가지고 있다.

아래 형식은 Condition Operator와 Condition Key-Value가 하나씩 있는 경우인데

"Condition": {
  "{condition-operator}": {
    "{condition-key}": "{condition-value}"
  }
}

 

아래와 같이 여러개를 가질 수 있다.

"Condition": {
  "{condition-operator}": {
    "{condition-key}": [
      "{condition-value}",
      "{condition-value}"
    ],
    "{condition-key}": [
      "{condition-value}",
      "{condition-value}"
    ]
  },
  "{condition-operator}": {
    "{condition-key}": "{condition-value}"
  }
}

 

IAM Policy Condition Logic

부가 설명을 추가하자면 조건 연산자 NotIpAddress는 Negated matching에 해당하며, Context Value는 NOR 조건이 적용된다.

NOR는 모든 항목을 OR로 처리하고 마지막에 NOT을 적용하는 연산이다. 모든 항목의 합집합의 여집합이라고 보면 된다.

Context Key, 조건 연산자는 AND 연산을 적용한다.
결론은 NotIpAddress는 작성한 IP를 제외한 IP들을 의미한다고 보면 된다.

 

2. IAM IP 제한 정책 (ver. 특정 IP에 대해서 권한 Allow)

특정 IP일 경우에 권한을 부여하도록 설정할 수도 있다.
일반적으로 아래와 같이 설정하는데, Operator가 IpAddress일 경우 Context Value는 OR 연산, Context Key는 AND 연산을 하기 때문에 각각 Statement를 구분해서 추가해 준다.
만약 하나의 Statement에 작성하게 될 경우 SourceIP도 만족해야하고, VpcSourceIp도 만족해야한다. 보통 SourceIP는 Public IP이고, VpcSourceIp는 Private IP이기 때문에 하나의 Statement에 작성하게될 경우 의미 없는 짓이 된다.

{
  "Sid": "AccessIPControl01",
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "*",
  "Condition": {
    "IpAddress": {
      "aws:SourceIp": [
        "13.1.1.1/32",
        "13.2.2.2/32"
      ]
    }
  }
},
{
  "Sid": "AccessIPControl01",
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "*",
  "Condition": {
    "IpAddress": {
      "aws:VpcSourceIp": [
        "10.0.0.1/32",
        "10.0.0.2/32",
        "10.1.0.0/16"
      ]
    }
  }
}



AWS 서비스가 사용자를 대신하여 다른 서비스에 요청하는 방식을 사용하는 서비스일 경우 아래와 같이 ViaAWSService를 True로 설정하여 권한을 추가해줘야 한다. 근데 사실 아래와 같이 Athena 서비스 단독으로 권한을 부여할 때면, 그냥 Condition을 제거하고 권한을 부여하는 거랑 뭐가 다른지 잘 모르겠다... ViaAWSService는 다른 Condition이랑 같이 사용될 때는 의미 있게 쓰이는 것 같기도 한데 잘 모르겠다.

{
  "Sid": "AccessIPControl02",
  "Effect": "Allow",
  "Action": "athena:*",
  "Resource": "*",
  "Condition": {
    "Bool": {
      "aws:ViaAWSService": "true"
    }
  }
}

 



실수하지 말자

1번 IAM IP 제한 정책 (ver. 특정 IP 외 모두 접근 Deny)을 참고해서

Deny를 Allow로 바꾸고,

NotIpAddress를 IpAddress로 바꾸고,

ViaAWSService를 false에서 true로 변경하면 되겠지라고 생각하면 안 된다.
2번에서 언급한 것처럼 이미 IpAddress 조건 연산자에서부터 글러먹었다.
아래는 잘못된 예시이며 이 경우 아래와 같은 범위에 적용된다.

## 잘못된 예시
{
  "Sid": "AccessIPControl",
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "*",
  "Condition": {
    "IpAddress": {
      "aws:VpcSourceIp": [
        "10.62.52.116/32",
        "10.62.72.86/32"
      ],
      "aws:SourceIp": [
        "13.125.69.12/32",
        "13.125.25.39/32"
      ]
    },
    "Bool": {
      "aws:ViaAWSService": "true"
    }
  }
}

 


오늘은 여기까지!

반응형

'AWS > IAM' 카테고리의 다른 글

AWS IAM 유효 기간 제한 정책  (0) 2024.10.07
AWS IAM Region 제한 정책  (0) 2024.03.11
현업에서 꼭 필요한 AWS IAM MFA 강제 정책  (0) 2024.03.11