youmuu 포트폴리오 노트

메인 인덱스 | bob-yamong | 오버뷰 | GitHub

이 문서는 제가 youmuu 레포를 조금 더 길게 설명하려고 남긴 심층 메모입니다. 빠르게 훑어보실 때는 오버뷰부터 보시고, 구현 판단이나 한계까지 보고 싶으실 때 이 문서로 내려오시면 됩니다.

왜 이 레포를 먼저 설명하는가

제 포트폴리오에서 youmuu는 가장 저수준까지 내려가는 문서입니다. eBPF, LSM, tracepoint, 정책 엔진이 한 레포 안에 묶여 있어서 커널 보안 쪽 코드를 어디까지 읽고 설명할 수 있는지를 비교적 분명하게 담고 있습니다.

제가 맡은 범위

  • 주요 설계
  • eBPF 프로그램
  • Docker 기반 테스트 환경
  • CI/CD와 배포 환경
  • 대규모 검증을 위한 인프라 구성

이 레포에서 드러나는 점

  • 커널 레벨 보안 엔진을 코드와 운영 양쪽에서 함께 설명할 수 있다는 점
  • eBPF 기능 구현을 실제 검증 환경까지 연결했다는 점
  • 성능 저하를 수치와 문서로 정리해 두었다는 점

개요

이 문서는 제가 youmuu를 설명할 때 바로 꺼내 쓸 수 있도록 정리한 기준 노트입니다. youmuu는 eBPF(Extended Berkeley Packet Filter) 기반의 컨테이너 런타임 보안 엔진이며, Linux BPF LSM(Linux Security Module)을 활용해 커널 레벨에서 시스템 호출과 보안 이벤트를 가로채며 실시간으로 정책을 적용합니다.


1. 기능 (Function/Features)

1.1 커널 레벨 보안 정책 적용 (BPF LSM Hooks)

youmuu는 BPF LSM(Linux Security Module) 훅을 통해 커널 레벨에서 직접 보안 정책을 적용합니다. src/lsm/enforcement.bpf.c 파일에서 확인할 수 있는 주요 LSM 훅은 다음과 같습니다:

  • 프로세스 보안: bprm_check_security (프로그램 실행), task_fix_setuid (권한 상승)
  • 파일 시스템 보안: file_open, path_unlink, path_mkdir, path_rename, inode_create
  • 네트워크 보안: socket_connect, socket_recvmsg

각 훅은 should_monitor() 함수를 통해 모니터링 대상 컨테이너인지 확인한 후, match_policy() 함수로 정책 매칭을 수행합니다. 정책 위반 시 즉시 -1(차단) 또는 0(허용)을 반환하여 커널 레벨에서 직접 제어합니다.

// enforcement.bpf.c - socket_connect 훅 예시
SEC("lsm/socket_connect")
int BPF_PROG(socket_connect, struct socket *sock, struct sockaddr *address, int addrlen)
{
    struct task_struct *task = (struct task_struct *)bpf_get_current_task();
    if (!should_monitor(task, POLICY_NETWORK)) {
        return 0;
    }
    // ... 정책 매칭 및 적용
}

1.2 세 가지 이벤트 수집 모드 (Triple Architecture)

youmuu는 세 가지 서로 다른 방식으로 컨테이너 이벤트를 수집하고 보안 정책을 적용합니다:

LSM (Linux Security Module) 모드: src/lsm/enforcement.cppsrc/lsm/enforcement.bpf.c로 구현되어 있으며, 커널 보안 훅을 통해 파일 시스템, 네트워크, 프로세스 접근을 실시간으로 제어합니다. bpf_map_structs.h에서 확인할 수 있는 policy_map을 통해 PID namespace와 Mount namespace 조합으로 컨테이너를 식별하고, 파일/네트워크/프로세스 정책을 적용합니다.

