brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Sep 25. 2023

37탄-9. AWS 보안 아키텍처 labs : 200

<1>  AUTOMATED DEPLOYMENT OF DETECTIVE CONTROLS =   CloudTrail + Config + GuardDuty + Security Hub  


<2>  AUTOMATED DEPLOYMENT OF EC2 WEB APPLICATION = EC2(워드프레스) 웹 서비스 + 기본 환경 배포


<3>   AUTOMATED DEPLOYMENT OF VPC = CloudFormation 으로 VPC 기본 환경 배포  


<4> [실습] Level 200: Automated IAM User Cleanup = 미사용 IAM User 와 IAM Role, 액세스 키 중지 혹은 삭제


<5>  Level 200: AWS Certificate Manager Request Public Certificate : AWS 퍼블릭 인증서 요청  


<6> [실습] Level 200: Remote Configuration, Installation, and Viewing of CloudWatch logs = 원격 설정 내용 로그 보기      


<7> 삭제





<1>  AUTOMATED DEPLOYMENT OF DETECTIVE CONTROLS =   CloudTrail + Config + GuardDuty + Security Hub   


 탐지 제어를 구성 ⇒ 공격 실습 시 활용

 https://wellarchitectedlabs.com/security/200_labs/200_automated_deployment_of_detective_controls/    




<2>  AUTOMATED DEPLOYMENT OF EC2 WEB APPLICATION = EC2(워드프레스) 웹 서비스 + 기본 환경 배포


https://wellarchitectedlabs.com/security/200_labs/200_automated_deployment_of_ec2_web_application/   




<3>   AUTOMATED DEPLOYMENT OF VPC = CloudFormation 으로 VPC 기본 환경 배포  


 https://wellarchitectedlabs.com/security/200_labs/200_automated_deployment_of_vpc/     



<4> [실습] Level 200: Automated IAM User Cleanup = 미사용 IAM User 와 IAM Role, 액세스 키 중지 혹은 삭제


1

https://wellarchitectedlabs.com/security/200_labs/200_automated_iam_user_cleanup/  


2

테스트 용도로만 사용하기 바란다.

서비스 계정에는 사용하지 않기 바란다.


3

[CloudShell 권장 or 자신의 PC(aws sam 설치 필요)] DEPLOYING IAM LAMBDA CLEANUP WITH AWS SAM  


4

# 파일 다운로드

wget https://wellarchitectedlabs.com/Security/200_Automated_IAM_User_Cleanup/Code/cloudformation-iam-user-cleanup.yaml

wget https://wellarchitectedlabs.com/Security/200_Automated_IAM_User_Cleanup/Code/lambda-iam-user-cleanup.py 



# S3 버킷 생성


#aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2

NICKNAME=<각자 자신의 유일한 닉네임>

NICKNAME=topasvga

aws s3 mb s3://$NICKNAME-ahss-4w --region ap-northeast-2

aws s3 ls


# Run the following command to prepare your deployment package

aws cloudformation package --template-file cloudformation-iam-user-cleanup.yaml --output-template-file output-template.yaml --s3-bucket $NICKNAME-ahss-4w

aws s3 ls s3://$NICKNAME-ahss-4w --human-readable  


# Once you have finished preparing the package you can deploy the CloudFormation with AWS SAM:

MYEMAIL='<각자 자신의 이메일>'

MYEMAIL='topasvga@naver.com'


aws cloudformation deploy --template-file output-template.yaml --stack-name IAM-User-Cleanup --capabilities CAPABILITY_IAM --parameter-overrides NotificationEmail=$MYEMAIL  

자신의 이메일 = 활동 리포트를 받을 email 이 필요하다.!  


5

메일 수신 확인

IAM-User-Cleanup  확인  


6

AWS CloudFormation 스택 배포 확인 → 생성된 Lambda 클릭해서 이동

출력에 람다 부분 확인


7

Lambda : EventBridge(CW Events) 확인, 코드 내용 확인

→ 테스트 : 더미 이벤트 실행 한번 한다.  


8

참고 : lambda-iam-user-cleanup.py 코드 내용


9

이 메일로  계정 변경사항  확인하자.


10

파라미터 확인

MinAgeKeysToDisable 0

0은 활성화 하지 않는것이다.

