DNS Armor의 고급 위협 탐지 시작하기

1. 소개 및 개요

Infoblox 기반의 DNS Armor는 Google Cloud 워크로드에 DNS 계층 보안을 제공하는 완전 관리형 서비스입니다. 고급 위협 감지기는 운영 복잡성이나 성능 오버헤드를 추가하지 않고 공격 체인의 가장 초기 지점인 DNS 쿼리에서 악성 활동을 감지하도록 설계되었습니다.

이 Codelab에서는 DNS Armor 서비스를 구성하고 테스트하는 방법을 단계별로 설명합니다. 필요한 네트워크 인프라를 설정하고, 위협 감지기를 만들고, DNS 위협을 시뮬레이션하여 서비스를 테스트하고, 마지막으로 로그 탐색기를 사용하여 위협 로그를 분석합니다.

빌드할 항목

이 Codelab에서는 다음 리소스를 프로비저닝합니다.

  • VPC 네트워크 2개(network-anetwork-b)
  • network-a에는 us-east4us-central1 리전의 서브넷과 가상 머신이 포함됩니다.
  • network-b에는 us-east4에만 있는 서브넷과 가상 머신이 포함됩니다.
  • DNS 쿼리를 검사하도록 구성된 DNS Armor 고급 위협 감지기

75d6eeb807735645.png

학습할 내용

  • VPC 및 가상 머신을 비롯한 필수 네트워킹 리소스를 프로비저닝하는 방법
  • 고급 위협 감지기를 배포하고 특정 네트워크를 제외하는 방법
  • 위협 시뮬레이션 스크립트를 사용하여 위협 감지 구성을 검증하는 방법
  • 로그 탐색기에서 위협 로그를 분석하는 방법

필요한 항목

  • Google Cloud 프로젝트
  • gcloud 명령줄 도구에 대한 액세스 권한

2. 기본 요건

이 섹션에서는 다음 태스크를 수행합니다.

  • Google Cloud 프로젝트가 필요한 조직 정책 제약 조건을 충족하는지 확인합니다.
  • 사용자 계정에 필요한 IAM 역할과 권한이 있는지 확인합니다.
  • 이 Codelab에 필수적인 Google Cloud API를 사용 설정합니다.
  • Compute Engine 서비스 계정에 roles/logging.viewer IAM 역할을 할당합니다.

조직 정책 제약 조건

이 Codelab을 성공적으로 완료하려면 프로젝트에 적용된 조직 정책 제약 조건을 확인하세요. 특정 정책은 필요한 리소스의 프로비저닝을 방해할 수 있습니다. 다음 제약 조건은 이 Codelab의 구성에 영향을 줄 수 있습니다.

  • constraints/gcp.resourceLocations: 리소스를 만들 수 있는 리전을 제한합니다. Codelab에는 us-east4us-central1가 필요합니다.
  • constraints/compute.vmExternalIpAccess: Codelab의 --no-address 플래그 사용을 따르지 않는 경우 설정에 방해가 될 수 있는 공개 IP 주소가 있는 가상 머신이 생성되지 않도록 합니다 .
  • constraints/compute.shieldedVm: Codelab의 VM 생성 명령어에서 지정하지 않는 보안 VM의 생성을 강제하여 오류가 발생할 수 있습니다.
  • constraints/gcp.restrictServiceUsage: 사용 설정할 수 있는 Google Cloud API를 제한하며 compute.googleapis.com, networksecurity.googleapis.com, logging.googleapis.com, monitoring.googleapis.com를 허용하지 않으면 Codelab이 차단될 수 있습니다.

IAM 역할 및 권한

