GSP474

개요
트래픽 미러링은 Google Cloud 네트워킹의 보안 및 네트워크 분석 관련 핵심 기능입니다. 기존 네트워킹의 네트워크 탭 또는 스팬 세션과 유사한 방식으로 기능합니다. 간단히 말해 패킷 미러링은 선택된 '미러링된 소스'에서 네트워크 트래픽(인그레스 및 이그레스)을 캡처하고, 트래픽을 복사하여 '수집기'로 전달합니다.
패킷 미러링은 각 패킷의 전체 페이로드를 캡처하므로 추가 대역폭을 사용한다는 점에 유의해야 합니다. 패킷 미러링은 샘플링 기간을 기반으로 하지 않으므로 문제 해결, 보안 솔루션, 상위 레이어 애플리케이션 기반 분석에 사용할 수 있습니다.
패킷 미러링은 다음 속성을 포함하는 '패킷 미러링 정책'을 기반으로 합니다.
- 리전
- VPC 네트워크
- 미러링된 소스
- 수집기(대상)
- 미러링된 트래픽(필터)
다음과 같은 핵심 사항을 고려해야 합니다.
- TCP, UDP, ICMP 트래픽만 미러링할 수 있습니다. 하지만 이 정도로도 대부분의 사용 사례를 처리할 수 있습니다.
- '미러링된 소스'와 '수집기'는 '동일한' 리전에 있어야 하지만, 다른 영역이나 (VPC가 적절하게 피어링되어 있다면) 다른 VPC에도 위치할 수 있습니다.
- 추가 대역폭 요금이 적용되며, 특히 영역이 다르면 더 많은 요금이 부과됩니다. 미러링되는 트래픽을 제한하려면 필터를 사용하면 됩니다.
'패킷 미러링'의 주요 사용 사례는 침입 감지 시스템(IDS) 솔루션에서 사용하는 것입니다. 일부 클라우드 기반 IDS 솔루션에는 각 소스 VM에서 실행되거나, 네트워크 소스와 대상 간에 IDS 가상 어플라이언스를 인라인으로 배치하는 특별 서비스가 필요합니다. 이 두 가지 모두 중요한 의미가 있습니다. 예를 들어 서비스 기반 솔루션은 완전히 분산되어 있지만, 게스트 운영체제에서 소프트웨어를 지원해야 합니다. '인라인' 솔루션은 모든 트래픽을 IDS 어플라이언스를 통해 전달하기 때문에 네트워크 병목 현상이 일어날 수 있습니다. 또한 인라인 솔루션은 동일한 VPC의 VM 내에서 'East-West' 트래픽을 캡처하지도 못합니다.
Google Cloud 패킷 미러링은 VM에 추가 소프트웨어가 필요하지 않으며 미러링된 각 가상 머신에 완전히 배포됩니다. '수집기' IDS는 내부 네트워크 부하 분산기(ILB)를 사용하여 경로 외부에 배치되며 'North-South' 트래픽과 'East-West' 트래픽을 모두 수신합니다.
패킷 미러링 실습 설명
패킷 미러링을 IDS와 함께 사용하는 방법을 확인하려면 오픈소스 IDS Suricata를 사용하는 이 예시를 참조하세요.
- 미러링된 소스용 서브넷 1개와 수집기용 서브넷 1개가 있는 단일 VPC
- 공개 IP 주소로 생성한 웹 서버 2개
- 보안을 위해 공개 IP 없이 생성한 수집기 서버(IDS) 1개
- 필요한 경우 인터넷에 액세스하기 위해 사용 설정된 Cloud NAT
- 간편성 확보와 비용 절감을 위해 모든 VM이 동일한 리전 및 영역에 생성됨
이 실습에서는 Google Cloud 환경을 만들고, '수집기' ILB를 구성하고, 패킷 미러링 정책을 구성하고, 가상 인스턴스에 [Suricata](https://suricata-ids.org/)를 설치하고 구성하여 IDS로 작동하게 합니다. 작업을 완료하면 네트워크 테스트가 실행되어 오픈소스 IDS를 사용하는 패킷 미러링의 구성과 사용을 검증합니다. 데모를 간소화하기 위해 매우 간략한 규칙 집합과 Suricata 구성을 사용합니다.

목표
- 위 다이어그램과 같은 방식으로 Google Cloud 네트워킹 환경 빌드
-
gcloud
명령어를 사용하여, '웹 서버' 역할을 하는 가상 머신 2개 만들기
-
gcloud
명령어를 사용하여, IDS 역할을 하는 가상 머신 1개 만들기
- 패킷 미러링의 '수집기' 역할을 하는 내부 부하 분산기(ILB) 만들기
- IDS VM에 오픈소스 IDS(Suricata) 설치 및 구성
- 기본 IDS 알림 규칙 검토
- 패킷 미러링 정책 만들기
- '미러링된' 서브넷으로 네트워크 트래픽을 생성하여 패킷 미러링 테스트
- 네트워크 트래픽을 생성하여 IDS 이벤트를 시뮬레이션하고 IDS 로깅을 검토하여 Suricata IDS 테스트
설정 및 요건
실습 시작 버튼을 클릭하기 전에
다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지를 표시합니다.
실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.
이 실습을 완료하려면 다음을 준비해야 합니다.
- 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드(권장) 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학습자 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
- 실습을 완료하기에 충분한 시간(실습을 시작하고 나면 일시중지할 수 없음)
참고: 이 실습에는 학습자 계정만 사용하세요. 다른 Google Cloud 계정을 사용하는 경우 해당 계정에 비용이 청구될 수 있습니다.
실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법
-
실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 대화상자가 열립니다.
왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 창이 있습니다.
- Google Cloud 콘솔 열기 버튼
- 남은 시간
- 이 실습에 사용해야 하는 임시 사용자 인증 정보
- 필요한 경우 실습 진행을 위한 기타 정보
-
Google Cloud 콘솔 열기를 클릭합니다(Chrome 브라우저를 실행 중인 경우 마우스 오른쪽 버튼으로 클릭하고 시크릿 창에서 링크 열기를 선택합니다).
실습에서 리소스가 가동되면 다른 탭이 열리고 로그인 페이지가 표시됩니다.
팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.
참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
-
필요한 경우 아래의 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다.
{{{user_0.username | "Username"}}}
실습 세부정보 창에서도 사용자 이름을 확인할 수 있습니다.
-
다음을 클릭합니다.
-
아래의 비밀번호를 복사하여 시작하기 대화상자에 붙여넣습니다.
{{{user_0.password | "Password"}}}
실습 세부정보 창에서도 비밀번호를 확인할 수 있습니다.
-
다음을 클릭합니다.
중요: 실습에서 제공하는 사용자 인증 정보를 사용해야 합니다. Google Cloud 계정 사용자 인증 정보를 사용하지 마세요.
참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
-
이후에 표시되는 페이지를 클릭하여 넘깁니다.
- 이용약관에 동의합니다.
- 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
- 무료 체험판을 신청하지 않습니다.
잠시 후 Google Cloud 콘솔이 이 탭에서 열립니다.
참고: Google Cloud 제품 및 서비스에 액세스하려면 탐색 메뉴를 클릭하거나 검색창에 제품 또는 서비스 이름을 입력합니다.
Cloud Shell 활성화
Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.
-
Google Cloud 콘솔 상단에서 Cloud Shell 활성화
를 클릭합니다.
-
다음 창을 클릭합니다.
- Cloud Shell 정보 창을 통해 계속 진행합니다.
- 사용자 인증 정보를 사용하여 Google Cloud API를 호출할 수 있도록 Cloud Shell을 승인합니다.
연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 학습자의 PROJECT_ID, (으)로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud
는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.
- (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
gcloud auth list
-
승인을 클릭합니다.
출력:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
gcloud config list project
출력:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
참고: gcloud
전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참고하세요.
작업 1. 네트워킹 풋프린트 빌드
이 섹션에서는 VPC 1개를 만들고 해당 VPC 내에 서브넷 2개를 만듭니다. 모든 작업은 Google Cloud Shell 내에서 gcloud
CLI 명령어를 사용하여 수행됩니다.
- 다음을 실행하여 가상 사설망(VPN)을 만듭니다.
gcloud compute networks create dm-stamford \
--subnet-mode=custom
-
에 있는 미러링된 트래픽용 VPC에 서브넷을 추가합니다.
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}} \
--range=172.21.0.0/24 \
--network=dm-stamford \
--region={{{project_0.default_region | REGION}}}
-
에 있는 수집기용 VPC에 서브넷을 추가합니다.
gcloud compute networks subnets create dm-stamford-{{{project_0.default_region | REGION}}}-ids \
--range=172.21.1.0/24 \
--network=dm-stamford \
--region={{{project_0.default_region | REGION}}}
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
네트워킹 풋프린트 빌드
작업 2. 방화벽 규칙 및 Cloud NAT 만들기
이 실습을 완료하려면 총 3개의 방화벽 규칙이 필요합니다.
- 규칙 1은 모든 소스에서 모든 VM으로의 표준 HTTP 포트(TCP 80)와 ICMP 프로토콜을 허용합니다.
- 규칙 2는 IDS가 '모든' 소스에서 전송하는 '모든' 트래픽을 수신하도록 허용합니다. 이후 섹션에서 IDS VM에 공개 IP를 할당하지 '않도록' 주의하세요.
- 규칙 3은 'Google Cloud IAP 프록시' IP 범위 TCP 포트 22를 '모든' VM에 허용하여 Cloud 콘솔을 통해 VM에 SSH로 연결할 수 있게 합니다.
다음 명령어를 실행하여 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create fw-dm-stamford-allow-any-web \
--direction=INGRESS \
--priority=1000 \
--network=dm-stamford \
--action=ALLOW \
--rules=tcp:80,icmp \
--source-ranges=0.0.0.0/0
gcloud compute firewall-rules create fw-dm-stamford-ids-any-any \
--direction=INGRESS \
--priority=1000 \
--network=dm-stamford \
--action=ALLOW \
--rules=all \
--source-ranges=0.0.0.0/0 \
--target-tags=ids
gcloud compute firewall-rules create fw-dm-stamford-iapproxy \
--direction=INGRESS \
--priority=1000 \
--network=dm-stamford \
--action=ALLOW \
--rules=tcp:22,icmp \
--source-ranges=35.235.240.0/20
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
Cloud 방화벽 규칙 및 Cloud NAT 만들기
Cloud Router 만들기
- Cloud NAT의 기본 요건으로, 먼저 해당 리전에서 Cloud Router를 구성해야 합니다.
gcloud compute routers create router-stamford-nat-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}} \
--network=dm-stamford
Cloud NAT 구성
- 공개 IP가 없는 VM에 인터넷 액세스를 제공하려면 해당 리전에 Cloud NAT를 만들어야 합니다.
gcloud compute routers nats create nat-gw-dm-stamford-{{{project_0.default_region | REGION}}} \
--router=router-stamford-nat-{{{project_0.default_region | REGION}}} \
--router-region={{{project_0.default_region | REGION}}} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
IDS VM은 인터넷에서 액세스할 수 없도록 공개 IP 없이 생성됩니다. 하지만 업데이트를 다운로드하고 Suricata 패키지를 설치하려면 인터넷에 액세스해야 합니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
Cloud Router 생성 및 Cloud NAT 구성
작업 3. 가상 머신 만들기
웹 서버용 인스턴스 템플릿 만들기
- 이 템플릿은 에서 Ubuntu 서버를 준비하고 간단한 웹 서비스를 설치합니다.
gcloud compute instance-templates create template-dm-stamford-web-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}} \
--network=dm-stamford \
--subnet=dm-stamford-{{{project_0.default_region | REGION}}} \
--machine-type=e2-small \
--image=ubuntu-1604-xenial-v20200807 \
--image-project=ubuntu-os-cloud \
--tags=webserver \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
웹 서버용 관리형 인스턴스 그룹 만들기
- 이 명령어는 이전 단계의 인스턴스 템플릿을 사용하여 웹 서버 2개를 만듭니다.
gcloud compute instance-groups managed create mig-dm-stamford-web-{{{project_0.default_region | REGION}}} \
--template=template-dm-stamford-web-{{{project_0.default_region | REGION}}} \
--size=2 \
--zone={{{project_0.default_zone | "ZONE"}}}
IDS VM용 인스턴스 템플릿 만들기
- 이 템플릿은 에서 공개 IP 없이 Ubuntu 서버를 준비합니다.
gcloud compute instance-templates create template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}} \
--network=dm-stamford \
--no-address \
--subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \
--image=ubuntu-1604-xenial-v20200807 \
--image-project=ubuntu-os-cloud \
--tags=ids,webserver \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
IDS VM용 관리형 인스턴스 그룹 만들기
- 이 명령어는 이전 단계의 인스턴스 템플릿을 사용하여, IDS로 구성될 VM 1개를 만듭니다. Suricata 설치는 이후 섹션에서 다룹니다.
gcloud compute instance-groups managed create mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--template=template-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--size=1 \
--zone={{{project_0.default_zone | "ZONE"}}}
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
가상 머신 만들기
작업 4. 내부 부하 분산기 만들기
패킷 미러링은 내부 부하 분산기(ILB)를 사용하여, 미러링된 트래픽을 수집기 그룹으로 전달합니다. 이 경우 수집기 그룹에는 VM 1개가 포함됩니다.
- 백엔드 서비스의 기본 상태 점검을 만듭니다.
gcloud compute health-checks create tcp hc-tcp-80 --port 80
- ILB에 사용할 백엔드 서비스 그룹을 만듭니다.
gcloud compute backend-services create be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \
--load-balancing-scheme=INTERNAL \
--health-checks=hc-tcp-80 \
--network=dm-stamford \
--protocol=TCP \
--region={{{project_0.default_region | REGION}}}
- 생성한 IDS 관리형 인스턴스 그룹을 이전 단계에서 만든 백엔드 서비스 그룹에 추가합니다.
gcloud compute backend-services add-backend be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \
--instance-group=mig-dm-stamford-ids-{{{project_0.default_region | REGION}}} \
--instance-group-zone={{{project_0.default_zone | "ZONE"}}} \
--region={{{project_0.default_region | REGION}}}
- 컬렉션 엔드포인트 역할을 할 프런트엔드 전달 규칙을 만듭니다.
gcloud compute forwarding-rules create ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \
--load-balancing-scheme=INTERNAL \
--backend-service be-dm-stamford-suricata-{{{project_0.default_region | REGION}}} \
--is-mirroring-collector \
--network=dm-stamford \
--region={{{project_0.default_region | REGION}}} \
--subnet=dm-stamford-{{{project_0.default_region | REGION}}}-ids \
--ip-protocol=TCP \
--ports=all
참고: TCP가 프로토콜로 표시되더라도, 미러링된 트래픽의 실제 유형은 향후 섹션의 패킷 미러링 정책에서 구성됩니다. --is-mirroring-collector
플래그가 설정되어 있다는 점에도 주목하세요.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
내부 부하 분산기 만들기
작업 5. 오픈소스 IDS - Suricata 설치
참고: 다음 두 섹션에서는 IDS VM에 SSH로 연결하고 관련 셸에서 명령어를 실행합니다. Cloud Shell에서 명령어를 실행하지 않도록 주의하세요.
IDS VM에 SSH로 연결
-
Cloud 콘솔의 탐색 메뉴에서 Compute Engine > VM 인스턴스로 이동합니다.
-
IDS VM의 SSH 버튼을 클릭합니다.

