1. File Integrity Monitoring (FIM) 개요
File Integrity Monitoring (FIM)은 중요한 파일 및 디렉터리의 변경을 감지하는 보안 메커니즘으로, 시스템 침입 탐지, 무단 수정 감지, 규제 준수 목적 등에 활용됩니다. osquery는 다양한 운영 체제에서 FIM을 지원하며, 각각의 플랫폼에서 다음과 같은 이벤트 수집 방식을 사용합니다.
- Linux
file_events
(inotify 사용)process_file_events
(Audit 사용)
- Windows
ntfs_journal_events
(NTFS Journaling 사용)
- macOS
file_events
(FSEvents 사용)
2. osquery에서 FIM 활성화
기본적으로 FIM 기능은 비활성화되어 있으며, 다음 설정을 적용해야 합니다.
2.1. FIM 활성화 필수 설정
- 이벤트 시스템 활성화
--disable_events=false
- FIM 관련 테이블 활성화
file_events
활성화 (Linux/macOS)--enable_file_events=true
process_file_events
활성화 (Linux, Audit 사용)--disable_audit=false
ntfs_journal_events
활성화 (Windows)--enable_ntfs_event_publisher=true
3. FIM 설정 (파일 및 디렉터리 감시)
3.1. 감시할 파일 및 디렉터리 지정
osquery에서는 감시할 파일과 디렉터리를 fnmatch
스타일 또는 파일 시스템 globbing 패턴을 사용하여 정의합니다.
패턴 | 설명 |
---|---|
% |
한 레벨의 모든 파일 및 폴더 매칭 |
%% |
하위 디렉터리를 포함한 모든 파일 및 폴더 매칭 (재귀적) |
%abc |
abc 로 끝나는 모든 파일/폴더 매칭 |
abc% |
abc 로 시작하는 모든 파일/폴더 매칭 |
3.2. 매칭 예시
경로 | 설명 |
---|---|
/Users/%/Library |
각 사용자의 Library 폴더 변경 감지 (하위 폴더 제외) |
/Users/%/Library/%% |
Library 폴더의 모든 파일 및 하위 폴더 변경 감지 |
/bin/%sh |
/bin/ 내 .sh 로 끝나는 모든 파일 변경 감지 |
주의
~
대신/Users/%
를 사용해야 합니다.- 파일 직접 감시보다 디렉터리 감시가 더 효과적입니다. 많은 애플리케이션이 파일을 수정하는 대신 교체하기 때문에, 파일을 직접 감시할 경우 osquery 재시작이 필요할 수 있습니다.
4. FIM 설정 예제
4.1. 기본 FIM 설정
{
"schedule": {
"file_events": {
"query": "SELECT * FROM file_events;",
"removed": false,
"interval": 300
}
},
"file_paths": {
"homes": [
"/root/.ssh/%%",
"/home/%/.ssh/%%"
],
"etc": [
"/etc/%%"
],
"tmp": [
"/tmp/%%"
]
},
"exclude_paths": {
"homes": [
"/home/not_to_monitor/.ssh/%%"
],
"tmp": [
"/tmp/too_many_events/"
]
}
}
설명
file_paths
: 감시할 디렉터리 및 파일 지정exclude_paths
: 감시에서 제외할 경로 지정
4.2. 유효한 exclude_paths 카테고리 사용
exclude_paths 노드 아래에서는 임의의 카테고리 이름을 사용하면 안 됩니다.
유효한 카테고리는 file_paths에 정의된 항목과 동일해야 합니다.
카테고리 유형 | 설명 |
---|---|
유효한 카테고리 | file_paths 에 정의된 이름 (예: homes , etc , tmp ) |
무효한 카테고리 | file_paths 에 없는 이름 (예: invalid_category ) |
무효한 카테고리는 자동으로 무시되므로, 이벤트 생성에 영향을 주지 않습니다.
5. FIM 이벤트 예제
파일 변경이 감지되면 file_events
테이블에 이벤트가 기록됩니다.
5.1. 이벤트 샘플 출력
{
"action": "ATTRIBUTES_MODIFIED",
"category": "homes",
"md5": "bf3c734e1e161d739d5bf436572c32bf",
"sha1": "9773cf934440b7f121344c253a25ae6eac3e3182",
"sha256": "d0d3bf53d6ae228122136f11414baabcdc3d52a7db9736dd256ad81229c8bfac",
"target_path": "/root/.ssh/authorized_keys",
"time": "1429208712",
"transaction_id": "0"
}
설명
action
: 파일 변경 유형 (CREATED
,MODIFIED
,DELETED
,ATTRIBUTES_MODIFIED
)md5
,sha1
,sha256
: 파일 해시값target_path
: 변경된 파일 경로time
: 이벤트 발생 시간 (Unix timestamp)
6. Linux inotify 설정 최적화
file_events
는 inotify를 사용하므로, 감시할 파일 개수 제한을 늘려야 할 수 있습니다.
6.1. sysctl.conf 최적화
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 256
fs.inotify.max_queued_events = 32768
설정 방법
/etc/sysctl.conf
파일에 위 설정 추가.sysctl -p
실행하여 변경 적용.
7. 파일 접근 모니터링 (Linux 전용)
FIM은 파일 변경 사항을 감지하지만, 파일 접근 이벤트는 기본적으로 비활성화되어 있습니다.
7.1. 파일 접근 감시 설정
{
"file_paths": {
"homes": [
"/root/.ssh/%%",
"/home/%/.ssh/%%"
],
"etc": [
"/etc/%%"
],
"tmp": [
"/tmp/%%"
]
},
"file_accesses": ["homes", "etc"]
}
설명
file_accesses
에 특정 카테고리를 추가하면 해당 디렉터리에서의 파일 접근 이벤트도 기록됨.
8. FIM 문제 해결 (Troubleshooting)
8.1. osquery 실행 권한 문제
- osquery는 root/Administrator 권한으로 실행해야 합니다.
- Linux에서 SELinux/AppArmor 설정을 확인하세요.
- macOS에서는 Full Disk Access 권한을 부여해야 합니다.
8.2. Auditd 충돌 문제 (Linux)
process_file_events
를 사용하려면 auditd가 실행 중이면 안 됩니다.- auditd 비활성화
systemctl stop auditd systemctl disable auditd
8.3. 디버깅
osqueryd --verbose
옵션을 사용하여 로그 확인 가능.
osquery의 FIM 기능은 시스템의 주요 파일 및 디렉터리 변경을 추적하여 보안 위협을 탐지하는 강력한 도구입니다. 적절한 설정을 통해 성능을 최적화하고, 무단 변경을 실시간으로 감지할 수 있습니다. inotify
이벤트를 직접 확인할 수 있는 Linux 기본 명령어는 inotifywait
와 inotifywatch
입니다. inotifywait
는 특정 파일 또는 디렉터리에서 발생하는 이벤트를 실시간으로 출력하고, inotifywatch
는 특정 경로에서 이벤트 발생 횟수를 집계합니다.
inotifywait를 사용하여 실시간 이벤트 모니터링
inotifywait
는 파일/디렉터리에서 발생하는 변경 사항을 실시간으로 확인하는 데 사용됩니다.
단일 파일 변경 감시
inotifywait -m /path/to/file
옵션 설명
-m (--monitor)
: 변경 사항을 지속적으로 모니터링
특정 디렉터리 내 파일 변경 감시
inotifywait -m -r -e modify,create,delete /path/to/directory
옵션 설명
-r (--recursive)
: 하위 디렉터리 포함-e (--event)
: 감시할 이벤트 지정 (modify
,create
,delete
등)
출력 예시
/var/log/syslog MODIFY
/var/log/syslog CLOSE_WRITE,CLOSE
/tmp/testfile CREATE
/tmp/testfile DELETE
inotifywatch를 사용하여 이벤트 발생 횟수 집계
inotifywatch
는 특정 파일이나 디렉터리에서 발생한 이벤트를 집계하여 보여줍니다.
특정 디렉터리 감시
inotifywatch -v -e modify,create,delete -r /path/to/directory
옵션 설명
-v (--verbose)
: 자세한 출력-r (--recursive)
: 하위 디렉터리 포함-e (--event)
: 감시할 이벤트 지정
출력 예시
Total Modify Create Delete Filename
5 2 2 1 /tmp/testdir
inotifywait를 백그라운드에서 실행하여 로그 파일에 기록
실시간 모니터링을 로그 파일에 저장하려면 다음과 같이 실행하면 됩니다.
inotifywait -m -r -e modify,create,delete /var/www > /var/log/inotify.log 2>&1 &
백그라운드 실행 (& 추가)
- 표준 출력을 로그 파일로 저장
inotifywait를 활용한 자동화 스크립트
특정 디렉터리에서 파일이 생성되면 자동으로 스크립트를 실행하는 예제입니다.
#!/bin/bash
WATCH_DIR="/tmp/testdir"
inotifywait -m -e create "$WATCH_DIR" | while read path action file; do
echo "새 파일 생성됨: $file"
# 예: 특정 파일이 생성되면 실행할 명령
if [[ "$file" == "important.log" ]]; then
echo "중요한 파일이 생성됨: $file" | mail -s "파일 변경 알림" admin@example.com
fi
done
이 스크립트는 /tmp/testdir
에서 파일이 생성될 때마다 해당 파일명을 출력하며, 특정 파일(important.log
)이 생성되면 이메일을 발송하는 동작을 수행합니다.
find + stat를 활용한 간단한 변경 감지
inotify
를 사용할 수 없는 환경에서는 find
와 stat
명령어를 이용하여 변경 사항을 감지할 수도 있습니다.
while true; do
find /path/to/monitor -type f -printf '%T@ %p\n' | sort -n > /tmp/mtime_snapshot
sleep 10
find /path/to/monitor -type f -printf '%T@ %p\n' | sort -n > /tmp/mtime_current
diff /tmp/mtime_snapshot /tmp/mtime_current
done
파일의 수정 시간을 find와 stat로 확인하여 변경 감지 가능
auditctl을 활용한 파일 접근 및 변경 감시
Linux의 audit
시스템을 활용하면 더욱 강력한 감시가 가능합니다.
auditctl -w /etc/passwd -p wa -k passwd_watch
/etc/passwd 파일을 감시 (-w)
wa
: write(access) 및 attribute 변경 감지-k passwd_watch
: 감시 키워드 설정
로그 확인
ausearch -k passwd_watch --start today
파일 무결성 모니터링(FIM)과 함께 inotifywait
를 활용하면 파일 변경을 실시간으로 감지할 수 있으며, osquery FIM과 결합하면 더욱 강력한 보안 모니터링이 가능합니다. osquery의 file_events
테이블은 audit
시스템을 사용하지 않습니다. 대신, 각 운영체제의 네이티브 파일 변경 감시 시스템을 활용합니다.
osquery에서 file_events가 사용하는 감시 메커니즘
운영체제 | osquery 테이블 | 사용 기술 |
---|---|---|
Linux | file_events |
inotify |
Linux | process_file_events |
Audit subsystem |
Windows | ntfs_journal_events |
NTFS Journaling |
macOS | file_events |
FSEvents |
file_events (Linux)
- inotify 기반으로 동작
- 파일 생성, 수정, 삭제 감시 가능
auditd
와는 충돌하지 않음
process_file_events (Linux)
- Audit subsystem 사용
auditd
와 충돌할 수 있음- 파일 액세스 이벤트까지 감지 가능 (ex: 파일을 열거나 실행)
osquery file_events vs. process_file_events 차이점
file_events |
process_file_events |
|
---|---|---|
사용 기술 | inotify |
Linux Audit subsystem |
파일 변경 감지 | ✅ 가능 | ❌ (파일 변경 자체는 감지 못함) |
파일 접근 감지 | ❌ 불가능 | ✅ 가능 (파일 읽기/실행 등) |
이벤트 충돌 가능성 | auditd 와 충돌 없음 |
auditd 와 충돌 가능 |
성능 영향 | 상대적으로 적음 | 이벤트 과다 발생 가능 |
즉, osquery의 file_events는 audit 시스템과는 무관하며, inotify를 사용합니다.
파일 무결성 모니터링(FIM)을 위해 file_events를 사용할 경우 auditd와 충돌하는 문제는 발생하지 않습니다.
audit 기반 FIM을 사용해야 한다면?
osquery가 아니라 Linux Auditd를 직접 사용하여 파일 감시도 가능합니다.
특정 파일 변경 감시
auditctl -w /etc/passwd -p wa -k passwd_watch
-w /etc/passwd: 감시할 파일 지정
-p wa
: 쓰기(write
), 속성(attribute
) 변경 감지-k passwd_watch
: 이벤트 키 설정
로그 확인
ausearch -k passwd_watch --start today
osquery와 auditd를 함께 사용하면 발생하는 문제
auditd
와osquery의 process_file_events
는 같은 Audit subsystem을 사용하므로 충돌 가능성이 있음.file_events
(inotify 사용)만 사용하면auditd
와 충돌 없음.
정리해보면,
- osquery의
file_events
는audit
을 사용하지 않고, inotify를 사용한다. file_events
는 파일 생성, 수정, 삭제를 감지하지만, 파일 읽기(access
) 이벤트는 감지하지 않는다.- 파일 접근 감시가 필요하다면
process_file_events
(Audit 사용) 또는auditctl
을 직접 활용해야 한다. auditd
를 사용하는 환경에서는file_events
만 사용하면 문제없이 운영할 수 있다.
즉, osquery FIM에서 file_events
만 활성화하면 auditd
와 충돌 없이 파일 무결성 감시가 가능하다!
Linux Audit 시스템에서 파일 변경 감지 가능 여부
Linux의 Audit subsystem은 auditd
데몬을 통해 동작하며, 파일 변경 감지 자체는 가능하지만 제한적입니다.
Audit에서 파일 변경 감지 방법
Audit에서 파일 변경을 감지하려면 특정 파일 또는 디렉터리에 대해 auditctl
을 사용하여 감시 규칙을 설정할 수 있습니다.
파일 변경 감지 설정 예제
auditctl -w /etc/passwd -p wa -k passwd_watch
옵션 설명
-w /etc/passwd
→ 감시할 파일 지정-p wa
→ 쓰기(write
), 속성 변경(attribute
) 감지-k passwd_watch
→ 식별을 위한 키워드 설정
로그 확인
ausearch -k passwd_watch --start today
Audit에서 감지할 수 있는 파일 이벤트
감시 플래그 (-p ) |
설명 |
---|---|
r |
읽기 (read ) |
w |
쓰기 (write ) |
x |
실행 (execute ) |
a |
속성 변경 (attribute change ) |
Audit은 파일 변경을 감지할 수 있지만, 이벤트 발생 방식에 한계가 있습니다.
Audit이 파일 변경 감지에 제한적인 이유
Audit은 파일 자체의 변경이 아니라 "시스템 호출(syscall)"을 감시
- Audit은 파일 시스템 이벤트를 직접 감시하지 않고, 특정 syscall을 감시하는 방식입니다.
- 즉, 파일을
open()
,write()
,unlink()
,chmod()
,rename()
등의 시스템 호출이 발생하면 이를 기록합니다.
예제: auditd를 통한 감지 이벤트 (audit.log)
type=SYSCALL msg=audit(1616497713.854:133): arch=c000003e syscall=2 success=yes exit=3 a0=7ffec7b98c20 a1=0 a2=1b6 a3=1 items=2 ppid=2345 pid=6789 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 ses=5
type=CWD msg=audit(1616497713.854:133): cwd="/root"
type=PATH msg=audit(1616497713.854:133): item=0 name="/etc/passwd" inode=1298498 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00
문제점
auditd
는 syscall 기반 이벤트 기록이므로 파일이 변경되었는지 실제 확인하려면 추가 분석이 필요함.auditd
로그만으로는 파일 내용이 변경되었는지, 파일이 교체되었는지 알기 어려움.- 고유 해시값(MD5, SHA256 등)이 자동으로 저장되지 않음.
inotify는 파일 변경을 직접 감지
반면, inotify
는 파일 시스템 레벨에서 실제 파일의 변경 이벤트를 감시합니다.
inotify의 주요 장점
auditd
처럼 syscall이 아니라, 파일의 변경 자체를 감시.- 파일이 수정되거나 삭제될 때 실시간 감지 가능.
osquery
와 같은 보안 도구에서 활용하기 용이.
inotifywait로 파일 변경 감지 예제
inotifywait -m -e modify,create,delete /etc
출력 예시
/etc/passwd MODIFY
/etc/shadow CREATE
/etc/hosts DELETE
auditd보다 직관적이며, 파일 변경 이벤트를 직접 기록할 수 있음.
osquery가 file_events에서 inotify를 사용하는 이유
osquery
는 FIM 기능(file_events
)을 제공할 때, Linux에서는 inotify를 기본적으로 사용합니다.
Audit 기반 감시의 한계
- Audit은 파일 변경을 syscall 기반으로 감지하기 때문에 실제 변경 여부를 확인하려면 추가 분석이 필요함.
auditd
와osquery
가 동시에 Audit subsystem을 사용할 수 없음 → 충돌 발생 가능성.
inotify의 장점
- 파일이 변경되었는지 직접 감지 가능.
- 이벤트가 실시간으로 생성되며, 불필요한 syscall 이벤트 필터링 가능.
- 파일이 삭제되거나 새롭게 생성될 경우 즉시 탐지 가능.
- 보안 정책 적용이 간편 (
osquery
에서 직접 설정 가능).
성능 문제
auditd
는 커널 syscall 로그를 생성하므로, 로그량이 많고 분석 부담이 큼.inotify
는 특정 파일 또는 디렉터리에 대한 변경 사항만 감지하므로 부하가 적음.
osquery에서 FIM을 최적으로 활용하는 방법
파일 무결성 모니터링을 위해 file_events 사용
{
"file_paths": {
"etc": [ "/etc/%%" ],
"ssh": [ "/root/.ssh/%%", "/home/%/.ssh/%%" ]
},
"exclude_paths": {
"etc": [ "/etc/machine-id" ]
}
}
file_events를 활용하면 파일 변경 시 해시값(MD5, SHA256)을 기록하여 정확한 변경 내용을 파악 가능.
파일 접근 모니터링이 필요하면 process_file_events 사용
--disable_audit=false
process_file_events를 활성화하면 파일을 누가 실행했는지, 누가 읽었는지 등의 정보를 audit 기반으로 기록.
정리해보면,
auditd
는 파일 변경 감지를 syscall 기반으로 수행하며, 추가적인 분석이 필요함.inotify
는 실제 파일 변경 이벤트를 감지할 수 있기 때문에 FIM(FIle Integrity Monitoring)에 적합함.osquery
에서file_events
는 Linux에서audit
대신 inotify를 사용하여 파일 변경을 직접 감지함.process_file_events
를 사용하면 파일 접근 이벤트까지 감지 가능하지만,auditd
와 충돌할 수 있음.- FIM을 위한 보안 솔루션 구성 시,
file_events
와process_file_events
를 적절히 활용하면 시스템 부하를 최소화하면서도 보안 모니터링을 강화할 수 있음.
즉, osquery에서 파일 변경 감지는 inotify를 사용하는 것이 성능과 보안 측면에서 가장 효율적인 방식이다!
댓글