이 Codelab을 완료하려면 사용자에게 부여된 IAM 역할과 권한을 확인하세요. 이 Codelab을 완료하려면 다음 IAM 역할과 권한이 필요합니다.

  • 서비스 사용량 관리자 (roles/serviceusage.serviceUsageAdmin): Codelab에 필요한 Google Cloud API를 사용 설정합니다.
  • Compute 네트워크 관리자 (roles/compute.networkAdmin): VPC 네트워크, 서브넷, Cloud NAT를 만들고 관리합니다.
  • Compute 보안 관리자 (roles/compute.securityAdmin): 가상 머신에 대한 SSH 액세스를 위한 방화벽 규칙을 구성합니다.
  • Compute 인스턴스 관리자 (v1) (roles/compute.instanceAdmin.v1): 실습에 필요한 가상 머신을 만들고 관리합니다.
  • IAP 보안 터널 사용자 (roles/iap.tunnelResourceAccessor): Identity-Aware Proxy (IAP)를 통해 SSH를 사용하여 가상 머신에 연결합니다.
  • 네트워크 보안 관리자 (roles/networksecurity.admin): DNS Armor 위협 감지기를 만들고 관리합니다.
  • 로그 뷰어 (roles/logging.viewer): 로그 탐색기에서 위협 로그를 보고 분석합니다.

Google Cloud API

프로젝트에서 필요한 Google Cloud API가 사용 설정되어 있는지 확인하세요.

1. 필요한 API를 사용 설정하려면 Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com

2. API가 사용 설정되었는지 확인하려면 Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud services list --enabled

Compute Engine 서비스 계정

테스트 스크립트에는 Cloud Logging에서 위협 로그를 읽을 수 있는 권한이 필요합니다. 스크립트는 기본 Compute Engine 서비스 계정을 사용하는 VM에서 실행되므로 이 서비스 계정에 roles/logging.viewer IAM 역할을 할당해야 합니다.

1. 환경 변수를 설정하려면 Cloud Shell 내에서 다음 명령어를 실행합니다.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

2. Compute Engine SA에 로깅 뷰어 역할을 부여합니다. Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/logging.viewer"

3. 기본 환경 설정

이 섹션에서는 다음 태스크를 수행합니다.

  • 커스텀 서브넷으로 VPC 네트워크 (network-anetwork-b)를 만듭니다.
  • network-anetwork-b 모두에서 인터넷 이그레스를 위해 Cloud Router 및 Cloud NAT를 구성합니다.
  • network-anetwork-b 모두에 대해 IAP의 IP 범위에서 VM에 대한 SSH 액세스를 허용하는 방화벽 규칙을 만듭니다.
  • 공개 IP 주소 없이 network-anetwork-b 모두에 Linux 가상 머신을 프로비저닝합니다.

VPC 및 서브넷 만들기

1. us-east4us-central1 리전에 network-a와 서브넷을 만듭니다. Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud compute networks create network-a --subnet-mode=custom
gcloud compute networks subnets create subnet-a-use4 \
--network=network-a \
--range=10.10.0.0/24 \
--region=us-east4
gcloud compute networks subnets create subnet-a-usc1 \
--network=network-a \
--range=10.10.1.0/24 \
--region=us-central1

2. us-east4 리전에 network-b와 서브넷을 만듭니다. Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud compute networks create network-b --subnet-mode=custom
gcloud compute networks subnets create subnet-b-use4 \
--network=network-b \
--range=10.20.0.0/24 \
--region=us-east4

인터넷 이그레스 구성

1. 공개 IP가 없는 VM의 인터넷 이그레스를 허용하도록 network-a용 Cloud Router 및 Cloud NAT를 만듭니다.

gcloud compute routers create router-a-use4 \
--network=network-a \
--region=us-east4
gcloud compute routers nats create nat-a-use4 \
--router=router-a-use4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-east4
gcloud compute routers create router-a-usc1 \
--network=network-a \
--region=us-central1
gcloud compute routers nats create nat-a-usc1 \
--router=router-a-usc1 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-central1

2. 공개 IP가 없는 VM의 인터넷 이그레스를 허용하도록 network-b용 Cloud Router 및 Cloud NAT를 만듭니다.

