본문 바로가기
개발/리눅스

FA NOTIFY

by -=HaeJuK=- 2024. 5. 21.

FANOTIFY는 리눅스 커널의 파일 액세스 알림 시스템으로, 프로그램이 파일 시스템 이벤트를 모니터링할 수 있게 해줍니다. FANOTIFY는 파일 시스템 이벤트(예: 열기, 읽기, 쓰기, 닫기 작업)에 대해 사용자 공간 애플리케이션에 알림을 제공합니다. FANOTIFY는 보안, 백신, 시스템 모니터링 애플리케이션에서 자주 사용됩니다.

다음은 FANOTIFY에 대한 주요 기능 및 세부 사항입니다:

  1. 파일 액세스 모니터링: FANOTIFY는 사용자 공간 애플리케이션에 다양한 파일 시스템 이벤트에 대해 알림을 제공할 수 있습니다. 이는 파일 액세스 패턴을 모니터링하거나 보안 정책을 적용해야 하는 애플리케이션에 유용합니다.
  2. 세밀한 제어: FANOTIFY는 어떤 이벤트를 모니터링할지, 어떤 파일이나 디렉토리를 모니터링할지에 대해 세밀한 제어를 제공합니다. 이를 통해 효율적이고 타겟팅된 모니터링이 가능합니다.
  3. 이벤트 유형: FANOTIFY는 파일 열기, 읽기, 쓰기, 닫기, 디렉토리 수정 등 다양한 유형의 이벤트를 모니터링할 수 있습니다.
  4. 권한 및 보안: FANOTIFY는 파일 액세스를 모니터링하고 잠재적으로 무단 액세스를 차단함으로써 보안 정책을 시행하는 데 사용할 수 있습니다. 이는 허용 모드(단순 모니터링) 또는 차단 모드(액세스를 차단할 수 있는 모드)에서 작동할 수 있습니다.
  5. 커널 통합: 리눅스 커널의 일부로서 FANOTIFY는 낮은 수준에서 작동하며 파일 시스템 활동에 대한 상세하고 실시간 알림을 제공할 수 있습니다.
  6. 사용자 공간 인터페이스: FANOTIFY는 사용자 공간 애플리케이션에 인터페이스를 제공하여 알림을 등록하고, 관심 있는 이벤트를 지정하고, 발생하는 이벤트를 처리할 수 있습니다.

사용 예시

  • 백신 소프트웨어: 파일 액세스를 모니터링하여 악성 소프트웨어를 감지 및 방지합니다.
  • 침입 탐지 시스템: 무단 파일 액세스 시도를 추적합니다.
  • 파일 무결성 모니터링: 중요한 파일이 변조되지 않았는지 확인합니다.
  • 데이터 유출 방지: 무단 데이터 액세스 및 유출을 모니터링하고 방지합니다.

기본 사용법

FANOTIFY를 프로그램에서 사용하려면 일반적으로 다음 단계를 수행합니다:

  1. FANOTIFY 초기화: fanotify_init()을 사용하여 새로운 FANOTIFY 그룹을 생성합니다.
  2. 마크 추가: fanotify_mark()을 사용하여 모니터링할 파일이나 디렉토리와 이벤트를 지정합니다.
  3. 이벤트 읽기: read() 또는 poll()을 사용하여 FANOTIFY 파일 디스크립터에서 이벤트를 가져옵니다.
  4. 이벤트 처리: 애플리케이션에서 필요한 대로 이벤트를 처리합니다.

예제 코드

#include <stdio.h>
#include <stdlib.h>
#include <sys/fanotify.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>

int main() {
    int fanotify_fd, ret;
    struct pollfd fds[1];

    // FANOTIFY 초기화
    fanotify_fd = fanotify_init(FAN_CLOEXEC | FAN_NONBLOCK, O_RDONLY);
    if (fanotify_fd == -1) {
        perror("fanotify_init");
        exit(EXIT_FAILURE);
    }

    // 마크 추가
    ret = fanotify_mark(fanotify_fd, FAN_MARK_ADD | FAN_MARK_MOUNT, FAN_OPEN | FAN_ACCESS, AT_FDCWD, "/path/to/monitor");
    if (ret == -1) {
        perror("fanotify_mark");
        exit(EXIT_FAILURE);
    }

    // 폴링 설정
    fds[0].fd = fanotify_fd;
    fds[0].events = POLLIN;

    while (1) {
        ret = poll(fds, 1, -1);
        if (ret > 0) {
            // 여기서 이벤트 처리
            // fanotify_fd에서 이벤트를 읽고 처리합니다
        }
    }

    // 정리
    close(fanotify_fd);
    return 0;
}

이 코드는 FANOTIFY를 초기화하고 특정 이벤트를 모니터링할 마크를 추가한 다음, 이벤트를 처리하는 루프로 들어갑니다. 실제 애플리케이션에서는 적절한 이벤트 처리 및 정리 코드를 추가해야 합니다.

반응형