<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
탐지 제어를 구성 ⇒ 공격 실습 시 활용
<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, 액세스 키 중지 혹은 삭제
1
2
테스트 용도로만 사용하기 바란다.
서비스 계정에는 사용하지 않기 바란다.
3
[CloudShell 권장 or 자신의 PC(aws sam 설치 필요)] DEPLOYING IAM LAMBDA CLEANUP WITH AWS SAM
4
# 파일 다운로드
# 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
참고
크론텝 주기 확인
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 퍼블릭 인증서 요청
<6> [실습] Level 200: Remote Configuration, Installation, and Viewing of CloudWatch logs = 원격 설정 내용 로그 보기
1
실습 환경 배포 시간이 소요되니, 미리 배포해둘 것 (10분 걸린다.)
2
동작 ?
Cloudwatch agent설치 ec2가 cloudwatch log 그룹에 쓴다.
장기저장을 위해 s3에 저장
분석은 아테나 쿼리로 분석
퀵사이트를 통해 가시화 대시보드 만든다.
3
보안관련 로그를 s3에 모아서 분석을 하는 부분이다.
Ec2 인스턴스는 ssh로 접속하지 않는다. 시스템 매니저(SSM) 세션 매니저로 접근한다.
기본 세팅은 시스템 매니저 run command로 한다.
4
콘솔로 작업
CloudFormation 템플릿 파일 다운로드 : security-lab-stack.yaml
5
- 스택 이름 : **remotelogs**
- BucketName : ‘*각자 자신의 신규 버킷명*’ ← 기존에 없던 이름, 배포 시 **해당 버킷이 신규로 생성됨**
- DisplayName : ‘*각자 자신의 닉네임*’ ← 웹 페이지에 출력되는 내용 , topasvga
6
배포 완료 확인 : EC2 웹사이트 접속 확인
Cloudformation에 출력 가서 확인한다.
7
배포된 EC2 접속 확인 : ‘시작 시 할당된 키 페어’ , 보안 그룹(인바운드, 아웃바운드)
80만 허용 되어 있다. 키페어도 없다.
SSH 접속이 될까요?
어떤 방법으로 접속 할 수 있나요?
해당 ec2 > 오른키 > ‘연결 → ‘Session Manager’ : 어떤 원리로 가능한지?
Ec2에서 인바운드는 막혀 있으나, 아웃 바인트가 열려 있다. 그래서 통신이 된다.
참고 자료
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 - 링크
시스템 매니저 > 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
주말 CloudNet 스터디 내용 참고하여 정리한 부분입니다.
감사합니다.