cloudNet@ 팀의 가시다 님이 진행하는 AWS 보안 스터디 4주차 정리입니다.
https://wellarchitectedlabs.com/security/200_labs 내용을 참고했습니다.
✅ 목적
- AWS Systems Manager
- Amazon CloudWatch
- Amazon Simple Storage Service(S3)
- Amazon Athena
- 같은 AWS 서비스를 활용하여 인스턴스에 직접 액세스하거나 데이터에 직접 액세스하지 않고도 로그를 수집하고 저장 함으로써
- 인스턴스에 대한 SSH 액세스를 제거하여 위협 노출 영역을 최소화하고 귀중한 로그 데이터를 수집하여 위협 탐지를 개선합니다.
✅ 동작 설명
- 실습에서는 Apache 및 PHP가 설치된 EC2 인스턴스를 배포합니다. 웹 서버는 매우 간단한 웹사이트를 호스팅합니다.
- Amazon Systems Manager(SSM)를 통해 인스턴스에 CloudWatch 에이전트를 구성합니다. 이 에이전트는 Apache 액세스 및 오류 로그, yum 로그, SSH 로그, CloudWatch 에이전트 로그 등 EC2 인스턴스에서 실행되는 서비스로부터 로그 파일을 수집합니다.
- 이러한 로그는 중앙 집중식 스토리지를 위해 EC2 인스턴스에서 CloudWatch 로그 서비스로 내보내집니다. 장기 저장 및 보관을 위해 이러한 로그를 S3 버킷으로 내보냅니다.
- 그런 다음 이러한 로그는 Athena를 통해 쿼리되므로 사람들이 로그 파일에 직접 액세스할 수 없습니다.
- 이 데이터는 QuickSight 대시보드에 시각적으로 표시됩니다.
✅ 아키텍처
❖ TASK 1
배포단계
- Deploy the cloudformation stack
- 해당 스택에는 Apache 웹서버, PHP 서버가 포함되어 있는 EC2가 포함되어 있습니다.
wget https://wellarchitectedlabs.com/Security/200_Remote_Configuration_Installation_and_Viewing_CloudWatch_Logs/code/security-lab-stack.yaml
- Cloudformation Stack 이름 : remotelogs
- buckentName: koo-ahss-4w
- DisplayName: koo
❖ TASK 2
시스템 매니저로 SSH가 아닌 원격접속
- AWS System Manager - Session Manager
- AWS 리소스 운영에 도움이 되는 기능을 제공합니다. 5 종류의 범주로 분류 되며 각 범주 내에 다양한 기능이 존재합니다.
인스턴스 및 노드 범주는 인스턴스, 온프레미스 서버와 가상 머신(VM) 및 기타 유형의 AWS 리소스(노드)를 관리하는 기능 입니다.
- 운영관리 Operations Management
- 애플리케이션 관리 Application Management
- 작업 및 변경 Actions & Change
- 인스턴스 및 노드 Instances & Nodes - Session Manager
- 공유된 리소스 Shared Resources
- System Manager - 왼쪽 탭에서 Session Manager 선택
- Session Manager- 세션 시작 클릭
- Start Session
- 배포된 EC2 접속 확인 : ‘시작 시 할당된 키 페어가 없음 ’ , 보안 그룹(인바운드는 22 안뚤려있음, 아웃바운드는 뚤려있음)
- SSH 접속이 될까요? 어떤 방법으로 접속 할 수 있나요? ‘연결 → ‘Session Manager’
- 어떤 원리로 가능한지? "SSM-Agent"
- 또 다른 방법? Cloud Shell에서 CLI 접속, 자신의 PC에 SessionManager Plugin 설치시 사용 가능
❖ TASK 3
CloudWatch Agent 설치
- 에이전트는 EC2의 활동을 모니터링 하며 로그와 메트릭을 수집
- AWS System Manager의 Run Command를 사용하여 원격에서 Agent를 설치 - 다수의 EC2 운영 관리에 유용함
- AWS Package를 설치 - Cloud Watch Agent
- 설치 된 상태에서 Output 로그 확인 가능
❖ TASK 4
System Manager Parameter Store을 통한 CloudWatch 구성 설정
- Parameter Store를 사용하면 재사용을 위해 구성 데이터와 암호를 안전하게 저장 및 재사용 가능
- CloudWatch 에이전트 구성 데이터는 CloudWatch로 전송될 로그 및 지표와 이 데이터의 소스를 지정
- 이름 : AmazonCloudWatch-securitylab-cw-config
- 계층 : 표준
- 유형 : 문자열
- 데이터 형식 : text
- 값 : config.json 파일 내용 : 이 구성 파일은 수집할 측정항목과 로그를 지정합니다.
- config.json
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"log_group_name": "securitylablogs",
"log_stream_name": "cw-agent-logs"
},
{
"file_path": "/var/log/httpd/access_log",
"log_group_name": "securitylablogs",
"log_stream_name": "apache-access-logs"
},
{
"file_path": "/var/log/httpd/error_log",
"log_group_name": "securitylablogs",
"log_stream_name": "apache-error-logs"
},
{
"file_path": "/var/log/boot.log",
"log_group_name": "securitylablogs",
"log_stream_name": "instance-boot-logs"
},
{
"file_path": "/var/log/secure",
"log_group_name": "securitylablogs",
"log_stream_name": "ssh-logs"
},
{
"file_path": "/var/log/yum.log",
"log_group_name": "securitylablogs",
"log_stream_name": "yum-logs"
}
]
}
}
},
"metrics": {
"namespace" : "SecurityCWLab-Metrics",
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
}
}
}
}
- 이 agent 섹션에서는 로그 에이전트를 실행할 사용자와 로그 수집 빈도를 지정합니다.
- 이 logs 섹션에서는 모니터링할 로그 파일과 해당 로그를 저장할 로그 그룹 및 스트림을 지정합니다. 이 정보는 다음에서 확인할 수 있습니다.
- collect_list
- 이 실습에서는 SSH 로그, Apache 웹 서버 로그 및 CloudWatch 에이전트 자체에 대한 로그를 수집합니다. 이후 단계에서 이러한 로그를 더 자세히 검토하겠습니다.
- 그만큼 metrics섹션에서는 수집되는 측정 항목을 지정 합니다(metrics_collected), 수집 빈도, 측정 및 기타 세부 사항.
- 구성 파일 생성에 대한 자세한 내용은 다음을 참조하세요.이 링크
❖ TASK 5
CloudWatch 시작
- System Manager → Run Command 메뉴 이동 - 링크 ⇒ 명령 실행 Run command 클릭
- 문서 이름 접두사 (같음) 선택 후 ‘AmazonCloudWatch-ManageAgent’ 입력 후 나오는 명령 선택 : 원격에서 EC2에 CW Agent에 명령 보냄
- 해당 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
❖ TASK 6
Log 생기도록 접속
- 자신의 웹 사이트에 방문하여 웹 액세스 로그 생성 : 자신의 PC, CloudShell
- 반복 접속 및 /example 등 없는 URL도 접속 시도 해보기
while true; do curl -s <EC2 IP> ; sleep 5; date; done
❖ TASK 7
CloudWatch Log 확인
- CW → 로그 그룹 : securitylablogs 클릭 - 링크 → 로그 스트림 이름 확인 ⇒ apache-access-logs 확인
- CW Live Tail 확인
- curl 계속 반복으로 실행
- CW Live Tail : 로그 그룹 선택 → 로그 스트림(apache-acess-logs) 선택
MYIP=x.x.x.x
while true; do curl -s $MYIP ;echo; sleep 1; done
❖ TASK 8
Log 수집한 후 S3 버킷으로 로그를 전송
- S3에 데이터를 저장하는 것이 CloudWatch에 저장하는 것보다 비용 효율적이고 안정적 ← 장기 저장 및 보관에 적합함
- CW 로그 그룹 : securitylablogs → Export data to Amazon S3 클릭
- 내보내기 상단 작업 목록 클릭 → 내보내기 태스트 정보 확인 ⇒ View in Amazon S3 클릭 후 확인
- (참고) AWS CLI에서 확인
aws s3 ls s3://$NICKNAME-ahss-4w-logs --recursive --human-readable
❖ TASK 9
Log 데이터 분석 - 서버리스 대화형 쿼리 서비스 (Amazon Athena)
- Athena는 업계 표준 언어인 SQL 쿼리를 지원합니다.
- 로그 파일에 대해 SQL 쿼리를 실행하여 로그 파일에서 정보를 추출합니다. 이 섹션에서는 Apache 액세스 로그에 중점을 두지만 Athena를 사용하여 모든 로그 파일을 쿼리할 수 있습니다.
- Athena → (쿼리 결과 위치 설정) 설정 편집 : s3://REPLACE_ME_BUCKETNAME/athenaqueries/
aws s3 ls s3://koo-ahss-4w --recursive --human-readable
# 7e37018c-e516-4e3d-aecb-50797a8253aa
- 편집기 - 데이터베이스 생성 - 생성 후 오른쪽에 생성된 데이터 베이스 선택
CREATE database security_lab_logs
- + 클릭 후 퀴리2에서 아래 쿼리 실행 : 테이블 생성
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://koo-ahss-4w/lablogs/7e37018c-e516-4e3d-aecb-50797a8253aa/apache-access-logs/'
TBLPROPERTIES (
'compressionType' = 'gzip'
);
- 새로운 쿼리
SELECT response_code,
count(response_code) AS count
FROM security_lab_logs.security_lab_apache_access_logs
WHERE response_code IS NOT NULL
GROUP BY response_code
ORDER BY count desc
'DevOps > AWS' 카테고리의 다른 글
[AWS] 네트워크 인터페이스 VMware와 비교 실습 (2) | 2023.12.02 |
---|---|
[AWS] AWS WAF 통한 API 보안 (0) | 2023.09.19 |
[AHSS 3주차] AWS WAF 사용법 (0) | 2023.09.14 |
[AHSS 3주차] 웹 취약점 및 보안 (0) | 2023.09.11 |
[AWS] IAM 정책 (자격증명 기반 정책, 리소스 기반 정책) (0) | 2023.09.09 |