리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.

리눅스 시스템 기초 11 / 50 · Part 2. 파일·명령어·권한
실습 환경: Rocky Linux 9 (10.0.0.200)
이전 글: 10. Linux 시스템 정보 확인

🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 01. Linux 파일과 디렉터리의 기본 개념 · 09. cp로 파일 복사하기 · 10. mv와 rm의 동작 원리

1. 들어가며

Part 2 「파일·명령어·권한」을 시작한다. 첫 글은 ls, cp, mv, rm, mkdir, touch 같은 파일 관리 명령어다.

누구나 아는 명령어지만, 보안관제 관점에서는 질문이 달라진다.

  • cp로 로그를 복사하면 원본의 시각과 소유자가 유지되는가?
  • mv로 파일을 옮기면 inode와 수정 시각은 어떻게 되는가?
  • rm으로 지운 파일은 정말 사라졌는가?

이 차이를 모르면 분석 과정에서 증거를 스스로 훼손 하거나, 공격자가 지운 파일의 흔적을 놓칠 수 있다. 이번 글은 명령어 사용법과 함께 각 명령이 파일 시스템의 무엇을 바꾸는지 를 정리한다.


2. 핵심 개념

2-1. 파일의 세 부분

6편에서 본 것처럼 파일은 세 부분으로 저장된다.

부분저장 내용확인 방법
디렉터리 항목파일 이름 → inode 번호ls -i
inode권한, 소유자, 크기, 시각, 링크 수, 데이터 위치stat
데이터 블록실제 내용cat

2-2. 주요 명령어와 보안 관점 옵션

명령기본 용도관제에서 자주 쓰는 옵션
ls목록-la(숨김 포함), -lt(최신순), -lS(크기순), -i(inode), --time-style=full-iso(초 단위 시각)
cp복사-p(권한·소유자·시각 보존), -a(= -dR --preserve=all, 링크·속성 전부 보존)
mv이동·이름 변경-n(덮어쓰지 않음), -i(확인)
rm삭제-i(확인), -r(디렉터리) — 분석 대상 서버에서는 원칙적으로 사용하지 않음
mkdir디렉터리 생성-p(중간 경로 생성), -m 700(권한 지정)
touch빈 파일 생성·시각 갱신-d(시각 지정) — 공격자의 시각 위조에도 쓰임
statinode 정보-c 형식 지정

3. 동작 원리

cp · mv · rm 은 파일 시스템에서 무엇을 바꾸는가

3-1. cp — 새 inode를 만든다

cp는 새 파일(새 inode) 을 만들고 내용을 복사한다. 옵션 없이 복사하면 새 파일의 소유자는 복사한 사람, 수정 시각은 복사한 시각이 된다. 증적을 이렇게 복사하면 원래 파일이 언제 수정되었는지 정보를 잃는다. 그래서 증적 복사는 cp -p 또는 cp -a를 쓴다.

3-2. mv — 같은 파일 시스템에서는 이름만 바꾼다

같은 파일 시스템 안의 mv는 데이터를 옮기지 않고 디렉터리 항목(이름)만 바꾼다. inode 번호와 mtime은 그대로이고, inode의 ctime(속성 변경 시각)만 갱신된다. 다른 파일 시스템으로 옮기면 내부적으로 복사 후 원본 삭제 가 일어난다.

3-3. rm — 이름과 inode의 연결을 끊는다

rm은 unlink System Call을 호출해 디렉터리 항목을 지우고 inode의 링크 수를 1 줄인다. 링크 수가 0이 되고 그 파일을 열고 있는 프로세스가 없을 때 비로소 inode와 데이터 블록이 "빈 공간"으로 반환된다. 이때도 데이터를 0으로 덮어쓰지는 않는다.

여기서 관제에 중요한 사실이 나온다. 공격자가 로그 파일을 rm 해도, 그 로그를 쓰고 있던 프로세스(rsyslog 등)가 파일을 계속 열고 있으면 내용이 살아 있다. /proc/<PID>/fd/를 통해 복사할 수 있다.


4. 실습

# 실습 디렉터리 (권한 700)
mkdir -p -m 700 ~/lab11 && cd ~/lab11
echo "test log" > a.log

# 1) inode와 시각 확인
ls -li --time-style=full-iso a.log
stat a.log

# 2) mv: inode 유지 확인
mv a.log b.log
stat -c '%n inode=%i mtime=%y ctime=%z' b.log

# 3) cp vs cp -p: 시각 비교
sleep 2
cp b.log c.log
cp -p b.log d.log
stat -c '%n inode=%i mtime=%y' b.log c.log d.log

# 4) 열려 있는 파일을 삭제하면?
exec 3< b.log                       # 현재 셸이 b.log를 열어 둠 (fd 3)
rm b.log
ls -l /proc/$$/fd/3                 # (deleted) 표시
cat /proc/$$/fd/3                   # 내용은 아직 읽힘
sudo lsof +L1 2>/dev/null | head    # 링크 수 0인데 열려 있는 파일 목록
exec 3<&-                           # 닫기

