파일 · 권한 · 사용자 관리 15 / 50 · Part 2. Linux 파일 종류와 속성
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 14. inode와 파일 시스템

1. 들어가며

08편에서 touch로 atime·mtime은 조작할 수 있지만 ctime은 조작할 수 없다는 것을 확인했다. 이번 글에서는 네 가지 타임스탬프를 정식으로 정리한다.

  • atime (access time) — 내용을 읽은 시각
  • mtime (modify time) — 내용을 수정한 시각
  • ctime (change time) — inode가 바뀐 시각
  • birth (creation time) — 파일이 생성된 시각

침해사고 타임라인 분석은 결국 이 네 값을 어떤 동작이 어떤 값을 바꾸는지 에 대한 정확한 이해 위에서 이루어진다. 특히 "파일을 읽었는데 atime이 안 바뀐다"는 relatime 동작을 모르면 잘못된 결론을 내리기 쉽다.


2. 핵심 개념

2-1. 네 가지 시간

시간바뀌는 때확인주의
atime파일 내용을 읽을 때ls -lu, stat %x마운트 옵션(relatime, noatime)에 따라 갱신 안 될 수 있음
mtime파일 내용이 바뀔 때ls -l, stat %y사용자가 touch로 조작 가능
ctimeinode 정보(권한, 소유자, 링크 수, 크기, 시간 등)가 바뀔 때ls -lc, stat %z일반 사용자는 직접 설정 불가
birth파일 생성 시 한 번stat %wext4, xfs, btrfs 등 지원 FS + 최신 도구에서만 표시

ctime은 "creation time"이 아니다. Linux에서 ctime은 change time이다. 생성 시각은 birth(crtime)다.

2-2. 디렉터리의 시간

디렉터리의 mtime·ctime은 안의 이름 목록이 바뀔 때 (파일 생성, 삭제, 이름 변경) 갱신된다. 디렉터리 안의 파일 내용 이 바뀌는 것은 디렉터리 시간에 영향을 주지 않는다.

2-3. atime 마운트 옵션

옵션동작
strictatime읽을 때마다 항상 갱신 (디스크 쓰기 많음)
relatime조건부 갱신 — 대부분 배포판의 기본값
noatime갱신하지 않음

3. 동작 원리

네 가지 타임스탬프 — 무엇이 언제 바뀌는가

3-1. relatime 규칙

relatime에서는 읽기가 발생해도 다음 중 하나일 때만 atime을 갱신한다.

  1. 현재 atime이 mtime 또는 ctime보다 이전이거나 같을 때 (수정 이후 첫 읽기)
  2. 현재 atime이 24시간 이상 지났을 때

그래서 파일을 생성한 뒤 처음 읽으면 atime이 갱신되고, 바로 다시 읽으면 갱신되지 않는다.

3-2. ctime을 사용자가 설정할 수 없는 이유

ctime은 커널이 inode를 수정할 때마다 현재 시스템 시각 으로 자동 기록한다. utimensat() 같은 시스템 콜에도 ctime을 지정하는 인자가 없다. 다만 root가 시스템 시계를 바꾸거나, 언마운트된 파일 시스템을 debugfs -w로 수정하는 것까지 막지는 못하므로 ctime도 "변조 불가능한 증거"는 아니다.


4. 명령어 실습

# 1) 마운트 옵션 확인
findmnt -no OPTIONS /data

cd /data && mkdir lab15 && cd lab15

# 2) 생성 직후 — 네 시간 동일
echo "secret" > f.txt && sleep 1
stat --printf 'A=%x\nM=%y\nC=%z\nB=%w\n' f.txt

# 3) 첫 번째 읽기 → atime 갱신
sleep 1; cat f.txt > /dev/null
stat --printf 'A=%x\n' f.txt

# 4) 두 번째 읽기 → relatime 으로 갱신 안 됨
sleep 1; cat f.txt > /dev/null
stat --printf 'A=%x  (두 번째 읽기: relatime 으로 갱신 안 됨)\n' f.txt

