BLOG
웹 응용프로그램을 만들거나 외부에서 데이터를 노출한다고 하면 확장성이 뛰어나고 안전하며 강력한 REST API를 구축 할 수있는 플랫폼을 찾게 될 것입니다. API가 공개적으로 노출되면 API를 사용하는 소비자에게 보안 메커니즘을 제공하기 위한 여러 가지 우수 사례가 있습니다.
Amazon API Gateway는 트래픽 관리, 권한 부여 및 액세스 제어, 모니터링 및 API 버전 관리를 포함하여 수십만 개의 동시 API 호출을 수락하고 처리하는 데 관련된 모든 작업을 처리합니다.
이 글에서는 API Gateway의 지역 API 엔드포인트 기능을 활용하여 AWS WAF를 사용하여 Amazon CloudFront 배포본을 만들고 API를 보호하는 방법을 보여줍니다.
AWS WAF는 웹 응용프로그램 방화벽으로서 응용프로그램 가용성에 영향을 미치거나 보안을 손상시키고 혹은 과도한 자원을 소비 할 수 있는 일반적인 웹 악용으로부터 웹 응용프로그램을 보호합니다.
API를 공개적으로 사용할 수 있게되면 여러 가지 방법으로 서비스를 악용하려는 공격자에게 노출 될 수 있습니다. AWS 보안 팀은 OWASP의 10 가지 웹 애플리케이션 취약점을 완화하는 방법인 AWS WAF를 사용하여 백서 솔루션을 발표했습니다.
지역 API 엔드포인트
에지에 최적화 API는 API 게이트웨이가 만들고 관리하는 CloudFront 배포를 통해 액세스되는 엔드포인트입니다. 지역 API 엔드포인트를 시작하기 전에 API 게이트웨이를 사용하여 API를 작성할 때 이것이 기본 옵션이었습니다. 이는 주로 API와 다른 지리적 위치에 있는 API 사용자의 대기 시간을 줄이는 데 큰 도움이 되었습니다.
API 요청이 주로 Amazon EC2 인스턴스 또는 API가 배포 될 때 동일한 AWS 리전 내의 다른 서비스에서 비롯된 경우 일반적으로 지역 API 엔드포인트는 연결 대기 시간을 낮춥니다. 이는 그러한 상황들에 권장됩니다.
캐싱 전략을 보다 효과적으로 제어하기 위해 고객은 지역 API에 대해 자체 CloudFront 배포판을 사용할 수 있습니다. 또한 이 게시물에서 설명하는 것처럼 AWS WAF 보호 기능을 사용할 수도 있습니다.
에지에 최적화된 API 엔드포인트
다음 다이어그램은 API 클라이언트가 API 게이트웨이에서 만들고 관리하는 CloudFront 배포를 통해 API에 액세스하는 가장자리 최적화 된 API 엔드포인트의 그림입니다.
지역 API 엔드포인트
지역 API 엔드포인트의 경우 고객은 REST API가 배치된 동일한 지역에서 API에 액세스합니다. 이렇게하면 요청 대기 시간을 줄이는 데 도움이 되며, 필요에 따라 고유한 콘텐츠 전송 네트워크를 추가 할 수 있습니다.
Walkthrough
이 섹션에서는 다음 단계를 구현합니다.
- PetStore 샘플 API를 사용하여 지역 API를 만듭니다.
- API용 CloudFront 배포판을 만듭니다.
- CloudFront 배포판을 테스트하십시오.
- AWS WAF를 설정하고 웹 ACL을 만듭니다.
- 웹 ACL을 CloudFront 배포판에 첨부하십시오.
- AWS WAF 보호를 테스트하십시오.
지역 API 생성하기
이 연습에서는 기존 PetStore API를 사용하십시오. 모든 새 API는 기본적으로 지역 엔드포인트 유형으로 실행됩니다. 기존 API의 엔드포인트 유형을 변경하려면 오른쪽 상단의 톱니 바퀴 아이콘을 선택하십시오.
계정에 PetStore API를 생성 한 후 PetStore API에 “prod”라는 단계를 배포하십시오.
API 게이트웨이 콘솔에서 PetStore API를 선택하고 동작, API 배포를 선택합니다.
스테이지 이름에 prod를 입력하고 스테이지 설명을 추가하십시오.
배포를 선택하면 새로운 API 단계가 생성됩니다.
다음 AWS CLI 명령을 사용하여 API를 에지 최적화에서 regional으로 업데이트하십시오.
[Bash]
aws apigateway update-rest-api \
–rest-api-id {rest-api-id} \
–patch-operations op=replace,path=/endpointConfiguration/types/EDGE,value=REGIONAL
성공적인 응답은 다음과 같습니다:
[Json]
{
“description”: “Your first API with Amazon API Gateway. This is a sample API that integrates via HTTP with your demo Pet Store endpoints”,
“createdDate”: 1511525626,
“endpointConfiguration”: {
“types”: [
“REGIONAL”
]
},
“id”: “{api-id}”,
“name”: “PetStore”
}
API 엔드포인트를 regional에 변경하고 난 후에,이제 자신의 CloudFront 배포를 이 API 에 설정할 수 있습니다.
CloudFront 배포판 만들기
작업을 쉽게하기 위해 방금 생성된 API를 가리키는 CloudFront 를 배포하고자 AWS CloudFormation 템플릿을 제공했습니다. 버튼을 클릭하여 us-east-1 지역에 서식 파일을 배포합니다.
스택 이름에 RegionalAPI를 입력하십시오. APIGWEndpoint의 경우 API FQDN을 다음 형식으로 입력하십시오.
{api-id} .execute-api.us-east-1.amazonaws.com
매개 변수를 채운 후 다음을 선택하여 스택 배치를 계속하십시오. 배포를 완료하는 데 몇 분이 소요됩니다. 작업이 끝나면 출력 탭에 다음 항목이 나열됩니다.
- CloudFront 도메인 URL
- CloudFront 액세스 로그용 S3 버킷
CloudFormation에서의 결과
CloudFront 배포 테스트
CloudFront 배포가 올바르게 구성되었는지 확인하려면 웹 브라우저를 사용하여 다음 매개 변수와 함께 배포본의 URL을 입력하십시오.
https : // {your-distribution-url} .cloudfront.net / {api-stage} / 애완 동물
다음과 같은 결과가 나옵니다.
[
{
“id”: 1,
“type”: “dog”,
“price”: 249.99
},
{
“id”: 2,
“type”: “cat”,
“price”: 124.99
},
{
“id”: 3,
“type”: “fish”,
“price”: 0.99
}
]
AWS WAF 설정 및 웹 ACL 생성
새로운 CloudFront 배포판을 통해 AWS WAF 설정을 시작하여 API를 보호 할 수 있습니다.
이 데모에서는 AWS WAF Security Automations 솔루션을 배포합니다.이 솔루션은 API에 액세스하려 요청에 대해 세밀한 제어 기능을 제공합니다.
배포에 대한 자세한 내용은 자동화된 배포를 참조하십시오. 원하는 경우 다음 버튼을 사용하여 계정에 직접 솔루션을 시작할 수 있습니다.
CloudFront 접근 로그 버켓 이름에 CloudFront 배포용 CloudFormation 스택 배포 중에 생성된 버킷 이름을 추가합니다.
이 솔루션을 사용하면 임계 값을 조정하고 API를 보호할 수있는 자동화를 선택할 수 있습니다. 이 설정을 구성한 후에는 다음을 선택하십시오.
계정에서 배포 프로세스를 시작하려면 생성 마법사를 따라 생성을 선택하십시오. 배포를 마치는 데 몇 분이 걸립니다. CloudFormation 콘솔을 통해 생성 프로세스를 수행 할 수 있습니다.
배포가 완료되면 AWS WAF 콘솔 AWSWAFSecurityAutomations에 배포 된 새 웹 ACL을 볼 수 있습니다.
AWS WAF 웹 ACL을 CloudFront 배포판에 첨부하십시오.
솔루션을 배포 한 후 이전에 생성한 CloudFront에 AWS WAF 웹 ACL을 첨부 할 수 있습니다.
새로 생성된 AWS WAF 웹 ACL을 할당하려면 CloudFront 배포로 돌아갑니다. 편집을 위해 배포본을 연 다음 일반, 편집을 선택하십시오.
앞에서 작성한 새로운 AWS WAF 웹 ACL인 AWSWAFSecurityAutomations를 선택하십시오.
변경 사항을 CloudFront 배포에 저장하고 완료 될 때까지 기다립니다.
AWS WAF 보호 테스트하기
AWS WAF Web ACL 설정의 유효성을 검사하려면 Artillery를 사용하여 API 테스트를 로드하고 AWS WAF가 실제로 작동하는지 확인하십시오.
컴퓨터에 Artillery를 설치하려면 다음 명령을 실행하십시오.
[Bash]
$ npm install –g artillery
설치가 완료되면 다음 명령을 실행하여 Artillery가 성공적으로 설치되었는지 확인할 수 있습니다.
[Bash]
$ artillery -V
$ 1.6.0-12
발간 당시 Artillery은 1.6.0-12 버전입니다.
설정한 WAF 웹 ACL 규칙 중 하나는 요율 기반 규칙입니다. 기본적으로 5 분 미만에서 2000개의 요청을 초과하는 요청자는 차단하도록 설정됩니다. 이것을 시험해보십시오.
먼저 cURL을 사용하여 배포물을 쿼리하고 API 출력을 봅니다.
[bash]
$ curl -s https://{distribution-name}.cloudfront.net/prod/pets
[
{
“id”: 1,
“type”: “dog”,
“price”: 249.99
},
{
“id”: 2,
“type”: “cat”,
“price”: 124.99
},
{
“id”: 3,
“type”: “fish”,
“price”: 0.99
}
]
위의 테스트를 바탕으로 결과는 좋아 보입니다. 하지만 5 분 안에 2000 건의 요청을 최대한 활용하면 어떨까요?
다음 Artillery 명령을 실행하십시오.
[bash]
artillery quick –n 2000 —count 10 https://{distribution–name}.cloudfront.net/prod/pets
현재 10 명의 동시 사용자로부터 API에 대한 2000 건의 요청이 발생했습니다. 간결함을 위해서 Artillery 출력을 여기에 게시하지 않을 것입니다.
Artillery이 끝나면 cURL 요청을 다시 실행하여 무슨일이 발생하는지 확인하십시오.
[bash]
$ curl -s https://{distribution-name}.cloudfront.net/prod/pets
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<HTML><HEAD><META HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=iso-8859-1″>
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size=”1px”>
Request blocked.
<BR clear=”all”>
<HR noshade size=”1px”>
<PRE>
Generated by cloudfront (CloudFront)
Request ID: [removed]
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
위의 출력에서 알 수 있듯이 요청이 AWS WAF에 의해 차단되었습니다. 귀하의 IP 주소는 요청 제한 속도 이하로 떨어지면 차단 목록에서 제거됩니다.
결론
이 부분에서는 일련의 공격으로부터 API를 보호하기 위해 Amazon CloudFront 및 AWS WAF와 함께 새로운 API 게이트웨이 지역 API 엔드포인트를 사용하는 방법을 살펴 보았습니다.
원문 URL: https://aws.amazon.com/ko/blogs/compute/protecting-your-api-using-amazon-api-gateway-and-aws-waf-part-i/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.