1로 하면 1일 사용하지 않으면, 중지하거나 삭제해버린다.  참고로만 알기 바란다.

실제 적용시 장애날수도 있다.  


11

Cloudwatch 이벤트 내용 확인하기

분석2 : 수동 실행 이외 트리거 확인 → EventBridge 클릭 후 규칙 편집 확인

일정 정의 부분 확인하자.

1달에 1번

12시에 동작한다.


12

참고

크론텝 주기 확인

https://crontab.guru/  



13

Lambda 가 실행을 할 수 있는 권한은 어디? → IAM Role 확인 하면 된다.  



14

삭제

aws cloudformation delete-stack --stack-name IAM-User-Cleanup

aws s3 rm s3://$NICKNAME-ahss-4w --recursive

aws s3 rb s3://$NICKNAME-ahss-4w   




<5>  Level 200: AWS Certificate Manager Request Public Certificate : AWS 퍼블릭 인증서 요청



https://wellarchitectedlabs.com/security/200_labs/200_certificate_manager_request_public_certificate/     





<6> [실습] Level 200: Remote Configuration, Installation, and Viewing of CloudWatch logs = 원격 설정 내용 로그 보기



1

실습 환경 배포 시간이 소요되니, 미리 배포해둘 것  (10분 걸린다.)

https://wellarchitectedlabs.com/security/200_labs/200_remote_configuration_installation_and_viewing_cloudwatch_logs/  



2

동작 ?

Cloudwatch agent설치  ec2가 cloudwatch log 그룹에 쓴다.

장기저장을 위해 s3에 저장

분석은 아테나 쿼리로 분석

퀵사이트를 통해 가시화 대시보드 만든다.  



3

보안관련 로그를 s3에 모아서 분석을 하는 부분이다.

Ec2 인스턴스는 ssh로 접속하지 않는다.  시스템 매니저(SSM) 세션 매니저로 접근한다.

기본 세팅은 시스템 매니저 run command로 한다.    



4

콘솔로 작업

CloudFormation 템플릿 파일 다운로드 : security-lab-stack.yaml

https://wellarchitectedlabs.com/security/200_labs/200_remote_configuration_installation_and_viewing_cloudwatch_logs/1_deploy_cfn_stack/   

wget https://wellarchitectedlabs.com/Security/200_Remote_Configuration_Installation_and_Viewing_CloudWatch_Logs/code/security-lab-stack.yaml   



5

- 스택 이름 : **remotelogs**

- BucketName : ‘*각자 자신의 신규 버킷명*’ ← 기존에 없던 이름, 배포 시 **해당 버킷이 신규로 생성됨**

- DisplayName : ‘*각자 자신의 닉네임*’ ← 웹 페이지에 출력되는 내용 , topasvga  



6

배포 완료 확인 : EC2 웹사이트 접속 확인

Cloudformation에 출력 가서 확인한다.  



7

배포된 EC2 접속 확인 : ‘시작 시 할당된 키 페어’ , 보안 그룹(인바운드, 아웃바운드)

80만 허용 되어 있다.  키페어도 없다.


SSH 접속이 될까요?

어떤 방법으로 접속 할 수 있나요?

해당 ec2 > 오른키 > ‘연결 → ‘Session Manager’ : 어떤 원리로 가능한지?

Ec2에서 인바운드는 막혀 있으나, 아웃 바인트가 열려 있다.  그래서 통신이 된다.


참고 자료

https://gasidaseo.notion.site/LabGuide-AWS-Systems-Manager-Session-Manager-bf6bac3002044daf8a2b3d5487a2faeb  

Whoami

Ssm-user로 나온다.

Id

Sudo   



8

Cloudshell 에서 접속도 가능하다.

(옵션) CloudShell 에서 CLI 에서 접속, 자신의 PC에서 사용 시 SessionManagerPlugin 설치 필요


# aws ssm start-session --target <각자 자신의 인스턴스 ID>

[cloudshell-user@ip-10-4-56-85 ~]$ aws ssm start-session --target i-0f7c75cd39b6fe44a

Starting session with SessionId: admin-096a7df573bf3f166


sh-4.2$ whoami

sh-4.2$ sudo systemctl stop sshd

sh-4.2$ sudo systemctl start sshd

sh-4.2$ exit


