go-lsm

메인 인덱스 | bob-yamong | GitHub

이 문서는 go-lsm 레포를 코드 기준으로 다시 읽은 메모입니다. 이 레포는 큰 정책 엔진이라기보다, Go 로더와 C 기반 eBPF LSM 프로그램을 아주 작게 연결해 보는 실험용 예제로 읽힙니다.

한 줄 소개

go-lsm은 Go에서 cilium/ebpf로 LSM 프로그램을 붙이고, ring buffer 이벤트를 읽어 연결 차단 여부를 확인하는 최소 구성 실험 레포입니다.

기술 스택

  • Go
  • C
  • github.com/cilium/ebpf
  • LSM hook
  • ring buffer

코드 기준으로 확인한 구조

  • main.goloadBpfBlockConnectObjects로 BPF 오브젝트를 로드한 뒤 link.RawAttachProgramebpf.AttachLSMMac로 LSM 프로그램을 붙입니다.
  • 같은 파일은 ringbuf.NewReader로 ring buffer를 열고, socketEvent 구조체를 읽어 ALLOWED / BLOCKED 로그를 출력합니다.
  • bpf_block_connect.cSEC("lsm/socket_connect") 훅을 사용하며, IPv4 소켓의 목적지 포트가 80일 때 return -1로 차단합니다.
  • 차단 여부와 포트 정보는 socket_events ring buffer map으로 사용자 공간에 전달됩니다.
  • 허용된 경우에도 이벤트를 남기므로, 이 레포는 “차단” 자체보다 “Go 로더 + LSM + ring buffer” 조합을 확인하는 학습용 샘플에 더 가깝습니다.

주요 파일과 흐름

  • main.go: Go 로더, LSM attach, ring buffer consumer
  • bpf_block_connect.c: socket_connect 훅에서 포트 80 차단
  • go.mod: cilium/ebpf 기반 실험이라는 점을 바로 보여 줍니다.

포트폴리오 메모

이 레포는 youmuu.mdgomumu.md처럼 큰 시스템을 설명하는 문서보다는, Go로 eBPF LSM 로더를 붙이는 최소 흐름을 설명할 때 더 적합합니다. 현재 소스만 보면 정책 엔진보다는 실험용 프로토타입에 가깝고, 그래서 오히려 user-space 쪽 선택을 어떻게 시험했는지 이야기하기 좋은 레포입니다.