

# Amazon API Gateway 자격 증명 기반 정책 예제
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 IAM 사용자 및 역할은 API Gateway 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 또한 AWS Management Console, AWS CLI 또는 AWS SDK를 사용해 작업을 수행할 수 없습니다. IAM 관리자는 지정된 리소스에서 특정 API 작업을 수행할 수 있는 권한을 사용자와 역할에게 부여하는 IAM 정책을 생성해야 합니다. 그런 다음 관리자는 해당 권한이 필요한 IAM 사용자 또는 그룹에 이러한 정책을 연결해야 합니다.

IAM 정책을 생성하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*의 [JSON 탭에서 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)을 참조하세요. API Gateway 관련 작업, 리소스 및 조건에 대한 자세한 내용은 [Amazon API Gateway Management에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonapigatewaymanagement.html) 및 [Amazon API Gateway Management V2에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonapigatewaymanagementv2.html)를 참조하세요.

**Topics**
+ [정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [사용자가 자신의 고유한 권한을 볼 수 있도록 허용](#security_iam_id-based-policy-examples-view-own-permissions)
+ [단순 읽기 권한](#api-gateway-policy-example-apigateway-general)
+ [REQUEST 또는 JWT 권한 부여자만 생성](#security_iam_id-based-policy-examples-v2-import)
+ [기본 `execute-api` 엔드포인트가 비활성화되어 있어야 함](#security_iam_id-based-policy-examples-v2-endpoint-status)
+ [사용자가 프라이빗 REST API만 생성하거나 업데이트할 수 있도록 허용](#security_iam_id-based-policy-examples-private-api)
+ [API 경로에 권한이 있어야 함](#security_iam_id-based-policy-examples-require-authorization)
+ [사용자가 VPC 링크를 생성하거나 업데이트하지 못하도록 방지](#security_iam_id-based-policy-examples-deny-vpc-link)
+ [라우팅 규칙 사용에 대한 정책 예제](#security_iam_id-based-policy-examples-routing-mode)

## 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

ID 기반 정책에 따라 계정에서 사용자가 API Gateway 리소스를 생성, 액세스 또는 삭제할 수 있는지 여부가 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ **AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아가기** - 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반 사용 사례에 대한 권한을 부여하는 *AWS관리형 정책*을 사용합니다. AWS 계정에서 사용할 수 있습니다. 사용 사례에 고유한 AWS고객 관리형 정책을 정의하여 권한을 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. CloudFormation와 같이, 특정 AWS 서비스를 통해 사용되는 경우에만 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용자 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요** – AWS 계정에 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우, 추가 보안을 위해 MFA를 설정합니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## 사용자가 자신의 고유한 권한을 볼 수 있도록 허용
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

이 예제는 IAM 사용자가 자신의 사용자 ID에 연결된 인라인 및 관리형 정책을 볼 수 있도록 허용하는 정책을 생성하는 방법을 보여줍니다. 이 정책에는 콘솔에서 또는 AWS CLI나 AWS API를 사용하여 프로그래밍 방식으로 이 작업을 완료할 수 있는 권한이 포함됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## 단순 읽기 권한
<a name="api-gateway-policy-example-apigateway-general"></a>

이 예제 정책은 us-east-1의 AWS 리전에서 `a123456789`의 식별자를 사용하여 HTTP 또는 WebSocket API의 모든 리소스에 대한 정보를 가져올 수 있는 권한을 사용자에게 부여합니다. 리소스 `arn:aws:apigateway:{{us-east-1}}::/apis/a123456789/*`에는 권한 부여자 및 배포와 같은 API의 모든 하위 리소스가 포함됩니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "apigateway:GET"
      ],
      "Resource": [
        "arn:aws:apigateway:{{us-east-1}}::/apis/a123456789/*"
      ]
    }
  ]
}
```

------

## REQUEST 또는 JWT 권한 부여자만 생성
<a name="security_iam_id-based-policy-examples-v2-import"></a>

이 예제 정책은 사용자가 [가져오기](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis.html#ImportApi)를 포함하여 `REQUEST` 또는 `JWT` 권한 부여자로만 API를 생성할 수 있도록 허용합니다. 정책의 `Resource` 섹션에서 `arn:aws:apigateway:us-east-1::/apis/??????????`에 따라 리소스에는 최대 10자(API의 하위 리소스 제외)를 포함해야 합니다. 이 예제에서는 사용자가 API를 가져와서 한 번에 여러 권한 부여자를 생성할 수 있기 때문에 `ForAllValues` 섹션에서 `Condition`을 사용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "OnlyAllowSomeAuthorizerTypes",
      "Effect": "Allow",
      "Action": [
        "apigateway:PUT",
        "apigateway:POST",
        "apigateway:PATCH"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/??????????",
        "arn:aws:apigateway:us-east-1::/apis/*/authorizers",
        "arn:aws:apigateway:us-east-1::/apis/*/authorizers/*"
      ],
      "Condition": {
        "ForAllValues:StringEqualsIfExists": {
          "apigateway:Request/AuthorizerType": [
            "REQUEST",
            "JWT"
          ]
        }
      }
    }
  ]
}
```

------

## 기본 `execute-api` 엔드포인트가 비활성화되어 있어야 함
<a name="security_iam_id-based-policy-examples-v2-endpoint-status"></a>

 이 예제 정책은 사용자가 `DisableExecuteApiEndpoint`가 `true`인 요구 사항을 사용하여 API를 생성, 업데이트 또는 가져올 수 있도록 허용합니다. `DisableExecuteApiEndpoint`가 `true`인 경우 클라이언트는 API를 호출하는 데 기본 `execute-api` 엔드포인트를 사용할 수 없습니다.

`BoolIfExists` 조건을 사용하여 `DisableExecuteApiEndpoint` 조건 키가 채워지지 않은 API를 업데이트하는 호출을 처리합니다. 사용자가 API를 생성하거나 가져오려고 하면 `DisableExecuteApiEndpoint` 조건 키가 항상 채워집니다.

`apis/*` 리소스는 권한 부여자나 메서드와 같은 하위 리소스도 캡처하므로 `Deny` 명령문을 통해 API만 사용하도록 명시적으로 범위를 지정합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DisableExecuteApiEndpoint",
      "Effect": "Allow",
      "Action": [
        "apigateway:PATCH",
        "apigateway:POST",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/*"
      ],
      "Condition": {
        "BoolIfExists": {
          "apigateway:Request/DisableExecuteApiEndpoint": true
        }
      }
    },
    {
      "Sid": "ScopeDownToJustApis",
      "Effect": "Deny",
      "Action": [
        "apigateway:PATCH",
        "apigateway:POST",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis/*/*"
      ]
    }
  ]
}
```

------

## 사용자가 프라이빗 REST API만 생성하거나 업데이트할 수 있도록 허용
<a name="security_iam_id-based-policy-examples-private-api"></a>

이 예제 정책은 조건 키를 사용하여 사용자가 `PRIVATE` API만 생성하도록 요구하고 API를 `PRIVATE`에서 다른 유형(예: `REGIONAL`)으로 변경할 수 있는 업데이트를 방지합니다.

`ForAllValues`는 API에 추가된 모든 `EndpointType`이 `PRIVATE`여야 한다고 요구하기 위해 사용합니다. `PRIVATE`인 경우에 한해 리소스 조건 키를 사용하여 API에 대한 업데이트를 허용합니다. `ForAllValues`는 조건 키가 있는 경우에만 적용됩니다.

비API 리소스(예: 권한 부여자) 허용을 방지하기 위해 최소 일치(`?`)를 사용하여 API ID에 대해 명시적으로 일치시킵니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ScopePutToPrivateApis",
            "Effect": "Allow",
            "Action": [
                "apigateway:PUT"
            ],
            "Resource": [
                "arn:aws:apigateway:us-east-1::/restapis",
                "arn:aws:apigateway:us-east-1::/restapis/??????????"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "apigateway:Resource/EndpointType": "PRIVATE"
                }
            }
        },
        {
            "Sid": "ScopeToPrivateApis",
            "Effect": "Allow",
            "Action": [
                "apigateway:DELETE",
                "apigateway:PATCH",
                "apigateway:POST"
            ],
            "Resource": [
                "arn:aws:apigateway:us-east-1::/restapis",
                "arn:aws:apigateway:us-east-1::/restapis/??????????"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "apigateway:Request/EndpointType": "PRIVATE",
                    "apigateway:Resource/EndpointType": "PRIVATE"
                }
            }
        },
        {
            "Sid": "AllowResourcePolicyUpdates",
            "Effect": "Allow",
            "Action": [
                "apigateway:UpdateRestApiPolicy"
            ],
            "Resource": [
                "arn:aws:apigateway:us-east-1::/restapis/*"
            ]
        }
    ]
}
```

------

## API 경로에 권한이 있어야 함
<a name="security_iam_id-based-policy-examples-require-authorization"></a>

이 정책은 경로에 권한이 없는 경우 경로를 생성하거나 업데이트하려는 시도([가져오기](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis.html#ImportApi)를 통한 시도 포함)가 실패하게 합니다. `ForAnyValue`은(는) 경로가 생성되거나 업데이트되지 않는 경우와 같이 키가 없으면 false로 평가됩니다. 가져오기를 통해 여러 경로를 생성할 수 있기 때문에 `ForAnyValue`을(를) 사용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowUpdatesOnApisAndRoutes",
      "Effect": "Allow",
      "Action": [
        "apigateway:POST",
        "apigateway:PATCH",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/??????????",
        "arn:aws:apigateway:us-east-1::/apis/*/routes",
        "arn:aws:apigateway:us-east-1::/apis/*/routes/*"
      ]
    },
    {
      "Sid": "DenyUnauthorizedRoutes",
      "Effect": "Deny",
      "Action": [
        "apigateway:POST",
        "apigateway:PATCH",
        "apigateway:PUT"
      ],
      "Resource": [
        "arn:aws:apigateway:us-east-1::/apis",
        "arn:aws:apigateway:us-east-1::/apis/*"
      ],
      "Condition": {
        "ForAnyValue:StringEqualsIgnoreCase": {
          "apigateway:Request/RouteAuthorizationType": "NONE"
        }
      }
    }
  ]
}
```

------

## 사용자가 VPC 링크를 생성하거나 업데이트하지 못하도록 방지
<a name="security_iam_id-based-policy-examples-deny-vpc-link"></a>

이 정책은 사용자가 VPC 링크를 생성하거나 업데이트하는 것을 방지합니다. VPC 링크를 사용하면 Amazon VPC 내의 리소스를 VPC 외부의 클라이언트에 노출할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyVPCLink",
      "Effect": "Deny",
      "Action": [
        "apigateway:POST",
        "apigateway:PUT",
        "apigateway:PATCH"
      ],
      "Resource": [
        "arn:aws:apigateway:{{us-east-1}}::/vpclinks",
        "arn:aws:apigateway:{{us-east-1}}::/vpclinks/*"
      ]
    }
  ]
}
```

------

## 라우팅 규칙 사용에 대한 정책 예제
<a name="security_iam_id-based-policy-examples-routing-mode"></a>

다음 예제 정책은 사용자가 사용자 지정 도메인 이름에서 REST API로 트래픽을 어떻게 라우팅할 수 있는지 RoutingRule 조건 키를 사용하여 제어하는 방법을 보여줍니다. 이러한 예제를 사용하여 사용자가 만들 수 있는 라우팅 규칙의 종류에 대한 세분화된 정책을 생성할 수 있습니다. 자세한 내용은 [API 스테이지를 REST API의 사용자 지정 도메인 이름에 연결하는 라우팅 규칙](rest-api-routing-rules.md) 섹션을 참조하세요.

### 사용자가 사용자 지정 도메인 이름이 요청을 라우팅하는 방법을 변경하지 못하도록 방지
<a name="security_iam_id-based-policy-examples-routing-mode-1"></a>

이 정책은 사용자가 `BasePathMapping`, `ApiMapping` 또는 `RoutingRule`을 만들거나 업데이트하는 것을 방지합니다. 이러한 모든 리소스는 사용자 지정 도메인 이름이 요청을 API로 라우팅하는 방식을 변경할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyAccessBasePathMappingsApiMappingsRoutingRules",
      "Effect": "Deny",
      "Action": "apigateway:*",
      "Resource": [
        "arn:aws:apigateway:{{us-east-1}}::/domainnames/{{example.com}}/basepathmappings/*",
        "arn:aws:apigateway:{{us-east-1}}::/domainnames/{{example.com}}/apimappings/*",
        "arn:aws:apigateway:{{us-east-1}}:{{111122223333}}:/domainnames/{{example.com}}/routingrules/*"
      ]
    }
  ]
}
```

------

### 사용자가 특정 우선 순위로 라우팅 규칙을 업데이트하도록 허용
<a name="security_iam_id-based-policy-examples-routing-mode-2"></a>

이 정책은 사용자가 라우팅 규칙을 1001에서 2000 사이의 우선 순위로만 업데이트할 수 있도록 허용합니다. 이 규칙을 사용하여 프로덕션 규칙을 우선 순위가 낮은 규칙과 분리할 수 있습니다. 그러면 사용자가 프로덕션 규칙에 영향을 주지 않고 우선 순위가 낮은 규칙을 수정할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "UpdatingRoutingRulePriorityBetween1001And2000",
      "Effect": "Allow",
      "Action": "apigateway:UpdateRoutingRule",
      "Resource": "arn:aws:apigateway:us-east-1:111122223333:/domainnames/example.com/routingrules/*",
      "Condition": {
        "NumericGreaterThanEquals": {
          "apigateway:Resource/Priority": 1001,
          "apigateway:Request/Priority": 1001
        },
       "NumericLessThanEquals": {
          "apigateway:Resource/Priority": 2000,
          "apigateway:Request/Priority": 2000
        } 
      }
    }
  ]
}
```