# 5) 권한 변경 → ctime 만 변경
sleep 1; chmod 600 f.txt
stat --printf 'M=%y\nC=%z  (chmod: ctime 만 변경)\n' f.txt

# 6) ls 로 각 시간 보기
ls -l --time-style=+%T f.txt ; ls -lu --time-style=+%T f.txt ; ls -lc --time-style=+%T f.txt

4~5단계 printf 안의 괄호 설명은 출력 형식에 직접 넣은 메모다. 시간 값은 모두 실제 출력이다.


5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — 타임스탬프 변화 추적

텍스트 원본(실제 출력):

[analyst@rocky9-lab ~]$ findmnt -no OPTIONS /data
rw,relatime
[analyst@rocky9-lab ~]$ cd /data && mkdir lab15 && cd lab15
[analyst@rocky9-lab lab15]$ echo "secret" > f.txt && sleep 1
[analyst@rocky9-lab lab15]$ stat --printf 'A=%x\nM=%y\nC=%z\nB=%w\n' f.txt
A=2026-09-24 10:35:17.399694964 +0900
M=2026-09-24 10:35:17.399694964 +0900
C=2026-09-24 10:35:17.399694964 +0900
B=2026-09-24 10:35:17.399694964 +0900
[analyst@rocky9-lab lab15]$ sleep 1; cat f.txt > /dev/null
[analyst@rocky9-lab lab15]$ stat --printf 'A=%x\n' f.txt
A=2026-09-24 10:35:19.423694976 +0900
[analyst@rocky9-lab lab15]$ sleep 1; cat f.txt > /dev/null
[analyst@rocky9-lab lab15]$ stat --printf 'A=%x  (두 번째 읽기: relatime 으로 갱신 안 됨)\n' f.txt
A=2026-09-24 10:35:19.423694976 +0900  (두 번째 읽기: relatime 으로 갱신 안 됨)
[analyst@rocky9-lab lab15]$ sleep 1; chmod 600 f.txt
[analyst@rocky9-lab lab15]$ stat --printf 'M=%y\nC=%z  (chmod: ctime 만 변경)\n' f.txt
M=2026-09-24 10:35:17.399694964 +0900
C=2026-09-24 10:35:21.475694989 +0900  (chmod: ctime 만 변경)
[analyst@rocky9-lab lab15]$ ls -l --time-style=+%T f.txt ; ls -lu --time-style=+%T f.txt ; ls -lc --time-style=+%T f.txt
-rw------- 1 analyst analyst 7 10:35:17 f.txt
-rw------- 1 analyst analyst 7 10:35:19 f.txt
-rw------- 1 analyst analyst 7 10:35:21 f.txt

6. 결과 해석

단계관찰해석
rw,relatime/data는 relatime으로 마운트됨대부분 배포판 기본값
생성 직후A = M = C = B = 10:35:17.399생성 순간 네 값이 같다
첫 cat 후A = 10:35:19.423atime(17.399) ≤ mtime(17.399) 조건 → 갱신
두 번째 cat 후A = 10:35:19.423 (변화 없음)atime > mtime이고 24시간이 지나지 않음 → 갱신 안 됨
chmod 600 후M = 10:35:17.399 유지, C = 10:35:21.475권한은 inode 정보 → ctime만 변경
ls -l / -lu / -lc10:35:17(mtime), 10:35:19(atime), 10:35:21(ctime)같은 파일도 옵션에 따라 전혀 다른 "시간"이 보인다

두 번째 읽기에서 atime이 바뀌지 않은 것이 이번 실습의 핵심이다. "atime이 사고 이전이니 공격자가 이 파일을 읽지 않았다"는 결론은 relatime 환경에서 성립하지 않는다.


7. 보안 관점

