AWS IAM: 여러 IAM 조건 연산자로 논리적 OR 효과를 얻으려면 어떻게 해야 합니까?
아래 예는 위의 2가지 진술에 대한 컨텍스트를 제공합니다. 아래 예에서 전역 조건 키 aws:SourceIp에 대한 2개의 값이 OR을 사용하여 평가되고 3개의 개별 조건 연산자(DateGreaterThan, DateLessThan, IpAddress)가 AND를 사용하여 평가되는 것을 볼 수 있습니다. 이것은 효과적으로 의미합니다
"Condition" : {
"DateGreaterThan" : {
"aws:CurrentTime" : "2019-07-16T12:00:00Z"
},
"DateLessThan": {
"aws:CurrentTime" : "2019-07-16T15:00:00Z"
},
"IpAddress" : {
"aws:SourceIp" : ["192.0.2.0/24", "203.0.113.0/24"]
}
}
문제 설명
위의 사항을 염두에 두고 논리적 OR 방식으로 평가해야 하는 조건 연산자를 설정해야 하는 경우 어떻게 합니까? 예를 들어, Env:Dev라는 특정 태그가 있거나 sourceIP가 192.0.2.0/24인 경우 EC2 인스턴스를 시작합니다. 이를 달성하는 한 가지 방법은 IAM 문 블록을 복제하고 각 블록에 2개의 조건 연산자를 별도로 배치하는 것이지만 이는 IAM 정책을 지저분하게 만드는 지루한 방법이자 복잡한 방법이며 IAM 관리형 정책 제한에 매우 근접할 수 있습니다. 여러 작업과 관련된 여러 조건 연산자가 있는 경우 6144자(공백 제외).
해결책
먼저 논리 AND 및 논리 OR 연산에 대한 아주 기본적인 진리표 개념을 공유한 다음 솔루션으로 넘어갈 것입니다.
Logical AND:
=============
Input1 Input2 Output
True True True
False False False
True False False
False True False
Logical OR:
============
Input1 Input2 Output
True True True
False False False
True False True
False True True
위에서 볼 수 있듯이 논리 AND 연산은 입력이 모두 참일 때만 참 출력을 산출하고 논리 OR은 입력 중 하나 이상이 참인 한 항상 참 출력을 산출합니다. IAM 정책도 같은 방식으로 평가됩니다. IAM 문 블록에 언급된 효과는 조건이 참인 경우에만 허용 또는 거부됩니다. 이제 조건 블록에서 논리적 OR을 수행하려면 다음 방법을 사용해야 합니다.
Not [(Not(Condition 1) AND Not(Condition 2)]
------------------------------------------
Let us try to solve the above block in truth table form with values where:
Condition 1 = Input 1
Condition 2 = Input 2
* When Input 1 = True and Input 2 = True:
Not [(Not(True) AND Not(True)] => Not [False AND False]
=> Not [False] => True
* When Input 1 = True and Input 2 = False:
Not [(Not(True) AND Not(False)] => Not [False AND True]
=> Not [False] => True
* When Input 1 = False and Input 2 = True:
Not [(Not(False) AND Not(True)] => Not [True AND False]
=> Not [False] => True
* When Input 1 = False and Input 2 = False:
Not [(Not(False) AND Not(False)] => Not [True AND True]
=> Not [True] => False
If we put the values in the table, then the table will look like this which matches that of Logical OR table shown above:
Input1 Input2 Output
====== ====== ======
True True True
False False False
True False True
False True True
지금까지는 모든 것이 기본이었지만 조건 블록에서 위의 논리를 실제로 어떻게 적용합니까? 아래에서 StringNotEquals와 같은 Effect:Deny 및 Not 조건 연산자의 예를 들어 설명하겠습니다. 그리고 문제 설명에서 언급한 것과 동일한 예를 들어보겠습니다. 즉, Env:Dev라는 특정 태그가 있거나 sourceIP가 192.0.2.0/24인 경우 EC2 인스턴스를 시작하는 것입니다. 다음 IAM 정책 설명은 원하는 논리적 OR 효과를 얻을 수 있어야 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowToDescribeAll",
"Effect": "Allow",
"Action": [
"ec2:RunInstances"
],
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"192.0.2.0/24"
]
},
"StringNotLike": {
"aws:RequestTag/Env": [
"Dev"
]
}
}
}
]
}
위의 정책이 논리적 OR로 작동하는 이유가 궁금하시다면 앞서 도출한 방법과의 관계를 보여드리겠습니다.
아님 [(Not(조건 1) AND Not(조건 2)]
위의 IAM 정책은 다음과 같이 작성할 수도 있습니다(개념 이해를 위해서만).
[(NotIpAddress(aws:SourceIP) AND StringNotLike(aws:RequestTag)] 거부
* When awsSourceIP is not 192.0.2.0/24 (meaning it is false) and aws:RequestTag/Env is not Dev (meaning it is false) and the respective condition operators will become True and Effect will be denied:
Deny [(NotIpAddress (False) AND StringNotLike (False)] ==>
Deny [True AND True] ==> Deny [True] => False
* When awsSourceIP is 192.0.2.0/24 (meaning it is true) and aws:RequestTag/Env is not Dev (meaning it is false) then this statement policy block will not apply. This will mean Effect:Allow will take effect and thereby allowing ec2:RunInstances action:
Deny [(NotIpAddress (True) AND StringNotLike (False)] ==>
Deny [False AND True] ==> Deny [False] => True
* When awsSourceIP is not 192.0.2.0/24 (meaning it is false) and aws:RequestTag/Env is Dev (meaning it is true) then this statement policy block will not apply. This will mean Effect:Allow will take effect and thereby allowing ec2:RunInstances action:
Deny [(NotIpAddress (False) AND StringNotLike (True)] ==>
Deny [True AND False] ==> Deny [False] => True
* When awsSourceIP is 192.0.2.0/24 (meaning it is true) and aws:RequestTag/Env is Dev (meaning it is true) then this statement policy block will not apply. This will mean Effect:Allow will take effect and thereby allowing ec2:RunInstances action:
Deny [(NotIpAddress (True) AND StringNotLike (True)] ==>
Deny [False AND False] ==> Deny [False] => True
If we put the values in the table, then the table will look like this which matches that of Logical OR table shown above:
Input1 Input2 Output
====== ====== ======
True True True
False False False
True False True
False True True
결론
IAM 정책은 복잡할 수 있으며 이 방법을 사용하면 지금까지 OR 효과를 달성하는 유일한 방법이었기 때문에 조건문에서만 다른 중복 명령문 블록을 제거할 수 있습니다.
Reference
이 문제에 관하여(AWS IAM: 여러 IAM 조건 연산자로 논리적 OR 효과를 얻으려면 어떻게 해야 합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/himwad05/aws-iam-how-to-achieve-logical-or-effect-with-multiple-iam-condition-operators-2h0p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)