Tracepoint 모드: src/tracepoint/tracepoint.cppsrc/tracepoint/tracepoint.bpf.c로 구현되어 있으며, 200개 이상의 시스템 호출을 트레이스포인트로 캡처합니다. parser.h에서 정의된 시스템 호출 목록을 통해 소켓, 파일, 프로세스 관련 시스템 호출을 상세히 모니터링합니다.

Raw Tracepoint 모드: src/raw_tracepoint/raw_tracepoint.cppsrc/raw_tracepoint/raw_tracepoint.bpf.c로 구현되어 있으며, sys_enter raw tracepoint를 통해 모든 시스템 호출을 고성능으로 캡처합니다. cgroup ID와 PID 기반으로 컨테이너를 식별하며, 특정 시스템 호출 목록(syscall_list.h)에 포함된 호출만 기록합니다.

1.3 YAML 기반 유연한 정책 설정

policy.yaml 파일을 통해 선언적 방식으로 보안 정책을 설정합니다. yaml_structs.h에서 정의된 구조체를 기반으로 policy.yaml은 다음과 같은 정책을 지원합니다:

  • 컨테이너 단위 정책: 컨테이너 이름(정규식 지원)별로 독립적인 정책 설정
  • LSM 정책: 파일 경로 기반 접근 제어, 네트워크 IP/포트/프로토콜 필터링, 프로세스 실행 제어
  • Tracepoint 정책: 시스템 호출별 모니터링 설정

parser.hstring_to_flags() 함수는 YAML의 문자열 플래그를 비트마스크로 변환하며, parse_ip() 함수는 CIDR 표기법을 지원하는 IP 파싱을 제공합니다.

1.4 실시간 컨테이너 감지 및 자동 정책 적용

container_info.cppContainerManager 클래스는 Docker API를 통해 실행 중인 컨테이너를 실시간으로 감지합니다:

  • Docker 소켓 통합: /var/run/docker.sock에 Unix 도메인 소켓으로 연결하여 컨테이너 목록 조회
  • 정규식 기반 매칭: isMonitored() 함수에서 컨테이너 이름을 정규식으로 매칭하여 유연한 모니터링 대상 지정
  • 네임스페이스 추출: /proc/{pid}/ns/pid/proc/{pid}/ns/mnt를 통해 PID namespace와 Mount namespace ID 추출
  • cgroup ID 추출: /sys/fs/cgroup/ 경로의 inode 번호를 통해 cgroup ID 획득

또한 monitor_docker_events() 함수는 Docker Events API를 통해 컨테이너 생성/삭제/시작/중지 이벤트를 실시간으로 수신하여 자동으로 정책을 업데이트합니다.


2. 특징 (Characteristics/Highlights)

2.1 블랙리스트/화이트리스트 혼합 정책 모델

youmuu는 구조가 분명한 정책 모델을 제공합니다. policy_map_structs.h에 정의된 플래그를 통해 다양한 접근 제어 방식을 지원합니다:

기본 접근 방식:

  • 파일 쓰기(POLICY_FILE_WRITE)는 기본적으로 차단(화이트리스트 방식)
  • 파일 읽기(POLICY_FILE_READ)는 기본적으로 허용(블랙리스트 방식)

플래그 기반 제어:

  • POLICY_ALLOW: 명시적 허용
  • POLICY_DENY: 명시적 차단
  • POLICY_AUDIT: 감사 로깅만 수행(실제 차단하지 않음)
  • POLICY_OWNER: 파일 소유자에게만 정책 적용
  • POLICY_RECURSIVE: 디렉토리 하위 경로에 재귀적 적용

enforcement.bpf.cfile_open 훅에서 확인할 수 있듯이, 파일 쓰기 작업은 정책에 명시적으로 허용된 경우에만 가능하며, 읽기 작업은 정책에 명시적으로 차단된 경우에만 제한됩니다.

2.2 Audit 모드를 통한 비침투적 모니터링

POLICY_AUDIT 플래그를 통해 프로덕션 환경에서도 안전하게 보안 정책을 테스트할 수 있습니다:

