
블루팀 탐지 연구소 - Terraform과 Ansible을 사용하여 Azure에서 생성됨.
이 프로젝트는 오케스트레이션된 BlueTeam Lab을 생성하기 위한 Terraform 및 Ansible 스크립트 세트를 포함합니다. 이 프로젝트의 목표는 레드 팀과 블루 팀이 최신 Windows 환경에서 다양한 공격 및 포렌식 아티팩트를 테스트하기 위해 임시 탐지 랩을 배포하고, 생성된 데이터에 대한 'SOC와 유사한' 관점을 얻을 수 있도록 하는 것입니다.
참고: 이 랩은 의도적으로 안전하지 않게 설계되었습니다. 이 시스템을 중요하게 생각하는 네트워크에 연결하지 마십시오.

이 설정을 사용하려면 시스템에 여러 기능이 설치되어 있어야 합니다.
# 1단계 - Azure CLI 설치. 자세한 내용은 https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt 참조
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# 2단계 - Terraform 설치. 자세한 내용은 https://learn.hashicorp.com/tutorials/terraform/install-cli 참조
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
# 3단계 - Ansible 설치. 자세한 내용은 https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html 참조
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt update
sudo apt install ansible
# 4단계 - 마지막으로 원격 연결 및 기타 활동에 필요한 Python 및 다양한 패키지 설치
sudo apt install python3 python3-pip
pip3 install pywinrm requests msrest msrestazure azure-cli
pip3 install -r https://raw.githubusercontent.com/ansible-collections/azure/refs/heads/dev/requirements.txt
모든 사전 요구 사항이 설치된 후 다음 단계를 수행하십시오:
# 액세스 토큰이 유효한지 확인하기 위해 명령줄에서 Azure에 로그인
az login
# 저장소 복제 및 BlueTeam.Lab 폴더로 이동
git clone https://github.com/op7ic/BlueTeam.Lab.git && cd BlueTeam.Lab
# Terraform 초기화 및 계획 시작
terraform init && terraform plan
# 다음 명령을 사용하여 랩 생성
terraform apply -auto-approve
# Ansible을 사용하여 환경 구성 확인
cd ansible && ANSIBLE_CONFIG=./ansible.cfg ansible-inventory --graph -i inventory.azure_rm.yml -vvv && cd ../
# 개별 호스트의 IP 및 기타 설정 세부 정보를 보려면 다음 명령 사용:
cd ansible && ANSIBLE_CONFIG=./ansible.cfg ansible-inventory -i inventory.azure_rm.yml -vvv --list && cd ../
# 완료 후 다음 명령을 사용하여 랩 제거:
terraform destroy -auto-approve
# 실행 시간을 측정하려면 다음 명령 사용:
start_time=`date +%s` && terraform apply -auto-approve && end_time=`date +%s` && echo execution time was `expr $end_time - $start_time` s
#참고: 선택한 하드웨어에 따라 전체 구성에 약 2시간이 소요됩니다.
Terraform 변수는 이 배포에 사용되는 운영 체제 유형을 설정합니다. 런타임 변수를 간단히 수정하여 전체 Active Directory(AD)를 실행할 다른 OS를 지정할 수 있습니다. 기본 옵션은 워크스테이션에 Windows 10 Enterprise를 사용하고 도메인 컨트롤러에 Windows Server 2019 Datacenter를 사용하는 것입니다. 다음은 전체 환경을 다른 OS 버전으로 수정하는 데 사용할 수 있는 몇 가지 일반적인 구성 옵션의 예입니다:
# 워크스테이션에는 Windows 10 Enterprise, DC에는 Server 2019 Datacenter 사용 (기본 옵션)
terraform apply -auto-approve
# 워크스테이션에는 Windows 11 Enterprise, DC에는 Server 2019 Datacenter 사용
terraform apply -auto-approve -var="workstation_os=Windows-11" -var="workstation_SKU=win11-21h2-ent" -var="workstations_vm_size=Standard_DC2s_v2"
# 워크스테이션에는 Windows 11 Enterprise, DC에는 Server 2012 Datacenter 사용
terraform apply -auto-approve -var="workstation_os=Windows-11" -var="workstation_SKU=win11-21h2-ent" -var="workstations_vm_size=Standard_DC2s_v2" -var="dc_os=WindowsServer" -var="dc_SKU=2012-Datacenter"
# 워크스테이션에는 Windows 11 Enterprise, DC에는 Server 2016 Datacenter 사용
terraform apply -auto-approve -var="workstation_os=Windows-11" -var="workstation_SKU=win11-21h2-ent" -var="workstations_vm_size=Standard_DC2s_v2" -var="dc_os=WindowsServer" -var="dc_SKU=2016-Datacenter"
# 워크스테이션에는 Windows 10 Pro N, DC에는 Server 2012 Datacenter 사용
terraform apply -auto-approve -var="workstation_os=Windows-10" -var="workstation_SKU=21h1-pron" -var="dc_os=WindowsServer" -var="dc_SKU=2012-Datacenter"
명령어 az vm image list를 사용하여 배포에 사용 가능한 다양한 OS 버전을 확인할 수 있습니다.
다음 섹션에서는 이 랩을 구성하는 다양한 구성 요소와 설정을 수정하기 위해 구성 파일을 변경하는 방법에 대한 세부 정보를 설명합니다:
랩이 구축되면 Terraform이 시스템의 실제 위치와 관련 자격 증명을 출력합니다. 아래 예시 출력을 확인할 수 있습니다.
Network Setup:
Domain Controller = xx.xx.xx.xx
Workstation DETECTION1: xx.xx.xx.xx
Workstation DETECTION2: xx.xx.xx.xx
Wazuh Server IP = xx.xx.xx.xx
Wazuh Web Interface = https://xx.xx.xx.xx:443/
Velociraptor Web Inteface: = https://xx.xx.xx.xx:10000/
FleetDM Web Interface: = https://xx.xx.xx.xx:9999/
Credentials:
Domain Admin:
blueteam.lab\blueteam BlueTeamDetection0%%%
Local Admin on Workstations:
blueteam BlueTeamDetection0%%%
Wazuh Server SSH Login:
blueteam BlueTeamDetection0%%%
Wazuh Logins:
wazuh BlueTeamDetection0%%%
admin BlueTeamDetection0%%%
kibanaserver BlueTeamDetection0%%%
kibanaro BlueTeamDetection0%%%
logstash BlueTeamDetection0%%%
readall BlueTeamDetection0%%%
snapshotrestore BlueTeamDetection0%%%
wazuh_admin BlueTeamDetection0%%%
wazuh_user BlueTeamDetection0%%%
Velociraptor Web Inteface Login:
blueteam BlueTeamDetection0%%%
FleetDM Web Inteface Login:
[email protected] BlueTeamDetection0%%%
RDP to Domain Controller:
xfreerdp /v:xx.xx.xx.xx /u:blueteam.lab\\blueteam '/p:BlueTeamDetection0%%%' +clipboard /cert-ignore
RDP to Workstation DETECTION1: xx.xx.xx.xx
xfreerdp /v:xx.xx.xx.xx /u:blueteam '/p:BlueTeamDetection0%%%' +clipboard /cert-ignore
RDP to Workstation DETECTION2: xx.xx.xx.xx
xfreerdp /v:xx.xx.xx.xx /u:blueteam '/p:BlueTeamDetection0%%%' +clipboard /cert-ignore
다음 표는 기본 구성에서 BlueTeamLab 환경 전반에 적용된 방화벽 규칙 세트를 요약합니다. 필요에 따라 방화벽 규칙 설정 섹션의 main.tf 파일을 수정하여 새 방화벽 규칙을 추가하십시오.
내부적으로 이 환경의 기본 구성에서는 10.0.0.0/16 범위의 다음 정적 IP 및 호스트 이름이 사용됩니다:
설치 중에 다음 기본 자격 증명이 생성됩니다. 전체 배포 프로세스가 완료된 후 실제 구성된 자격 증명의 출력이 표시됩니다.
기본 자격 증명을 수정하려면 domain_setup.yml 파일에서 사용자 이름과 비밀번호를 변경하십시오.







