문서API 참조
Documentation

Node Install - Docker Image

Sandfly 노드는 시스템이 Linux 호스트에 연결하여 에이전트리스 조사 및 포렌식 분석을 수행할 수 있게 합니다. 항상 최소 하나의 노드가 실행되어야 하지만, 중복성과 성능을 위해 여러 노드를 시작하는 것이 권장됩니다.

아래 다이어그램을 참조하면, 노드는 Sandfly의 주요 작업 요소입니다. 노드는 SSH를 통해 보호된 호스트에 연결하여 조사를 수행하고 결과를 서버에 보고합니다. 각 노드는 500개의 스레드를 가지고 있으며 작동 중에 이 수보다 훨씬 많은 호스트를 쉽게 스캔할 수 있습니다.

Sandfly High-Level Overview

Sandfly High-Level Overview

정상 작동을 위해 두 개 이상의 노드 컨테이너를 시작하는 것을 권장합니다. 각 새로운 노드 컨테이너는 500개의 추가 스캔 스레드를 제공하므로 대규모 네트워크 배포에서도 많은 호스트를 보호하는 방대한 기능을 Sandfly로 매우 쉽게 구축할 수 있습니다. 노드는 서버에 연결하여 자동 로드 밸런싱으로 요청 시 스캔 요청을 처리합니다. 보호해야 하는 호스트에 SSH 액세스가 있는지 확인하는 것 외에는 노드에 아무것도 할 필요가 없습니다.

컨테이너들은 모두 동일한 가상 머신(VM)에서 실행될 수 있지만, 보안상의 이유로 이 VM이 서버를 호스팅하는 데 사용되는 VM과 동일하지 않을 것을 권장합니다. 실행할 수 있는 노드 컨테이너 수의 유일한 제한은 이를 호스팅하는 VM의 CPU와 RAM입니다.

나머지 지침에서는 노드 컨테이너를 실행할 수 있도록 호스트 VM을 준비하는 방법을 설명합니다.

표준 보안 vs. 최대 보안 설치

표준 보안 vs. 최대 보안 설치 섹션에서는 환경에 맞게 Sandfly를 배포하는 방법의 차이점을 설명합니다. 매우 소규모 배포를 실행하거나 제품을 테스트하는 경우 표준 보안 모드를 사용할 수 있습니다. 리소스가 있는 고객의 경우 서버와 노드를 별도의 VM에서 실행하는 최대 보안 설치를 적극 권장합니다.

표준 보안 설치를 사용하고 싶습니다

동일한 VM에서 서버와 스캔 노드 컨테이너를 실행하는 것에 만족한다면 여기서 대부분의 지침을 건너뛸 수 있습니다. 아래의 노드 시작 섹션으로 이동하여 서버와 동일한 시스템에서 스캔 노드를 시작하고 로그인하여 Sandfly 사용을 시작하세요.

최대 보안 설치를 사용하고 싶습니다

서버와 스캔 노드를 실행하기 위해 권장되는 별도의 VM을 사용하려는 경우 아래에 설명된 모든 단계를 수행해야 합니다.

설치 아카이브 다운로드

지원되는 모든 환경에서 Sandfly를 설치하고 실행하는 데 필요한 모든 것이 포함된 설치 패키지는 Sandfly Security의 Github에 위치하고 있습니다. 최신 버전을 얻으려면 아래 링크를 방문하세요:

https://github.com/sandflysecurity/sandfly-setup/releases

sandfly-setup-5.5.0.tgz를 호스트에 다운로드한 다음 Sandfly를 위치시킬 곳에 아카이브를 추출하세요(예시 명령에서는 현재 디렉토리가 사용됨):

wget https://github.com/sandflysecurity/sandfly-setup/releases/download/v5.5.0/sandfly-setup-5.5.0.tgz tar -xzvf sandfly-setup-5.5.0.tgz

아카이브가 추출되면 sandfly-setup이라는 디렉토리가 생성됩니다. 아래의 모든 작업은 여기서 수행됩니다.

컨테이너 도구 설치

Sandfly는 보안 및 성능상의 이유로 모든 것이 컨테이너 내에서 실행되므로 Docker 또는 Podman을 사용합니다. CentOS와 이전 Ubuntu 리포지토리에는 종종 매우 오래된 버전의 Docker가 포함되어 있어 Ubuntu의 snap 버전의 Docker와 마찬가지로 Sandfly와 호환되지 않습니다. OS 배포에서 제공하는 최신 지원 버전의 Docker 또는 Podman을 설치하려면 아래의 적절한 설치 방법을 사용하세요.

지원되는 Docker 호환 배포가 이미 설치되어 있고 최신 상태인 경우 Docker 시작 단계로 진행하세요. Docker 버전은 다음 명령으로 확인할 수 있습니다:

