일부 환경에서는 eBPF가 전혀 없는 이전 커널이 포함된 인스턴스를 사용합니다. ptrace 솔루션은 이러한 환경을 위해 제공됩니다.
eBPF-less Agent 에서는 다음 기능을 사용할 수 없습니다.
Security 프로필, 다음 기능 제공:
이상 탐지
신호 분류를 위한 정상 동작 자동 억제
멀웨어 탐지
네트워크 탐지
현재 구현은 amd64 및 arm64 아키텍처와 ABI를 지원하지만 32비트 ABI로 확장할 수 있습니다.
ptrace 솔루션의 장점
ptrace 기반 솔루션은 강력한 위협 탐지와 흔들림 없는 서비스 가용성 사이의 균형을 달성합니다. ptrace 기반 솔루션의 장점은 다음과 같습니다.
정밀한 프로세스 제어: ptrace는 메모리와 레지스터에 대한 상세한 검사를 제공하여 중요한 애플리케이션 워크로드를 보호합니다. 이러한 세밀한 가시성은 정교한 위협을 식별하는 데 필수적입니다. Datadog procfs(프로세스 파일 시스템) 스캐너는 시스템 전체의 모든 실행을 모니터링하여 악성 프로세스를 정밀하게 종료할 수 있도록 합니다. 이러한 도구는 함께 작용하여 악성 활동으로부터 보호합니다.
운영 안정성: 사용자 공간에서 작동하는 ptrace는 커널 공간의 복잡성과 위험을 피하여 더 안전하고 관리하기 쉬운 접근 방식을 제공합니다. 장애 발생 시, ptrace 기반 Agent는 OS 계층에서 기본적으로 fail-open 상태가 되어 애플리케이션이 중단되더라도 시스템에 영향을 주지 않습니다.
성능 효율성: Datadog 엔지니어링 팀이 수행한 최근 벤치마크에 따르면 Datadog의 ptrace 기반 구현은 커널 기반 솔루션과 비교할 만한 성능을 보여줍니다. 구체적으로, PostgreSQL 워크로드의 경우 약 3%의 최소한의 오버헤드만 발생하며 Redis 작업에는 거의 영향을 미치지 않아 대부분의 사용 사례에서 매우 효율적입니다.
오픈 소스 검증: Datadog은 ptrace 기반 및 eBPF Agent를 오픈 소스로 공개하여 고객과 보안 커뮤니티가 직접 안전성과 효과를 검증할 수 있도록 함으로써 솔루션에 대한 투명성과 신뢰를 높였습니다.
eBPF-less Agent 설정
Docker 및 Linux 호스트를 포함한 다양한 플랫폼에서 eBPF-less Agent를 설정할 수 있습니다.
이전 eBPF-less agent setup 섹션에서 추가 구성을 지정하여 사용자 지정 버전을 설치하고 eBPF-less 모드를 활성화합니다.
설정 확인
Agent 설치 및 설정을 확인하려면 Linux 호스트 또는 Docker 컨테이너에 연결하여 다음 작업을 실행합니다.
sudo /opt/datadog-agent/embedded/bin/system-probe config|grep -A 1 ebpfless
다음과 같은 출력이 표시되어야 합니다.
ebpfless:
enabled: true
eBPF-less Agent로 애플리케이션 추적 설정
eBPF-less Agent가 설치되고 eBPF-Free 모드를 사용하도록 설정된 후에는 애플리케이션 추적 방식을 설정할 수 있습니다. 이 섹션에서는 다음 2가지 다른 방법을 제공합니다.
래핑 모드:(권장) 이 모드에서는 ptrace를 사용하여 처음부터 애플리케이션을 추적하는 Datadog wrapper에 의해 애플리케이션이 실행됩니다.
생성된 모든 자식 프로세스도 추적됩니다.
ptrace 오버헤드를 크게 줄이기 위해 seccomp 프로필이 적용됩니다.
연결 모드: 이 모드에서는 애플리케이션 프로세스에 연결할 PID 목록을 지정할 수 있습니다. 이 작업이 완료될 때까지 애플리케이션이 ptrace되지 않으므로 신속하게 수행해야 합니다.
이 모드에서는 seccomp 프로필을 적용할 수 없습니다. 결과적으로 약간의 ptrace 오버헤드가 발생합니다.
두 모드 모두 Datadog Agent와 함께 패키징되어 /opt/datadog-agent/embedded/bin/cws-instrumentation에 위치한 cws-instrumentation 바이너리를 사용합니다.
이 트레이서는 포트 5678을 사용하여 localhost에서 system-probe(Datadog Agent의 일부)와 통신합니다. system-probe 주소는 --probe-addr=host:port cws-instrumentation 옵션을 사용하여 구성할 수 있습니다. 서버 측 주소는 Agent 구성 파일의 runtime_security_config.ebpfless.socket 옵션을 통해 /etc/datadog-agent/system-probe.yaml 업데이트할 수 있습니다.
래핑 모드에서는 Datadog Wrapper가 애플리케이션을 시작합니다. 여기에 예시가 있습니다.
이미 init 스크립트가 있는 경우 필요한 변경 사항에 대한 간단한 예시는 다음과 같습니다.
#!/bin/sh
set -e
### BEGIN INIT INFO# Provides: my_app# Required-Start: $network# Required-Stop: $network# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: My application# Description: My application### END INIT INFO# Start the servicestart(){echo"Starting my app" /opt/datadog-agent/embedded/bin/cws-instrumentation trace -- /usr/bin/myapp &}# Stop the servicestop(){echo"Stopping my app" pkill -f /usr/bin/myapp
}### main logic ###case"$1" in
start) start
;; stop) stop
;; restart) stop
start
;; *)echo $"Usage: $0 {start|stop|restart}"exit1esacexit0
Docker
Docker 애플리케이션 배포의 경우 다음과 같이 Dockerfile을 수정하여 애플리케이션을 래핑해야 합니다.
FROM registry.datadoghq.com/agent:7 AS datadogagent
FROM ubuntu:latest
COPY --from=datadogagent /opt/datadog-agent/embedded/bin/cws-instrumentation .
ENTRYPOINT ["/cws-instrumentation", "trace", "--"]CMD ["/bin/bash", "-c", "while true; do sleep 1; echo my app is running; done"]
Docker 애플리케이션을 실행할 때 --cap-add=SYS_PTRACE를 docker run 명령에 추가하여 추가 기능을 부여하는 것이 중요합니다.
또한 다음 중 하나를 수행하여 5678 포트에서 컨테이너를 Datadog에 연결해야 합니다.
--network 호스트 옵션을 사용하여 두 컨테이너를 모두 시작합니다.
[Docker 네트워크][6] 기능을 사용하여 두 컨테이너를 동일한 브리지 네트워크에서 실행합니다.
연결 모드에는 다음과 같은 제한 사항이 있으므로 래핑 모드를 사용하는 것이 좋습니다.
Datadog이 애플리케이션에 연결될 때까지 애플리케이션에서 수행되는 모든 초기화를 놓칩니다.
연결 시 Datadog은 seccomp 프로필을 설정할 수 없습니다.
더 많은 성능 오버헤드.
추적된 애플리케이션이 다시 시작되면 Datadog은 트레이서도 다시 시작되도록 해야 합니다.
연결 모드는 이미 실행 중인 애플리케이션에 추적기를 직접 연결한다는 점에서 래핑 모드와 다르며, 방식은 다음과 같습니다: