Amazon GuardDuty는 AWS 계정 및 워크로드에서 악의적 활동을 모니터링하고 상세한 보안 결과를 제공하여 가시성 및 해결을 촉진하는 위협 탐지 서비스입니다.
GuardDuty를 활성화하면 다음과 같이 severity(심각도)에 따른 AWS의 감지된 위협을 확인할 수 있습니다.
향상된 보안성을 위해 EKS, EC2, Lambda, S3, RDS등 여러 위협에 대해 감지하고 대응할 수 있어야 합니다.
최근 public cloud의 도입이 늘어난 만큼 IDC 환경이 아닌 AWS에서의 기술적 보안 방법을 활용할 수 있어야 합니다.
1. GuardDuty 위협 탐지
2. 탐지 이벤트 발생
2-1. 설정한 CloudWatch Event의 규칙에서 이벤트가 발생되어 연결된 Lambda 함수 동작
2-2. Lambda에서 Event 정보에 따른 NACL Inbound Deny Rule 삽입
2-3. 차단 후 Rule Number를 설정하여 연결한 DynamoDB의 Table에 항목 추가
2-4. Slack Message 알림 전송
3. RuleNumber의 설정한 최대 개수에 의거한 최대 개수 초과 발생 이벤트 처리 프로세스 동작
3-1. NetworkACLId기준 10건 초과의 Threat IP 처리 된 이력이 있으면 오래된 이력부터 삭제하여 RuleNumber Range를 유지 (최대 20건 이내)
1. guardduty 설정
1-1. 결과 업데이트 빈도 설정 (15분)
1-2. s3 버킷 연결 (선택사항)
2. Lambda 생성
3. Lambda 환경변수 암호화를 위한 KMS 생성
4. DynamoDB Table 생성
5. CloudWatch Event 규칙 생성
5-1. event pattern type - GuardDuty Finding
5-2. 생성한 Lambda와 이벤트 연결
6. Lambda 정책 권한 설정
6-1. DynamoDB Table Access policy 링크 참조
- https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_examples_lambda-access-dynamodb.html
6-2. Lambda-GuardDuty 연결 권한 설정
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:REGION:XXXXXXXXXXXX:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:REGION:XXXXXXXXXXXX:log-group:/aws/lambda/LAMBDA_NAME:*"
]
}
6-3. Lambda EC2NACL 생성/삭제 권한 설정
{
"Sid": "EC2NetworkAclEntryControll",
"Effect": "Allow",
"Action": [
"ec2:CreateNetworkAclEntry",
"ec2:DeleteNetworkAclEntry"
],
"Resource": "*"
}
7. Lambda 코드 작성하기
- github link 참조: https://github.com/yieon-swk/guardduty-event
Lambda test JSON
{
"version": "0",
"id": "c8c4daa7-a20c-2f03-0070-b7393dd542ad",
"detail-type": "GuardDuty Finding",
"source": "aws.guardduty",
"account": "123456789012",
"time": "1970-01-01T00:00:00Z",
"region": "us-east-1",
"resources": [],
"detail": {
"schemaVersion": "2.0",
"accountId": "123456789012",
"region": "us-east-1",
"partition": "aws",
"id": "16afba5c5c43e07c9e3e5e2e544e95df",
"arn": "arn:aws:guardduty:us-east-1:123456789012:detector/123456789012/finding/16afba5c5c43e07c9e3e5e2e544e95df",
"type": "Canary:EC2/Stateless.IntegTest",
"resource": {
"resourceType": "Instance",
"instanceDetails": {
"instanceId": "i-05746eb48123455e0",
"instanceType": "t2.micro",
"launchTime": 1492735675000,
"productCodes": [],
"networkInterfaces": [
{
"ipv6Addresses": [],
"privateDnsName": "ip-0-0-0-0.us-east-1.compute.internal",
"privateIpAddress": "0.0.0.0",
"privateIpAddresses": [
{
"privateDnsName": "ip-0-0-0-0.us-east-1.compute.internal",
"privateIpAddress": "0.0.0.0"
}
],
"subnetId": "subnet-d58b7123",
"vpcId": "vpc-34865123",
"securityGroups": [
{
"groupName": "launch-wizard-1",
"groupId": "sg-9918a123"
}
],
"publicDnsName": "ec2-11-111-111-1.us-east-1.compute.amazonaws.com",
"publicIp": "11.111.111.1"
}
],
"tags": [
{
"key": "Name",
"value": "ssh-22-open"
}
],
"instanceState": "running",
"availabilityZone": "us-east-1b",
"imageId": "ami-4836a123",
"imageDescription": "Amazon Linux AMI 2017.03.0.20170417 x86_64 HVM GP2"
}
},
"service": {
"serviceName": "guardduty",
"detectorId": "3caf4e0aaa46ce4ccbcef949a8785353",
"action": {
"actionType": "NETWORK_CONNECTION",
"networkConnectionAction": {
"connectionDirection": "OUTBOUND",
"remoteIpDetails": {
"ipAddressV4": "0.0.0.0",
"organization": {
"asn": -1,
"isp": "GeneratedFindingISP",
"org": "GeneratedFindingORG"
},
"country": {
"countryName": "United States"
},
"city": {
"cityName": "GeneratedFindingCityName"
},
"geoLocation": {
"lat": 0,
"lon": 0
}
},
"remotePortDetails": {
"port": 22,
"portName": "SSH"
},
"localPortDetails": {
"port": 2000,
"portName": "Unknown"
},
"protocol": "TCP",
"blocked": false
}
},
"resourceRole": "TARGET",
"additionalInfo": {
"unusualProtocol": "UDP",
"threatListName": "GeneratedFindingCustomerListName",
"unusual": 22
},
"eventFirstSeen": "2017-10-31T23:16:23Z",
"eventLastSeen": "2017-10-31T23:16:23Z",
"archived": false,
"count": 1
},
"severity": 5,
"createdAt": "2017-10-31T23:16:23.824Z",
"updatedAt": "2017-10-31T23:16:23.824Z",
"title": "Canary:EC2/Stateless.IntegTest",
"description": "Canary:EC2/Stateless.IntegTest"
}
}
Lambda test 결과 확인
테스트 진행 시 실제 nacl 등록 확인을 위해 subnet-id를 변경하여 테스트 진행
Slack 실제 발생 메시지 예시