BLOG

Amazon API Gateway 리소스 정책을 사용하여 API에 대한 액세스 제어하기
작성일: 2018-07-20

Amazon API Gateway는 핵심 비즈니스 서비스를 구축하는 데 집중할 수 있는 단순하고 유연하며 안전하고 완벽하게 관리되는 서비스를 제공합니다. API Gateway는 AWS Identity and Access Management(IAM), AWS Lambda 보조 장치 및 Amazon Cognito를 사용하는 다양한 액세스 제어 메커니즘을 지원합니다.

API가 호출되는 위치를 엄격하게 제어할 수 있습니다. 예를 들어 SaaS 모델을 통한 API를 제공하는 AWS 파트너인 경우 새로운 Amazon API Gateway 리소스 정책 기능을 활용하여 미리 정의된 IP 주소 범위를 사용하여 API에 대한 액세스를 제어할 수 있습니다. API Gateway 리소스 정책은 지정된 주체(일반적으로 IAM 사용자 또는 역할)가 API를 호출할 수 있는지 여부를 제어하기 위해 API에 연결하는 JSON 정책 문서입니다.

고객이 AWS Marketplace에서 SaaS 제품을 구독한 후 등록 정보에 IP 주소 범위를 요청할 수 있습니다. 그런 다음 이러한 IP 주소에서만 API에 액세스 할 수 있도록 설정하여 API를 안전하게 통합할 수 있습니다. 예를 들어 고객이 특정 지역에 분산되어 있다는 것을 알고 있다면 다른 모든 국가를 블랙리스트에 올릴 수 있습니다. 또는 글로벌 고객이 있는 경우 특정 IP 주소 범위만 화이트리스트에 추가할 수 있습니다.

 

리소스 정책은 어떤 문제를 해결합니까?

별도의 AWS 계정이 있는 분산 개발 팀에서는 통합 테스트가 어렵습니다. 다른 AWS 계정의 사용자가 API에 액세스 할 수 있도록 허용하려면 API 소유자 계정의 역할을 가정하기 위해 코드를 작성하고 유지해야 합니다. 또한 제 3자와 함께 작업하는 경우에는 전달자(bearer) 토큰 인증 전략을 구현하기 위해 Lambda 보조 장치를 기입해야 합니다.

이제 S3 버킷 정책과 유사한 리소스 정책을 사용하여 사용자 지정 보조 장치 또는 복잡한 응용 프로그램 로직을 작성하지 않고 API에서 중요한 제어 기능을 제공할 수 있습니다. 이 글에서는 API Gateway 리소스 정책을 사용하여 다른 AWS 계정의 사용자가 API에 안전하게 액세스 할 수 있도록 하는 방법을 시연합니다. 또한 코드를 작성하지 않고도 지정된 소스 IP 주소 범위 또는 CIDR 블록에서만 API 호출을 허용할 수 있습니다.

 

솔루션 개요

한 회사에 A팀과 B팀의 두 팀이 있다고 상상해 보세요. 팀 B는 Lambda 함수와 DynamoDB 데이터베이스로 지원되는 API를 생성했습니다. API를 제 3자에게 공개하고자 합니다. 첫째로, 그들은 팀 A가 통합 시험을 시행하기를 원합니다. API가 활성화되면 팀 B는 알려진 IP 주소 범위에서 API에 액세스 하는 사용자만 허용하려고 합니다.

다음 다이어그램은 시퀀스를 보여 줍니다.

 

 

API 구축부터 시작합니다. 자세한 설명으로 API를 생성하기 위해서는 SAM 템플릿과 AWS CLI를 사용합니다. 코드를 사용하여 API를 만들고 리소스 정책을 연결하려면 Sam-moviesapi-resourcepolicy GitHub repo를 참조하십시오.

여기에 단계별 절차가 나와 있으므로 커버 아래에서 발생하는 상황을 보다 깊이 이해할 수 있습니다.

  • API 생성
  • IAM인증 켜기
  • 사용자 액세스 허용
  • 액세스 권한 테스트

 

API 생성

AccountB에서 API를 호스팅하고 있다고 가정합니다. 다음 명령을 실행합니다.

git clone https://github.com/aws-samples/aws-sam-movies-api-resource-policy.git

mkdir ./build

 

cp -p -r ./movies

./build/movies

 

pip install -r

requirements.txt -t ./build

 

aws cloudformation package –template-file template.yaml –output-template-file template-out.yaml –s3-bucket $S3Bucket –profile AccountB

 

aws cloudformation deploy –template-file template-out.yaml –stack-name apigw-resource-policies-demo –capabilities CAPABILITY_IAM –profile AccountB

