Cloud Infra Architecture (AWS)/AWS Organization

[AWS Organization] 특정 IP, AWS Service, VPC 에서 요청을 차단하는 SCP 생성

seongduck 2025. 3. 3. 16:34

시나리오

  • 요청 IP가 xxx.xxxx.xxx.xxx/24에 포함되지 않을 경우 요청 차단
  • 요청이 AWS Servcie에서 발생한 것이 아닐 경우 차단
  • 요청 VPC가 vpc-123456789, vpc-0987654321에 포함되지 않을 경우 요청 차단
  • 하나의 Sid에 포함되어 있으므로 AND 조건 (OR 조건은 별도로 Sid 분리하여 작성)
    • <조건>
      • 요청이 허용한 IP 대역이 아니고
      • 요청이 AWS Service에서 발생한 것이 아니며
      • 요청이 원본 VPC가 허용된 VPC 목록에 포함되지 않는다면
      • 요청은 Deny
    • 즉, 모두 아니여야 Deny이므로, 위의 3가지 조건 중 1개를 만족하면 요청이 차단되지 않음
{
  "Version": "2012-10-17",
  // 정책 버전. AWS IAM 정책의 최신 버전은 "2012-10-17"입니다.
  "Statement": [
    {
      "Sid": "AllowAllSTSAssumeRole",
      // sts:AssumeRole 작업을 모든 리소스에서 허용
      "Effect": "Allow",
      // 명시적으로 요청을 허용합니다.
      "Action": "sts:AssumeRole",
      // sts:AssumeRole 작업에 대해 적용됩니다.
      "Resource": "*"
      // 모든 리소스에 대해 적용됩니다.
    },
    {
      "Sid": "DenyAccessOutsideIP",
      // 특정 조건을 만족하는 요청을 차단
      "Effect": "Deny",
      // 명시적으로 요청을 차단합니다.
      "Action": "*",
      // 모든 작업에 대해 적용됩니다.
      "Resource": "*",
      // 모든 리소스에 대해 적용됩니다.
      "Condition": {
        "NotIpAddressIfExists": {
          // 요청의 원본 IP가 아래 지정된 IP 대역에 포함되지 않으면 차단
          "aws:SourceIp": [
            "xxx.xxxx.xxx.xxx/24"
            // 허용된 IP 대역. 여기에 요청이 속하지 않으면 차단됩니다.
          ]
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
          // 요청이 AWS 서비스에서 발생한 것이 아니면 조건을 평가합니다.
          // 즉, AWS 서비스(Lambda, Step Functions 등)가 요청한 경우 이 조건은 무시됩니다.
        },
        "StringNotEqualsIfExists": {
          // 요청의 원본 VPC가 아래 나열된 VPC 목록에 포함되지 않으면 차단
          "aws:SourceVpc": [
            "vpc-1234567890",
            // 허용된 VPC 1
            "vpc-0987654321"
            // 허용된 VPC 2
          ]
        }
      }
    }
  ]
}

AND 조건일 경우

  • 모든 조건이 True일 때, 요청이 차단
  • 하나의 Statement (Sid로 묶여 있을 때)
    • 요청이 허용한 IP 대역이 아니고
    • AWS 서비스에서 발생한 것이 아니며
    • 원본 VPC가 허용된 VPC 목록에 포함되지 않는다면
      • 요청은 Deny
"Condition": {
  "NotIpAddressIfExists": {
    "aws:SourceIp": ["xx.248.4.0/24"]
  },
  "BoolIfExists": {
    "aws:ViaAWSService": "false"
  },
  "StringNotEqualsIfExists": {
    "aws:SourceVpc": ["vpc-1234567890"]
  }
}

 

OR 조건일 경우 

  • 요청이 차단되지 않으려면, 조건 중 하나라도 False이여야 함
  • 여러 개의 Statement (Sid로 분리되어 있을 때)
    • 요청이 허용된 IP 대역이 아니거나
    • 요청의 원본 VPC가 허용된 VPC 목록에 포함되지 않으면
      • 요청은 Deny
{
  "Sid": "DenyAccessOutsideIP",
  "Effect": "Deny",
  "Condition": {
    "NotIpAddress": {
      "aws:SourceIp": ["xx.248.4.0/24"]
    }
  }
},
{
  "Sid": "DenyAccessOutsideVPC",
  "Effect": "Deny",
  "Condition": {
    "StringNotEquals": {
      "aws:SourceVpc": ["vpc-1234567890"]
    }
  }
}

 

Deny가 조건상 우선이므로, 아무리 Allow 되더라도 하나가 Deny면 무조건 Deny