docker -v

Podman 설치

RHEL 8 호환 및 신버전

RedHat Enterprise Linux (RHEL) 8 호환 및 해당 운영 체제 기반의 신버전에서 표준으로 제공되는 Podman 기반 배포의 경우, 먼저 Podman으로 Sandfly 실행 문서에서 찾을 수 있는 단계를 완료한 다음 이 페이지로 돌아와서 서버에서 노드로 Config JSON 복사 섹션으로 진행하여 노드 설치를 계속하세요.

Docker 설치

❗️

중요: Docker의 대체/추가 버전을 설치하지 마세요

일부 Linux 배포판(snap과 apt를 사용하는 Ubuntu 등) 또는 수동 docker 설치에서는 경고 없이 두 버전의 docker 패키지가 존재할 수 있습니다. 이는 Sandfly 컨테이너를 시작할 때 잘재적으로 문제를 일으킬 수 있습니다. 호스트 OS에 지원되는 버전의 docker가 하나만 설치되어 있는지 확인하세요.

❗️

중요: CentOS 리포지토리는 Docker에 너무 오래되었습니다

일부 Linux 배포판(CentOS 등)에는 Sandfly와 호환되지 않는 오래된 버전의 Docker가 포함되어 있습니다. 지원되는 버전의 Docker가 사용되도록 제공된 스크립트 중 하나를 통해 설치를 수행하세요.

Docker 기반 배포의 경우 호스트의 운영 체제에 가장 밀접하게 대응되는 아래 스크립트 중 하나를 사용하여 최신 지원 버전을 설치하세요:

CentOS 7 호환

~/sandfly-setup/setup/install_docker_centos7.sh

Ubuntu 18 호환

~/sandfly-setup/setup/install_docker_ubuntu18.sh

Ubuntu 20 호환 및 신버전

~/sandfly-setup/setup/install_docker_ubuntu20.sh

Debian 9 호환 및 신버전

~/sandfly-setup/setup/install_docker_debian.sh

Docker 시작

Docker 데몬이 자동으로 시작되도록 하거나 다음 명령으로 Linux에서 수동으로 시작할 수 있습니다:

service docker start

서버에서 노드로 Config JSON 복사

이제 서버에서 생성된 노드 구성 JSON 파일을 복사해야 합니다. 이 파일에는 노드가 서버에 자동으로 연결하고 작동하는 데 필요한 모든 암호화 키와 관련 설정 정보가 포함되어 있습니다.

두 개의 터미널 창을 열어야 합니다. 하나는 서버에 연결되어야 하고, 다른 하나는 노드에 연결되어야 합니다. 보안이 보장되는 한 파일을 복사하기 위해 scp나 다른 원하는 방법을 사용할 수도 있습니다.

서버setup_data 디렉토리로 이동하여 구성 텍스트를 복사하세요:

# ON SERVER cd ~/sandfly-setup/setup/setup_data cat config.node.json <copy contents>

노드setup_data 디렉토리로 이동하여 구성 텍스트를 파일에 붙여넣으세요:

# ON NODE cd ~/sandfly-setup/setup/setup_data cat > config.node.json <paste contents> <CTRL-D>
🚧

주의: 잘못된 구성 파일을 생성할 수 있습니다

화면 간의 텍스트 복사 및 붙여넣기는 생성된 config.node.json 파일에 사소한 대수를 일으켜 나중에 설치 과정에서 오류를 일으킬 수 있습니다. 이 상황은 "cat" 명령을 사용할 때 가장 빈번히 발생합니다. 선호하는 텍스트 에디터에서 열린 config.node.json 파일에 붙여넣는 것은 이 문제를 일으킬 가능성이 낮습니다.

붙여넣기 방법을 사용하는 경우 다음 단계로 진행하기 전에 파일의 JSON 구조를 유효성 검사할 것을 권장합니다. JSON은 선호하는 방법으로 유효성 검사할 수 있거나 python3가 설치되어 있는 경우 명령줄에서 빠르게 확인할 수 있습니다:

python3 -mjson.tool "./config.node.json" > /dev/null

전체 config.node.json 파일은 모든 키가 그대로 복사되어야 합니다. 이러한 값들 대부분은 Sandfly Security에서 바꿀 것을 권고하지 않는 한 변경해서는 안 됩니다.

노드 구성 파일 삭제

Sandfly는 서버 데이터베이스의 SSH 키를 보호하기 위해 고성능 타원곡선 암호화를 사용합니다. 서버가 손상된 경우 이러한 SSH 키가 안전하도록 하기 위해 이를 해독하는 데 사용되는 비밀 키는 스캔 노드에만 저장됩니다.

