이전 회사에서 보안 프로그램 개발을 했었지만 새로온 회사에서는 기존과 다른직무를 맡게 되었다.
회사가 해커분들에게 인력 자원을 더 지원하다 보니 개발팀은 개발보다는 유지보수쪽으로 자원을 쏟아야했기에 자체적으로 일감이 줄어들었고 개인적으로 더 성장하고 싶어서 나오게 되었다.
그래서 너무 한 도메인만 신경쓰는 것 보다 개발자로써 다른 서비스에 기여하는 개발을 도전해보고 싶어서 도전했고,
현재 회사에서 신입으로써 기회를 주셔서 차세대 트래픽 제어 엔진 개발자 포지션으로 일하게 되었다.
아직은 업무가 크게 눈에 들어오지는 않지만 관련 자료들을 찾아보면 Naver에서 eBPF/XDP를 활용해서 쿠버네티스에서 인프라 상황에서의 고성능과 고가용성 개선을 했던 이력들이 있어서 보면서 공부를 진행중이다.
https://deview.kr/2020/sessions/382?ref=pangyoalto.com
K8s 에서의 eBPF/XDP 기반 고성능 & 고가용성 NAT 시스템
발표자 : 송인주
deview.kr
시스템 개발에서는 신경쓸 고려할게 많고 eBPF는 전 회사에서 따로 담당하는분이 존재하는 것만 알고 있어서 내가 담당할 일이 없어서 관심도 없었는데 이렇게 다루게 되었으니 공부를 해야한다.
자, 공부를 시작해보자.
eBPF란
인터넷에 잘 나와 있는 내용들이 많아서 개념만 쳐도 인터넷에 잘 나온다.
"eBPF는 운영 체제 커널과 같은 특별한 권한이 있는 환경에서 샌드박스 프로그램을 실행시킬 수 있는 리눅스 커널의 기술에서 기원한 혁신적인 기술입니다. 이는 커널 소스 코드를 바꾸거나 커널 모듈을 로드하지 않고도 기존 커널의 기능을 안전하고 효율적으로 확장시키는 것에 사용됩니다."
문장으로 보면 어려운데 쉽게 생각하면 이전에 커널 코드 변경하면 커널을 다시 컴파일해서 로드 해야되는데 그러지 않고 Frida와 같은 동적분석툴 처럼 후킹 포인트를 잡아서 변경하여 사용하는게 가능하다는 것이다.
전체적인 동작 방식은 공식문서 링크 : https://ebpf.io/ko-kr/what-is-ebpf/
What is eBPF? An Introduction and Deep Dive into the eBPF Technology
A detailed step by step introduction to the eBPF technology with lots of references for further reading.
ebpf.io
XDP나 TC에 대해서도 들어가면 잘 알려준다....
원래 사용법이란 해보면서 실력이 느는 것이다.
참으로 버전 확인이 가장 중요하다.
연습
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
#define BPF_NO_GLOBAL_DATA
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
typedef unsigned int u32;
typedef int pid_t;
const pid_t pid_filter = 0;
char LICENSE[] SEC("license") = "Dual BSD/GPL";
SEC("tp/syscalls/sys_enter_write")
int handle_tp(void *ctx)
{
pid_t pid = bpf_get_current_pid_tgid() >> 32;
if (pid_filter && pid != pid_filter)
return 0;
bpf_printk("BPF triggered sys_enter_write from PID %d.\n", pid);
return 0;
}
ebpf에서는 bpf_printk로 로그를 출력한다.
먼저 pid를 기반으로 그냥 sys_enter_write에 트레이스포인트를 걸고 해당 시스템 콜이나 이벤트가 불릴때 다음과 같은 함수가 추가로 실행되는 것이다.
eBPF는 검증기를 거쳐야 비록 .o 파일을 만들어주는 것을 허락해주기에.... 환경이 좀 열악해서 검증기 거치는게 엄청 힘들다고 한다.
간단하게 기본만 하면 이렇게 되고 실제로 linux 오픈소스에서도 보물상자급으로 eBPF example 폴더가 있는데 해당 자료들을 봐도 솔직히 kernel module를 삽입하는거 자체가 코드가 긴 경우가 거의 없다.
저 트레이스 포인트를 건 sys_enter_write를 실제 linux 커널코드에 들어가서 보면 write를 콜을 부르는 일종의 커널 인터페이스 콜이다.
AI가 요즘에 코딩을 그렇게 잘해준다는데 개인적으로 이전 업계도 그렇고 학습 자료가 전체적으로 부족해서 공부하면서 안되는 상황에서 해결이 어려웠던 것 같다.
이런거도 좀 추론해서 자동으로 됐으면 좋겠다.....
'회사' 카테고리의 다른 글
| [TIL 54] 패턴 탐지 검사에 대하여 (2) | 2025.05.09 |
|---|---|
| [TIL 50] windows defender로 인한 파일 삭제 (0) | 2025.03.13 |
| [TIL 49] python subprocess의 대한 문제직면 (0) | 2025.02.26 |