참고:”패키지”단계에서 사용할 아티팩트를 저장하려면 S3 버킷이 필요합니다.

 

IAM인증 켜기

동영상 API를 설정한 후에는 인증되지 않은 시도로부터 보호되도록 IAM 인증을 켭니다.

다음 스크린샷과 같아야 합니다.

 

 

또한 다음 스크린샷에 표시된 것처럼 GET 요청을 할 때도 유효한 응답을 받고 있는지 확인하십시오.

 

 

 

 

사용자 액세스 허용

이제 AccountA 사용자에게 API에 대한 액세스 권한을 부여합니다. API Gateway 콘솔에서 MoviesAPI, ResourcePolicy를 선택합니다.

참고:이 게시물에 기록된 모든 IP 주소 범위는 예시용입니다.

다음은 콘솔에서 표시되는 스크린샷입니다.

 

 

전체 정책은 다음과 같이 나열됩니다.

{

    “Version”: “2012-10-17”,

    “Statement”: [

        {

            “Effect”: “Allow”,

            “Principal”: {

                “AWS”: [

                    “arn:aws:iam::<account_idA>:user/<user>”,

                    “arn:aws:iam::<account_idA>:root”

                ]

            },

            “Action”: “execute-api:Invoke”,

            “Resource”: “arn:aws:execute-api:us-east-1:<account_idB>:qxz8y9c8a4/*/*/*”

        },

        {

            “Effect”: “Allow”,

            “Principal”: “*”,

            “Action”: “execute-api:Invoke”,

            “Resource”: “arn:aws:execute-api:us-east-1:<account_idB>:qxz8y9c8a4/*”,

            “Condition”: {

                “IpAddress”: {

                    “aws:SourceIp”: ” 203.0.113.0/24″

                }

            }

        }

    ]

}

여기 주목할 만한 몇가지 사항이 있습니다. 첫번째 정책 문장은 정책의 리소스 섹션에 있는 특정 리소스 경로로 특정 API ID에 대한 세부적인 액세스를 제공하는 방법을 보여 줍니다. AccountA 사용자에게 GET 요청에만 액세스 할 수 있는 권한을 제공하려면 리소스 줄을 다음으로 변경하십시오.

“Resource”: “arn:aws:execute-api:us-east-1:<account_idB>:qxz8y9c8a4/*/GET/*”

두번째 문장에서는 API에 대한 모든 호출을 수행하기 위해 전체 203.0.113.0/24 네트워크를 화이트리스트에 추가합니다.

IP 주소를 화이트리스트에 추가하는 것이 API를 처음 시작할 때 시작하는 좋은 방법이지만 업데이트된 목록을 유지하는 것은 어려울 수 있습니다. 안정적인 제품을 위해서는, 위험한 사람을 블랙리스트에 올리는 것이 더 실용적일 수 있습니다.

블랙리스트 구현은 다음과 같을 수 있습니다.

{

       “Effect”: “Deny”,

       “Principal”: “*”,

       “Action”: “execute-api:Invoke”,

       “Resource”: “arn:aws:execute-api:us-east-1:<account_idB>:qxz8y9c8a4/*”,

       “Condition”: {

             “IpAddress”: {

                    “aws:SourceIp”: “203.0.113.0/24”

             }

       }

}

API에 대한 액세스 로그가 설정되어 있으며 로그 분석 도구가 특정 IP 주소 범위(예: 203.0.113.0/24)에서 위험한 사람으로 플래그 지정되었습니다. 이제 리소스 정책에서 이 IP 주소를 블랙리스트에 추가할 수 있습니다.

 

액세스 권한 테스트

이제 우체부를 이용하여 AccountA의 사용자가 AccountB에서 호스팅되는 API를 실제로 호출할 수 있는지 확인할 수 있습니다. 또한 다른 계정의 시도가 거부되는지 확인합니다.

다음 예에서는 AWS Signature가 AccountB 사용자로부터 API에 대한 액세스 권한을 부여 받은 AccessKey및 SecretKey 값으로 구성되어 있습니다.

AccountB로부터 권한 있는 사용자의 성공적인 응답–200 OK 확인

 

 

인증되지 않은 계정/사용자로부터의 실패: 401승인실패

 

 

 

요약

이 글에서는 리소스 정책을 사용하여 API에 대한 액세스를 잠글 수 있는 다양한 방법을 보여 드렸습니다. 개발 API 엔드포인트를 사무실 IP 주소 범위로 제한하시겠습니까? 이제 여러분도 할 수 있습니다. 교차 계정 API 액세스도 복잡한 인증 절차를 작성할 필요 없이 훨씬 간단하게 수행됩니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/compute/control-access-to-your-apis-using-amazon-api-gateway-resource-policies/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.