본문 바로가기

DevOps/AWS

[AWS] AWS System Manager을 통한 보안 강화

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 리소스(노드)를 관리하는 기능 입니다.

  1. 운영관리 Operations Management
  2. 애플리케이션 관리 Application Management
  3. 작업 및 변경 Actions & Change
  4. 인스턴스노드 Instances & Nodes - Session Manager
  5. 공유된 리소스 Shared Resources

 

 

  • System Manager - 왼쪽 탭에서 Session Manager 선택 
  • Session Manager- 세션 시작 클릭

  • Start Session
    • 배포된 EC2 접속 확인 : ‘시작 시 할당된 키 페어가 없음 ’ , 보안 그룹(인바운드는 22 안뚤려있음, 아웃바운드는 뚤려있음) 
    •  SSH 접속이 될까요?  어떤 방법으로 접속 할 수 있나요? ‘연결 → ‘Session Manager’
    • 어떤 원리로 가능한지? "SSM-Agent"  
    • 또 다른 방법? Cloud Shell에서 CLI 접속, 자신의 PC에 SessionManager Plugin 설치시 사용 가능

위 그림은 CloudNeta 스터디 gasida님의 게시물에 저작권이 있습니다.
ssm-user라는 user가 생성되어 있으며, 해당 유저로 터미널을 실행하고 있음을 알수있다.



❖ 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
			}
		}
	}
}
  1. 이 agent 섹션에서는 로그 에이전트를 실행할 사용자와 로그 수집 빈도를 지정합니다.
  2. 이 logs 섹션에서는 모니터링할 로그 파일과 해당 로그를 저장할 로그 그룹 및 스트림을 지정합니다. 이 정보는 다음에서 확인할 수 있습니다. 
  3. collect_list
    • 이 실습에서는 SSH 로그, Apache 웹 서버 로그 및 CloudWatch 에이전트 자체에 대한 로그를 수집합니다. 이후 단계에서 이러한 로그를 더 자세히 검토하겠습니다.
  4. 그만큼 metrics섹션에서는 수집되는 측정 항목을 지정 합니다(metrics_collected), 수집 빈도, 측정 및 기타 세부 사항.
  5. 구성 파일 생성에 대한 자세한 내용은 다음을 참조하세요.이 링크
 

Manually create or edit the CloudWatch agent configuration file - Amazon CloudWatch

When CloudWatch retrieves messages from a Windows log channel, it looks up the log channel based on its Full Name property. Meanwhile, the Windows Event Viewer navigation pane displays the Log Name property of log channels. The Full Name and Log Name do no

docs.aws.amazon.com

 



❖ 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