------

### 사용자가 특정 기본 경로 값에 대한 라우팅 규칙 또는 기본 경로 매핑을 업데이트하도록 허용
<a name="security_iam_id-based-policy-examples-routing-mode-3"></a>

이 정책은 사용자가 `orders`로 시작하는 기본 경로에 대한 기본 경로 매핑만 업데이트하거나 `orders`로 시작하는 기본 경로와 일치하는 라우팅 규칙을 업데이트할 수 있도록 허용합니다. 이 정책에서 사용자는 `orders/create` 또는 `orders123`에 대한 기본 경로 매핑 또는 라우팅 규칙을 업데이트할 수 있지만, `payment/orders`에 대한 기본 경로 매핑 또는 라우팅 규칙은 업데이트할 수 없습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
        "Sid": "AllowUpdateRoutingRuleUnderPathOrders",
        "Effect": "Allow",
        "Action": "apigateway:UpdateRoutingRule",
        "Resource": "arn:aws:apigateway:us-east-1:111122223333:/domainnames/example.com/routingrules/*",
        "Condition": {
            "ForAllValues:StringLike": {
                "apigateway:Request/ConditionBasePaths": ["orders*"],
                "apigateway:Resource/ConditionBasePaths": ["orders*"]
            },
            "Null":{
                 "apigateway:Request/ConditionBasePaths":"false",
                 "apigateway:Resource/ConditionBasePaths":"false"             
          }
        }
      }
  ]
}
```

------

### 사용자가 라우팅 모드를 특정 값으로 업데이트하도록 허용
<a name="security_iam_id-based-policy-examples-routing-mode-4"></a>

이 정책은 사용자가 라우팅 모드를 `API_MAPPING_ONLY` 및 `ROUTING_RULE_THEN_API_MAPPING`으로만 업데이트할 수 있도록 허용합니다. 라우팅 모드에 대한 자세한 내용은 [사용자 지정 도메인 이름의 라우팅 모드 설정](set-routing-mode.md) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
        {
           "Sid": "AllowUpdateRoutingModeToAnythingWithApiMapping",
           "Effect": "Allow",
           "Action": ["apigateway:PATCH"],
           "Resource": "arn:aws:apigateway:us-east-1::/domainnames/example.com",
              "Condition": {
               "StringLike": {
                   "apigateway:Request/RoutingMode":"*API_MAPPING*"
               }
           }
       }
    ]
}
```

------