계정 내 위협 탐지 서비스, GuardDuty
GuardDuty
AWS 계정 전반의 위협 탐지 서비스(Threat Detection Service)
AWS 계정과 워크로드를 보호하기 위해 악의적인 활동들과 비인가적인 행위들을 지속적으로 모니터링한다.
GuardDuty는 위협 인텔리전스 피드를 통해 악성IP / 도메인을 판별하고, 이를 바탕으로 머신러닝을 적용시켜 위협 탐지를 수행한다.
GuardDuty가 모니터링하는 항목으로는 다음과 같다.
- VPC flow log
- CloudTrail 이벤트 로그
- CloudTrail 관리 이벤트
- DNS 로그
GuardDuty는 기본으로 활성화되지 않고 별도로 활성화를 시켜줘야 모니터링과 탐지를 시작한다.
GuardDuty 서비스를 나타내는 객체로 감지기라는 개념이 존재한다. 이 감지기는 리전 단위의 객체로, 이 탐지기는 GuardDuty 서비스를 활성화하면 해당 리전에 생성된다. 따라서 주로 사용하는 리전에 각각 GuardDuty 서비스를 활성화시켜 감지기를 생성시켜 주어야한다.
또한 GuardDuty는 30일간 무료로 사용할 수 있다.
Finding
GuardDuty가 위협으로 탐지한 이벤트를 Finding(결과)라고 한다. 모든 Finding은 감지기와 연결되어있다.
GuardDuty 웹 콘솔의 결과 탭에서 탐지된 Finding들의 목록과 세부사항들을 확인할 수 있다.
각 Finding들은 고유한 ID 값인 결과 ID를 가진다. 이 결과 ID는 Finding Type과 탐지한 파라미터 값을 바탕으로 구분하고, 이 값들이 동일하면 동일한 결과 ID로 처리한다.
Finding의 내용은 JSON으로 확인할 수 있다.
Finding에서 확인할 수 있는 세부정보들은 대표적으로 아래와 같다.
내용 | 설명 |
탐지 시각 | Finding이 발생된 시각 |
리소스 | Finding이 생성되는데에 연관있는 AWS 리소스 (해당 리소스가 의심되는 활동의 대상이였다를 나타냄) |
Finding type(유형) | Finding 생성을 트리거한 활동의 유형 |
심각도 | Finding별로 할당된 심각도로 High, Medium, Low로 구성 |
갯수 | 감지기가 해당 Finding type을 찾아낸 누적 갯수 |
Finding의 요소로는 크게 Resource와 Action으로 나눠볼 수 있다.
Resource
Finding 생성에 대상이 된 AWS 리소스, Resource 요소는 리소스 역할과 리소스 유형을 세부정보로 갖는다.
탐지되는 리소스 유형에는 EC2 인스턴스, S3 버킷, IAM 엑세스키, EKS/ECS 클러스터, 컨테이너, RDS 인스턴스, Lambda가 있다.
이 리소스 유형에 따라 세부정보 format이 달라지므로 상세한 내용은 아래 Docs를 참고한다.
그리고 리소스 역할은 해당 리소스가 의심되는 행동의 대상인지 수행자인지를 나타내는 지표로 Actor와 Target 값을 가질 수 있다.
Action
의심되는 행동이 어떤 작업을 수행했는지를 나타내는 지표로 작업 유형이라고 하며, 유형별로 세부정보가 달라진다.
작업 유형은 아래 5가지로 나뉜다.
- NETWORK_CONNECTION : 인스턴스와 외부 인터넷 간의 네트워크 트래픽
- PORT_PROBE : 포트 스캔 트래픽
- DNS_REQUEST : 도메인 이름 질의 트래픽
- AWS_API_CALL : AWS API 호출 트래픽
- RDS_LOGIN_ATTEMPT : RDS 로그인 시도 트래픽
결과 내보내기
웹 콘솔에서 Finding 탭을 확인해보면 알 수 있듯이 모든 Finding을 웹 콘솔에서 바로 확인할 수는 없다.
웹 콘솔에서는 결과ID 단위로 결과를 볼 수 있는데, 위에서 서술했듯이 결과ID는 동일한 패턴의 행동에 대해서는 같은 값을 가지게 된다.
즉, 동일한 결과ID (Finding Type과 파라미터)에 대해 Finding이 발생하면 웹 콘솔에서는 가장 최근 것의 내용만 확인할 수 밖에 없다.
모든 Finding을 보관하기 위해 결과 내보내기 기능을 이용할 수 있다.
내보내는 대상으로는 기본적으로 Cloudwatch Events가 있고, 선택적으로 S3 버킷을 설정해 보관하도록 할 수 있다.
빈도는 GuardDuty에서 발생한 Finding을 Eventbridge와 버킷으로 내보내는 주기로, 기본값은 6시간으로 설정되어있다.
GuardDuty Finding을 모니터링하는 아키텍쳐 등을 구성할 때에는 이 값을 최소값인 15분으로 설정해주는 것이 바람직하다.
Eventbridge와 저장용 버킷으로 내보내는 빈도를 각각 설정할 수 없기에 Guardduty가 탐지한 내역을 최대한 빠르게 전달하려면 최솟값으로 설정해주어야하기 때문이다.
버킷 연결을 해주는 경우, 저장할 버킷을 지정하고 해당 버킷에 GuardDuty가 접근할 수 있도록 버킷 정책을 수정해주어야한다.
(새로 만드는 경우면 생성시에 정책 연결됨)
그리고 버킷에 Finding을 저장할 때, Finding을 암호화하는 과정이 포함되어있어 KMS 키를 지정해주어야한다. 물론, GuarddDuty가 KMS 키를 사용할 수 있도록 키 정책도 설정해주어야한다.
### GuardDuty가 KMS 키에 엑세스하는 정책
{
"Sid": "AllowGuardDutyKey",
"Effect": "Allow",
"Principal": {
"Service": "guardduty.amazonaws.com"
},
"Action": "kms:GenerateDataKey",
"Resource": "arn:aws:kms:Region1:444455556666:key/KMSKeyId",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012",
"aws:SourceArn": "arn:aws:guardduty:Region2:123456789012:detector/SourceDetectorID"
}
}
}
이렇게 내보내기를 설정하면 탐지된 Finding들이 버킷에 JSON으로 저장되어있는 것을 볼 수 있다.