기여, 수정 및 개선 사항은 이 프로젝트에 GitHub 이슈 또는 풀 리퀘스트로 직접 제출할 수 있습니다.
| - ansible
| | - ansible.cfg
| | - domain-controller.yml
| | - domain-member.yml
| | - domain_setup.yml
| | - group_vars
| | | - all
| | | - wazuh
| | - inventory.azure_rm.yml
| | - roles
| | | - domain-controller
| | | | - tasks
| | | | | - main.yml
| | | - domain-member
| | | | - tasks
| | | | | - main.yml
| | | - fleetserver
| | | | - tasks
| | | | | - main.yml
| | | | - templates
| | | | | - config.yml.j2
| | | | | - ssl.crt
| | | | | - ssl.key
| | | | | - systemd-fleetm.service.j2
| | | - monitor
| | | | - tasks
| | | | | - main.yml
| | | - osqueryagent
| | | | - tasks
| | | | | - main.yml
| | | | - templates
| | | | | - osquery.conf
| | | | | - osquery.flags.j2
| | | | | - osquery.key.j2
| | | | | - ssl.crt
| | | | | - ssl.key
| | | | - vars
| | | | | - main.yml
| | | - sysmon
| | | | - handlers
| | | | | - main.yml
| | | | - tasks
| | | | | - main.yml
| | | | - vars
| | | | | - main.yml
| | | - velociraptorclient
| | | | - tasks
| | | | | - main.yaml
| | | | - templates
| | | | | - clientconfig.yml.j2
| | | | - vars
| | | | | - main.yml
| | | - velociraptorserver
| | | | - tasks
| | | | | - main.yaml
| | | | - templates
| | | | | - serverconfig.yml.j2
| | | | | - systemd-velociraptor.service.j2
| | | | - vars
| | | | | - main.yml
| | | - wazuhagent
| | | | - tasks
| | | | | - main.yml
| | | | - templates
| | | | | - ossec.conf.j2
| | | | - vars
| | | | | - main.yml
| | | - wazuhserver
| | | | - tasks
| | | | | - main.yaml
| | | | - templates
| | | | | - sysmon_rules.xml
| | | | | - unattended-installation.sh
| | | | | - wazuh-passwords-tool.sh.j2
| | | - winlogbeat
| | | | - tasks
| | | | | - main.yml
| | | | - templates
| | | | | - config.yml.j2
| | | | - vars
| | | | | - main.yml
| | - wazuh-server.yml
| - documentation
| | - osquery.md
| | - pic
| | | - map.png
| | | - wazuh-logs.PNG
| | | - wazuh-pdc.PNG
| | | - winlogbeat.PNG
| | - sysmon.md
| | - velociraptor.md
| | - wazuh.md
| | - winlogbeat.md
| | - winmember.md
| - main.tf
| - README.md
| - terraform.tfstate
| - terraform.tfstate.backup
| - variables.tf
Disk wks-1-os-disk already exists in resource group BLUETEAM-LAB. Only CreateOption.Attach is supported. 또는 이와 유사한 오류가 발생합니다.
terraform destroy -auto-approve && terraform apply -auto-approve를 다시 실행하여 랩을 제거하고 다시 만드십시오. 이 오류는 Azure가 모든 디스크를 제대로 정리하지 않아 동일한 이름의 리소스가 남아 있을 때 발생하는 것으로 보입니다.Operation 'startTenantUpdate' is not allowed on VM 'domain-controller' since the VM is marked for deletion. You can only retry the Delete operation (or wait for an ongoing one to complete). 또는 이와 유사한 오류가 발생합니다.
terraform destroy -auto-approve && terraform apply -auto-approve를 다시 실행하여 랩을 제거하고 다시 만드십시오. 이 오류는 Azure가 모든 리소스를 제대로 정리하지 않아 이름 또는 위치 충돌로 인해 랩 생성 전에 제거해야 할 잔여 리소스가 남아 있을 때 발생하는 것으로 보입니다.Network security group windows-nsg cannot be deleted because old references for the following Nics 또는 이와 유사한 오류가 발생합니다.
terraform destroy -auto-approve && terraform apply -auto-approve를 다시 실행하여 랩을 제거하고 다시 만드십시오. 이 오류는 Azure가 모든 리소스를 제대로 정리하지 않아 이름 또는 위치 충돌로 인해 랩 생성 전에 제거해야 할 잔여 리소스가 남아 있을 때 발생하는 것으로 보입니다.왜 Azure인가요?
이 코드의 상당 부분은 Christophe Tafani-Dereeper의 Adaz에서 차용하여 수정했습니다. 이 랩 환경을 설계할 수 있는 기반을 마련해 주신 것에 대해 큰 감사를 드립니다.
| 규칙 이름 | 네트워크 보안 그룹 | 소스 호스트 | 소스 포트 | 대상 호스트 | 대상 포트 |
|---|
| Allow-RDP | windows-nsg | 내 공인 IP | * | PDC-1, DETECTION1, DETECTION2 | 3389 |
| Allow-WinRM | windows-nsg | 내 공인 IP | * | PDC-1, DETECTION1, DETECTION2 | 5985 |
| Allow-WinRM-secure | windows-nsg | 내 공인 IP | * | PDC-1, DETECTION1, DETECTION2 | 5986 |
| Allow-SMB | windows-nsg | 내 공인 IP | * | PDC-1, DETECTION1, DETECTION2 | 445 |
| Allow-SSH | wazuh-nsg | 내 공인 IP | * | Wazuh | 22 |
| Allow-Wazuh-Manager | wazuh-nsg | 내 공인 IP | * | Wazuh | 1514-1516 |
| Allow-Wazuh-Elasticsearch | wazuh-nsg | 내 공인 IP | * | Wazuh | 9200 |
| Allow-Wazuh-API | wazuh-nsg | 내 공인 IP | * | Wazuh | 55000 |
| Allow-Elasticsearch-Cluster | wazuh-nsg | 내 공인 IP | * | Wazuh | 9300-9400 |
| Allow-Wazuh-GUI | wazuh-nsg | 내 공인 IP | * | Wazuh | 443 |
| Allow-Velociraptor-Client-Connections | wazuh-nsg | 내 공인 IP | * | Wazuh | 8000 |
| Allow-Velociraptor-GUI | wazuh-nsg | 내 공인 IP | * | Wazuh | 10000 |
| Allow-Fleet-GUI | wazuh-nsg | 내 공인 IP | * | Wazuh | 9999 |
| 호스트 | 역할 | 내부 IP |
|---|
| PDC-1 | 기본 도메인 컨트롤러 | 10.0.10.10 |
| Wazuh | Wazuh Server, Velocidex Velociraptor 설치 및 FleetDM도 호스팅 | 10.0.10.100 |
| DETECTION1 | Windows 10 워크스테이션 1 | 10.0.11.11 |
| DETECTION2 | Windows 10 워크스테이션 2 | 10.0.11.12 |
| 호스트 | 로그인 | 비밀번호 | 역할 |
|---|
| PDC-1 | blueteam.lab\blueteam | BlueTeamDetection0%%% | blueteam.lab 도메인의 도메인 관리자 |
| DETECTION1 | localadministrator | BlueTeamDetection0%%% | DETECTION1 워크스테이션의 로컬 관리자 |
| DETECTION2 | localadministrator | BlueTeamDetection0%%% | DETECTION2 워크스테이션의 로컬 관리자 |
| Wazuh | blueteam | BlueTeamDetection0%%% | Wazuh 서버 SSH 자격 증명 |
| Wazuh | wazuh | BlueTeamDetection0%%% | Wazuh 관리자 |
| Wazuh | admin | BlueTeamDetection0%%% | Wazuh 관리자 |
| Wazuh | kibanaserver | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | kibanaro | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | logstash | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | readall | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | snapshotrestore | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | wazuh_admin | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | wazuh_user | BlueTeamDetection0%%% | Wazuh 서비스 계정 |
| Wazuh | blueteam | BlueTeamDetection0%%% | Velociraptor 웹 포털 로그인 |
| Wazuh | [email protected] | BlueTeamDetection0%%% | FleetDM 웹 포털 로그인 |
네트워크 세그먼트, 배포 규모 또는 기타 변수를 어떻게 수정하나요?
특정 배포에 대한 SKU를 찾는 방법은 무엇인가요?
az vm list-skus --location westeurope --all --output table을 사용하여 배포에 사용 가능한 SKU를 찾으십시오.시스템 구축 중에 Max retries exceeded with url: /wsman 오류가 발생하고 연결이 거부됩니다.
terraform apply -auto-approve를 다시 실행하여 손상된 호스트를 복구하십시오.