# 5) touch -d 로 수정 시각 위조 → ctime은 바뀜
touch -d '2020-01-01 00:00' c.log
stat -c '%n mtime=%y ctime=%z' c.log

5. 결과 분석

아래 출력은 형식 설명용 예시다.

① mv 전후 / cp 비교

b.log inode=794695 mtime=2026-09-23 10:31:20
c.log inode=794696 mtime=2026-09-23 10:31:22   ← cp: 새 inode, 복사 시각
d.log inode=794698 mtime=2026-09-23 10:31:20   ← cp -p: 새 inode, 원본 시각 유지

② 삭제 후 열린 파일

lr-x------ 1 roror roror 64 ... /proc/2310/fd/3 -> /home/roror/lab11/b.log (deleted)

(deleted)가 붙은 fd는 이름은 사라졌지만 데이터는 남아 있는 파일 이다. cp /proc/2310/fd/3 /root/evidence/recovered.log로 복사할 수 있다.

③ touch -d 이후

c.log mtime=2020-01-01 00:00:00.000000000 +0900
      ctime=2026-09-23 10:33:05.xxx +0900

mtime은 2020년인데 ctime은 오늘이다. 사용자 명령으로는 ctime을 임의로 되돌릴 수 없기 때문에, mtime이 ctime보다 훨씬 과거인 파일은 시각 위조(timestomping)를 의심할 단서가 된다. (단, cp -p, tar 압축 해제처럼 정상 작업으로도 생길 수 있어 단독 근거로 삼지는 않는다.)


6. 보안 관점

상황위험올바른 방법
증적 복사cp로 복사해 원본 시각·소유자 정보 손실cp -a + sha256sum
원본 로그 열람편집기로 열다 실수로 저장less, cat 등 읽기 전용 도구
분석 중 정리의심 파일을 rm삭제 금지, 격리 디렉터리로 복사
공격자 로그 삭제rm /var/log/secure열린 fd에서 복구, SIEM에 전송된 사본 확인
시각 위조touch -d로 악성 파일을 오래된 파일처럼 위장mtime vs ctime 비교
숨김 파일.으로 시작하는 이름, ... 같은 디렉터리ls -la로 확인

7. SOC / 보안관제 활용

7-1. 증적 복사 절차

CASE=/root/evidence/case_$(date +%Y%m%d_%H%M)
sudo mkdir -p -m 700 "$CASE"

# 원본 해시 → 속성 보존 복사 → 사본 해시 → 비교
sudo sha256sum /var/log/secure | sudo tee "$CASE/original.sha256"
sudo cp -a /var/log/secure "$CASE/"
sudo sh -c "cd $CASE && sha256sum secure" | sudo tee "$CASE/copy.sha256"
sudo sync

원본과 사본의 해시가 같아야 "분석한 파일 = 원본과 동일" 을 증명할 수 있다.

7-2. 삭제된 로그 흔적 찾기

# 삭제되었지만 열려 있는 파일
sudo lsof +L1 2>/dev/null

# 특정 프로세스의 삭제된 fd
sudo ls -l /proc/$(pgrep -o rsyslogd)/fd | grep deleted

7-3. 분석 흐름

[Event]   SIEM: 서버에서 수집되던 secure 로그가 10:40 이후 끊김
   ↓
[확인]    ls -li /var/log/secure → 새 inode, 크기 작음 (재생성된 파일)
          lsof +L1 → rsyslogd 가 (deleted) secure 를 여전히 열고 있음
   ↓
[복구]    /proc/<PID>/fd/<n> 에서 삭제 전 로그 복사 + 해시
   ↓
[IOC]     삭제 직전 로그인 기록, sudo 기록 → 계정·IP
   ↓
[판단]    의도적 로그 삭제 = 흔적 은폐 → 침해 확정 방향으로 등급 상향

8. 핵심 정리

  • 파일은 이름(디렉터리 항목) → inode(속성) → 데이터 블록(내용) 으로 구성된다.
  • cp는 새 inode를 만든다. 증적 복사는 cp -a + sha256sum 이 기본이다.
  • 같은 파일 시스템의 mv는 이름만 바꾼다 (inode·mtime 유지, ctime 갱신).
  • rm은 연결만 끊는다. 열려 있는 파일은 삭제 후에도 /proc/<PID>/fd로 복구 할 수 있다.
  • touch -d로 mtime은 바꿀 수 있지만 ctime은 바뀐다. mtime ≪ ctime은 시각 위조 단서 다.
  • 분석 대상 서버에서는 원본을 수정·삭제하지 않는다.

9. 다음 글

다음 글 「12. 절대경로와 상대경로」 에서는 경로 표기 방식과 ., .., ~의 의미를 정리한다. 경로 개념은 웹 로그에서 자주 보이는 경로 탐색(Path Traversal) 공격 과 스크립트의 상대경로 취약점 으로 바로 이어진다.


참고 자료

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

0개의 댓글