이미지 스캔을 마쳤다고 해서 컨테이너 보안이 끝난 것은 아닙니다. 실행 중인 컨테이너 내부에서 공격자가 리버스 쉘을 열거나, 민감한 설정 파일을 수정하는 행위는 정적 분석만으로 막을 수 없습니다. 런타임 단계에서의 능동적인 감시가 필수적입니다.
이 가이드에서는 클라우드 네이티브 보안 프로젝트인 Falco를 사용하여 리눅스 커널 수준에서 발생하는 비정상 시스템 콜(System Call)을 실시간으로 탐지하고 경고를 생성하는 아키텍처를 구축합니다. 2024년 기준 최신 안정 버전인 Falco 0.38.x 환경을 기준으로 설명합니다.
TL;DR — 컨테이너 런타임 보안은 eBPF 기술을 사용하는 Falco를 통해 구현하며, 커널 시스템 콜을 가로채 룰 엔진과 매칭하여 실시간 경고를 발생시킵니다.
목차
Falco와 eBPF: 컨테이너의 블랙박스
Falco는 CNCF(Cloud Native Computing Foundation)를 졸업한 오픈소스 런타임 보안 도구입니다. 리눅스 커널에서 발생하는 execve, openat, connect와 같은 시스템 콜을 캡처하여 사전에 정의된 보안 규칙과 비교합니다. 위반 사항이 발견되면 로그, Slack, Webhook 등으로 즉시 알림을 보냅니다.
💡 비유로 이해하기: Falco는 건물의 복도(OS 커널)마다 설치된 '지능형 CCTV'와 같습니다. 단순히 누가 들어왔는지만 보는 게 아니라, 허가받지 않은 열쇠로 문을 열려고 하거나 금지된 구역의 물건을 만지는 행위를 실시간으로 감지해 경비실에 알립니다.
기존의 보안 도구와 달리 Falco는 eBPF(Extended Berkeley Packet Filter) 기술을 활용합니다. 커널 코드를 수정하거나 별도의 모듈을 로드하지 않고도 안전하게 커널 이벤트를 추적할 수 있어, 호스트 시스템의 성능 저하를 최소화하면서 강력한 가시성을 제공합니다.
언제 Falco가 필요한가?
단순한 웹 서비스를 운영하더라도 다음과 같은 보안 위협 시나리오에서 Falco는 결정적인 역할을 합니다. 특히 다수의 컨테이너가 복잡하게 얽힌 마이크로서비스 아키텍처(MSA) 환경에서 빛을 발합니다.
- 권한 상승 탐지: 컨테이너 내 프로세스가 갑자기
root권한을 획득하려고 시도하는 경우. - 민감 파일 접근:
/etc/shadow나/root/.ssh와 같은 핵심 파일에 읽기/쓰기 시도가 발생하는 경우. - 비정상 네트워크 통신: 평소에 사용하지 않는 포트로 외부 서버와 통신을 시도하거나 리버스 쉘을 생성하는 경우.
- 패키지 매니저 실행: 운영 중인 컨테이너에서
apt또는yum을 통해 새로운 바이너리를 설치하는 행위.
Falco 설치 및 커스텀 룰 설정
가장 간편한 설치 방법은 도커(Docker)를 이용하는 것입니다. 호스트의 커널을 감시해야 하므로 특권 권한(Privileged)과 커널 헤더 접근이 필요합니다.
Step 1: Falco 컨테이너 실행
docker run -d --name falco \
--privileged \
-v /var/run/docker.sock:/host/var/run/docker.sock \
-v /dev:/host/dev \
-v /proc:/host/proc:ro \
-v /boot:/host/boot:ro \
-v /lib/modules:/host/lib/modules:ro \
-v /usr:/host/usr:ro \
falcosecurity/falco:latest
Step 2: 커스텀 보안 규칙(Rule) 정의
Falco의 기본 규칙 파일은 /etc/falco/falco_rules.yaml에 위치합니다. 특정 디렉터리에 쓰기 시도가 발생했을 때 알람을 울리는 커스텀 룰을 작성해 보겠습니다. /etc/falco/falco_rules.local.yaml 파일에 다음 내용을 추가합니다.
- rule: Write below binary dir
desc: binary 디렉터리에 쓰기 시도 감지
condition: >
evt.type = openat and fd.directory in (/bin, /sbin, /usr/bin, /usr/sbin)
and (evt.arg.flags contains O_WRONLY or evt.arg.flags contains O_RDWR)
output: >
File below a known binary directory opened for writing (user=%user.name
command=%proc.cmdline file=%fd.name parent=%proc.pname container_id=%container.id)
priority: CRITICAL
tags: [filesystem, mitre_persistence]
Step 3: 룰 적용 및 테스트
설정을 변경한 후 Falco 프로세스를 재시작합니다. 이후 테스트용 컨테이너에서 금지된 동작을 수행하여 로그가 발생하는지 확인합니다.
# 테스트: /bin 아래에 파일 생성 시도
docker exec -it my_app touch /bin/malicious_script
# Falco 로그 확인
docker logs falco | grep "CRITICAL"
자주 발생하는 에러와 주의사항
Falco 운영 시 가장 흔히 겪는 문제는 커널 드라이버 로딩 실패입니다. 이는 Falco가 커널 시스템 콜을 캡처하기 위한 드라이버를 로드할 때, 호스트 커널 버전과 맞지 않아서 발생합니다.
⚠️ 가장 자주 하는 실수: 호스트 커널 헤더가 설치되어 있지 않으면 Falco가 eBPF 프로브를 컴파일할 수 없습니다. Ubuntu 기준 sudo apt install linux-headers-$(uname -r) 명령어로 헤더를 반드시 사전 설치해야 합니다.
또한, 초당 발생하는 시스템 콜이 너무 많은 서비스(예: 고성능 DB)의 경우 Falco가 CPU 자원을 과도하게 점유할 수 있습니다. 이때는 modern-ebpf 드라이버를 사용하거나 룰의 범위를 좁혀서(Filter) 성능 최적화를 진행해야 합니다.
운영 효율을 높이는 팁
단순히 로그를 남기는 것을 넘어 실질적인 방어 체계를 구축하려면 다음의 팁을 활용하세요.
- Falco Sidekick 활용: 로그를 수집하여 Slack, PagerDuty, Datadog 등으로 전달해주는 어댑터입니다. 시각화와 알림 고도화에 필수적입니다.
- 화이트리스트 기반 튜닝: 정상적인 비즈니스 로직에서 발생하는 시스템 콜은
macro를 정의하여 예외 처리하세요. 오탐(False Positive)을 줄여야 실제 공격에 집중할 수 있습니다. - Falcoctl 사용: 룰 업데이트를 자동화하는
falcoctl툴을 사용하여 최신 보안 위협 인텔리전스를 실시간으로 반영하세요.
📌 핵심 요약
- Falco는 eBPF를 통해 커널 레벨에서 컨테이너 런타임 보안을 제공한다.
- 호스트 커널 헤더가 설치되어 있어야 정상적으로 동작한다.
- 커스텀 룰을 통해 특정 디렉터리 접근이나 권한 상승을 실시간 탐지할 수 있다.
- 오탐을 줄이기 위한 지속적인 룰 튜닝과 알림 연동이 운영의 핵심이다.
Frequently Asked Questions
Q. Falco와 Sysdig의 차이는 무엇인가요?
A. Falco는 보안 탐지에 특화된 오픈소스 엔진이며, Sysdig은 이를 포함한 모니터링 및 트러블슈팅 기능을 제공하는 상용 솔루션 기반 프로젝트입니다.
Q. eBPF 모드와 커널 모듈 모드 중 무엇이 더 좋나요?
A. 최신 리눅스 환경이라면 안정성과 보안성이 높은 eBPF(또는 modern-ebpf) 모드를 강력히 권장합니다.
Q. Falco가 탐지 후 공격을 직접 차단(Kill)할 수 있나요?
A. 기본적으로 탐지 및 경고 위주입니다. 차단을 원하면 Falco Talon과 같은 추가 프로젝트를 연동하여 반응형 보안(Response)을 구축해야 합니다.
Post a Comment