VPC 조건 키로 페더레이션 접근 제어

VPC 조건 키로 페더레이션 접근 제어

페더레이션 사용자가 VPC 엔드포인트를 통해 역할을 수임할 때, 신뢰 정책이나 리소스 제어 정책(RCP)에 VPC 조건 키를 넣으면 요청이 어디서 시작됐는지를 제한할 수 있어요. 네트워크 수준 경계를 더하고 싶은 분께 좋은 주제예요.

출처: 문서

본문

페더레이션 사용자는 VPC 엔드포인트를 통해 AssumeRoleWithSAML이나 AssumeRoleWithWebIdentity로 역할을 수임할 수 있어요. 이때 역할의 신뢰 정책이나 리소스 제어 정책(RCP)에 VPC 특정 조건 키를 사용하면 이런 요청이 어디서 시작될 수 있는지 제한할 수 있어요. 이는 신뢰 정책의 ID 수준 제어에 더해 네트워크 수준 경계를 제공해 줘요.

페더레이션 요청에서 VPC 조건 키가 동작하는 방식

요청 컨텍스트에 사용할 수 있는 조건 키는 페더레이션 요청의 네트워크 경로에 따라 달라져요.

조건 키 VPC 엔드포인트를 통한 경우 공용 인터넷을 통한 경우 설명
aws:SourceVpc 예 아니요 요청이 통과하는 VPC ID
aws:SourceVpcArn 예 아니요 요청이 통과하는 VPC의 ARN
aws:SourceVpce 예 아니요 요청이 통과하는 VPC 엔드포인트 ID
aws:VpcSourceIp 예 아니요 VPC 안의 호출자 프라이빗 IP 주소
aws:SourceIp 아니요 예 호출자의 공용 IP 주소

신뢰 정책의 Allow 문에서 aws:SourceVpc, aws:SourceVpcArn, aws:SourceVpce를 사용하고 요청이 VPC 엔드포인트를 통해 오지 않았다면 조건이 매칭되지 않아 AWS가 요청을 암시적으로 거부해요. 이는 사실상 페더레이션 요청이 성공하려면 VPC 엔드포인트를 통과해야 한다는 뜻이에요.

Important — VPC 엔드포인트를 통해 보낸 요청에서는 aws:SourceIp가 채워지지 않아요. IP 기반 제한에는 aws:VpcSourceIp를 사용하세요.

신뢰 정책에서는 aws:SourceVpc보다 aws:SourceVpcArn을 사용할 것을 권장해요. VPC ID는 리전 안에서만 고유하고 전역적으로는 고유하지 않지만, aws:SourceVpcArn은 리전과 계정을 포함해서 VPC를 전역적으로 고유하게 식별해 주거든요.

Note — 아래 OIDC 예시의 audience(aud) 값은 Amazon EKS의 기본값인 sts.amazonaws.com을 사용해요. 다른 OIDC 공급자의 경우 애플리케이션에 구성된 audience 값(예: 클라이언트 ID나 애플리케이션 URI)으로 바꾸세요.

예시: OIDC 페더레이션을 특정 VPC로 제한

다음 신뢰 정책은 VPC 엔드포인트를 통해 특정 VPC에서 요청이 시작된 경우에만 OIDC 공급자가 역할을 수임하도록 허용해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOIDCFromVpc",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/idp.example.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "idp.example.com:aud": "sts.amazonaws.com",
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                }
            }
        }
    ]
}

지정된 VPC 외부에서 온 요청은 aws:SourceVpcArn 조건이 매칭되지 않아 AWS가 암시적으로 거부해요. 명시적 거부 문은 필요 없어요.

예시: SAML 페더레이션을 특정 VPC 엔드포인트로 제한

다음 신뢰 정책은 요청이 특정 VPC 엔드포인트를 통해 온 경우에만 SAML 공급자가 역할을 수임하도록 허용해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSAMLFromVpce",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:saml-provider/ExampleProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml",
                    "aws:SourceVpce": "vpce-0abcdef1234567890"
                }
            }
        }
    ]
}

