BLOG
제가 함께 일하고 있는 고객들 중 일부는 각 애플리케이션에 대해 완벽한 분리를 원합니다. AWS에서 실행되는 두 개의 응용 프로그램이 API를 사용하여 통신하거나 서로의 AWS 리소스와 네트워크로 연결되는 것을 원하지 않습니다. 즉, 수영경기에서 수영 선수들이 하는 것처럼 각 애플리케이션들은 “자체 라인을 유지”하기를 원합니다. 이 글에서는 AWS 리소스 IAM 역할에 대한 AWS ID 및 액세스 관리 (IAM) 정책을 동적으로 업데이트하는 방법을 설명합니다. 예를 들어, Amazon EC2 인스턴스가 셀프 서비스 기능을 통해 특정 애플리케이션에 대해 Amazon S3 버킷과 통신 할 수 있도록 AWS 리소스 간의 AWS API 액세스를 허용합니다. 개발자는 AWS 리소스간에 API 액세스 권한을 얻기 위해 더 이상 티켓을 열지 않아도 됩니다.
이 글에서는 AWS Service Catalog와 AWS CloudFormation에서 AWS Lambda가 지원하는 Custom Resource를 사용하여 이를 수행하는 방법을 설명합니다. 그러나 유스 케이스와 그 과제에 대해 논의하기 전에 AWS Service Catalog의 기본 사항에 대해 다룰 것입니다. AWS Service Catalog를 사용하여 미리 정의되고 제한된 제품의 전용 세트를 포함하는 포트폴리오를 뜻합니다. 제품은 AWS CloudFormation 템플릿의 버전이 있는 컨테이너입니다. 포트폴리오는 각 애플리케이션 팀에 공개되며 제품과 관련됩니다. 응용 프로그램 개발자는 필요에 따라 제품을 반복적으로 프로비저닝하면서 최소한의 권한 집합을 부여 받습니다.
이제 유스 케이스로 돌아가 봅시다. 애플리케이션 개발자가 AWS Service Catalog 제품을 시작하여 애플리케이션 인프라를 생성하면 개발자 (및 개발 프로세스)가 셀프 서비스 이점을 누리는 동안 AWS 리소스에 대한 향상된 관리 기능을 활용할 수 있습니다. 그러나 다음 예제와 같이 AWS 리소스가 서로 다른 제품으로 독립적으로 생성되는 경우 시나리오에 따라 제공되는 AWS 리소스간에 AWS API 액세스를 설정하는 것이 까다로울 수 있습니다.
개발자가 AWS Service Catalog를 사용하여 인프라를 생성 할 때 프로비저닝 프로세스 및 개발자 경험을 따르십시오.
- 개발자가 “EC2 인스턴스” 제품을 실행합니다.
- 개발자가 “S3 Bucket” 제품을 실행합니다.
- 개발자는 SSH를 사용하여 EC2 인스턴스에 연결합니다.
- 개발자는 EC2 인스턴스에서 S3 버킷으로 파일을 복사하지만 복사 요청은 거부됩니다.
AWS Service Catalog 제품을 시작하는 것 이외의 AWS API 액세스 권한이 없는 개발자는 IT 팀이 Amazon EC2 인스턴스에 Amazon S3 버킷에 액세스하도록 허용하라는 서비스 요청을 열어야 합니다. IT 팀은 프로비저닝된 EC2 인스턴스가 Amazon S3 버킷에 액세스 할 수 있도록 “EC2 인스턴스” 제품을 수정하여 문제를 해결합니다.
이 예제에서는 두 가지 문제를 소개합니다.
- 셀프 서비스의 중단 – 개발자는 AWS API 액세스 문제를 해결하기 위해 IT 팀을 필요로 합니다. 이렇게 하면 가치 흐름에 과도한 단계가 추가되고 비즈니스 가치가 낮아지고 시장 출시 시간이 늘어납니다.
- 최소 권한 원칙이 깨짐 – 수정된 후에는 프로비저닝된 각 EC2 인스턴스에 응용 프로그램의 모든 Amazon S3 버킷에 대한 AWS API 액세스 권한이 부여됩니다.
이러한 문제를 해결하기 위해 하나의 애플리케이션 팀 (하나의 포트폴리오)에서 생성된 모든 AWS 리소스는 서로 다른 AWS API에 대해 “즉각적인” 액세스를 허용해야 하지만 다른 AWS 리소스에 대한 AWS API 액세스는 금지됩니다. 이제부터는 이 개념을 보안 파티션이라고 부릅니다.
다음 저희는 기술적 상세내용에 대해 들어갑니다. 저는 이런 보안 파티션을 어떻게 AWS Service Catalog 환경에서 실행할지에 대해 보여드리겠습니다.
솔루션
다음 다이아그램은 솔루션 아키텍쳐를 보여줍니다.
다이어그램을 왼쪽에서 오른쪽으로 순차적으로 따라가 봅시다.
- 개발자가 AWS Service Catalog 제품을 시작합니다.
- AWS CloudFormation 스택이 생성됩니다.
- AWS 리소스가 프로비저닝됩니다.
- AWS CloudFormation은 AWS Lambda 함수 (CloudFormation 사용자 정의 자원 사용)를 트리거합니다.
- Lambda 함수는 프로비저닝된 (또는 삭제 된) 모든 리소스의 목록을 끝맺고 다음을 수행합니다.
- 리소스를 포함 (또는 제외)하기 위해 보안 파티션 IAM 정책을 업데이트합니다.
- 역할을 맡을 수 있는 리소스에 보안 파티션 IAM 역할을 연결합니다.
보안 파티션 내의 리소스 간 AWS API 액세스를 관리하기 위해 보안 파티션에는 3 개의 전용 컨트롤이 있습니다.
- 보안 파티션 IAM 정책 – 특정 리소스 목록에 대해 허용되거나 거부된 AWS API 호출을 포함하는 IAM 고객 관리 정책 문서입니다. 리소스는 AWS Service Catalog 제품의 시작, 업데이트 및 종료를 기반으로 이 문서에서 동적으로 추가 및 제거됩니다.
- 보안 파티션 IAM 역할 – 리소스 (예 : EC2 인스턴스, Lambda 함수)는 이 역할이 보안 파티션의 다른 리소스에 액세스 할 수 있다고 가정합니다. 이 역할은 보안 파티션 IAM 정책을 사용합니다.
- 포트폴리오 ID – 보안 파티션의 식별자 역할을 합니다. Lambda 함수는 이 식별자를 사용하여 리소스를 올바른 보안 파티션 IAM 정책 및 역할과 연결합니다.
다음 그림에서는 이러한 컨트롤이 실제로 작동하는 것을 볼 수 있습니다.
- 각 애플리케이션 팀은 그림의 왼쪽에 있는 것과 같은 전용 AWS Service Catalog 포트폴리오를 보유합니다.
- 응용 프로그램 개발자는 전용 포트폴리오에서 리소스 그룹을 제공합니다.
- “포트폴리오 ID”태그는 리소스 그룹을 식별합니다.
- 새 S3 버킷이 준비되고 S3_08이라는 이름이 지정됩니다.
- 새로운 S3 버킷 Amazon Resource Name이 보안 파티션 IAM 정책 설명문 DedicatedForResourcesS3에 추가됩니다.
- 이 보안 파티션 IAM 정책은 이미 EC2_04의 IAM 인스턴스 프로필 역할과 연결되어 있습니다.
- 인스턴스 EC2_04는 S3_08 버킷에 대한 모든 액세스 권한을 가집니다.
배포
1 단계 : 솔루션 배포
- aws-service-catalog-portfolio-partition 아래의 GitHub에서 솔루션 패키지를 찾으십시오.
- 저장소를 로컬 장치에 다운로드하거나 복제하십시오.
- Lambda 함수 코드 (자세한 내용은 Lambda 패키지 만들기 참조)를 패키지화하고 결과 zip 파일을 S3 버킷에 업로드하십시오.
[Bash]
cd aws-service-catalog-portfolio-partition/code/
zip -r ../code.zip .
aws s3 cp ../code.zip s3://<Bucket Name>/
- template.yml 템플릿을 사용하여 CloudFormation 스택을 만듭니다. 스택을 생성할 때 Amazon S3 버킷 이름과 Lambda 패키지의 S3 키 이름을 제공하십시오. 또는 콘솔을 사용하여 스택을 직접 생성하십시오.
cd aws-service-catalog-portfolio-partition/deployment/
aws cloudformation create-stack –stack-name sc-security-partition –template-body file://template.yml –parameters ParameterKey=LambdaCodeS3Bucket,ParameterValue=<BucketName> ParameterKey=LambdaCodeS3Key,ParameterValue=<KeyName> –capabilities CAPABILITY_IAM
- 이 템플릿은 두 개의 Lambda 함수와 Amazon DynamoDB 테이블을 제공합니다. 사용자 정의 자원을 백업하는 Lambda 함수의 Amazon Resource Name (ARN)은 PartitionPhaseAFunctionArn 이름으로 내보내집니다. SetSecurityPartition 사용자 정의 리소스에서 사용됩니다.
—
Outputs:
PartitionPhaseAFunctionArn:
Description: Lambda function to serve the custom resource of portfolio as security partition
Export:
Name: PartitionPhaseAFunctionArn
2 단계 : 온보드 포트폴리오 및 제품
새로 생성된 포트폴리오에 보안 파티션을 적용하려면 SetSecurityPartition 사용자 지정 리소스를 포함하도록 제품을 수정해야합니다. 포트폴리오와 관련된 각 제품에 대해 사용자 정의 리소스를 다음 형식으로 포함하도록 CloudFormation 템플릿을 수정해야 합니다.
SetSecurityPartition:
Type: Custom::SetSecurityPartition
DependsOn: <List of all the Logical Resources Names provisioned in this template>
Properties:
ServiceToken: !ImportValue PartitionPhaseAFunctionArn
3 단계 : 보안 파티션 사용자 지정
최소 권리 원칙을 따라야 하는 리소스 유형별로 허용되는 행동 방침에 대한 제한된 세트를 지정할 수 있습니다. 이를 진행하려면 구성파일 aws-service-catalog-portfolio- partition/code/configuration/resource_types_actions_allowed.json을 오픈하세요.
예를 들어,
[json]
{
“AWS::EC2::Instance”: [“ec2:StartInstance”],
“AWS::Lambda::Function”: [“lambda:UpdateFunctionCode”]
}
나열되지 않은 리소스 유형의 경우, 기본값은 모든 조치를 허용하는 “*”입니다. 구성 변경을 적용하려면 Lambda 함수 코드를 다시 패키지하고 배포된 Lambda 함수 코드를 해당 패키지로 업데이트 해야 합니다.
4 단계 : 지원되는 자원 유형
IAM의 경우 서로 다른 AWS 리소스 유형이 서로 다른 동작을 할 수 있으므로 특정 구현이 서로 다른 리소스 유형에 적용됩니다. 보안 파티션 패키지는 지원되는 리소스 유형의 허용 목록을 유지 관리합니다. 또한 지원 되려면 각 자원 유형이 resources / base.py 인터페이스를 구현해야 합니다. 자세한 지침은 GitHub 저장소 문서에서 찾을 수 있습니다.
새로운 리소스 유형을 허용 목록에 추가하고 그에 따라 새 개체를 구현 한 후에는 더 필요한 작업을 수행 할 수 있도록 Lambda 함수 실행 역할을 업데이트해야합니다. 필요한 추가 작업을 완료하려면 새 객체 코드에서 사용되는 AWS API 호출을 나열하십시오. 현재, 몇 가지 리소스 유형만을 지원합니다.
[json]
“AWS::EC2::Instance”,
“AWS::Lambda::Function”,
“AWS::DynamoDB::Table”,
“AWS::S3::Bucket”
결론
이 글에서는 AWS Service Catalog 포트폴리오의 내용에서 프로비저닝되는 리소스를 중심으로 보안 파티션을 유지하는 개념을 설명했습니다. 솔루션 배포 및 사용 방법을 안내했습니다.
이 솔루션을 조직에 적용하면 셀프 서비스 문화를 유지하면서 보안을 강화할 수 있으며, 결국 개발자의 업무에서 비즈니스 가치를 높이고 회사의 시장 출시 시간을 단축할 수 있습니다.
원문 URL: https://aws.amazon.com/ko/blogs/mt/create-a-security-partition-for-your-applications-using-aws-service-catalog-and-aws-lambda/
** 메가존클라우드 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.