VPC 엔드포인트 정책으로 AWS STS 접근 제어

VPC 엔드포인트 정책으로 AWS STS 접근 제어

AWS STS용 인터페이스 VPC 엔드포인트에 정책을 붙이면 어떤 프린시펄이 엔드포인트를 쓸 수 있고 어떤 STS 동작을 수행할 수 있는지 제어할 수 있어요. 특히 페더레이션 호출자(SAML·OIDC)는 AWS 프린시펄이 아니라서 조건 키가 다르게 동작한다는 점을 이 페이지가 세밀하게 짚어 줘요.

출처: 문서

본문

AWS Security Token Service(AWS STS)용 인터페이스 VPC 엔드포인트를 만들 때 엔드포인트 정책을 첨부할 수 있어요. 이 정책은 어떤 프린시펄이 엔드포인트를 사용할 수 있고 어떤 AWS STS 동작을 수행할 수 있는지 제어해요. 정책을 첨부하지 않으면 엔드포인트는 모든 프린시펄에 대해 모든 AWS STS 동작에 무제한 접근을 허용하는 기본 정책을 사용해요.

VPC 엔드포인트 정책은 자체적으로 권한을 부여하지 않아요. 다른 정책과 함께 동작하는 추가 경계 역할을 해요. 요청이 성공하려면 엔드포인트 정책과 호출자의 해당 정책이 모두 요청을 허용해야 해요.

VPC 엔드포인트 정책에 대한 자세한 내용은 Amazon VPC 사용자 가이드의 엔드포인트 정책으로 VPC 엔드포인트 접근 제어를 참고하세요.

기본 VPC 엔드포인트 정책

엔드포인트를 만들 때 사용자 지정 정책을 첨부하지 않으면 AWS가 다음 기본 정책을 첨부해요. 이 정책은 엔드포인트에 무제한 접근을 허용해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

엔드포인트에 대한 접근을 제한하려면 사용자 지정 엔드포인트 정책을 첨부해요.

AWS STS VPC 엔드포인트 정책의 중요한 고려 사항

AWS STS는 근본적으로 다른 두 가지 타입의 호출자로부터 요청을 처리해요. VPC 엔드포인트 정책은 합법적인 요청을 실수로 차단하지 않도록 두 타입을 모두 고려해야 해요.

  • 인증된 AWS 프린시펄 — AWS Signature Version 4(SigV4)로 요청에 서명하는 IAM 사용자와 IAM 역할이에요. 이 호출자는 요청 컨텍스트에 aws:PrincipalOrgID, aws:PrincipalAccount, aws:PrincipalArn 같은 표준 조건 키를 사용할 수 있어요.
  • 페더레이션 호출자 — AssumeRoleWithSAML이나 AssumeRoleWithWebIdentity를 호출하는 SAML 2.0 및 OpenID Connect(OIDC) 프린시펄이에요. 이 호출자는 SigV4 서명이 아니라 SAML 어설션 또는 JSON 웹 토큰(JWT)으로 인증해요. 요청 시점에 AWS ID가 없기 때문에 요청 컨텍스트에 aws:PrincipalOrgID, aws:PrincipalAccount, aws:PrincipalArn 같은 프린시펄 기반 조건 키가 포함되지 않아요.

Important — VPC 엔드포인트 정책이 접근 허용을 오직 aws:PrincipalOrgID에만 의존한다면, 페더레이션 AssumeRoleWithSAML과 AssumeRoleWithWebIdentity 호출은 암시적으로 거부돼요. 비-AWS 프린시펄에게는 그 조건 키가 없기 때문이에요.

AWS STS가 페더레이션 호출자에 대한 VPC 엔드포인트 정책을 평가하는 방법

페더레이션 호출자가 VPC 엔드포인트를 통해 AssumeRoleWithSAML이나 AssumeRoleWithWebIdentity를 호출할 때 다음이 적용돼요.

  • 호출자는 AWS 프린시펄이 아니에요. aws:PrincipalOrgID, aws:PrincipalAccount, aws:PrincipalArn 같은 조건 키는 요청 컨텍스트에 없어요.
  • 페더레이션 호출자는 요청 컨텍스트에 aws:PrincipalIsAWSService 조건 키가 없어요.
  • 수임되는 역할은 AWS 리소스예요. aws:ResourceOrgID와 aws:ResourceAccount 같은 리소스 기반 조건 키는 사용할 수 있고 대상 역할을 가리켜요.
  • 역할의 신뢰 정책은 페더레이션 접근의 1차 인가 게이트로 남아 있어요. VPC 엔드포인트 정책은 추가적인 네트워크 수준 경계를 제공해요.

페더레이션 호출자에게 적용해야 하는 VPC 엔드포인트 정책 문을 작성할 때는 aws:ResourceOrgID 또는 aws:ResourceAccount를 사용하는 걸 권장해요. 이 호출자들은 프린시펄 기반 조건 키가 없기 때문이에요.

AWS STS VPC 엔드포인트 정책에 사용 가능한 조건 키

다음 표는 AWS STS VPC 엔드포인트를 통해 요청할 때 호출자 타입별 요청 컨텍스트에서 흔히 쓰는 조건 키의 가용성을 보여 줘요. 여기에 나열된 것보다 더 많은 조건 키를 사용할 수 있어요.

조건 키 인증된 AWS 프린시펄 페더레이션 호출자 설명
aws:PrincipalOrgID 예 아니요 호출 프린시펄의 조직 ID
aws:PrincipalAccount 예 아니요 호출 프린시펄의 계정 ID
aws:PrincipalArn 예 아니요 호출 프린시펄의 ARN
aws:PrincipalIsAWSService 예 (false로 평가) 아니요 (키 없음) 호출자가 AWS 서비스 프린시펄인지 여부
aws:ResourceOrgID 예 예 요청된 리소스를 소유한 계정의 조직 ID
aws:ResourceAccount 예 예 요청된 리소스를 소유한 계정 ID

