
자동화된 에이전트의 상호작용을 추상적인 시뮬레이션 네트워크 환경에서 연구하기 위한 실험 및 연구 플랫폼입니다.
2021년 4월 8일: Microsoft Security Blog의 발표를 확인하세요.
CyberBattleSim은 시뮬레이션된 추상적인 기업 네트워크 환경에서 운영되는 자동화 에이전트들의 상호 작용을 연구하기 위한 실험 연구 플랫폼입니다. 이 시뮬레이션은 컴퓨터 네트워크와 사이버 보안 개념의 고수준 추상화를 제공합니다. Python 기반의 Open AI Gym 인터페이스를 통해 강화 학습 알고리즘을 사용하여 자동화 에이전트를 훈련할 수 있습니다.
시뮬레이션 환경은 고정된 네트워크 토폴로지와 에이전트가 네트워크 내에서 측면 이동(lateral movement)에 활용할 수 있는 취약점 집합으로 매개변수화됩니다. 공격자의 목표는 컴퓨터 노드에 심어진 취약점을 악용하여 네트워크의 일부를 소유하는 것입니다. 공격자가 네트워크 전체로 확산을 시도하는 동안, 방어자 에이전트는 네트워크 활동을 감시하고 발생하는 모든 공격을 탐지하여 공격자를 축출함으로써 시스템에 미치는 영향을 완화하려고 합니다. 우리는 사전 정의된 성공 확률을 기반으로 진행 중인 공격을 탐지하고 완화하는 기본적인 확률적 방어자를 제공합니다. 완화는 감염된 노드를 재이미징(re-imaging)하는 방식으로 구현되며, 이 과정은 여러 시뮬레이션 단계에 걸쳐 추상적으로 모델링됩니다.
에이전트의 성능을 비교하기 위해 두 가지 지표를 살펴봅니다: 목표 달성에 소요된 시뮬레이션 단계 수와 훈련 에포크에 걸친 시뮬레이션 단계별 누적 보상입니다.
이 프로젝트를 추상적인 시뮬레이션 네트워크 환경에서 자동화 에이전트의 상호 작용을 연구할 수 있는 실험 플랫폼으로 봅니다. 오픈소스화함으로써 연구 커뮤니티가 이러한 네트워크 환경에서 사이버 에이전트가 어떻게 상호 작용하고 진화하는지 조사하도록 장려하고자 합니다.
제공하는 시뮬레이션은 명백히 단순하지만 이는 장점이 있습니다. 매우 추상적인 특성으로 인해 실제 시스템에 직접 적용할 수 없으므로, 이를 사용하여 훈련된 자동화 에이전트의 잠재적인 악의적 사용을 방지하는 안전장치를 제공합니다. 동시에 단순성 덕분에 연구하고자 하는 특정 보안 측면에 집중하고 최신 기계 학습 및 AI 알고리즘을 빠르게 실험할 수 있습니다.
예를 들어, 현재 구현은 측면 이동 사이버 공격 기술에 초점을 맞추고 있으며, 네트워크 토폴로지와 구성이 이에 어떤 영향을 미치는지 이해하는 것을 목표로 합니다. 이러한 목표를 위해 실제 네트워크 트래픽을 모델링할 필요는 없다고 판단했습니다. 이는 우리 시스템의 주요 한계 중 하나일 뿐이며, 향후 기여자들이 해결하고자 할 수 있는 부분입니다.
알고리즘 측면에서는 몇 가지 기본 에이전트를 시작점으로 제공하지만, 최첨단 강화 학습 알고리즘이 이들과 어떻게 비교되는지 궁금합니다. 우리는 컴퓨터 시스템 고유의 큰 행동 공간이 비디오 게임이나 로봇 제어와 같은 다른 응용 분야와 달리 강화 학습에 특히 어려운 과제임을 발견했습니다. 자격 증명을 저장하고 검색할 수 있는 에이전트를 훈련하는 것은 일반적으로 내부 메모리가 없는 에이전트를 특징으로 하는 RL 기술을 적용할 때 또 다른 도전 과제입니다. 이것들은 시뮬레이션이 벤치마킹 목적으로 사용될 수 있는 또 다른 연구 분야입니다.
관심 있는 다른 분야로는 자율 사이버 보안 시스템의 책임감 있고 윤리적인 사용이 있습니다: 방어자 에이전트에게 본질적인 이점을 제공하는 기업 네트워크를 설계하는 방법은? 자율 사이버 공격으로부터 기업을 방어하기 위한 안전한 연구를 수행하면서, 그러한 기술의 악의적 사용을 방지하는 방법은?
프로젝트 빠른 소개를 읽어보세요.
| 유형 | 브랜치 | 상태 |
|---|---|---|
| CI | master | |
| Docker 이미지 | master |
벤치마크 문서를 참조하세요. 최신 실행 결과가 포함된 Jupyter 노트북은 전용 태그 아래 /notebooks/benchmarks (latest_benchmark)에 체크인되어 있습니다.
Linux 환경(직접 또는 Windows에서 WSL을 통해)에서 작업하는 것이 강력히 권장됩니다. Windows에서 직접 Python을 실행해도 작동해야 하지만 더 이상 지원되지 않습니다.
저장소를 체크아웃하는 것으로 시작하세요:
git clone https://github.com/microsoft/CyberBattleSim.git
노트북에서 papermill을 실행할 때(또는 orca --help를 실행할 때) 다음과 같은 오류가 발생하는 경우:
/home/wiblum/miniconda3/envs/cybersim/lib/orca_app/orca: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
또는 libgdk_pixbuf-2.0.so.0과 같은 다른 공유 라이브러리 오류가 발생하면 다음 명령을 실행하세요:
sudo apt install libnss3-dev libgtk-3-0 libxss1 libasound2-dev libgtk2.0-0 libgconf-2-4
지침은 Linux Ubuntu 배포판(네이티브 및 WSL 모두)에서 테스트되었습니다.
conda가 아직 설치되지 않은 경우 install_conda.sh 스크립트를 실행하여 설치해야 합니다.
bash install-conda.sh
이 작업이 완료되면 새 터미널을 열고 초기화 스크립트를 실행하세요:
bash init.sh
그러면 필요한 모든 OS 및 Python 종속성과 함께 cybersim이라는 conda 환경이 생성됩니다.
환경을 활성화하려면 다음을 실행하세요:
conda activate cybersim
Windows에서 지원되는 개발 환경은 WSL을 통한 것입니다. 먼저 Windows 머신에 Ubuntu WSL 배포판을 설치한 다음 Linux 지침(다음 섹션)을 진행해야 합니다.
Git으로 인증하려면 SSH 기반 인증을 사용하거나, 또는 credential-helper 트릭을 사용하여 자동으로 PAT 토큰을 생성할 수 있습니다. 후자는 WSL에서 다음 명령을 실행하여 수행할 수 있습니다 (여기서 자세한 정보):
git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"
Docker 컨테이너 내에서 환경을 실행하려면 다음 지침을 사용하여 Windows Subsystem on Linux (WSL)를 통해 docker를 실행하는 것이 좋습니다:
WSL에서 Windows에 Docker 설치.
이 방법은 더 이상 유지보수되지 않습니다. 대신 WSL 하위 시스템 Linux 환경에서 실행하는 것을 권장합니다.
그래도 진행하려면 Python 3.10을 설치한 다음 Powershell 프롬프트에서 ./init.ps1 스크립트를 실행하세요.
가장 빠른 시작 방법은 Docker 컨테이너를 이용하는 것입니다.
참고: 라이선스 문제로 인해 빌드 아티팩트를 공개적으로 재배포하지 않습니다. 특히, 아래 명령에서 언급된 Docker 레지스트리
spinshot.azurecr.io는 프로젝트 유지관리자만 사용할 수 있도록 비공개로 유지됩니다.해결 방법으로, 제공된
Dockerfile을 사용하여 Docker 이미지를 직접 다시 만들고, 결과 이미지를 자신의 Docker 레지스트리에 게시한 후 아래 명령에서 레지스트리 이름을 바꿔 사용할 수 있습니다.
commit=7c1f8c80bc53353937e3c69b0f5f799ebb2b03ee
docker login spinshot.azurecr.io
docker pull spinshot.azurecr.io/cyberbattle:$commit
docker run -it spinshot.azurecr.io/cyberbattle:$commit python -m cyberbattle.agents.baseline.run
docker build -t cyberbattle:1.1 .
docker run -it -v "$(pwd)":/source --rm cyberbattle:1.1 python -m cyberbattle.agents.baseline.run
다음 명령을 실행하여 기본 RL 에이전트로 시뮬레이션을 실행하세요:
python -m cyberbattle.agents.baseline.run --training_episode_count 5 --eval_episode_count 3 --iteration_count 100 --rewardplot_width 80 --chain_size=4 --ownership_goal 0.2
python -m cyberbattle.agents.baseline.run --training_episode_count 5 --eval_episode_count 3 --iteration_count 100 --rewardplot_width 80 --chain_size=4 --reward_goal 50 --ownership_goal 0
모든 것이 올바르게 설정되었다면 다음과 같은 출력이 나타나야 합니다:
torch cuda available=True
###### DQL
Learning with: episode_count=1,iteration_count=10,ϵ=0.9,ϵ_min=0.1, ϵ_expdecay=5000,γ=0.015, lr=0.01, replaymemory=10000,
batch=512, target_update=10
## Episode: 1/1 'DQL' ϵ=0.9000, γ=0.015, lr=0.01, replaymemory=10000,
batch=512, target_update=10
Episode 1|Iteration 10|reward: 139.0|Elapsed Time: 0:00:00|###################################################################|
###### Random search
Learning with: episode_count=1,iteration_count=10,ϵ=1.0,ϵ_min=0.0,
## Episode: 1/1 'Random search' ϵ=1.0000,
Episode 1|Iteration 10|reward: 194.0|Elapsed Time: 0:00:00|###################################################################|
simulation ended
Episode duration -- DQN=Red, Random=Green
10.00 ┼
Cumulative rewards -- DQN=Red, Random=Green
194.00 ┼ ╭──╴
174.60 ┤ │
155.20 ┤╭─────╯
135.80 ┤│ ╭──╴
116.40 ┤│ │
97.00 ┤│ ╭╯
77.60 ┤│ │
58.20 ┤╯ ╭──╯
38.80 ┤ │
19.40 ┤ │
0.00 ┼──╯
프로젝트에 빠르게 익숙해지려면 제공된 Jupyter 노트북 중 하나를 열어 gymnasium 환경과 대화식으로 상호 작용할 수 있습니다.
.py노트북에 대한 참고 사항:
- 노트북은 Git에
.py파일로 체크인되어 있습니다. 이 파일은 VSCode에서 직접 열거나 Jupytext 확장을 사용하여 Jupyter에서 열고 실행할 수 있습니다.- 출력
.ipynb파일은 bash 스크립트 run_benchmark.sh를 실행하여 papermill로 자동 재생성할 수도 있습니다.- 또한 전체 출력과 플롯이 포함된 해당
.ipynb노트북의 스냅샷을 별도의 git 태그로 게시합니다. Jupyter 노트북의 최신 스냅샷(벤치마크 포함)은 다음 git 태그에서 확인할 수 있습니다: /notebooks/benchmarks (latest_benchmark).
시작하기 위한 몇 가지 노트북:
'Capture The Flag' 장난감 환경 노트북:
체인 환경 노트북:
기타 환경:
벤치마크: 다음 노트북은 다양한 환경에서 기본 에이전트의 벤치마크 평가를 보여줍니다.
Jupyter 노트북의 최신 스냅샷(벤치마크 포함)은 다음 git 태그에서 확인할 수 있습니다: /notebooks/benchmarks (latest_benchmark).
다음 코드는 OpenAI Gym 환경 CyberBattleChain-v0의 인스턴스를 생성하는 방법을 보여줍니다. 이 환경은 체인형 네트워크 구조를 기반으로 하며, 10개의 노드(size=10)를 가지고 있습니다. 에이전트의 목표는 네트워크를 완전히 소유(own_atleast_percent=1.0)하거나 80% 네트워크 가용성 SLA를 위반하지 않는 것(maintain_sla=0.80)이며, 네트워크는 기본 확률 기반 방어자(defender_agent=ScanAndReimageCompromisedMachines)에 의해 모니터링 및 보호됩니다:
import cyberbattle._env.cyberbattle_env
cyberbattlechain_defender =
gym.make('CyberBattleChain-v0',
size=10,
attacker_goal=AttackerGoal(
own_atleast=0,
own_atleast_percent=1.0
),
defender_constraint=DefenderConstraint(
maintain_sla=0.80
),
defender_agent=ScanAndReimageCompromisedMachines(
probability=0.6,
scan_capacity=2,
scan_frequency=5))
다른 네트워크 토폴로지를 시도하려면 chainpattern.py를 예시로 사용하여 자신만의 머신 및 취약점 집합을 정의한 후, 모듈 초기화 파일에 항목을 추가하여 Gym 환경을 선언하고 등록하세요.
이 프로젝트는 기여와 제안을 환영합니다. 대부분의 기여는 기여자 라이선스 동의(CLA)에 동의해야 하며, 귀하의 기여를 사용할 권리가 있고 실제로 사용할 권리를 부여한다는 것을 선언해야 합니다. 자세한 내용은 https://cla.opensource.microsoft.com을 방문하세요.
풀 리퀘스트를 제출하면 CLA 봇이 자동으로 CLA 제공이 필요한지 여부를 결정하고 PR에 적절하게 표시합니다(예: 상태 확인, 댓글). 봇이 제공하는 지침을 따르기만 하면 됩니다. CLA를 사용하는 모든 저장소에서 한 번만 수행하면 됩니다.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 행동 강령 FAQ를 참조하거나 추가 질문이나 의견이 있으면 [email protected]에 문의하세요.
기여할 수 있는 몇 가지 아이디어는 다음과 같습니다: 시뮬레이션 개선(이벤트 기반, 시뮬레이션 세부 조정 등), 기존 시뮬레이션에서 RL 알고리즘 훈련, 에이전트의 참신함을 평가하고 비교하기 위한 벤치마크 구현, RL 에이전트 훈련을 위한 더 많은 네트워크 생성 모드 추가, 문서화 기여, 버그 수정.
더 많은 아이디어는 위키를 참조하세요.
@misc{msft:cyberbattlesim,
Author = {Microsoft Defender Research Team.}
Note = {Created by Christian Seifert, Michael Betser, William Blum, James Bono, Kate Farris, Emily Goren, Justin Grana, Kristian Holsheimer, Brandon Marken, Joshua Neil, Nicole Nichols, Jugal Parikh, Haoran Wei.},
Publisher = {GitHub},
Howpublished = {\url{https://github.com/microsoft/cyberbattlesim}},
Title = {CyberBattleSim},
Year = {2021}
}
이 프로젝트에는 어떤 고객 데이터도 포함되어 있지 않습니다. 제공된 모델과 네트워크 토폴로지는 순전히 가상입니다. 제공된 코드의 사용자는 시뮬레이션에 대한 모든 입력을 제공하며, 제공된 데이터를 사용하는 데 필요한 권한이 있어야 합니다.
이 프로젝트에는 프로젝트, 제품 또는 서비스에 대한 상표 또는 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인된 사용은 Microsoft의 상표 및 브랜드 지침을 따라야 합니다. 이 프로젝트의 수정된 버전에서 Microsoft 상표 또는 로고를 사용하면 혼동을 일으키거나 Microsoft의 후원을 암시해서는 안 됩니다. 타사 상표 또는 로고의 사용은 해당 타사의 정책을 따릅니다.