이렇게 하면 IDS VM 내에서 명령어를 실행할 수 있는 새 창이 열립니다.
- IDS VM을 업데이트합니다.
sudo apt-get update -y
- Suricata 종속 항목을 설치합니다.
sudo apt-get install libpcre3-dbg libpcre3-dev autoconf automake libtool libpcap-dev libnet1-dev libyaml-dev zlib1g-dev libcap-ng-dev libmagic-dev libjansson-dev libjansson4 -y
sudo apt-get install libnspr4-dev -y
sudo apt-get install libnss3-dev -y
sudo apt-get install liblz4-dev -y
sudo apt install rustc cargo -y
- Suricata를 설치합니다.
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt-get update -y
sudo apt-get install suricata -y
참고: 설치 중에 오류가 발생하면 다음 확인 단계를 진행합니다.
설치 확인
- 다음 명령어를 사용하여 설치를 확인하고 설치된 Suricata 버전을 확인합니다.
suricata -V
출력은 다음과 비슷해야 합니다.
This is Suricata version 5.0.3 RELEASE
작업 6. Suricata 구성 및 검토
다음 섹션에 나오는 명령어와 단계도 IDS/Suricata VM의 SSH 내에서 실행해야 합니다.
- Suricata 서비스를 중지하고 기본 구성 파일을 백업합니다.
sudo systemctl stop suricata
sudo cp /etc/suricata/suricata.yaml /etc/suricata/suricata.backup
새 Suricata 구성 파일과 축약된 규칙 파일 다운로드 및 교체
새 구성 파일은 수집기 인터페이스를 업데이트하고, my.rules
파일 및 suricata.yaml
파일에 구성된 것처럼 매우 적은 양의 트래픽에 대해서만 알림을 보냅니다. Suricata 규칙 세트와 알림의 기본값은 매우 광범위하며 이 실습에서는 불필요합니다.
wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/suricata.yaml
wget https://storage.googleapis.com/tech-academy-enablement/GCP-Packet-Mirroring-with-OpenSource-IDS/my.rules
sudo mkdir /etc/suricata/poc-rules
sudo cp my.rules /etc/suricata/poc-rules/my.rules
sudo cp suricata.yaml /etc/suricata/suricata.yaml
Suricata 서비스 시작
서비스를 다시 시작해야 하는 경우도 있습니다. 이러한 경우를 위해 이 단계에는 restart
명령어가 포함되어 있습니다.
sudo systemctl start suricata
sudo systemctl restart suricata
테스트를 위한 간단한 Suricata 규칙 검토
이 실습에서는 Suricata 규칙 세트가 4개로 축소되었습니다. 그러나 기본 Suricata 설치에는 광범위한 규칙 세트가 존재합니다.
- 이 실습에는 각 알림을 쉽게 테스트할 수 있도록, 알림을 간결하고 간단한 목록으로 압축합니다.
cat /etc/suricata/poc-rules/my.rules
출력에는 총 4개의 규칙과 각 규칙에 대한 설명이 표시되어야 합니다.
####RULES#####
#UDP ALERTS
alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;)
#HTTP ALERTS
alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;)
#ICMP ALERTS
alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;)
#TCP ALERTS
alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;)
참고: 표준 규칙 파일은 일반적으로 /etc/suricata/rules/
또는 /var/lib/suricata/rules
에 있습니다. 2단계에서는 이 실습을 위해 이를 다른 위치로 재구성했습니다.
작업 7. 패킷 미러링 정책 구성
이 섹션에서는 Cloud Shell로 돌아갑니다.
패킷 미러링 정책 설정은 간단한 명령어 하나로(또는 GUI에서 '마법사'를 진행하여) 완료할 수 있습니다. 이 명령어에서는 패킷 미러링 설명 섹션에서 언급하는 5가지 속성을 모두 지정합니다.
- 리전
- VPC 네트워크
- 미러링된 소스
- 수집기(대상)
- 미러링된 트래픽(필터)
'미러링된 트래픽'이 언급되지 않는다는 사실을 알아차리셨을 것입니다. 정책이 '전체' 트래픽을 미러링하도록 구성되며 필터가 필요하지 않기 때문입니다. 이 정책은 인그레스 트래픽과 이그레스 트래픽을 모두 미러링하고 수집기 ILB의 일부인 Suricata IDS 기기로 전달합니다.
-
Cloud Shell에서 다음을 실행하여 패킷 미러링 정책을 구성합니다.
gcloud compute packet-mirrorings create mirror-dm-stamford-web \
--collector-ilb=ilb-dm-stamford-suricata-ilb-{{{project_0.default_region | REGION}}} \
--network=dm-stamford \
--mirrored-subnets=dm-stamford-{{{project_0.default_region | REGION}}} \
--region={{{project_0.default_region | REGION}}}
이제 패킷 미러링 및 Suricata 구성이 완료됩니다. 다음 섹션에서는 두 항목 모두를 테스트합니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
패킷 미러링 정책 구성
작업 8. 패킷 미러링 테스트
이 섹션에서는 IDS VM 셸에 액세스해야 합니다. 셸 창이 아직 열려 있으면 그 창을 사용하세요. 셸 창이 닫혔다면 다시 연결하세요.
또한 '인터넷 클라이언트' 역할을 할 Cloud Shell도 사용하게 됩니다.
몇 분 동안 두 웹 VM의 외부 IP를 찾아보세요.
Cloud 콘솔의 탐색 메뉴에서 Compute Engine > VM 인스턴스를 클릭하고 두 웹 VM의 외부 IP를 기록합니다. 두 요소를 각각 [PUBLIC_IP_WEB1]과 [PUBLIC_IP_WEB2]라고 지칭합니다.
동일한 정보를 Cloud Shell의 gcloud
명령어를 통해 수집할 수도 있습니다.
gcloud compute instances list
IDS VM 셸로 돌아가기
패킷 미러링 테스트
- 다음 필터를 사용하여 IDS/Suricata VM에서 패킷 캡처(tcpdump)를 실행합니다.
sudo tcpdump -i ens4 -nn -n "(icmp or port 80) and net 172.21.0.0/24"
참고: 172.21.0.0/24 네트워크는 '미러링된' 서브넷이며 IDS VM은 이 서브넷에 속하지 않습니다. 패킷 미러링이 올바르게 구성되었다면 IDS VM은 이 서브넷의 미러링된 트래픽을 수신해야 합니다.
'미러링된' 서브넷으로 가는 트래픽 생성
-
Cloud Shell 터미널을 사용하여, WEB1에 할당된 공개 주소를 핑합니다. 이렇게 하면 [PUBLIC_IP_WEB1]이 Cloud 콘솔에 표시된 'WEB1'의 공개 IP 주소로 바뀝니다.
sudo apt install iputils-ping
ping -c 4 [PUBLIC_IP_WEB1]
패킷 미러링은 이 트래픽을 복제하여 IDS VM으로 전달해야 하며, 1단계의 패킷 캡처에서 이를 확인할 수 있습니다. IDS VM의 출력은 다음과 비슷해야 하며, 여기서 X.X.X.X는 ICMP 요청의 소스 IP 주소입니다. tcpdump 출력에는 '웹 서버'의 비공개 IP가 표시되어야 합니다. Google Cloud가 에지에서 네트워크 변환을 수행합니다.
00:55:32.980666 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 0, length 64
00:55:32.980801 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 0, length 64
00:55:33.968920 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 1, length 64
00:55:33.968965 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 1, length 64
00:55:34.980472 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 2, length 64
00:55:34.980521 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 2, length 64
00:55:35.986354 IP X.X.X.X > 172.21.0.2: ICMP echo request, id 3399, seq 3, length 64
00:55:35.986445 IP 172.21.0.2 > X.X.X.X: ICMP echo reply, id 3399, seq 3, length 64
WEB2의 공개 주소를 핑해도 같은 결과가 나옵니다.
- WEB2에 할당된 공개 주소를 핑하여 [PUBLIC_IP_WEB2]를 'WEB2'의 공개 IP 주소로 바꿉니다.
ping -c 4 [PUBLIC_IP_WEB2]
패킷 미러링은 이 트래픽을 IDS VM으로 전달해야 하며, 1단계의 패킷 캡처에서 이를 확인할 수 있습니다. IDS VM의 출력은 다음과 비슷해야 합니다. tcpdump 출력에는 '웹 서버'의 비공개 IP가 표시되어야 합니다. Google Cloud가 에지에서 네트워크 변환을 수행합니다.
00:00:45.309407 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 0, length 64
00:00:45.309736 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 0, length 64
00:00:46.309406 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 1, length 64
00:00:46.309602 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 1, length 64
00:00:47.306278 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 2, length 64
00:00:47.306406 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 2, length 64
00:00:48.314506 IP X.X.X.X > 172.21.0.3: ICMP echo request, id 25159, seq 3, length 64
00:00:48.314698 IP 172.21.0.3 > X.X.X.X: ICMP echo reply, id 25159, seq 3, length 64
패킷 미러링이 계층 3 헤더 이상을 보여준다는 사실을 더 잘 확인할 수 있도록, 다음 테스트에서는 '웹 서버' 중 하나에 대한 표준 HTTP GET을 보여줍니다(초기 TCP 3방향 핸드셰이크 포함).
-
브라우저에서 새 탭을 열고 HTTP 프로토콜을 사용해 WEB1에 할당된 공개 주소를 엽니다. Cloud 콘솔의 'curl' 유틸리티를 사용할 수도 있습니다.
-
[PUBLIC_IP_WEB1]을 'WEB1'의 공개 IP 주소로 바꿉니다.
http://[PUBLIC_IP_WEB1]/
패킷 미러링은 이 트래픽을 IDS VM으로 전달해야 하며, 1단계의 패킷 캡처에서 이를 확인할 수 있습니다.
IDS VM의 출력은 다음과 비슷해야 합니다.
00:00:46.761748 IP X.X.X.60835 > 172.21.0.2.80: Flags [S]...
00:00:46.763037 IP 172.21.0.2.80 > X.X.X.60835: Flags [S.], ... ack ...
00:00:46.816407 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
00:00:46.823624 IP X.X.X.60835 > 172.21.0.2.80: Flags [P.], ... HTTP: GET / HTTP/1.1
00:00:46.823832 IP 172.21.0.2.80 > X.X.X.60835: Flags [.], ack ...
00:00:46.824549 IP 172.21.0.2.80 > X.X.X.60835: Flags [P.], ... HTTP: HTTP/1.1 200 OK
00:00:46.879214 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
00:00:46.888477 IP X.X.X.60835 > 172.21.0.2.80: Flags [F.], ...
00:00:46.888662 IP 172.21.0.2.80 > X.X.X.60835: Flags [F.], ... ack...
00:00:46.943915 IP X.X.X.60835 > 172.21.0.2.80: Flags [.], ack ...
- WEB2의 공개 주소로 이동해도 같은 결과가 나옵니다. [PUBLIC_IP_WEB2]를 'WEB2'의 공개 IP 주소로 바꿉니다.
http://[PUBLIC_IP_WEB2]/
패킷 미러링은 이 트래픽을 IDS VM으로 전달해야 하며, 1단계의 패킷 캡처에서 이를 확인할 수 있습니다.
IDS VM의 출력은 다음과 비슷해야 합니다.
00:00:58.819740 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [S]...
00:00:58.820027 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [S.], ... ack ...
00:00:58.875301 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...
00:00:58.875329 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [P.], ... HTTP: GET / HTTP/1.1
00:00:58.875448 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [.], ack ...
00:00:58.876204 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [P.], ... HTTP: HTTP/1.1 200 OK
00:00:58.929015 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...
00:00:58.929047 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [F.], ...
00:00:58.929244 IP 172.21.0.3.80 > X.X.X.X.62335: Flags [F.], ... ack...
00:00:58.993844 IP X.X.X.X.62335 > 172.21.0.3.80: Flags [.], ack ...
IDS VM에서 ctrl+c
를 입력하여 tcpdump를 종료합니다.
작업 9. Suricata IDS 검사 및 알림 테스트
이 실습의 마지막 섹션에서는 패킷 미러링과 오픈소스 IDS Suricata 통합을 테스트합니다. 잠시 시간을 내어 'Suricata 구성 및 검토' 섹션의 4단계에서 알림으로 설정된 Suricata 규칙 4개를 검토하세요.
####RULES#####
#UDP ALERTS
alert udp $HOME_NET any -> 8.8.8.8 53 (msg:"BAD UDP DNS REQUEST"; sid:99996; rev:1;)
#HTTP ALERTS
alert http any any -> $HOME_NET 80 (msg:"BAD HTTP PHP REQUEST"; http.uri; content:"index.php"; sid:99997; rev:1;)
#ICMP ALERTS
alert icmp any any -> $HOME_NET any (msg:"BAD ICMP"; sid:99998; rev:1;)
#TCP ALERTS
alert tcp $HOME_NET any -> any 6667 (msg:"BAD TCP 6667 REQUEST"; sid:99999; rev:1;)
다음 4단계를 수행해 이러한 각 규칙을 트리거하는 네트워크 트래픽을 생성합니다. 각 규칙에 대한 알림이 Suricata 이벤트 로그 파일에 표시됩니다.
참고: IDS VM과 '웹 서버' VM 모두에 대한 SSH 창을 열었는지 확인하세요. 이 섹션을 완료하려면 '두 창'을 동시에 확인해야 합니다.
TEST1과 TEST2는 '웹 서버'에서 시작되고 이그레스 트래픽을 테스트합니다.
TEST3 및 TEST4는 Cloud Shell에서 시작되고 인그레스 트래픽을 테스트합니다.
테스트 1: 이그레스 UDP 규칙/알림 테스트
-
웹 서버 중 하나에서 다음 명령어를 실행하여 이그레스 DNS 트래픽을 생성합니다.
dig @8.8.8.8 example.com
- 이제 IDS VM의 Suricata 이벤트 로그 파일에서 알림을 확인합니다.
IDS VM의 SSH 창으로 전환
- IDS VM의 SSH 창에서 다음 명령어를 실행합니다.
egrep "BAD UDP DNS" /var/log/suricata/eve.json
로그 항목은 다음과 비슷해야 합니다.
@GCP: {"timestamp":"2020-08-14T01:23:14.903210+0000","flow_id":412864167987242,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":47020,"dest_ip":"8.8.8.8","dest_port":53,"proto":"UDP","alert":{"action":"allowed","gid":1,"signature_id":99996,"rev":1,"signature":"BAD UDP DNS REQUEST","category":"","severity":3},"dns":{"query":[{"type":"query","id":17268,"rrname":"EXAMPLE.COM","rrtype":"A","tx_id":0}]},"app_proto":"dns","flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":82,"bytes_toclient":0,"start":"2020-08-19T18:23:14.903210+0000"}}
테스트 2: 이그레스 'TCP' 규칙/알림 테스트
-
웹 서버 중 하나에서 다음 명령어를 실행하여 이그레스 TCP 트래픽을 생성하고 [PUBLIC_IP_WEB2]를 'WEB2'의 공개 IP 주소로 바꿉니다.
telnet [PUBLIC_IP_WEB2] 6667
-
ctrl+c
를 입력하여 종료합니다.
-
이제 IDS VM의 Suricata 이벤트 로그 파일에서 알림을 확인합니다.
IDS VM의 SSH 창으로 전환
- IDS VM의 SSH 창에서 다음 명령어를 실행합니다.
egrep "BAD TCP" /var/log/suricata/eve.json
로그 항목은 다음과 비슷해야 합니다.
@GCP: {"timestamp":"2020-08-14T01:27:45.058526+0000","flow_id":479376049300638,"in_iface":"ens4","event_type":"alert","src_ip":"172.21.0.2","src_port":36168,"dest_ip":"100.64.1.1","dest_port":6667,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":99999,"rev":1,"signature":"BAD TCP 6667 REQUEST","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":74,"bytes_toclient":0,"start":"2020-08-19T18:27:45.058526+0000"}}
테스트 3: 인그레스 'ICMP' 규칙/알림 테스트
-
Cloud Shell에서 다음 명령어를 실행하여 인그레스 ICMP 트래픽을 생성합니다.
-
[PUBLIC_IP_WEB1]을 'WEB1'의 공개 IP 주소로 바꿉니다.
ping -c 3 [PUBLIC_IP_WEB1]
- 이제 IDS VM의 Suricata 이벤트 로그 파일에서 알림을 확인합니다.
egrep "BAD ICMP" /var/log/suricata/eve.json
로그 항목은 다음과 비슷해야 합니다.
@GCP: {"timestamp":"2020-08-14T01:24:46.065250+0000","flow_id":1114966772874978,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","dest_ip":"172.21.0.2","proto":"ICMP","icmp_type":8,"icmp_code":0,"alert":{"action":"allowed","gid":1,"signature_id":99998,"rev":1,"signature":"BAD ICMP","category":"","severity":3},"flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":98,"bytes_toclient":0,"start":"2020-08-19T18:24:46.065250+0000"}}
테스트 4: 인그레스 'HTTP' 규칙/알림 테스트
로컬 워크스테이션의 웹브라우저 또는 Cloud Shell의 curl
을 사용하여, HTTP 프로토콜을 통해 index.php 페이지의 WEB1에 할당된 공개 주소를 탐색합니다.
- [PUBLIC_IP_WEB1]을 'WEB1'의 공개 IP 주소로 바꿉니다.
http://[PUBLIC_IP_WEB1]/index.php
- 이제 IDS VM의 Suricata 이벤트 로그 파일에서 알림을 확인합니다.
egrep "BAD HTTP" /var/log/suricata/eve.json
로그 항목은 다음과 비슷해야 합니다.
@GCP: {"timestamp":"2020-08-14T01:26:36.794124+0000","flow_id":1901424684045611,"in_iface":"ens4","event_type":"alert","src_ip":"X.X.X.X","src_port":61132,"dest_ip":"172.21.0.3","dest_port":80,"proto":"TCP","tx_id":0,"alert":{"action":"allowed","gid":1,"signature_id":99997,"rev":1,"signature":"BAD HTTP PHP REQUEST","category":"","severity":3},"http":{"hostname":"PUBLIC_IP_WEB1","url":"\/index.php","http_user_agent":"curl\/7.64.1","http_content_type":"text\/html","http_method":"GET","protocol":"HTTP\/1.1","status":404,"length":275},"app_proto":"http","flow":{"pkts_toserver":7,"pkts_toclient":6,"bytes_toserver":658,"bytes_toclient":1284,"start":"2020-08-19T18:26:36.660779+0000"}}
수고하셨습니다
Google Cloud 패킷 미러링을 오픈소스 IDS Suricata와 함께 사용하는 실습을 완료했습니다.
다음 단계/더 학습하기
패킷 미러링에 관한 자세한 내용은 다음을 참고하세요.
Suricata에 관한 자세한 내용은 https://suricata-ids.org/를 참고하세요.
Google Cloud 교육 및 자격증
Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.
설명서 최종 업데이트: 2024년 11월 18일
실습 최종 테스트: 2023년 9월 6일
Copyright 2025 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.