Lambda를 사용한 GuardDuty Threat IP 차단 프로세스 구현하기

이언철·2023년 3월 17일
0

AWS

목록 보기
7/11
post-thumbnail

GuardDuty란?

Amazon GuardDuty는 AWS 계정 및 워크로드에서 악의적 활동을 모니터링하고 상세한 보안 결과를 제공하여 가시성 및 해결을 촉진하는 위협 탐지 서비스입니다.

  1. AWS 계정, 인스턴스, 컨테이너 워크로드, 사용자, 데이터베이스 및 스토리지에서 잠재적 위협 요소를 지속적으로 모니터링할 수 있습니다.
  2. 이상 탐지, 기계 학습, 동작 모델링 및 AWS와 선도적인 서드 파티의 위협 인텔리전스 피드를 사용하여 위협을 빠르게 노출할 수 있습니다.
  3. 자동 대응을 시작하여 위협을 조기에 완화할 수 있습니다.

GuardDuty를 통한 DevSevOps 도입

GuardDuty를 활성화하면 다음과 같이 severity(심각도)에 따른 AWS의 감지된 위협을 확인할 수 있습니다.
향상된 보안성을 위해 EKS, EC2, Lambda, S3, RDS등 여러 위협에 대해 감지하고 대응할 수 있어야 합니다.
최근 public cloud의 도입이 늘어난 만큼 IDC 환경이 아닌 AWS에서의 기술적 보안 방법을 활용할 수 있어야 합니다.


GuardDuty 위협 IP 차단 프로세스 구성하기

이벤트 발생 흐름

  • 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 실제 발생 메시지 예시

profile
Soomgo, DevOps

0개의 댓글