bpftrace Customize

‍최정민·2023년 4월 2일
1

Monitoring

목록 보기
2/2
post-thumbnail

작업 배경

  • 사내 Jenkins서버에서 ssh접속이 너무 많이 일어남
    • 접속 빈도나 간격으로 볼때 User는 아니라고 판단

  • 일반적인 로그만으로는 어떤 Jenkins Job이 돌았는지 확인이 어려움
    • Jenkins script 실행 시, /tmp/jenkins12345678910.sh 이런식의 스크립트가 만들어져 실행 됨

  • 새로운 프로세스 실행을 감지하는 execsnoop을 활용
    • 기존 execsnoop은 username, time등을 출력하지않음
    • 변경 필요

1. bpftrace-execsnoop

execsnoop은 새로운 프로세스 실행을 시스템 전역에 걸쳐 트레이싱하는 BCC, bpftrace도구이다.

execsnoop source code

#!/usr/bin/bpftrace

BEGIN
{
        printf("%-10s %-5s %s\n", "TIME(ms)", "PID", "ARGS");
}

tracepoint:syscalls:sys_enter_execve
{
        printf("%-10u %-5d ", elapsed / 1000000, pid);
        join(args->argv);
}
  • BEGIN probe
    • 헤더를 출력

  • tracepoint probe
    • execve() systemcall 함수가 실행, 즉 새로운 process 생성되면 시간과, process id, 명령어 이름, 인자를 출력함.
  • Example

2. Customize

  • 요구 사항
    1. 누가 해당 프로세스를 생성했는지
    2. 해당 시간이 어떻게 되는지
  • 헤더를 다음과 같이 변경
    • 기존 헤더에서 USERNAME 추가
    BEGIN
    {
            printf("%-25s %-5s %s %s\n","TIME", "PID", "USERNAME", "ARGS");
    }


  • Username

    • bpftrace의 내장변수인 username을 활용
  • Time

    • elapsed : bpftrace가 초기화된 후 nanoseconds

    • nsecs : timestamp (bpf_ktime_get_ns()으로 수집)

      두 변수 모두 RealTime을 알수없음
      
    • 내장함수인 time을 이용

    • but 해당 함수는 bpf가 time을 호출한 시점이 아닌 이벤트 즉 process 생성한 시간이다.

tracepoint:syscalls:sys_enter_execve
{
        time("%F %H:%M:%S      ");
        printf("%-6d %-10s", pid, username);
        join(args->argv);
}

Result

  • Code

    #!/usr/bin/bpftrace
    
    BEGIN
    {
            printf("%-25s %-5s %s %s\n","TIME", "PID", "USERNAME", "ARGS");
    }
    
    tracepoint:syscalls:sys_enter_execve
    {
            time("%F %H:%M:%S      ");
            printf("%-6d %-10s", pid, username);
            join(args->argv);
    }
  • Result

3. 결론

  • bpftrace는 간단하게 커스터마이즈가 가능
    • probe, 변수, 함수 등에 대한 간단한 이해만 있으면 기존에 다른언어로 프로그래밍을 했던 사람이라면 10분내로 간단하게 프로그램이 가능하다.
    • bpftrace Reference Guide

  • BCC와의 비교
    • 해당 도구의 BCC 버전은 시스템 콜의 진입과 리턴 두 가지 모두 계측
    • bpftrace도 BCC와 같이 개선 가능
profile
Junior DevOps Engineer

0개의 댓글