// enforcement.bpf.c - Audit 모드 예시
if (flags & POLICY_FILE_DELETE) {
    ret = e->retval = (flags & POLICY_AUDIT) ? -1 : 0;
    // AUDIT 플래그가 있으면 실제로는 차단하지 않고 로깅만 수행
}

Audit 모드에서는 정책 위반 이벤트가 실제로 차단되지 않고 Ring Buffer를 통해 사용자 공간으로 전달되어 로깅됩니다. 이를 통해 프로덕션 환경에서 정책의 영향을 사전에 평가할 수 있습니다.

2.3 BPF Ring Buffer 기반 고성능 이벤트 전달

bpf_map_structs.h에서 정의된 Ring Buffer는 커널 공간에서 사용자 공간으로 이벤트를 효율적으로 전달합니다:

struct {
    __uint(type, BPF_MAP_TYPE_RINGBUF);
    __uint(max_entries, 1 << 30);  // 1GB 크기
} events SEC(".maps");
  • 1GB 대용량 버퍼: 대규모 이벤트 발생 시에도 데이터 손실 최소화
  • 비동기 처리: ring_buffer__poll()을 통해 비동기로 이벤트 수신
  • 메모리 효율성: bpf_ringbuf_reserve()bpf_ringbuf_submit()/bpf_ringbuf_discard()로 메모리 관리

2.4 멀티 아키텍처 지원을 위한 vmlinux 헤더

vmlinux/ 디렉토리는 다양한 아키텍처와 커널 버전을 지원합니다:

  • x86: vmlinux/x86/vmlinux_680.h, vmlinux/x86/vmlinux.h
  • ARM64: vmlinux/arm64/vmlinux.h, vmlinux/arm64/vmlinux_601.h, vmlinux/arm64/vmlinux_516.h
  • ARM: vmlinux/arm/vmlinux.h, vmlinux/arm/vmlinux_62.h

BPF CO-RE(Compile Once - Run Everywhere)를 위한 BPF_CORE_READ() 매크로를 적극 활용하여 다양한 커널 버전에서 동일한 바이너리가 실행될 수 있도록 합니다.

2.5 실시간 정책 핫 리로딩

enforcement.cppmonitor_policy_file() 함수는 inotify를 사용하여 /policy/policy.yaml 파일의 변경을 실시간으로 감지합니다:

  • IN_CLOSE_WRITE 이벤트 감지: 파일 수정 완료 시 자동 감지
  • 3초 재시도 로직: 정책 파싱 실패 시 3초 간격으로 재시도
  • BPF Map 갱신: clear_bpf_map()update_policy_with_file()으로 기존 정책을 제거하고 새 정책 적용
  • Docker 이벤트 연동: 컨테이너 생성/삭제 시 자동 정책 갱신

3. 부족한 점 (Limitations/Weaknesses)

3.1 제한된 컨테이너 런타임 지원

현재 youmuu는 Docker에만 최적화되어 있습니다:

container_info.cppgetContainerPIDs() 함수는 Docker REST API(/containers/json)에만 의존하며, containerd, CRI-O, Podman 등 다른 OCI-compliant 런타임을 지원하지 않습니다. 이는 Kubernetes 환경에서 containerd를 사용하는 경우 youmuu가 컨테이너를 감지할 수 없음을 의미합니다.

취약점:

  • /var/run/docker.sock에 대한 의존성
  • Docker-specific한 cgroup 경로 패턴(docker-%s*) 사용
  • 다른 런타임의 cgroup 계층 구조 차이로 인한 호환성 문제

3.2 단일 노드 제한 및 중앙 집중식 관리 부재

youmuu는 단일 노드에서만 실행되며, 클러스터 전체 정책 관리를 위한 중앙 제어 플레인이 없습니다:

  • Kafka 미지원: LSM 모듈(enforcement.cpp)은 Kafka 설정 코드가 있으나, 현재 구현은 실제 Kafka 전송 없이 로컬 로깅만 수행
  • 분산 정책 관리 없음: 각 노드별로 개별적인 policy.yaml 관리 필요
  • 집계된 뷰 부재: 다중 노드 환경에서의 보안 이벤트 집계 및 상관 관계 분석 불가

