JINIers
[Qwiklabs] Google Cloud Packet Mirroring with OpenSource IDS 본문
오픈 소스 IDS를 사용한 google cloud 패킷 미러링
트래픽 미러링 : 보안 및 네트워크 분석을 위한 google cloud 네트워킹의 핵심 기능
※유의※
Packet Mirroring : 각 패킷의 전체 페이로드를 캡쳐하므로 추가 대역폭을 소비한다.
샘플링 주기를 기반으로 하지 않기 때문에 더 나은 문제해결, 보안 솔루션 및 상위계층 응용 프로그램 기반 분석에 사용할 수 있음
패킷 미러링 정책을 기반으로 한다.
- Region
- VPC Network(s)
- Mirrored Source(s)
- Collector (destination)
- Mirrored traffic (filter)
고려사항
- TCP, UDP 및 ICMP 트래픽만 미러링 가능
- Mirrored Source(s)와 Collector (destination)는 동일한 지역에 있어야하지만, 해당 vpc가 적절하게 피어링 되는 다른 영역 및 다른 vpc에도 있을 수 있음
- 영역간 추가 대역폭 요금 적용
- 미러링 되는 트래픽을 제한하기 위해 필터를 사용할 수 있음
** IDS에 많이 사용된다.
실습설명
패킷 미러링 사용방법을 보여준다.
- ↑ 그림처럼 google cloud networking 환경 구축
- web servers 역할의 2개 가상머신 생성
- ids 역할의 단일 가상머신 생성
- 패킷 미러링을 위한 Collector 역할을 하는 내부 로드밸런서(ILB) 생성
- IDS VM에 오픈소스 IDS(suricata) 설치 및 구성
- 몇가지 기본 ids 경고 규칙 검토
- 패킷 미러 정책 생성 등
1. 네트워킹 공간 구축
[가상 사설망 생성]
gcloud compute networks create dm-stamford \
--subnet-mode=custom
[us-west4의 미러링된 트래픽을 위해 vpc에 서브넷 추가]
gcloud compute networks subnets create dm-stamford-uswest4 \
--range=172.21.0.0/24 \
--network=dm-stamford \
--region=us-west4
[us-west4의 수집기용 vpc에 서브넷 추가]
gcloud compute networks subnets create dm-stamford-uswest4-ids \
--range=172.21.1.0/24 \
--network=dm-stamford \
--region=us-west4
2. 방화벽 규칙 및 Cloud NAT 만들기
[규칙1. 모든 소스의 모든 vm에 대한 표준 http포트(tcp 80) 및 icmp 프로토콜 허용]
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
[규칙2. ids가 모든 소스에서 모든 트래픽 수신 허용]
* 이후 섹션에서 ids vm에 공용 ip를 제공하지 않도록 주의할 것!
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
[규칙 3. 모든 vm에 대해 'google cloud iap proxy' ip 범위 tcp port 22 허용하여 cloud console을 통해 vm에 ssh 할 수 있도록 함]
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 router 생성]
* 전제조건 : cloud router는 해당지역에서 먼저 구성되어야함
gcloud compute routers create router-stamford-nat-west4 \
--region=us-west4 \
--network=dm-stamford
[cloud NAT 구성]
* 공용 ip 없이 vm에 대한 인터넷 액세스를 제공하려면 cloud nat를 생성해야함
gcloud compute routers nats create nat-gw-dm-stamford-west4 \
--router=router-stamford-nat-west4 \
--router-region=us-west4 \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
3. 가상머신 생성
[web server용 인스턴스 템플릿 생성]
gcloud compute instance-templates create template-dm-stamford-web-us-west4 \
--region=us-west4 \
--network=dm-stamford \
--subnet=dm-stamford-uswest4 \
--machine-type=g1-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'
[webServer에 대한 관리형 인스턴스 그룹 생성]
* 인스턴스 템플릿 이용 2개의 웹서버 생성
gcloud compute instance-groups managed create mig-dm-stamford-web-uswest4 \
--template=template-dm-stamford-web-us-west4 \
--size=2 \
--zone=us-west4-a
[IDS VM용 인스턴스 템플릿 생성]
* us-west4 에서 공개 ip가 없는 우분투 서버 준비
gcloud compute instance-templates create template-dm-stamford-ids-us-west4 \
--region=us-west4 \
--network=dm-stamford \
--no-address \
--subnet=dm-stamford-uswest4-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 생성
gcloud compute instance-groups managed create mig-dm-stamford-ids-uswest4 \
--template=template-dm-stamford-ids-us-west4 \
--size=1 \
--zone=us-west4-a
4. 내부 LoadBalancer 생성
[백엔드 서비스에 대한 기본 상태 확인]
gcloud compute health-checks create tcp hc-tcp-80 --port 80
[ILB에 사용할 백엔드 서비스 그룹 생성]
gcloud compute backend-services create be-dm-stamford-suricata-us-west4 \
--load-balancing-scheme=INTERNAL \
--health-checks=hc-tcp-80 \
--network=dm-stamford \
--protocol=TCP \
--region=us-west4
[생성된 ids 인스턴스 그룹 → 백엔드 서비스 그룹에 추가]
gcloud compute backend-services add-backend be-dm-stamford-suricata-us-west4 \
--instance-group=mig-dm-stamford-ids-uswest4 \
--instance-group-zone=us-west4-a \
--region=us-west4
[(컬렉션 엔드포인트 역할을 하는) 프런트엔드 전달 규칙 생성]
gcloud compute forwarding-rules create ilb-dm-stamford-suricata-ilb-us-west4 \
--load-balancing-scheme=INTERNAL \
--backend-service be-dm-stamford-suricata-us-west4 \
--is-mirroring-collector \
--network=dm-stamford \
--region=us-west4 \
--subnet=dm-stamford-uswest4-ids \
--ip-protocol=TCP \
--ports=all
5. 오픈소스 IDS 설치(Suricata)
mig-dm-stamford-ids-~ ssh >
sudo apt-get update -y
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
[수리카타 설치]
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt-get update -y
sudo apt-get install suricata -y
[설치확인]
suricata -V
6. Suricata 구성 및 검토
[백업]
mig-dm-stamford-ids-~ ssh >
sudo systemctl stop suricata
sudo cp /etc/suricata/suricata.yaml /etc/suricata/suricata.backup
[새 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
[수리카타 서비스 시작]
sudo systemctl start suricata
sudo systemctl restart suricata
[테스트를 위한 단순 수리카타 규칙 검토]
cat /etc/suricata/poc-rules/my.rules
-> 4개 규칙과 설명이 표시되어야함(udp, http, icmp, tcp)
7. 패킷 미러 정책 구성
패킷 미러정책 설정은 명령어 한번으로 완료할 수 있음
1. Region
2. VPC Network(s)
3. Mirrored Source(s)
4. Collector (destination)
5. Mirrored traffic (filter)
[패킷 미러링 정책 구성]
cloud shell >
gcloud compute packet-mirrorings create mirror-dm-stamford-web \
--collector-ilb=ilb-dm-stamford-suricata-ilb-us-west4 \
--network=dm-stamford \
--mirrored-subnets=dm-stamford-uswest4 \
--region=us-west4
8. 테스트 패킷 미러링
gcloud compute instances list
# vm 인스턴스 ip 확인
[테스트 패킷 미러링]
mig-dm-stamford-ids-~ ssh >
sudo tcpdump -i ens4 -nn -n "(icmp or port 80) and net 172.21.0.0/24"
[미러링된 서브넷에 대한 트래픽 생성]
mig-dm-stamford-ids-~ ssh >
ping -c 4 [PUBLIC_IP_WEB1]
ping -c 4 [PUBLIC_IP_WEB2]
http://[PUBLIC_IP_WEB1]/
http://[PUBLIC_IP_WEB2]/
하면 챱챱챱 뜬다.
패킷이 뜨긴 뜨네... 아주 느리게... 무슨 달팽이마냥..
20분 기다려서 얻긴 얻음..
하.. 진짜 성질 급하면 이거 기다리는 것도 일이다🤷♂️
9. 테스트 Suricata IDS 검사 및 경고
mig-dm-stamford-ids-~ ssh >
cat /etc/suricata/poc-rules/my.rules
[테스트 1 : Test egress UDP rule/alert]
웹서버 1 ssh >
dig @8.8.8.8 example.com
mig-dm-stamford-ids-~ ssh >
egrep "BAD UDP DNS" /var/log/suricata/eve.json
[테스트 2 : Test egress "TCP" rule/alert]
웹서버 1 ssh >
telnet 100.64.1.1 6667
후 종료 ctrl+c
mig-dm-stamford-ids-~ ssh >
egrep "BAD TCP" /var/log/suricata/eve.json
[테스트 3 : Test ingress "ICMP" rule/alert]
웹서버 1 ssh >
ping -c 3 web_server1_expternal_IP
mig-dm-stamford-ids-~ ssh >
egrep "BAD ICMP" /var/log/suricata/eve.json
[테스트 4 : Test ingress "HTTP" rule/alert]
웹서버 1 ssh >
http://[PUBLIC_IP_WEB1]/index.php
-> 홈페이지로 들어가야 로그가 뜸
mig-dm-stamford-ids-~ ssh >
egrep "BAD HTTP" /var/log/suricata/eve.json
끝
'GCP > Qwiklabs' 카테고리의 다른 글
Vertex AI: Qwik Start (0) | 2022.04.25 |
---|---|
[Qwiklabs] Configuring Private Google Access and Cloud NAT (0) | 2022.03.03 |
Create an Internal Load Balancer (0) | 2022.03.02 |
[Qwiklabs] HTTP Load Balancer with Cloud Armor (0) | 2022.03.02 |
[Qwiklabs] VPC Networks - Controlling Access (0) | 2022.02.28 |