같은 VPC 안에 VPC 엔드포인트가 여러 개 있고 특정 엔드포인트로 접근을 제한하려면 aws:SourceVpc 대신 aws:SourceVpce를 쓰면 더 세밀하게 제어할 수 있어요.

예시: VPC 안의 프라이빗 IP 범위로 OIDC 페더레이션 제한

다음 신뢰 정책은 VPC 안의 특정 서브넷에서 시작된 요청으로 페더레이션을 제한해요. VPC 엔드포인트를 통해 보낸 요청의 IP 기반 제한에는 aws:VpcSourceIp를 사용하세요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOIDCFromSubnet",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/idp.example.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "idp.example.com:aud": "sts.amazonaws.com",
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                },
                "IpAddress": {
                    "aws:VpcSourceIp": "10.0.1.0/24"
                }
            }
        }
    ]
}

Important — VPC 엔드포인트를 통해 보낸 요청에는 aws:SourceIp를 프라이빗 IP 범위와 함께 사용하지 마세요. aws:SourceIp 키는 VPC 엔드포인트 요청에서 사용할 수 없어요. aws:VpcSourceIp를 대신 사용하세요.

예시: SAML 페더레이션을 여러 VPC로 제한

다음 신뢰 정책은 여러 VPC 중 아무 곳에서나 SAML 공급자가 역할을 수임하도록 허용해요. 서로 다른 환경이나 리전에 여러 VPC가 있고 모두 같은 역할에 페더레이션 접근이 필요할 때 유용해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSAMLFromMultipleVpcs",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:saml-provider/ExampleProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml",
                    "aws:SourceVpcArn": [
                        "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111aaa11",
                        "arn:aws:ec2:us-east-1:111122223333:vpc/vpc-222bbb22"
                    ]
                }
            }
        }
    ]
}

예시: VPC 조건과 공급자 특정 조건 결합

VPC 조건 키를 audience(aud)와 subject(sub) 같은 공급자 특정 조건과 결합하면 세밀한 접근 제어가 가능해요. 다음 신뢰 정책은 역할 수임을 특정 페더레이션 사용자로 제한하고, 요청이 특정 VPC에서 시작되도록 요구해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOIDCUserFromVpc",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:oidc-provider/idp.example.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "idp.example.com:aud": "sts.amazonaws.com",
                    "idp.example.com:sub": "user123",
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                }
            }
        }
    ]
}

이 방식은 ID 수준 제어(특정 페더레이션 사용자로 제한)와 네트워크 수준 제어(특정 VPC로 제한)를 결합해서 심층 방어(defense in depth)를 제공해요.

예시: RCP로 페더레이션 접근을 특정 VPC로 제한

다음 리소스 제어 정책(RCP)은 특정 VPC에서 시작되지 않는 AssumeRoleWithSAML과 AssumeRoleWithWebIdentity 요청을 거부해요. 역할마다 적용되는 신뢰 정책과 달리, 리소스 제어 정책(RCP)은 대상 계정의 모든 역할에 적용돼요. 이는 중앙 집중식 네트워크 경계를 제공해 줘요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyFederatedAccessOutsideVpc",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "sts:AssumeRoleWithWebIdentity",
                "sts:AssumeRoleWithSAML"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpcArn": "arn:aws:ec2:us-west-2:111122223333:vpc/vpc-111bbb22"
                },
                "Null": {
                    "aws:SourceVpcArn": "false"
                }
            }
        }
    ]
}

Null 조건은 aws:SourceVpcArn이 요청 컨텍스트에 있을 때(즉 요청이 VPC 엔드포인트를 통해 왔지만 잘못된 VPC에서 온 경우)만 거부가 적용되도록 보장해요. 이것이 없으면 공용 인터넷을 통한 요청(aws:SourceVpcArn이 없는 경우)도 StringNotEquals로 거부돼요. Null 확인을 제거하면 VPC 엔드포인트를 전혀 통과하지 않는 공용 인터넷 요청에도 거부가 적용돼요. 운영 환경에서 Null 확인을 제거하기 전에 철저히 테스트할 것을 권장해요.

더 알아보기 (Learn more)