시간증거로서의 강도이유
birth강함 (지원 시)생성 시 한 번 기록, 사용자 조작 불가
ctime강함커널이 자동 기록, 사용자 조작 불가 (root 우회 가능성은 존재)
mtime중간사용자가 touch로 임의 설정 가능
atime약함relatime·noatime·백업·백신 스캔 등으로 쉽게 왜곡
관찰 패턴가능한 해석
ctime만 사고 시각, mtime은 오래됨권한·소유자 변경, 이름 변경, 또는 timestomping
birth가 mtime보다 늦음복사·압축 해제·복원된 파일, 또는 시간 조작
디렉터리 mtime이 사고 시각그 디렉터리에서 파일 생성·삭제·이름 변경이 있었음
전체 파일 atime이 같은 시각백업·백신·grep -r 같은 일괄 읽기 작업

8. 보안관제 관점

[Timeline 구성 순서]
 ① 기준 시각 확정    : SIEM 경보 시각, 최초 로그인 로그
 ② ctime/birth 검색  : find / -xdev -newerct "사고-1h" ! -newerct "사고+1h"
 ③ 디렉터리 변화      : 해당 시간대 mtime 이 바뀐 디렉터리
 ④ mtime 은 참고값    : ctime 과의 차이로 조작 여부 판단
 ⑤ atime 은 보조     : relatime 여부를 먼저 확인
 ⑥ 로그와 교차 검증  : secure/auth.log, 웹 로그, auditd
관점내용
Evidence파일을 열어 보기 전에 stat을 먼저 수집한다. 분석가의 cat이 atime을 바꿀 수 있다
Timeline시간대(+0900)를 포함해 기록하고, 여러 서버의 시계 동기화(NTP) 상태를 확인한다
DetectionFIM 도구는 보통 mtime·ctime·해시 변화를 감시한다. atime 감시는 오탐이 많아 잘 쓰지 않는다
보고"atime 기준 접근 없음"이 아니라 "relatime 환경이므로 접근 여부 판단 불가"처럼 한계를 명시한다

9. 실무에서 자주 발생하는 실수

실수결과예방
ctime을 생성 시각으로 해석타임라인 오류ctime = change time, 생성은 birth
atime으로 "안 읽었다"고 결론relatime·noatime 무시마운트 옵션 먼저 확인
증거 파일을 먼저 열어 봄atime 변경stat 먼저
시간대 없이 시각 기록서버 간 비교 오류full-iso 형식, +0900 포함
디렉터리 시간을 무시삭제된 파일의 흔적을 놓침상위 디렉터리 mtime·ctime 확인

10. 실습 체크리스트

[ ] findmnt 로 relatime 여부를 확인했다
[ ] 첫 읽기와 두 번째 읽기의 atime 차이를 확인했다
[ ] chmod 가 ctime 만 바꾸는 것을 확인했다
[ ] ls -l / -lu / -lc 가 각각 어떤 시간을 보여 주는지 확인했다
[ ] ctime 과 birth 의 차이를 설명할 수 있다
[ ] 타임라인 분석에서 시간별 신뢰도 순서를 정리했다

11. 핵심 정리

  • atime(읽기), mtime(내용 변경), ctime(inode 변경), birth(생성) 네 가지 시간이 있다.
  • ctime은 change time 이다. 생성 시각은 birth다.
  • 권한·소유자·이름 변경은 mtime이 아니라 ctime만 바꾼다.
  • relatime에서는 수정 후 첫 읽기 또는 24시간 경과 시에만 atime이 갱신된다.
  • 증거 강도는 birth·ctime > mtime > atime 순이다.
  • 조사 시 stat을 먼저 수집하고, 마운트 옵션과 시간대를 함께 기록한다.

12. 다음 편 예고

다음 글 「16. stat 명령어로 파일 metadata 분석」 에서는 지금까지 본 inode 정보를 한 번에 보여 주는 stat의 출력 필드를 모두 해석하고, 분석 보고서에 바로 쓸 수 있는 형식 지정(-c) 템플릿 을 만든다.


참고 자료


시리즈 이동

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글