IAM JSON 정책 요소: Condition
IAM JSON 정책 요소: Condition
Condition 요소(또는 Condition 블록)는 정책이 언제 효력이 있는지 조건을 지정해요. 선택 요소이며, 조건 연산자(같음, 작음 등)로 정책의 컨텍스트 키·값을 요청 컨텍스트의 키·값과 매칭해요.
출처: 문서
본문
Condition 요소(또는 Condition 블록)는 정책이 효력을 발휘할 조건을 지정해요. Condition 요소는 선택 사항이에요. Condition 요소에서는 조건 연산자(같음, 작음 등)를 사용해 정책의 컨텍스트 키와 값을 요청 컨텍스트의 키와 값에 대조하는 표현식을 만든다. 요청 컨텍스트에 대해 더 알아보려면 요청의 구성 요소를 참고하세요.
"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}
정책 조건에 지정하는 컨텍스트 키는 전역 조건 컨텍스트 키이거나 서비스별 컨텍스트 키일 수 있어요. 전역 조건 컨텍스트 키는 aws: 접두사를 가져요. 서비스별 컨텍스트 키는 서비스 접두사를 가져요. 예를 들어 Amazon EC2는 그 서비스에 고유한 ec2:InstanceType 컨텍스트 키로 조건을 작성할 수 있게 해 줘요. iam: 접두사의 서비스별 IAM 컨텍스트 키를 보려면 IAM 및 AWS STS 조건 컨텍스트 키를 참고하세요.
컨텍스트 키 이름은 대소문자를 구분하지 않아요. 예를 들어 aws:SourceIP 컨텍스트 키를 포함하는 것은 AWS:SourceIp를 테스트하는 것과 같아요. 컨텍스트 키 값의 대소문자 구분은 사용하는 조건 연산자에 따라 달라져요. 예를 들어 다음 조건은 StringEquals 연산자를 포함해 john이 보낸 요청만 매칭되도록 해요. John이라는 이름의 사용자는 접근이 거부돼요.
"Condition" : { "StringEquals" : { "aws:username" : "john" }}
다음 조건은 StringEqualsIgnoreCase 연산자를 사용해 john이나 John이라는 이름의 사용자를 매칭해요.
"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "john" }}
일부 컨텍스트 키는 키 이름의 일부를 지정할 수 있게 해 주는 키-값 쌍을 지원해요. 예로는 aws:RequestTag/tag-key 컨텍스트 키, AWS KMS의 kms:EncryptionContext:encryption_context_key, 여러 서비스가 지원하는 ResourceTag/tag-key 컨텍스트 키가 있어요.
- Amazon EC2 같은 서비스에
ResourceTag/tag-key컨텍스트 키를 사용한다면 tag-key에 대한 키 이름을 지정해야 해요. - 키 이름은 대소문자를 구분하지 않아요. 즉 정책의 조건 요소에
"aws:ResourceTag/TagKey1": "Value1"을 지정하면 조건은TagKey1또는tagkey1이라는 리소스 태그 키와 매칭되지만, 둘 다는 아니에요. - 이런 속성들을 지원하는 AWS 서비스는 대소문자만 다른 여러 키 이름을 만들 수 있게 허용할 수 있어요. 예를 들어 Amazon EC2 인스턴스에
ec2=test1과EC2=test2라는 태그를 달 수 있어요."aws:ResourceTag/EC2": "test1"같은 조건을 사용해 그 리소스에 접근을 허용하면 키 이름은 두 태그 모두에 매칭되지만 값은 하나만 매칭돼요. 이로 인해 예상치 못한 조건 실패가 발생할 수 있어요.
Important — 모범 사례로, 계정의 구성원들이 키-값 쌍 속성(태그나 AWS KMS 암호화 컨텍스트 같은 것) 이름을 지정할 때 일관된 명명 규칙을 따르도록 하세요. 태그는
aws:TagKeys컨텍스트 키로, AWS KMS 암호화 컨텍스트는kms:EncryptionContextKeys로 강제할 수 있어요.
- 모든 조건 연산자 목록과 동작 방식에 대한 설명은 Condition 연산자를 참고하세요.
- 달리 명시되지 않는 한 모든 컨텍스트 키는 여러 값을 가질 수 있어요. 여러 값을 가진 컨텍스트 키를 처리하는 방법은 다중 값 컨텍스트 키용 집합 연산자를 참고하세요.
- 전역적으로 사용할 수 있는 모든 컨텍스트 키 목록은 AWS 전역 조건 컨텍스트 키를 참고하세요.
- 각 서비스가 정의하는 조건 컨텍스트 키는 AWS 서비스용 동작, 리소스, 조건 키를 참고하세요.
요청 컨텍스트
프린시펄이 AWS에 요청을 보내면 AWS는 요청 정보를 요청 컨텍스트로 모아요. 요청 컨텍스트는 프린시펄, 리소스, 동작, 기타 환경 속성에 대한 정보를 포함해요. 정책 평가는 정책의 속성을 요청에서 보낸 속성과 대조해서 AWS에서 수행할 수 있는 동작을 평가·인가해요.
JSON 정책의 Condition 요소로 특정 컨텍스트 키를 요청 컨텍스트에 대해 테스트할 수 있어요. 예를 들어 aws:CurrentTime 컨텍스트 키를 사용해 사용자가 특정 날짜 범위 안에서만 동작을 수행할 수 있게 하는 정책을 만들 수 있어요.
다음 예시는 Martha Rivera가 자신의 MFA 디바이스를 비활성화하는 요청을 보낼 때의 요청 컨텍스트를 보여 줘요.
Principal: AROA123456789EXAMPLE
Action: iam:DeactivateMFADevice
Resource: arn:aws:iam::user/martha
Context:
– aws:UserId=AROA123456789EXAMPLE:martha
– aws:PrincipalAccount=1123456789012
– aws:PrincipalOrgId=o-example
– aws:PrincipalARN=arn:aws:iam::1123456789012:assumed-role/TestAR
– aws:MultiFactorAuthPresent=true
– aws:MultiFactorAuthAge=2800
– aws:CurrentTime=...
– aws:EpochTime=...
– aws:SourceIp=...
이 요청 컨텍스트는 사용자가 지난 1시간(3,600초) 안에 MFA로 로그인한 경우에만 자기 MFA 디바이스를 제거할 수 있게 허용하는 정책에 대해 매칭돼요.
{
"Version":"2012-10-17",
"Statement": {
"Sid": "AllowRemoveMfaOnlyIfRecentMfa",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}",
"Condition": {
"NumericLessThanEquals": {"aws:MultiFactorAuthAge": "3600"}
}
}
}
이 예시에서 정책은 요청 컨텍스트와 일치해요. 동작이 같고, 리소스가 * 와일드카드와 매칭되며, aws:MultiFactorAuthAge 값이 2800으로 3600보다 작으므로 이 인가 요청을 허용해요.
AWS는 정책의 각 컨텍스트 키를 평가해 true나 false를 반환해요. 요청에 없는 컨텍스트 키는 불일치로 간주돼요.
요청 컨텍스트는 다음 값을 반환할 수 있어요.
- True — 요청자가 지난 1시간 이내에 MFA로 로그인했다면 조건이 true를 반환해요.
- False — 요청자가 1시간보다 더 전에 MFA로 로그인했다면 조건이 false를 반환해요.
- Not present(없음) — 요청자가 AWS CLI나 AWS API에서 IAM 사용자 액세스 키로 요청했다면 키가 없어요. 이 경우 키가 없으므로 매칭되지 않아요.
Note — 어떤 경우에는 조건 키 값이 없어도 조건이 여전히 true를 반환할 수 있어요. 예를 들어
ForAllValues한정자를 추가하면 컨텍스트 키가 요청에 없을 때 요청이 true를 반환해요. 누락된 컨텍스트 키나 빈 값의 컨텍스트 키가 true로 평가되는 것을 막으려면, 정책에 false 값의Null조건 연산자를 포함해 컨텍스트 키가 존재하고 그 값이 null이 아닌지 확인할 수 있어요.
조건 블록
다음 예시는 Condition 요소의 기본 형식을 보여 줘요.
"Condition": {"StringLike": {"s3:prefix": ["jane/*"]}}
요청의 값은 컨텍스트 키로 표현돼요. 이 경우 s3:prefix예요. 컨텍스트 키 값은 jane/* 같은 리터럴 값으로 지정한 값과 비교돼요. 수행할 비교 유형은 조건 연산자 여기서는 StringLike가 지정해요. 같음, 크다, 작다 같은 일반적인 부울 비교로 문자열, 날짜, 숫자 등을 비교하는 조건을 만들 수 있어요. 문자열 연산자나 ARN 연산자를 사용할 때는 컨텍스트 키 값에 정책 변수를 사용할 수도 있어요. 다음 예시는 aws:username 변수를 포함해요.
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
어떤 상황에서는 컨텍스트 키가 여러 값을 포함할 수 있어요. 예를 들어 Amazon DynamoDB 요청이 테이블에서 여러 속성을 반환하거나 업데이트하도록 요청할 수 있어요. DynamoDB 테이블 접근 정책은 요청에 나열된 모든 속성을 포함하는 dynamodb:Attributes 컨텍스트 키를 포함할 수 있어요. Condition 요소에서 집합 연산자(set operators)를 사용해 요청의 여러 속성을 정책의 허용된 속성 목록에 대해 테스트할 수 있어요. 자세한 내용은 다중 값 컨텍스트 키용 집합 연산자를 참고하세요.
요청 중에 정책이 평가될 때 AWS는 키를 요청의 해당 값으로 바꿔요. (이 예시에서 AWS는 요청의 날짜와 시간을 사용해요.) 조건은 true 또는 false를 반환하도록 평가되고, 이는 정책 전체가 요청을 허용하거나 거부하는 데 반영돼요.
조건의 여러 값
Condition 요소는 여러 조건 연산자를 포함할 수 있고, 각 조건 연산자는 여러 컨텍스트 키-값 쌍을 포함할 수 있어요. 자세한 내용은 다중 값 컨텍스트 키용 집합 연산자를 참고하세요.