cloudNet@ 팀의 가시다 님이 진행하는 AWS 보안 스터디 4주차 정리입니다.
https://wellarchitectedlabs.com/security/300_labs 내용을 참고했습니다.
✅ 목적
- API 보안은 이제 향상된 인식과 제품 기능 적용 범위로 인해 이점을 누리고 있지만 애플리케이션 리더는 비즈니스 요구 사항에 맞는 효과적인 API 보안 전략을 만들고 구현해야 합니다.
- Zero Trust : 승인된 요청만 애플리케이션의 비즈니스 계층에 액세스하도록 허용하는 전략입니다.
- 또한 아키텍처의 여러 계층에서 신뢰도를 평가하면 API 데이터가 워크로드를 통해 전송될 때 여러 검사를 수행할 수 있습니다.
✅ 사용되는 서비스
- Amazon API Gateway - Used for securing REST API.
- AWS Secrets Manager - Used to securely store secrets.
- Amazon CloudFront - Used to prevent direct access to API as well as to enforce encrypted end-to-end connections to origin.
- AWS WAF - Used to protect our API by filtering, monitoring, and blocking malicious traffic.
- Amazon Cognito - Used to enable access control for API
✅ 아키텍처
- Amazon s3 에 람다가 사용하는 boto, request 등 pip 패키지들을 업로드 해두고 사용
- Amazon API Gateway는 API가 지나가는 통로이다 말그대로 관문역할을 하는 셈이다. 공통으로 필요한 인증/인가, 사용량 제어, 요청/응답 변조 등의 다양한 기능을 플러그인 형태로 제공하고 있다.
- AWS Lamda와 연동하여 Serverless 서비스를 구축 하는데 자주 사용된다.
- Amazon CloudFront를 사용하면 서비스의 트래픽을 분산 하여 성능 향상
- 특정 지리적 위치의 요청이 처리되지 않도록 지역 차단
- 사용자 헤더값을 Secrets Manager로 부터 받아와서 강력한 보안을 적용 할수 있습니다.
- 읽기 속도가 느리거나 쓰기 속도가 느린 공격자로부터 연결을 자동으로 닫을 수 있습니다
- API Gateway 배포에 직접 액세스하지 못하도록 방지할 수 있습니다.
- Amazon Cognito는 자격 증명 또는 액세스 토큰을 얻은 다음 토큰 중 하나로 API 메서드를 호출 할 수 있습니다.
- 사용자 풀에 로그인하여 토큰을 받습니다.
- 토큰은 일반적으로 요청의 Authorization 헤더로 설정됩니다.
❖ TASK 1
배포단계
- S3 bucket 생성 및 Lamda 배포 package upload
# S3 버킷 생성
NICKNAME=koo
aws s3 mb s3://$NICKNAME-walab --region us-east-1
# Lambda deployment packages 다운로드
wget https://d3h9zoi3eqyz7s.cloudfront.net/Security/300_multilayer_api_security_with_congnito_and_waf/rds-create-table.zip
wget https://d3h9zoi3eqyz7s.cloudfront.net/Security/300_multilayer_api_security_with_congnito_and_waf/rds-query.zip
wget https://d3h9zoi3eqyz7s.cloudfront.net/Security/300_multilayer_api_security_with_congnito_and_waf/python-requests-lambda-layer.zip
# S3 버킷에 업로드
aws s3 cp rds-create-table.zip s3://$NICKNAME-walab
aws s3 cp rds-query.zip s3://$NICKNAME-walab
aws s3 cp python-requests-lambda-layer.zip s3://$NICKNAME-walab
# 확인
aws s3 ls s3://$NICKNAME-walab --human-readable --summarize
- AWS Cloudformation 템플릿 파일 다운로드 : section1-base.yaml
wget https://wellarchitectedlabs.com/Security/300_Multilayered_API_Security_with_Cognito_and_WAF/Code/templates/section1/section1-base.yaml
- IAM resource 생성 허용
- 배포 후 output에서 Cloud9Url 클릭후 테스트 환경 진입
#
aws sts get-caller-identity
aws s3 ls
# 버전 확인
python3 -V
pip3 --version
#
cd walab-scripts
cat install_package.sh
bash install_package.sh
pip3 list
❖ TASK 2
배포단계
- 다운로드 : section3-enhance_security.yaml
wget https://wellarchitectedlabs.com/Security/300_Multilayered_API_Security_with_Cognito_and_WAF/Code/templates/section3/section3-enhance_security.yaml
- AWS CloudFormation Stack 배포 : Name(walab-cdn-waf-cognito), APIGatewayURL과 S3버킷명 기입 → 4분
- 배포 확인
- CloudFront(WAF, Origin-API_GW)
- WAF(2개, 1개는 API GW에 연동)
- Secret Manager(OriginVerifyHeader + 자동 교체 Lambda)
❖ TASK 3
CloudFront 사용자 지정 헤더 설정
- Cloudformation - output- OriginVerifyHeader 값을 클릭하면 다음과 같이 AWS Secrets Manager로 진입
- AWS Secrets Manager에서 OriginVerifyHeader 비밀을 클릭하여 X-Origin-Verify 헤더 값을 가져오기
- 비밀값 - 복사 : 이 값을 CloudFront의 오리진 헤더 값 으로 사용하겠습니다
- 이제 Secrets Manager는 이 헤더 값을 자동으로 교체하여 향후 손상 가능성을 방지.
- CloudFront → 원본 (편집) : 사용자 정의 헤더 추가 : X-Origin-Verify , 값은 위 Secret Manager값 붙여넣기 ⇒ 변경 사항 저장
- 최종 확인 : CF Output에 CloudFrontEndpoint 클릭해서 접속 확인, APIGatewayURL도 다시 접속 확인
- CloudFront: 허용 , APIGateway : Deny
❖ TASK 4
SQL 주입, 분산 서비스 거부(DDoS)
- CloudFormation output에서 CloudFront에 연결된 WAF에 Rules을 추가함
- Rule 탭을 누르고 Add rules 선택
- AWS Managed rule groups 을 펼치고 SQL database 룰을 클릭
- Save 버튼 클릭
- 확인
- Cloud9 접속 후 sendRequest 쿼리를 통해 확인 (Response code: 403)
❖ TASK 5
AWS Cognito
✅ Amazon Cognito : 식별된 사용자만 API에 액세스 허용
✅ 사용자는 우리가 생성한 사용자 풀에 로그인하고 토큰을 얻은 다음 토큰 중 하나로 API 메서드를 호출할 수 있습니다.
✅ 토큰은 일반적으로 요청의 Authorization 헤더로 설정됩니다.
- cloudformation 에서 client ID , userpool ID 메모
- API GW → wa-lab-rds-api 선택 : 리소스 → 메서드 요청 정보 확인 : 권한 부여 NONE
- 왼쪽 메뉴 ‘권한 부여자’ → ‘권한 부여자 생성’ : 이름(walab-authorizer), 유형(cognito), Cognito 사용자 풀, 토큰 소스(Authorization)
- 리소스 → GET → 메서드 요청 편집 : (새창) 권한 부여(walab-authorizer) → 저장
- 상단 API 배포 → 스테이지(Dev), 설명(WA Lab) ⇒ 배포
- 배포 완료 후 리소스에서 GET 하단에 권한 부여 부분 확인
❖ TASK 6
CloudFront header
- 기본적으로 CloudFront는 엣지 로케이션에서 객체를 캐싱할 때 헤더를 고려하지 않습니다.
- 이제 API에 액세스하려면 요청에 유효한 ID 토큰이 있는 Authorization 헤더가 있어야 합니다.
- 따라서 헤더를 API 게이트웨이로 전달하도록 CloudFront를 구성합니다
- CloudFront → 무효화 : /*
- Cognito 사용자 Sign up : CF output에 CognitoSignupURL 클릭 → 아래 Sign up 클릭 ⇒ 기입한 이메일로 확인
- Cloud9 에서 먼저 그냥 요청 시도
- # CloudFrontEndpoint 시도 CloudFrontEndpoint='https://d3ua9kogvj5qwi.cloudfront.net/?id=1' python sendRequest.py $CloudFrontEndpoint
- 사용자 이름과 비밀번호, Cognito 사용자 풀 ID, 앱 클라이언트 ID 및 앱 비밀번호를 사용하여 ID 토큰을 생성해 보겠습니다.
- Cognito에 가입할 때 앱 클라이언트 비밀번호를 기록해 두었습니다 . 사용자 풀 ID, 앱 클라이언트 ID 등 기타 필수 값은 현재 cloudformation 스택의 출력 섹션 에서 확인할 수 있습니다.
- app_client_secret 확인 : Cognito → 선택 → 앱 통합 : 하단 ‘앱 클라이언트 이름’ 선택
- 클라이언트 보안키 표시 클릭 후 아래 출력 내용 복사 후 사용
- ID 토큰 생성
# ID 토큰 생성
# python getIDtoken.py <username> <user_password> <user_pool_id> <app_client_id> <app_client_secret>
python getIDtoken.py gasida.seo@gmail.com 'P@ssw0rd' us-east-1_Vllj1OLBs 2crjkv50dm3j9d08r4vj3p90u8 1nl44osm5q6rom9ivcfj3jee1aed5nn9nfbig716i9n8lq0n5j05
Getting your ID token that will be expired in 60 minutes...
Current time: 16/09/2023 20:20:19
/usr/local/lib/python3.6/site-packages/boto3/compat.py:88: PythonDeprecationWarning: Boto3 will no longer support Python 3.6 starting May 30, 2022. To continue receiving service updates, bug fixes, and security updates please upgrade to Python 3.7 or later. More information can be found here: https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/
warnings.warn(warning, PythonDeprecationWarning)
ID token: eyJraWQiOiJiQU9pYUZlalhrbVdaSkhNakxCNFRKRTA2TURjQlpGTXBua3RQQXRmUEVrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJmNGMxNGYxZS0xZjdjLTRhNDMtOTkxYi00MGYyOWQ1YzNlYWEiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfU0NLYmRlUzhjIiwiY29nbml0bzp1c2VybmFtZSI6ImY0YzE0ZjFlLTFmN2MtNGE0My05OTFiLTQwZjI5ZDVjM2VhYSIsIm9yaWdpbl9qdGkiOiIxNDAwMmJkYS04ZGZiLTQ5YWItOGYxYi05OWY5NGVmYjQ2ZGIiLCJhdWQiOiI3ZDJpZXRvbjBrZHB1aDU3ZjZ0bDR2YXMzcyIsImV2ZW50X2lkIjoiODczMDM1M2UtNzY5ZS00ZjJjLTllMjAtZmJiZDM3NTczNzRkIiwidG9rZW5fdXNlIjoiaWQiLCJhdXRoX3RpbWUiOjE2OTQ4OTU2MjAsImV4cCI6MTY5NDg5OTIyMCwiaWF0IjoxNjk0ODk1NjIwLCJqdGkiOiI1NGI3N2ZlOS0yMmFlLTRmNjItODZlNS0xNzdhYmE1ZDhhZDciLCJlbWFpbCI6Imdhc2lkYS5zZW9AZ21haWwuY29tIn0.nCFXfenBj87kIw4YyuqNP3iOj0tQhPY5F732lw57lcw7kOdp03DJw8KQvflAlWehXWaM5LlLs8a5R3RuTXyUMZBv_Gr8jlXGfBt5sIXPLinugNUNg3M9gArpN49S77nJXJzOwCU2AAnD-hQlDgLLsNqQVcqIwPGo2gkVWtQfVPhlwj5cWV0VPXMb70jeRSVvZ4cprC547E6kQkQpVKAO3wwC5SwAeqzZqEWTAD9objNJ2UqKKtmoTkUCiTnYG3atKIzJv42enQiUasfNvbN0l3Y79MkaRQxAX8xYRICtDxfprVYrnG16jhaUa2HOIHlZQk22QanbzfB7fPmTideu3w
IDT='eyJraWQiOiJiQU9pYUZlalhrbVdaSkhNakxCNFRKRTA2TURjQlpGTXBua3RQQXRmUEVrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJmNGMxNGYxZS0xZjdjLTRhNDMtOTkxYi00MGYyOWQ1YzNlYWEiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfU0NLYmRlUzhjIiwiY29nbml0bzp1c2VybmFtZSI6ImY0YzE0ZjFlLTFmN2MtNGE0My05OTFiLTQwZjI5ZDVjM2VhYSIsIm9yaWdpbl9qdGkiOiIxNDAwMmJkYS04ZGZiLTQ5YWItOGYxYi05OWY5NGVmYjQ2ZGIiLCJhdWQiOiI3ZDJpZXRvbjBrZHB1aDU3ZjZ0bDR2YXMzcyIsImV2ZW50X2lkIjoiODczMDM1M2UtNzY5ZS00ZjJjLTllMjAtZmJiZDM3NTczNzRkIiwidG9rZW5fdXNlIjoiaWQiLCJhdXRoX3RpbWUiOjE2OTQ4OTU2MjAsImV4cCI6MTY5NDg5OTIyMCwiaWF0IjoxNjk0ODk1NjIwLCJqdGkiOiI1NGI3N2ZlOS0yMmFlLTRmNjItODZlNS0xNzdhYmE1ZDhhZDciLCJlbWFpbCI6Imdhc2lkYS5zZW9AZ21haWwuY29tIn0.nCFXfenBj87kIw4YyuqNP3iOj0tQhPY5F732lw57lcw7kOdp03DJw8KQvflAlWehXWaM5LlLs8a5R3RuTXyUMZBv_Gr8jlXGfBt5sIXPLinugNUNg3M9gArpN49S77nJXJzOwCU2AAnD-hQlDgLLsNqQVcqIwPGo2gkVWtQfVPhlwj5cWV0VPXMb70jeRSVvZ4cprC547E6kQkQpVKAO3wwC5SwAeqzZqEWTAD9objNJ2UqKKtmoTkUCiTnYG3atKIzJv42enQiUasfNvbN0l3Y79MkaRQxAX8xYRICtDxfprVYrnG16jhaUa2HOIHlZQk22QanbzfB7fPmTideu3w'
- 위에서 생성한 ID 토큰으로 요청 보내서 확인 → CloudFront를 통해서 API에 액세스하려면 ID 토큰을 Authorization 헤더로 제공해야 합니다.
python sendRequest.py $CloudFrontEndpoint $IDT
'DevOps > AWS' 카테고리의 다른 글
[AWS] 네트워크 인터페이스 VMware와 비교 실습 (2) | 2023.12.02 |
---|---|
[AWS] AWS System Manager을 통한 보안 강화 (0) | 2023.09.19 |
[AHSS 3주차] AWS WAF 사용법 (0) | 2023.09.14 |
[AHSS 3주차] 웹 취약점 및 보안 (0) | 2023.09.11 |
[AWS] IAM 정책 (자격증명 기반 정책, 리소스 기반 정책) (0) | 2023.09.09 |