위의 이유로 서버가 노드용 공개 키와 개인 키를 모두 가지기를 원하지 않습니다. 노드 구성 JSON을 노드에 복사한 후에는 서버에서 이를 제거하려고 합니다.

🚧

주의: 유효한 키가 노드에 있는지 확인하세요

서버에서 SSH 키를 삭제하기 전에 최소 하나의 노드에 유효한 복사본이 있는지 확인하세요. 키가 삭제되면 재생성하거나 복원할 수 없습니다. 다른 작동하는 키 쌍을 생성하려면 Sandfly를 다시 설치해야 합니다.

서버setup_data 디렉토리로 이동하여 config.node.json 파일을 삭제하세요. 서버에는 config.server.json 파일만 있으면 됩니다.

사용 가능한 경우 아래와 같이 노드 구성 파일에 보안 삭제를 사용할 수 있습니다:

# ON SERVER: shred -u ~/sandfly-setup/setup/setup_data/config.node.json

또는 표준 삭제:

# ON SERVER: rm ~/sandfly-setup/setup/setup_data/config.node.json
❗️

중요: 비밀 키 삭제 (최대 보안 설치만 해당)

Sandfly에서 SSH 자격 증명의 완전한 보안을 보장하려면 서버에서 노드 구성(config.node.json)을 삭제해야 합니다. 표준 보안 설치를 사용하는 경우 이 파일을 삭제하지 마세요.

비밀 키가 서버에서 삭제되면 노드를 시작할 수 있습니다.

노드 시작

이 시점에서 시작할 노드 컨테이너 수를 결정해야 하지만, Sandfly가 작동하려면 최소 하나는 실행되어야 합니다.

노드 컨테이너 하나 시작

단일 인스턴스는 다음 명령으로 시작할 수 있습니다:

~/sandfly-setup/start_scripts/start_node.sh

Docker 이미지가 아직 존재하지 않는 경우 로드되고, 위의 키가 올바르게 복사된 경우 노드가 시작됩니다.

일반적으로 여러 노드 인스턴스를 실행하는 것을 권장하지만, 처음에는 텕나만 실행하는 것이 좋은 몇 가지 이유가 있습니다. 첫째, Sandfly를 처음 설치하는 경우 인스턴스가 하나만 있으면 디버깅이나 모니터링에 도움이 됩니다. 둘째, 노드를 실행하는 호스트/VM에 충분한 CPU와 RAM 리소스가 없는 경우입니다. 하나의 노드는 초기 테스트나 가벼운 사용에는 충분하지만, 결국 정기적인 사용을 위해서는 여러 컨테이너를 실행하는 것이 바람직합니다.

추가 컨테이너 시작

start_node.sh 스크립트를 반복적으로 실행하여 동일한 시스템에서 여러 노드 컨테이너를 시작하여 더 나은 성능과 중복성을 얻을 수 있습니다. 이를 수행하기 전에 호스트 인스턴스에 여러 노드 컨테이너를 실행할 충분한 RAM이 있는지 확인하세요.

root@example:~/sandfly-setup/start_scripts# ./start_node.sh 0106c87dbfd304b3f6fef847702a41f603eb5e625c7b6194ba5fd30019533421 root@example:~/sandfly-setup/start_scripts# ./start_node.sh 9ecc25cdaae72589d4792a01989ab73001bcf400da05cfd436a54e9defc38be9 root@example:~/sandfly-setup/start_scripts# ./start_node.sh a8c3b80228c47a7feabf0dcbee89cbd6a2d5abbe80ec7b2a61fc86ed246bfbd7
👍

팁: 여러 컨테이너 실행을 권장합니다

여러 노드 컨테이너를 실행하는 것을 권장합니다. 단일 호스트 인스턴스나 개별 호스트에서 여러 컨테이너를 실행할 수 있습니다. 여러 컨테이너를 실행하면 훨씬 높은 성능을 제공하고 컨테이너가 예기치 않게 종료되는 경우 중복성을 제공합니다.

각 노드 컨테이너는 500개의 스캔 스레드를 실행합니다. 따라서 시스템에 추가하는 각 노드 컨테이너마다 스캔 용량이 500개 스레드씩 확장됩니다.

예를 들어 5개의 노드를 실행하면 2500개의 스캔 스레드를 얻을 수 있습니다. 이는 2500개의 호스트를 동시에 스캔할 수 있음을 의미합니다. 또한 하나의 컨테이너가 예기치 않게 종료되더라도 스캔이 중단 없이 계속될 수 있는 용량을 여전히 보유할 수 있음을 의미합니다.

호스트에서 실행 중인 모든 노드 컨테이너를 보려면 다음 명령을 실행하세요:

docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 865c0520124e quay.io/sandfly/sandfly:5.5.0 "/opt/sandfly/start_…" 5 seconds ago Up 3 seconds boring_jang 3b9a82546aae quay.io/sandfly/sandfly:5.5.0 "/opt/sandfly/start_…" 7 seconds ago Up 5 seconds clever_burnell 92b33fe63f33 quay.io/sandfly/sandfly:5.5.0 "/opt/sandfly/start_…" 8 seconds ago Up 6 seconds goofy_blackwell
🚧

주의: 노드 컨테이너 RAM 및 CPU

많은 컨테이너를 실행하기 전에 노드 컨테이너용 호스트 인스턴스에 충분한 RAM이 있는지, 그리고 성능 문제가 없도록 몰고 개의 CPU가 있는지 확인하세요.

4GB 인스턴스는 3개의 컨테이너를 편안하게 실행할 수 있습니다. 8GB 인스턴스는 6개 또는 7개의 노드 컨테이너를 실행할 수 있습니다. 단일 인스턴스에서 많은 노드 컨테이너를 실행하려면 그에 따라 RAM과 CPU를 확장해야 합니다.

원한다면 노드 컨테이너의 로그를 확인하여 제대로 연결되고 작동하고 있는지 확인할 수 있습니다. 이를 수행하는 한 가지 방법은 위의 시작 스크립트를 실행한 후 출력에 대한 Docker 로그가 무엇인지 알아내는 것입니다.

대상 컨테이너의 docker 이름이나 컨테이너 ID를 사용하여 해당 컨테이너 인스턴스에 어떤 고유한 로그 이름이 사용되는지 찾아보세요:

docker inspect 865c0520124e | grep LogPath "LogPath": "/var/lib/docker/containers/865c0500124e4b119f36447a3556264a3996c5fd78eeee009e7fe10fbbe2e847/865c0500124e4b119f36447a3256264a3996c5fd78eeee009e7fe10fbbe2e847-json.log",

위 명령에서 얻은 LogPath 파일 정보로 로그를 볼 수 있습니다. 아래 예시에서는 tail 명령을 통해 로그가 표시되며, -f 옵션으로 인해 새로운 로그 항목이 들어오면 출력에 추가됩니다:

tail -f /var/lib/docker/containers/865c0500124e4b119f36447a3556264a3996c5fd78eeee009e7fe10fbbe2e847/865c0500124e4b119f36447a3256264a3996c5fd78eeee009e7fe10fbbe2e847-json.log {"log":"Setting fallback_directory to /dev/shm\n","stream":"stdout","time":"2024-02-02T15:31:03.680165719Z"} {"log":"Concurrency set to 500\n","stream":"stdout","time":"2024-02-02T15:31:03.744270095Z"} {"log":"Simulator multiplier set to 0\n","stream":"stdout","time":"2024-02-02T15:31:03.797034353Z"} {"log":"Starting Node\n","stream":"stdout","time":"2024-02-02T15:31:03.959266465Z"} {"log":"{\"time\":\"2024-02-02T15:31:03.964868301Z\",\"level\":\"INFO\",\"msg\":\"starting Sandfly node\",\"version\":\"5.5.0\",\"build_date\":\"2024-01-04T02:44:13Z\"}\n","stream":"stderr","time":"2024-02-02T15:31:03.972896661Z"} {"log":"{\"time\":\"2024-02-02T15:31:03.964989048Z\",\"level\":\"INFO\",\"msg\":\"loading config file\",\"path\":\"conf/config.json\"}\n","stream":"stderr","time":"2024-02-02T15:31:03.972982467Z"} {"log":"{\"time\":\"2024-02-02T15:31:04.00731022Z\",\"level\":\"INFO\",\"msg\":\"successfully loaded additional CA certificates from config\"}\n","stream":"stderr","time":"2024-02-02T15:31:04.007616874Z"} {"log":"{\"time\":\"2024-02-02T15:31:04.007362626Z\",\"level\":\"INFO\",\"msg\":\"node thread limit\",\"threads\":500}\n","stream":"stderr","time":"2024-02-02T15:31:04.008122668Z"} ...

이 예시 명령을 계속 실행하면 노드 메시지가 스크롤되는 것을 계속 볼 수 있으며, 스캔이 발생할 때는 종종 매우 빠르게 스크롤됩니다. 이 예시는 정상적인 Sandfly 작동에 필요하지 않지만, 잘재적인 오류나 성능 문제가 있을 경우 디버깅이나 모니터링에 유용할 수 있습니다.

또는 이 형식화된 로그 보기 방법을 사용할 수도 있습니다:

Sandfly docker 컨테이너에서 완전한 로그를 얻는 방법은?

설치 섹션이 거의 완료되었습니다. 다음 페이지로 계속 진행하세요.


이 페이지가 도움이 되었나요?