리소스 기반 정책 가이드
리소스 기반 정책 개요
API Gateway의 리소스 기반 정책(Resource-based Policy)은 리소스에 부여되는 정책으로써 특정 자원에 대한 행동(Action)을 주체(Principal)에 한하여 허용하거나 거부(Effect)하도록 결정할 수 있습니다.
리소스 기반 정책을 활용하여 API를 호출할 수 있는 주체를 직접 정의할 수 있습니다.
리소스 기반 정책을 통해 다음을 정의하여 안전한 API 호출을 허용할 수 있습니다.
- 지정된 Samsung Cloud Platform 계정의 사용자
- 지정된 소스 IP 주소 범위 또는 CIDR 블록
소스 정책은 지정된 보안 주체(보통 IAM 역할 또는 그룹)가 API를 호출할 수 있는지 여부를 제어하기 위해 API에 연결되는 JSON 정책 문서 형태로 정의됩니다.
| 구분 | 설명 | 예시 |
|---|---|---|
| 대상(Principal) | API를 호출할 주체 지정 | - |
| 작업(Action) | 허용할 기능을 정의 | - |
| 조건(Condition) | 특정 상황에서만 허용하도록 제한 | 특정 SRN에서 온 요청만 허용 |
- API Gateway의 리소스 기반 정책은 IAM의 리소스 기반 정책의 규칙을 활용합니다.
- JSON을 활용하여 정책을 생성하거나 수정하는 방법은 JSON 작성 가이드를 참고하세요.
리소스 기반 정책 사용 시나리오
리소스 기반 정책의 주요 사용 시나리오는 다음과 같습니다.
리소스 기반 정책 시나리오
API Gateway의 특정 기능이 동작할 때 활용되는 리소스 기반 정책 시나리오는 다음과 같습니다.
| 구분 | 설명 | 참고 예시 |
|---|---|---|
| 기본 정책 | API가 생성될 때 기본적으로 함께 생성되는 DEFAULT 리소스 정책입니다.
| 기본 정책 예시 |
| 계정 허용 목록 | API를 호출할 수 있는 계정(들)을 정의할 수 있습니다. | 계정 허용 목록 예시 |
| IP 범위 거부 목록 | API를 호출할 수 없는 IP 범위를 정의할 수 있습니다. | IP 범위 거부 목록 예시 |
사용자 추가 활용 시나리오
API Gateway의 리소스 기반 정책으로 자동으로 등록되지는 않지만 필요에 따라 사용자가 추가하여 활용할 수 있습니다.
사용자가 추가하여 활용할 수 있는 시나리오는 다음과 같습니다.
- 교차 계정 접근
- A 계정의 IAM 사용자가 B 계정의 API를 실행하고 싶은 경우, B 계정 함수 정책에 A 계정을 등록합니다.
- 하이브리드 접근 제어
- 단순히 계정이나 IP만 제한하는 것이 아니라, 특정 사용자와 특정 IP 대역 두 조건이 동시에 만족해야 접근할 수 있도록 구성할 수 있습니다.
API Gateway의 리소스 기반 정책 관리
API Gateway의 리소스 기반 정책을 확인하고 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Application Service > API Gateway 메뉴를 클릭하세요. API Gateway의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 API Gateway > 리소스 정책 메뉴를 클릭하세요. 리소스 정책 페이지로 이동합니다.
- 정책 세부 정보 항목의 수정 버튼을 클릭하세요. 리소스 정책 수정 팝업창이 열립니다.
- 삭제 버튼을 클릭하면 등록된 정책이 삭제됩니다.
- 리소스 정책 수정 팝업창에서 정책 템플릿을 선택한 후, 정책을 작성하세요.
- 정책 템플릿별 정책 예시는 리소스 기반 정책 예시를 참고하세요.
- 작성이 완료되면 완료 버튼을 클릭하세요.
리소스 기반 정책 예시
사용자는 필요에 따라 리소스 기반 정책을 추가로 정의하거나 기존 정책을 수정하여 활용할 수 있습니다.
- 일부 기능들의 경우에는 API Gateway에서 사용하려면 리소스 기반 정책(또는 자격 증명)이 등록되어 있어야 합니다.
- 이 가이드에서 설명하고 있는 리소스 기반 정책 예시의 경우, 각 기능들이 활성화되거나 연결될 때 예시의 리소스 기반 정책을 API Gateway가 자동으로 등록하고 있습니다.
기본 정책
API를 생성할 때 자동으로 등록되는 정책입니다.
정책 템플릿
{
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:api/{{ApiId}}"
],
"Sid": "DefaultStatement"
}
],
"Version": "2024-07-01"
}{
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:api/{{ApiId}}"
],
"Sid": "DefaultStatement"
}
],
"Version": "2024-07-01"
}정책 예시
{
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "DefaultStatement"
}
],
"Version": "2024-07-01"
}{
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "DefaultStatement"
}
],
"Version": "2024-07-01"
}{
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "DefaultStatement"
}
],
"Version": "2024-07-01"
}{
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "DefaultStatement"
}
],
"Version": "2024-07-01"
}계정 허용 목록
특정 SCP 계정(Root 사용자 또는 IAM Role)의 사용자만 API를 호출을 허용하는 정책입니다.
정책 템플릿
{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:method/{{ApiId}}/{{stageNameOrWildcard*}}/{{httpVerbOrWildcard*}}/{{resourcePathOrWildcard*}}"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:{{Offering}}::{{AccountID}}:::iam:user/{{UserSrn}}"
]
},
"Resource": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:api/{{ApiId}}"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:method/{{ApiId}}/{{stageNameOrWildcard*}}/{{httpVerbOrWildcard*}}/{{resourcePathOrWildcard*}}"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:{{Offering}}::{{AccountID}}:::iam:user/{{UserSrn}}"
]
},
"Resource": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:api/{{ApiId}}"
],
"Sid": "Statement1"
}
]
}정책 예시
{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1"
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1"
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:s::accountId1:::iam:user/userId1"
]
},
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:s::accountId1:::iam:user/userId1"
]
},
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}IP 범위 거부 목록
특정 IP 주소나 CIDR 범위만 허용하거나 차단하는 정책입니다.
정책 템플릿
{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:method/{{ApiId}}/{{stageNameOrWildcard*}}/{{httpVerbOrWildcard*}}/{{resourcePathOrWildcard*}}"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"{{sourceIpOrCIDRBlock}}",
"{{sourceIpOrCIDRBlock}}"
]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:api/{{ApiId}}"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:method/{{ApiId}}/{{stageNameOrWildcard*}}/{{httpVerbOrWildcard*}}/{{resourcePathOrWildcard*}}"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"{{sourceIpOrCIDRBlock}}",
"{{sourceIpOrCIDRBlock}}"
]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:{{Offering}}::{{AccountID}}:kr-west1::apigateway:api/{{ApiId}}"
],
"Sid": "Statement1"
}
]
}정책 예시
{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/stage1/GET/resource1"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}교차 계정 접근
계정 A의 특정 API 리소스를 계정 B의 사용자가 호출할 수 있는 리소스 정책입니다.
정책 예시
{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1",
"srn:e::accountId2:::iam:user/userId2",
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1",
"srn:e::accountId2:::iam:user/userId2",
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1",
"srn:e::accountId2:::iam:user/userId2",
]
},
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1",
"srn:e::accountId2:::iam:user/userId2",
]
},
"Resource": [
"srn:s::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}하이브리드 접근 제어
사용자 자격 증명(Account)과 접속 소스(IP)를 결합하여 접근 제어 정책을 정의할 수 있는 리소스 정책입니다.
정책 예시
{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1",
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:e::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountId1:::iam:user/userId1",
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:s::accountId1:::iam:user/userId1",
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}{
"Version": "",
"Statement": [
{
"Action": [
"apigateway:InvokeApigatewayRegion"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['method-srn']": [
"srn:s::accountId1:kr-west1::apigateway:method/apiId1/*/*/*"
]
},
"NotIpAddress": {
"scp:SourceIp": [
"1.2.3.4/24",
"5.6.7.8/32"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:s::accountId1:::iam:user/userId1",
]
},
"Resource": [
"srn:e::accountId1:kr-west1::apigateway:api/apiId1"
],
"Sid": "Statement1"
}
]
}