gcloud compute routers create router-b-use4 \
--network=network-b \
--region=us-east4
gcloud compute routers nats create nat-b-use4 \
--router=router-b-use4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges \
--region=us-east4

방화벽 규칙 구성

1. network-a에 대한 방화벽 규칙을 만들어 IAP의 IP 범위에서 SSH 액세스를 허용합니다. Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud compute firewall-rules create allow-ssh-iap-a \
--network=network-a \
--allow=tcp:22 \
--source-ranges=35.235.240.0/20

2. network-b에 대한 방화벽 규칙을 만들어 IAP의 IP 범위에서 SSH 액세스를 허용합니다. Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud compute firewall-rules create allow-ssh-iap-b \
--network=network-b \
--allow=tcp:22 \
--source-ranges=35.235.240.0/20

가상 머신 만들기

1. network-a에서 Linux VM 만들기

gcloud compute instances create vm-a-use4 \
--zone=us-east4-c \
--network=network-a \
--subnet=subnet-a-use4 \
--no-address \
--scopes=cloud-platform
gcloud compute instances create vm-a-usc1 \
--zone=us-central1-a \
--network=network-a \
--subnet=subnet-a-usc1 \
--no-address \
--scopes=cloud-platform

2. network-b에서 Linux VM 만들기

gcloud compute instances create vm-b-use4 \
--zone=us-east4-c \
--network=network-b \
--subnet=subnet-b-use4 \
--no-address \
--scopes=cloud-platform

4. DNS 위협 감지기 만들기

이 섹션에서는 다음 태스크를 수행합니다.

  • 위협 감지기를 만듭니다.
  • 위협 감지기를 나열합니다.
  • 리소스를 설명합니다.

이제 VPC, 서브넷, 가상 머신이 프로비저닝되었으므로 다음 단계는 DNS 위협 감지기를 만드는 것입니다.

1. gcloud beta network-security dns-threat-detectors create 명령어를 사용하여 위협 감지기를 만듭니다. --excluded-networks 플래그를 사용하여 network-b를 제외합니다.

gcloud beta network-security dns-threat-detectors create my-dns-threat-detector \
--location=global \
--provider=infoblox \
--excluded-networks=projects/$PROJECT_ID/global/networks/network-b

2. 위협 감지기를 나열하여 생성을 확인합니다.

gcloud beta network-security dns-threat-detectors list --location=global

3. 리소스를 설명하여 network-bexcludedNetworks 아래에 올바르게 나열되어 있는지 확인합니다.

gcloud beta network-security dns-threat-detectors describe my-dns-threat-detector --location=global

명령어 결과

createTime: '2025-08-06T17:06:30.297586089Z'
excludedNetworks:
- projects/dns-armor-demo-project/global/networks/network-b
name: projects/dns-armor-demo-project/locations/global/dnsThreatDetectors/my-dns-threat-detector
provider: INFOBLOX
updateTime: '2025-08-27T01:14:09.666357239Z'

5. 설정 테스트

이 섹션에서는 다음 태스크를 수행합니다.

  • VM에 SSH를 통해 연결합니다.
  • VM에 Git을 설치합니다.
  • Infoblox 위협 감지 시뮬레이터 저장소를 클론합니다.
  • 스크립트를 실행하고 생성된 출력을 분석합니다.

VM에서 에뮬레이션된 악성 DNS 쿼리를 생성하여 설정을 검증합니다. network-a에서 시작된 쿼리의 로그 항목이 표시되지만 network-b.에서는 로그가 생성되지 않습니다.

1. vm-a-use4에 SSH를 사용합니다. Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud compute ssh vm-a-use4 --zone=us-east4-c

2. VM에 Git을 설치합니다.

sudo apt-get install git -y

3. Infoblox 위협 감지 시뮬레이터 저장소를 클론합니다.