3.3 BPF Map 크기 고정 및 확장성 제한

policy_map_structs.h의 정적 배열 크기는 대규모 환경에서 제한적입니다:

#define MAX_CONTAINERS 1000
#define MAX_POLICIES_PER_CONTAINER 64
#define MAX_UID_LIST 30
  • 컨테이너 수 제한: 최대 1,000개 컨테이너만 동시 모니터링 가능
  • 정책 수 제한: 컨테이너당 최대 64개 파일/네트워크/프로세스 정책만 설정 가능
  • 동적 확장 불가: BPF Map 크기가 컴파일 시점에 고정되어 런타임 조정 불가

3.4 에러 처리 및 복구 메커니즘 미흡

코드 전반에 걸쳐 에러 처리가 불완전합니다:

BPF 프로그램에서의 처리:

if (bpf_d_path(&file->f_path, e->data.path, sizeof(e->data.path)) < 0) {
    // 에러 로깅 없이 무시됨
}

사용자 공간에서의 처리:

  • bpf_map_update_elem() 실패 시 재시도 로직 부재
  • ring_buffer__poll() 에러 시 자동 복구 없이 즉시 종료
  • Docker API 연결 실패 시 백오프 전략 없음

3.5 복잡한 정책 디버깅 도구 부재

현재 youmuu는 정책이 예상대로 작동하는지 확인하기 위한 도구가 제한적입니다:

  • 정책 시뮬레이션 없음: 실제 적용 전 정책 영향도 예측 도구 부재
  • 상세 로깅 레벨 없음: bpf_printk만을 사용한 제한적인 디버깅
  • 정책 트레이싱 없음: 특정 컨테이너나 프로세스에 대한 정책 적용 흐름 추적 불가
  • 성능 영향 분석 도구 없음: 정책 적용에 따른 오버헤드 측정 수단 부재

4. 개선 방향 (Improvement Directions)

4.1 다중 컨테이너 런타임 지원 확대

container_info.cppContainerManager 클래스를 리팩토링하여 다양한 런타임을 지원해야 합니다:

구현 방안:

  1. 런타임 인터페이스 추상화: ContainerRuntime 인터페이스를 정의하고 Docker, containerd, CRI-O 구현체를 분리
  2. CRI 통합: Kubernetes CRI(Container Runtime Interface)를 통해 런타임 독립적인 컨테이너 정보 획득
  3. cgroup v2 통합 지원: cgroup v2의 unified 계층 구조를 지원하여 런타임 간 일관된 컨테이너 식별

기대 효과:

  • Kubernetes 환경에서의 seamless한 동작
  • 다양한 운영 환경에서의 재사용성 향상
  • vendor lock-in 제거

4.2 중앙 집중식 관리 플랫폼 개발

클러스터 전체 보안 정책 관리를 위한 컨트롤 플레인을 개발해야 합니다:

아키텍처 제안:

┌─────────────────────────────────────────────────────┐
│              youmuu Control Plane                    │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────┐  │
│  │ Policy Store │  │ Event Aggregator│ │ Analytics │  │
│  └──────────────┘  └──────────────┘  └──────────┘  │
└─────────────────────────────────────────────────────┘
         │                      │
    ┌────┴────┐            ┌────┴────┐
    ▼         ▼            ▼         ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│youmuu-1│ │youmuu-2│ │youmuu-3│ │youmuu-4│
└────────┘ └────────┘ └────────┘ └────────┘

핵심 기능:

  1. 분산 정책 동기화: etcd 기반 정책 저장소로 모든 노드에 실시간 동기화
  2. 중앙 집중식 로깅: Kafka/Elasticsearch 연동을 통한 클러스터 전체 이벤트 수집
  3. 대시보드: Grafana 기반 실시간 모니터링 및 알림
  4. 정책 버전 관리: GitOps 방식의 정책 버전 관리 및 롤백 지원