서버 접속은  Tcp 443 으로 접속해 사용하는것이다.  = 세션 매니저 사용중이다.

Ssh를 쓰는것이 아니다.  



9

Ec2 에  cloudwatch agent 설치하기.

cloudwatch agent를  시스템 매니저의 run command로 설치해보자.


INSTALL THE CLOUDWATCH AGENT - 링크 

https://wellarchitectedlabs.com/security/200_labs/200_remote_configuration_installation_and_viewing_cloudwatch_logs/2_install_cw_agent/  


시스템 매니저 > run command (명령실행)

문서이름 접두어 > equal =

AWS-ConfigureAWSPackage.


원격에서 시스템 매니저 패키지를 설치할수 있는것이다.  



10

Under Command parameters:

Set Action to Install

Set Installation Type to Uninstall and Reinstall

In the Name field, enter AmazonCloudWatchAgent

In the Version field, enter latest

Do not modify the Additional Arguments field  



11

여기서는 수동으로 설치한다.

다량의 서버들을 설치할 경우 tag로 해서 설치할수 있다.



12

Under Output Options, deselect Enable writing to an S3 bucket

출력 옵션을 s3버킷에 쓰지 않아도 된다.  



13

실행

시간이 지나면 설치된다.  



14

Cli 로 설치 가능하다.

설치하는법 ?

인스턴트 id 만 변경하여 실행


aws ssm send-command --document-name "AWS-ConfigureAWSPackage" --document-version "1" --targets '[{"Key":"InstanceIds","Values":["i-0f7c75cd39b6fe44a"]}]' --parameters '{"action":["Install"],"installationType":["Uninstall and reinstall"],"version":["latest"],"additionalArguments":["{}"],"name":["AmazonCloudWatchAgent"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-2     



15

STORE THE CLOUDWATCH CONFIG FILE IN PARAMETER STORE - 링크 


설정을 변경해보자.

파라미터 스토어를 이용해 사용한다.

설정내용을 관리형 서비스에 저장후  불러와서 사용하는 것이다.


STORE THE CLOUDWATCH CONFIG FILE IN PARAMETER STORE - 링크   

Parameter Store를 사용하면 재사용을 위해 구성 데이터와 암호를 안전하게 저장 및 재사용 가능


목표 : Systems Manager의 도구인 Parameter Store를 사용하여 CloudWatch 에이전트 구성을 저장  

CloudWatch 에이전트 구성 데이터는 CloudWatch로 전송될 로그 및 지표와 이 데이터의 소스를 지정

ystem Manager → Parameter Store 메뉴 이동 - 링크 → 파라미터 생성 클릭 ⇒ 아래 입력 후 하단 파라미터 생성 클릭  



16    

Name(이름) :      AmazonCloudWatch-securitylab-cw-config


AmazonCloudWatch`` 로       되어 있어야만, CW에서 유효한 구성 파일로 인식


계층(표준), 유형(문자열), 데이터      형식(text)


값 : config.json 파일 내용 : 이 구성 파일은 수집할      측정항목과 로그를      지정합니다.


Name(이름) :      AmazonCloudWatch-securitylab-cw-config


AmazonCloudWatch`` 로       되어 있어야만, CW에서 유효한 구성 파일로 인식


계층(표준), 유형(문자열), 데이터      형식(text)


값 : config.json 파일 내용 : 이 구성 파일은 수집할      측정항목과 로그를      지정합니다.


https://wellarchitectedlabs.com/Security/200_Remote_Configuration_Installation_and_Viewing_CloudWatch_Logs/code/config.json



17

내용은?


60초마다 매트릭을 수집한다.

로그와 메트릭을 수집한다.

어느 파일 위치의 로그를 수집한다.  = Var/log/www/access_log 파일을 수집한다.= access-log  수집이다.  



18

Cloudwacth agent를 실행한다.


세션 매니저의 Run command로 위에서 설정한 내용을 불러온다.

START THE CLOUDWATCH AGENT - 링크 



목표 : 로그 수집을 시작하기 위해, 구성 파일을 로드하고 CloudWatch 에이전트를 다시 시작하자 ← Run Command


System Manager → Run Command 메뉴 이동 - 링크 ⇒ 명령 실행 Run command 클릭

