메뉴 바로가기 검색 및 카테고리 바로가기

한빛미디어

독자리뷰

리눅스 유저라면 소장할 가치가 있는 책

spaci***

|

2020-06-29

BPF로 리눅스 관측 가능성 향상하기

이 책은 시스템 엔지니어를 위한 리눅스 커널의 BPF VM에 관한 전문 지식을 제공합니다. BPF 프로그램의 수명 주기를 자세히 설명할 뿐만 아니라, 커널에서 벌어지는 사건들을 감시, 추적, 관찰하는 코드를 주입해 커널의 행동을 좀 더 안전하고 안정적으로 관찰하고 수정하는 방법을 알려줍니다.

  • 저자 : 데이비드 칼라베라 , 로렌초 폰타나
  • 번역 : 류광
  • 출간 : 2020-05-01

리눅스 커널은 소수의 전문가에게만 허용되는 영역으로 아무나 건드릴 수 있는 영역이 아니었다. BPF는 평범한 개발자도 스크립팅과 VM을 통해서 편하고 안전하게 리눅스 커널 안에서 원하는 코드를 실행하게 하는 흥미로운 기술이다. 프로그래머라면 디자인 패턴 중 옵저버 패턴을 생각하면 비슷할 것이다.

 

BPF를 사용하면 임의의 시스템 호출 또는 커널 함수를 추적할 수 있으며, 임의의 사용자 공간 프로그램도 추적할 수 있다. bpftrace(https://github.com/iovisor/bpftrace)는 리눅스에서 DTrace와 비슷한 기능을 제공하는 명령줄 도구이다. 이 도구를 이용하면 예를 들어 열린 파일들과 그것을 연 프로세스들을 추적하거나, 프로그램이 요청한 시스템 호출들을 세거나, OOM 킬러를 추적하는 등의 다양한 추적 작업을 수행할 수 있다. 간단히 말해서, 이 도구가 있으면 리눅스 시스템의 내부 상황을 완전히 파악할 BPF와 XDP는 Cloudflare(https://oreil.ly/OZdmj)와 페이스북(https://oreil.ly/wrM5-)의 부하 분산기에서 DDos 공격을 방지하는 용도로도 쓰인다.

 

 BPF 프로그램을 작성하는 것은 의외로 정말 간단하다. 책에서도 첫 머리에 소개되고 있지만 가장 간단한 예제를 소개하는 것 만큼 BPF를 잘 소개하는 것은 없다고 생각하기에 본문의 예제를 그대로 적어 보았다. 아래의 코드는 "Hello World"를 출력하는 프로그램과 비슷한 BPF 프로그램이다. 

이 예제는 execve 시스템 추적점이 검출되었을 때, BPF VM이 프로그램을 실행해야 함을 SEC매크로로 저장한다. 개발자는 추적점을 이용해서 커널의 실행 흐름 안의 특정 지점에 자신이 원하는 코드를 주입한다. 결과적으로 execve가 프로그램을 실행하는 상황을 커널이 포착할 때마다 Hello, BPF World!라는 메세지가 출력된다.

 

소스 코드의 마지막 줄은 이 프로그래므이 사용권(License)을 명시한 것이다. 리눅스 커널은 GPL 사용권을 따르므로 오직 GPL을 따르는 프로그램만 커널에 적재할 수 있다.

 

앞의 예제 코드를 bpf_program.c라는 이름의 소스 파일로 저장했다고 할 때, 이를 컴파일하는 명령은 다음과 같다. 

컴파일된 코드는 커널에 적재해야 한다. 커널은 프로그램의 컴파일과 적재(load)과정을 추상화하는 보조 함수들을 제공한다. 다음은 load_bpf_file 함수를 이용해서 앞에서 만든 이진 파일을 커널에 적재하는 프로그램이다. 

다음은 이 소스 코드를 컴파일, 링크해도 ELF 실행 파일을 만드는 셸 스크립트이다. 이 프로그램은 BPF VM에 적재할 것이 아니므로 -target 옵션을 지정할 필요가 없다. 각종 디렉토리를 지정한 것 외에, load_bpf_file 함수의 정의가 있는 bpf_load.c 파일도 함께 컴파일, 링크함을 주의하기 바란다. 여러 파일이 관여하는 빌드 작업을 수행할 때는 이처럼 스크립트를 사용하는 것이 편하다. 

이 스크립트를 통해서 컴파일 및 링크가 잘 진행되었다면 loader라는 실행 파일이 생긴다.

 

이 실행 파일은 반드시 sudo로 실행해야 한다.(이를테면 sudo ./loader). 이 프로그램을 실행하면 여러분이 컴퓨터로 아무 일도 하지 않았는데도 몇 초 후에 Hello, BPF World!라는 메세지가 나타나기 시작할 것이다. 이는 백그라운드에서 실행되는 프로그램이 다른 프로그램들을 실행하기 때문이다. 

 

2장까지는 생애 첫 BPF프로그램을 다룬다. 3장부터는 BPF 맵을 다루는데 이것은 커널 안에 존재하는 키-값 저장소이다. BPF맵은 그 위치를 아는 모든 BPF 프로그램이 접근할 수 있다. 커널 내의서 처리하는 여러 데이터와 장치들의 BPF맵에 대해 학습할 수 있다.

 

4장에서는 BPF를 이용해 커널과 사용자 공간을 탐침해 보고 히스토그램을 만드는 등 자료를 시각화 해 본다.

 

5장에서는 BPF를 편리하게 사용하도록 도와주는 BPFTool, BPFTrace, kubectl-trace 그리고 eBPF Exporter와 같은 유틸리티를 소개한다. 

 

6장과 7장에서는 패킷 필터링 등, 리눅스 네트워킹을 탐침하는 것을 배우고 XDP(Express Data Path)를 배운다. XDP는 안전하고 프로그래밍 가능하며 커널에 통합된 고성능 패킷 처리기이다. 리눅스 네트워크 자료 경로 안에서 XDP는 네트워크 인터페이스 카드(NIC)의 드라이브가 패킷을 받았을 때 적절한 BPF프로그램을 실행한다. XDP프로그램은 수신된 패킷의 운명(폐기, 수정, 허용)을 최대한 이른 시점에서 결정한다.

 

8장에서는 리눅스 커널 보안, 능력 그리고 seccomp에 대해 다룬다. BPF는 안정성과 속도를 해치지 않고 커널을 확장하는 강력한 수단이다. 그래서 커널 개발자들은 seccomp의 프로세스 격리 기능을 개선하는 데 BPF의 다재다능한 능력을 활용하기로 하고, BPF 프로그램을 seccomp의 필터로 사용할 수 있게 했다. 이를 seccomp BPF라고 부르기도 한다. Secure Computing(보안 컴퓨팅)을 줄인 SECCOMP는 리눅스 커널의 한 보안 계층으로, 개발자가 특정 시스템 호출을 필터링하게 만드는 용도로 쓰인다. 어떤 작업을 허용 또는 금지하는 수단이라는 점에서 seccomp는 커널 능력과 비슷하지만, 구체적인 시스템 호출들을 제어할 수 있다는 점에서 커널 능력보다 유연하다.

 

마지막으로 9장에서는 실제 응용 사례를 다룬다. 실제 응용 사례는 아래와 같다.

 

1. Sysdig의 eEBF '신(god)' 모드 

- Sysdig(시스디그)는 최초의 오픈소스 리눅스 문제해결(troubleshooting) 도구이자 그것을 만든 회사의 이름이다.

- Sysdig의 eBPF 구조는 아래와 같다. 219p이다. 

 - Sysdig BPF 성능 비교표는 아래와 같다. 221p이다.

2. Flowmill

 

- Flowmill(플로밀)은 관측 가능성 관련 스타트업으로, 창업자 조너선 페리(Jonathan Perry)가 참여한 Flowtune(https://oreil.ly/e9heR)이라는 학술 연구 프로젝트를 뿌리로 한다. Flowtune은 개별 패킷들의 처리 일정을 효율적으로 관리함으로서 데이터 센터 네트워크의 혼잡(congestion; 또는 밀집)을 해소하는 문제를 연구하는 프로젝트인데, 그러한 혼잡 해소에는 네트워크 관련 수치들을 아주 낮은 추가 부담으로 수집하느 기술이 필요했다. Flowmill은 BPF(eBPF)의 커널 탐침을 이용해서 모든 연린 소켓을 추적하고 소켓 연산 관련 수치들을 주기적으로 수집한다.

 

BPF는 리눅스 커널 내에서 일어나느 일들을 우리가 더욱 잘 탐침하고 그것을 활용할 수 있도록 도움을 준다. 리눅스 유저라면 BPF를 통해 커널과 유저레벨에서 일어나는 지표들을 BPF를 통해 편리하게 탐침할 수 있을 것이다. 여기엔 어떤 커널 모듈 관련 지식도 필요하지 않다. 오직 BPF를 활용하는 방법에 대한 지식만이 필요할 뿐이다. 리눅스 유저들은 BPF로 할 수 있는 일들에 대해 체계적으로 설명한 이 책을 통해 BPF를 단계별로 활용해 가면 꽤 괜찮으리라 생각한다. 

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?