4.3 동적 BPF Map 크기 조정 및 eBPF 프로그램 핫 스와핑

동적 Map 크기 조정:

// 현재: 정적 크기
#define MAX_CONTAINERS 1000
 
// 개선: 런타임 설정 가능
struct bpf_map_def policy_map = {
    .type = BPF_MAP_TYPE_LRU_HASH,
    .max_entries = 0, // 0으로 설정하고 사용자 공간에서 동적 설정
};

eBPF 프로그램 핫 스와핑:

  1. libbpf 맵 재사용: LIBBPF_PIN_BY_NAME 플래그를 활용하여 BPF 맵을 pinning하고 프로그램만 교체
  2. BPF trampoline 활용: BPF 프로그램 업데이트 시 트랜잭션 방식 적용
  3. 점진적 롤아웃: 카나리아 배포 방식의 정책 적용

4.4 정책 시뮬레이션 및 성능 분석 도구 개발

youmuu-cli 도구 개발:

# 정책 시뮬레이션
youmuu-cli simulate --policy policy.yaml --container test-app --dry-run
 
# 성능 프로파일링
youmuu-cli profile --duration 60s --output report.json
 
# 정책 검증
youmuu-cli validate --policy policy.yaml

기능 상세:

  1. Dry-run 모드: 실제 차단 없이 정책 위반 이벤트 예측 및 로깅
  2. 성능 벤치마크: BPF 프로그램 실행 시간 측정 및 지연 시간 분석
  3. 정책 커버리지 분석: 설정된 정책의 실제 활용률 분석
  4. 시각화: 정책 적용 흐름의 그래프화

4.5 보안 강화: seccomp-bpf 및 Landlock 통합

다중 보안 계층 아키텍처:

┌──────────────────────────────────────────┐
│         Landlock (File Access)           │  ← 사용자 공간 파일 샌드박싱
├──────────────────────────────────────────┤
│         youmuu LSM (eBPF)                │  ← 커널 보안 정책
├──────────────────────────────────────────┤
│         seccomp-bpf (Syscall Filter)     │  ← 시스템 호출 필터링
├──────────────────────────────────────────┤
│         Linux Kernel                     │
└──────────────────────────────────────────┘

구현 방안:

  1. seccomp-bpf 통합: src/seccomp/ 디렉토리 추가하여 컨테이너별 syscall allowlist 생성
  2. Landlock 통합: 파일 시스템 접근 제어를 Landlock으로 위임하여 성능 향상
  3. 보안 프로파일 템플릿: 일반적인 워크로드(nginx, database 등)에 대한 보안 프로파일 제공
  4. 자동 프로파일 생성: 정적 분석을 통한 최소 권한 프로파일 자동 생성

결론

youmuu는 eBPF와 BPF LSM을 활용한 차세대 컨테이너 런타임 보안 엔진으로서, 커널 레벨에서의 실시간 보안 정책 적용이라는 강력한 기능을 제공합니다. 세 가지 이벤트 수집 모드(LSM, Tracepoint, Raw Tracepoint)와 YAML 기반 유연한 정책 설정, 실시간 컨테이너 감지 등은 현재 사용한 클라우드 네이티브 환경에 적합한 설계입니다.

그러나 Docker 중심의 제한적인 런타임 지원, 단일 노드 제한, 고정된 BPF Map 크기 등은 대규모 프로덕션 환경에서의 적용을 제한합니다. 다중 컨테이너 런타임 지원, 중앙 집중식 관리 플랫폼, 동적 자원 관리, 정책 시뮬레이션 도구 등의 개선을 통해 youmuu는 Kubernetes 환경에서의 표준 보안 솔루션으로 발전할 수 있을 것입니다.

향후 youmuu는 Falco, Tetragon과 같은 기존 eBPF 기반 보안 도구와의 차별화를 위해 더욱 가벼운 오버헤드, 더 직관적인 정책 언어, 그리고 다양한 컨테이너 런타임과의 통합을 통해 시장에서의 경쟁력을 확보해야 할 것입니다.