문서 이름 접두사 (같음) 선택 후 ‘AmazonCloudWatch-ManageAgent’ 입력 후 나오는 명령 선택 : 원격에서 EC2에 CW Agent에 명령 보냄

대상 : 수동으로 인스턴스 선택(배포된 EC2) → S3 버킷에 쓰기 활성화(Uncheck) ⇒ 맨 하단 실행

대상 및 출력에서 인스턴스 선택(배포된 EC2) 후 ‘출력 보기’ 선택 → 성공 확인  



19

파라미터 config 내용으로 적용하는 것이다.



20

해당 ec2에서 확인


sh-4.2$ sudo systemctl status amazon-cloudwatch-agent


amazon-cloudwatch-agent.service - Amazon CloudWatch Agent

   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)

   Active: active (running) since Sat 2023-09-16 15:16:42 UTC; 1min 47s ago

 Main PID: 4060 (amazon-cloudwat)

   CGroup: /system.slice/amazon-cloudwatch-agent.service

           └─4060 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -otelconfig /opt/aws/amazon-clo...

Sep 16 15:16:42 ip-10-0-0-237.ap-northeast-2.compute.internal systemd[1]: Started Amazon CloudWatch Agent.

Sep 16 15:16:42 ip-10-0-0-237.ap-northeast-2.compute.internal start-amazon-cloudwatch-agent[4060]: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it.

Sep 16 15:16:42 ip-10-0-0-237.ap-northeast-2.compute.internal start-amazon-cloudwatch-agent[4060]: I! Detecting run_as_user...

sh-4.2$ cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml  

//  컨피그가 amazon-cloudwatch-agent.tom  파라미터 스토어에 설정된 파일로 실행된다.

 -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.tom   



21

ENERATE LOGS - 링크     

자신의 웹 사이트에 방문하여 웹 액세스      로그 생성

사이트 접속하자!!!


: 자신의 PC, CloudShell

반복 접속 및 /example 등 없는      URL도 접속 시도 해보기


while true; do curl -s <EC2 IP> ; sleep 5; date; done    




22

로그 확인하자!!!


VIEW YOUR CLOUDWATCH LOGS - 링크 



CW → 로그 그룹 : securitylablogs 클릭 - 링크

→ 로그 스트림 이름 확인 ⇒ apache-access-logs 클릭

웹 access-log 와 똑같이 보인다.    



23

CW Live Tail 확인

자신의 PC 또는 CloudShell에서 EC2 웹 반복 접속 실행

MYIP=3.34.53.208

while true; do curl -s $MYIP ;echo; sleep 1; done  



24

CW Live Tail : 로그 그룹 선택 → 로그 스트림(apache-acess-logs) 선택  



25

로그가 많다.

장기 저장 해야하는경우 s3로 보내자.

기능에서  로그 그룹을 s3로 보낼수 있다.

EXPORT LOGS TO S3 - 링크 

하루 전 데이터 부터 로그를 보내자.

있는 버킷에 저장한다. (미리 버킷을 하나 만들자.)

목표 : 로그를 수집한 후 CloudWatch에서 S3 버킷으로 로그를 내보낼 수 있습니다.

S3에 데이터를 저장하는 것이 CloudWatch에 저장하는 것보다 비용 효율적이고 안정적 ← 장기 저장 및 보관에 적합함

CW 로그 그룹 : securitylablogs → Export data to Amazon S3 클릭

이계정

S3버킷 이름 지정.

접두사 lablogs   



26

내보내기 상단 작업 목록 클릭 → 내보내기 태스트 정보 확인 ⇒ View in Amazon S3 클릭 후 확인  



27

(선택)  Cli 로 확인

aws s3 ls s3://$NICKNAME-ahss-4w-logs --recursive --human-readable    



28

아테나로 분석하기!!!

QUERY LOGS FROM S3 USING ATHENA - 링크 

결과를 어디 지정할것인가를 지정한다.

Athena → (쿼리 결과 위치 설정) 설정 편집 : s3://REPLACE_ME_BUCKETNAME/athenaqueries/   



29

쿼리 편집기 사용한다.

편집기

먼저 데이터베이스 생성 → 생성 후 오른쪽에 생성된 데이터베이스 선택


쿼리에  입력


CREATE database security_lab_logs

데이터 베이스 만들었다.

테이블 만들자.


