AWS IAM: 여러 IAM 조건 연산자로 논리적 OR 효과를 얻으려면 어떻게 해야 합니까?

6328 단어
AWS IAM(Identity and Access Management) 세계에서 다음과 같은 평가 로직이 있다는 것은 잘 알려진 사실입니다.
  • 여러 키 또는 여러 조건 연산자가 있는 조건 연산자는 항상 논리적 AND 연산입니다.
  • 단일 키와 여러 값이 있는 조건은 논리적 OR 연산입니다.

  • 아래 예는 위의 2가지 진술에 대한 컨텍스트를 제공합니다. 아래 예에서 전역 조건 키 aws:SourceIp에 대한 2개의 값이 OR을 사용하여 평가되고 3개의 개별 조건 연산자(DateGreaterThan, DateLessThan, IpAddress)가 AND를 사용하여 평가되는 것을 볼 수 있습니다. 이것은 효과적으로 의미합니다
  • IpAddress 조건 연산자는 요청의 SourceIP가 OR 연산인 192.0.2.0/24 또는 203.0.113.0/24 서브넷에 속하는 경우에만 true가 됩니다.
  • 전체 조건 블록은 AND 연산과 동일한 3가지 조건 연산자가 모두 참인 경우에만 참이 됩니다.

  • "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 효과를 달성하는 유일한 방법이었기 때문에 조건문에서만 다른 중복 명령문 블록을 제거할 수 있습니다.

    좋은 웹페이지 즐겨찾기