Note — 인증된 AWS 프린시펄(IAM 사용자·역할)의 경우 aws:PrincipalIsAWSService는 요청 컨텍스트에 있고 false로 평가돼요. 페더레이션 호출자의 경우 이 키는 요청 컨텍스트에 완전히 없어요. "Bool": {"aws:PrincipalIsAWSService": "false"}를 확인하는 조건은 키가 없기 때문에 페더레이션 호출자와 매칭되지 않아요.

예시: 조직의 모든 AWS STS 동작 허용

다음 엔드포인트 정책은 AWS STS VPC 엔드포인트를 조직으로 제한하면서 페더레이션 접근을 지원해요. 조직 안의 인증된 프린시펄에게 모든 AWS STS 동작을 허용하고, 페더레이션 호출자가 조직 안의 역할을 수임하는 것을 별도로 허용해요. 페더레이션 호출자(AssumeRoleWithSAML과 AssumeRoleWithWebIdentity)는 요청 컨텍스트에 aws:PrincipalOrgID가 없기 때문에 별도의 문이 필요해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowOrganizationPrincipals",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "sts:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-exampleorgid"
                }
            }
        },
        {
            "Sid": "AllowFederatedAssumeRole",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:AssumeRoleWithWebIdentity"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceOrgID": "o-exampleorgid"
                }
            }
        }
    ]
}

첫 번째 문은 "Principal": {"AWS": "*"}와 aws:PrincipalOrgID를 사용해 조직의 인증된 AWS 프린시펄을 허용해요. 두 번째 문은 "Principal": "*"를 사용해 페더레이션 호출자를 매칭하고, aws:ResourceOrgID로 대상 역할을 조직으로 제한해요. 어떤 페더레이션 ID가 어떤 역할을 수임할 수 있는지에 대한 1차 제어는 역할의 신뢰 정책이 담당해요.

네트워크 경계 제어 구현에 대한 자세한 내용은 AWS에서 데이터 경계 구축과 GitHub 웹사이트의 데이터 경계 정책 예시를 참고하세요.

예시: 특정 계정의 모든 AWS STS 동작 허용

다음 엔드포인트 정책은 특정 계정의 프린시펄에게 모든 AWS STS 동작을 허용해요. 계정이 조직에 속하지 않을 때 이 정책을 사용해요. 페더레이션 호출자는 요청 컨텍스트에 aws:PrincipalAccount가 없어서 별도의 문으로 허용해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSpecificAccountPrincipals",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "sts:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalAccount": [
                        "111122223333",
                        "444455556666"
                    ]
                }
            }
        },
        {
            "Sid": "AllowFederatedAssumeRole",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:AssumeRoleWithWebIdentity"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": [
                        "111122223333",
                        "444455556666"
                    ]
                }
            }
        }
    ]
}

첫 번째 문은 "Principal": {"AWS": "*"}와 aws:PrincipalAccount를 사용해 지정된 계정의 인증된 AWS 프린시펄을 허용해요. 두 번째 문은 "Principal": "*"를 사용해 페더레이션 호출자를 매칭하고, aws:ResourceAccount로 대상 역할을 같은 계정으로 제한해요. 어떤 페더레이션 ID가 어떤 역할을 수임할 수 있는지에 대한 1차 제어는 역할의 신뢰 정책이 담당해요.

예시: 특정 AWS STS 동작으로 제한

다음 엔드포인트 정책은 인증된 프린시펄에 대해서는 AssumeRole만, 페더레이션 호출자에 대해서는 AssumeRoleWithSAML만 허용하며, 둘 다 조직 안의 역할로 범위를 한정해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAssumeRoleByOrgPrincipals",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "sts:AssumeRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-exampleorgid"
                }
            }
        },
        {
            "Sid": "AllowSAMLFederation",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "sts:AssumeRoleWithSAML",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceOrgID": "o-exampleorgid"
                }
            }
        }
    ]
}

이 정책은 이 엔드포인트를 통한 GetCallerIdentity, GetSessionToken, AssumeRoleWithWebIdentity 같은 다른 AWS STS 동작을 차단해요. 요구 사항에 맞게 Action 요소를 조정하세요.

예시: 조직 외부 접근은 거부하고 페더레이션은 허용

다음 엔드포인트 정책은 명시적 거부를 사용해 조직 외부의 인증된 프린시펄을 차단하면서 페더레이션 호출자의 접근은 유지해요. 이 방식은 넓은 허용으로 시작하고 대상화된 거부 문을 추가해요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAll",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "*",
            "Resource": "*"
        },
        {
            "Sid": "DenyNonOrgPrincipals",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "sts:*",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalOrgID": "o-exampleorgid"
                }
            }
        }
    ]
}

거부 문은 "Principal": {"AWS": "*"}를 사용하므로 인증된 AWS 프린시펄로만 범위가 한정돼요. 페더레이션 호출자(SAML·OIDC)는 AWS 프린시펄이 아니고 이 Principal 요소에 매칭되지 않으므로 거부가 적용되지 않아요. 이 방식은 페더레이션 호출자에 대한 예외를 만들기 위해 복잡한 Null이나 Bool 조건을 쓸 필요가 없어요.

Note — 첫 번째 문은 모든 프린시펄의 모든 동작을 허용해요. 두 번째 문의 거부는 조직 외부의 인증된 AWS 프린시펄에게 우선 적용돼요. 페더레이션 호출자는 첫 번째 문으로 허용되고, 거부 문의 Principal 요소가 매칭되지 않으므로 거부의 영향을 받지 않아요.

더 알아보기 (Learn more)