CREATE EXTERNAL TABLE IF NOT EXISTS `security_lab_apache_access_logs` (

  request_date string,

  request_timestamp string,

  request_ip string,

  request_method string,

  request string,

  response_code int,

  response_size int,

  user_client_data string,

  garbage string

  )

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'

WITH SERDEPROPERTIES (

 "input.regex" = "([^ ]*)T([^ ]*)Z ([^ ]*) (?:[^ ]* [^ ]*) (?:[^\"]*) \"([^ ]*) ([^\"]*)\" ([^ ]*) ([^ ]*) (?:\"[^\"]*\") (\"[^\"]*\")([^\n]*)"

 )

LOCATION 's3://REPLACE_ME_BUCKET/lablogs/REPLACE_ME_STRING/apache-access-logs/'

TBLPROPERTIES (

  'compressionType' = 'gzip'

  );    




30

aws s3 ls s3://$NICKNAME-ahss-4w-logs --recursive --human-readable


2023-09-17 00:46:08    0 Bytes athenaqueries/Unsaved/2023/09/17/7f8552c2-c523-481c-aece-f81dc4fcd77c.txt

2023-09-17 00:37:16   27 Bytes lablogs/aws-logs-write-test

2023-09-17 00:37:19    4.5 KiB lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/apache-access-logs/000000.gz

2023-09-17 00:37:18  527 Bytes lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/apache-error-logs/000000.gz

2023-09-17 00:37:18    2.3 KiB lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/cw-agent-logs/000000.gz

2023-09-17 00:37:18    2.1 KiB lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/instance-boot-logs/000000.gz

2023-09-17 00:37:19  988 Bytes lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/ssh-logs/000000.gz

2023-09-17 00:37:18  260 Bytes lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/yum-logs/000000.gz  



31

테이블 생성


CREATE EXTERNAL TABLE IF NOT EXISTS `security_lab_apache_access_logs` (

  request_date string,

  request_timestamp string,

  request_ip string,

  request_method string,

  request string,

  response_code int,

  response_size int,

  user_client_data string,

  garbage string

  )

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'

WITH SERDEPROPERTIES (

 "input.regex" = "([^ ]*)T([^ ]*)Z ([^ ]*) (?:[^ ]* [^ ]*) (?:[^\"]*) \"([^ ]*) ([^\"]*)\" ([^ ]*) ([^ ]*) (?:\"[^\"]*\") (\"[^\"]*\")([^\n]*)"

 )

LOCATION 's3://gasida-ahss-4w-logs/lablogs/d2bc58f4-7709-4edc-8819-d24ab5da8863/apache-access-logs/'

TBLPROPERTIES (

  'compressionType' = 'gzip'

  );   



32

New Query → 아래 입력 후 쿼리 실행 후 결과 확인

SELECT * FROM security_lab_logs.security_lab_apache_access_logs limit 15   



33

New Query → 아래 입력 후 쿼리 실행 후 결과 확인 : 응답 코드와 카운트만 필터

New Query → 아래 입력 후 쿼리 실행 후 결과 확인 : 응답 코드와 카운트만 필터     



34

(옵션) CREATE A QUICKSIGHT VISUALIZATION - 링크 ⇒ 실습 진행은 하지 않고, Docs만 확인

QuickSight → 등록 클릭 : Enterprise(30일 무료) 후 Continue → No, Maybe Later  






<7> 삭제


LAB TEARDOWN - 링크 


1

Deleting Athena database/table

테이블 삭제  

New 쿼리 창에서 아래 입력 후 실행 → 데이터베이스 삭제 확인

DROP database security_lab_logs

(옵션) 쿼리 편집기 - 설정 : 쿼리 결과 위치 뺴고 저장  


2

Deleting the Systems Manager stored parameter

SSM → 파라미터 스토어 : 생성된 파라미터 선택 후 삭제  


3

Deleting the S3 Bucket

aws s3 rm s3://$NICKNAME-ahss-4w-logs --recursive

aws s3 rb s3://$NICKNAME-ahss-4w-logs  


4

Tearing down the CloudFormation stack : 스택 삭제  





다음은 보안 모범 사례 300

https://brunch.co.kr/@topasvga/3450



주말 CloudNet  스터디 내용 참고하여  정리한 부분입니다.

https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  




감사합니다.



                    

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari