API 게이트웨이 엔드포인트를 보호하는 쉽고 안전한 방법
14954 단어 apisecurityserverlessaws
1. 시나리오
Bob의 최신 작업은 회사의 마이크로서비스 간의 통신 흐름을 보호하는 것입니다. REST API를 사용해야 하므로 각 서비스에는 전용API Gateway이 프로비저닝됩니다.
API는 기본적으로 공개되므로 Bob은 원치 않는 트래픽으로부터 API를 보호해야 합니다. 그는 AWS IAM을 사용하여 서비스 간 통신 요청을 승인하기로 결정합니다.
2. 솔루션
AWS IAM은 엔드포인트를 보호하는 가장 안전한 방법입니다. 정책을 사용하고 서명을 요청하여 API에 대한 액세스를 제어합니다.
단순화를 위해 Bob에게 두 개의 마이크로 서비스가 있다고 가정해 보겠습니다. 둘 다 Lambda 함수를 사용하지만 원칙은 ECS 과 같은 다른 유형의 서비스에서도 동일합니다.
그는 CDK에 인프라를 구축했습니다.
2.1. AuthorizationType 정의: API Gateway에서 AWS_IAM
샘플
GET /pets
엔드포인트를 사용하여 AWS IAM 권한 부여 워크플로를 시연하겠습니다. 이 API는 누구나 API Gateway를 사용해 볼 수 있습니다.인프라 코드의 관련 부분은 다음과 같습니다.
const petsApi = new RestApi(this, 'PetsApi', {
restApiName: 'PetsApi',
description: 'AWS IAM auth demo',
deploy: true,
endpointTypes: [EndpointType.REGIONAL],
});
const pets = petsApi.root.addResource('pets');
const getPets = pets.addMethod(
'GET',
new HttpIntegration(
'http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets'
),
{
// This is the most important thing!!
authorizationType: AuthorizationType.IAM,
}
);
Console에서 설정할 수 있는 샘플
HTTP Integration
과 동일합니다PetsApi
.authorizationType: AuthorizationType.IAM
끝점에 대해 GET /pets
를 설정해야 합니다. enum의 값은 AWS_IAM
이며 API Gateway에게 AWS IAM에 연결하고 호출 엔터티에 관련 권한이 있는지 확인하도록 지시합니다.2.2. 엔드포인트를 호출하기 위해 Lambda 실행 역할에 권한 추가
다른 서비스의 API 게이트웨이를 호출하는 Lambda 함수의 CDK 코드는 다음과 같습니다.
const allowedFn = new NodejsFunction(this, 'allowed', {
bundling: {
target: 'es2020',
keepNames: true,
logLevel: LogLevel.INFO,
sourceMap: true,
minify: true,
},
runtime: Runtime.NODEJS_16_X,
timeout: Duration.seconds(6),
memorySize: 256,
logRetention: RetentionDays.ONE_DAY,
environment: {
NODE_OPTIONS: '--enable-source-maps',
API_URL: `${petsApi.url}pets`,
},
functionName: 'AllowedFn',
});
// add permission to invoke the GET /pets endpoint
allowedFn.addToRolePolicy(
new PolicyStatement({
effect: Effect.ALLOW,
actions: ['execute-api:Invoke'],
resources: [getPets.methodArn],
})
);
적절한 권한을 설정하지 않으면
GET /pets
끝점에서 거부된 응답을 받게 됩니다. Bob은 동일한 계정에 두 서비스를 모두 배포했으므로 여기에서 Lambda 함수의 실행 역할에 권한을 추가하면 됩니다. API Gateway의 리소스 기반 정책에 관련 정책을 추가할 수도 있습니다.2.3. aws-sdk/signature-v4를 사용한 서명 요청
마지막 필수 단계는 끝점에 대한 요청에 서명하는 것입니다. 그렇게 하지 않으면 API Gateway가
403
오류와 함께 요청을 거부합니다.AWS SDK에서 사용할 수 있는
signature-v4
패키지를 사용하여 요청에 서명하는 방법을 설명합니다.Lambda 함수 핸들러에는 다음과 같은 최소 코드가 있을 수 있습니다.
import axios from 'axios';
import { SignatureV4 } from '@aws-sdk/signature-v4';
import { Sha256 } from '@aws-crypto/sha256-js';
const { API_URL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN } = process.env;
const apiUrl = new URL(API_URL);
const sigv4 = new SignatureV4({
service: 'execute-api',
region: 'us-east-1',
credentials: {
accessKeyId: AWS_ACCESS_KEY_ID,
secretAccessKey: AWS_SECRET_ACCESS_KEY,
sessionToken: AWS_SESSION_TOKEN,
},
sha256: Sha256,
});
export const handler = async () => {
const signed = await sigv4.sign({
method: 'GET',
hostname: apiUrl.host,
path: apiUrl.pathname,
protocol: apiUrl.protocol,
headers: {
'Content-Type': 'application/json',
host: apiUrl.hostname,
},
});
try {
const { data } = await axios({
...signed,
url: API_URL,
});
console.log('Successfully received data: ', data);
return data;
} catch (error) {
console.log('An error occurred', error);
throw error;
}
};
링크된 게시물에 서명 과정이 자세히 설명되어 있습니다.
3. 테스트
이제 세 가지 필수 구성 요소가 모두 있으므로 스택을 클라우드에 배포하고 아키텍처를 테스트할 수 있습니다.
Lambda 함수를 호출하면(예를 들어 입력이 빈 객체가 될 수 있는 테스트 이벤트를 생성하여) 애완 동물과 함께 성공적인 응답을 받아야 합니다.
4. 대체 솔루션
AWS_IAM
가 API에 대한 액세스를 제어하는 유일한 방법은 아닙니다. 내부 마이크로서비스 통신을 보호하기 위해 또는 Cognito ( 및 )을 사용할 수 있습니다.5. 요약
IAM은 API 게이트웨이에 대한 액세스를 제어하려는 경우 최소한의 설정으로 가장 안전한 API 보호를 제공합니다.
아키텍처는 세 가지 필수 조건을 충족해야 합니다.
먼저 권한 부여자 유형을
AWS_IAM
로 설정합니다. 둘째, 호출 서비스에 API를 호출할 수 있는 권한을 추가합니다. 셋째, 적절한 패키지로 요청에 서명하십시오.AWS_IAM
는 마이크로 서비스 간의 내부 통신을 승인하는 데 적합합니다.6. 참조, 추가 읽기
Controlling and managing access to a REST API in API Gateway - API Gateway에서 액세스를 제어하는 방법
Reference
이 문제에 관하여(API 게이트웨이 엔드포인트를 보호하는 쉽고 안전한 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/an-easy-and-secure-way-to-protect-api-gateway-endpoints-3o8c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)