git clone https://github.com/infobloxopen/ib-threat-detection-simulator

4. 디렉터리를 시뮬레이터의 디렉터리로 변경합니다.

cd ib-threat-detection-simulator/threat_detection_simulator/

5. 스크립트를 실행하고 생성된 출력을 분석합니다.

스크립트를 실행 가능하게 만듭니다.

chmod +x run.sh

스크립트를 실행합니다.

./run.sh info basic

6. 샘플 출력

아래 스크린샷은 network-a의 VM에서 가져온 스크립트 출력의 일부를 보여줍니다. 출력에 위협이 100% 감지된 것으로 표시됩니다.

a66c1757f8c74da6.png

아래 스크린샷은 network-b의 VM에서 가져온 스크립트 출력의 일부를 보여줍니다. 출력에 위협의 0% 가 감지된 것으로 표시됩니다. 위협 감지기를 만드는 동안 network-b가 제외되었으므로 예상되는 동작입니다.

c12d130c95c04e84.png

7. SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.

exit

6. 로그 탐색기에서 위협 로그 보기

생성된 위협 로그는 Cloud Logging에 기록되므로 테스트 스크립트를 실행한 후 로그 탐색기에서 볼 수 있습니다.

샘플 로그 항목

이 섹션에서는 감지된 DNS 위협의 샘플 로그 항목을 제공하여 소스 IP, 쿼리된 도메인, 위협 카테고리를 비롯해 DNS Armor에서 캡처한 세부정보를 보여줍니다. 분석할 로그의 구조와 콘텐츠를 이해하는 데 참고 자료로 사용됩니다.

{
  "insertId": "1izjkneb44",
  "jsonPayload": {
    "partnerId": "Infoblox",
    "detectionTime": "2025-08-08T01:49:54.092250101Z",
    "dnsQuery": {
      "authAnswer": false,
      "rdata": "random.malicious-domain.com.\t300\tIN\ta\t196.251.118.39",
      "protocol": "UDP",
      "projectNumber": "1234567890",
      "responseCode": "NOERROR",
      "queryType": "A",
      "location": "us-east4",
      "sourceIp": "10.10.0.2",
      "queryName": "random.malicious-domain.com.",
      "vmProjectNumber": "1234567890",
      "vmInstanceId": "01234567899876543210",
      "destinationIp": "",
      "queryTime": "2025-08-08T01:49:53.712692495Z"
    },
    "threatInfo": {
      "severity": "HIGH",
      "confidence": "HIGH",
      "threatDescription": "",
      "category": "EmergentDomain",
      "threatId": "Suspicious_EmergentDomain",
      "type": "Suspicious",
      "threatIndicator": "izumisv1.cc",
      "threatIndicatorType": "FQDN",
      "threat": "Suspicious",
      "threatFeed": "suspicious-noed"
    }
  },
  "resource": {
    "type": "networksecurity.googleapis.com/DnsThreatDetector",
    "labels": {
      "resource_container": "projects/1234567890",
      "id": "",
      "location": "us-east4"
    }
  },
  "timestamp": "2025-08-08T01:49:54.092250101Z",
  "severity": "INFO",
  "logName": "projects/dns-armor-demo-project/logs/networksecurity.googleapis.com%2Fdns_threat_events",
  "receiveTimestamp": "2025-08-08T01:49:55.290965780Z"
}

로그 탐색기에서 로그 보기

1. Google Cloud 콘솔에서 Monitoring 섹션으로 이동한 후 Logs explorer를 선택합니다.

4a90c593d7e339d8.png

2. 모든 DNS Armor 위협 로그를 필터링하려면 다음 쿼리를 사용하세요. DNS 위협 감지기의 리소스 유형에 따라 로그를 필터링합니다.

resource.type="networksecurity.googleapis.com/DnsThreatDetector"

3. us-east4 리전의 로그를 필터링하고 위치에 필터를 추가합니다. 이 쿼리는 us-east4 리전에서 감지된 위협만 표시합니다.

resource.type="networksecurity.googleapis.com/DnsThreatDetector"
resource.labels.location="us-east4"

4. 소스 네트워크별로 로그를 필터링하면 DNS 쿼리의 소스 IP 주소를 기반으로 로그를 필터링하여 특정 VPC 네트워크에서 시작된 위협을 확인할 수 있습니다.

network-a (서브넷 10.10.0.0/24 및 10.10.1.0/24)의 로그를 보려면 다음 단계를 따르세요.

resource.type="networksecurity.googleapis.com/DnsThreatDetector"
(jsonPayload.dnsQuery.sourceIp:"10.10.0." OR jsonPayload.dnsQuery.sourceIp:"10.10.1.")

network-b (서브넷 10.20.0.0/24)의 로그를 보려면 다음 단계를 따르세요.

resource.type="networksecurity.googleapis.com/DnsThreatDetector"
jsonPayload.dnsQuery.sourceIp:"10.20.0."

7. 삭제

향후 요금이 청구되지 않도록 이 Codelab에서 만든 리소스를 삭제합니다. 정리 명령어를 실행할 때는 VM의 셸을 종료하고 Cloud Shell로 돌아가야 합니다.

1. VM을 삭제합니다.

gcloud compute instances delete vm-a-use4 --zone=us-east4-c --quiet
gcloud compute instances delete vm-a-usc1 --zone=us-central1-a --quiet
gcloud compute instances delete vm-b-use4 --zone=us-east4-c --quiet

2. 방화벽 규칙을 삭제합니다.

gcloud compute firewall-rules delete allow-ssh-iap-a --quiet
gcloud compute firewall-rules delete allow-ssh-iap-b --quiet

3. Cloud NAT 게이트웨이를 삭제합니다.

gcloud compute routers nats delete nat-a-use4 --router=router-a-use4 --region=us-east4 --quiet
gcloud compute routers nats delete nat-a-usc1 --router=router-a-usc1 --region=us-central1 --quiet
gcloud compute routers nats delete nat-b-use4 --router=router-b-use4 --region=us-east4 --quiet

4. Cloud Router 삭제

gcloud compute routers delete router-a-use4 --region=us-east4 --quiet
gcloud compute routers delete router-a-usc1 --region=us-central1 --quiet
gcloud compute routers delete router-b-use4 --region=us-east4 --quiet

5. 서브넷을 삭제합니다.

gcloud compute networks subnets delete subnet-a-use4 --region=us-east4 --quiet
gcloud compute networks subnets delete subnet-a-usc1 --region=us-central1 --quiet
gcloud compute networks subnets delete subnet-b-use4 --region=us-east4 --quiet

6. DNS 위협 감지기를 삭제합니다.

gcloud beta network-security dns-threat-detectors delete my-dns-threat-detector --location=global --quiet

7. VPC를 삭제합니다.

gcloud compute networks delete network-a --quiet
gcloud compute networks delete network-b --quiet

8. 축하합니다

축하합니다. DNS Armor 위협 감지기를 구성, 배포, 테스트했습니다. DNS 기반 위협으로부터 Google Cloud 환경을 보호하는 실무 경험을 쌓았습니다.

이 Codelab에서 다음 작업을 했습니다.

  • 여러 VPC, 서브넷, 가상 머신으로 네트워크 환경을 프로비저닝했습니다.
  • Cloud NAT를 사용하여 비공개 VM의 인터넷 이그레스를 구성했습니다.
  • DNS Armor 위협 감지기를 배포하고 특정 네트워크를 제외하는 방법을 알아봤습니다.
  • DNS 위협을 시뮬레이션하고 위협 감지 구성을 검증했습니다.
  • 로그 탐색기에서 위협 로그를 분석하여 악성 DNS 활동을 식별하고 이해했습니다.

다음 단계

참조 문서