리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 11 / 50 · Part 2. 파일·명령어·권한
실습 환경: Rocky Linux 9 (10.0.0.200)
이전 글: 10. Linux 시스템 정보 확인
🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 01. Linux 파일과 디렉터리의 기본 개념 · 09. cp로 파일 복사하기 · 10. mv와 rm의 동작 원리
Part 2 「파일·명령어·권한」을 시작한다. 첫 글은 ls, cp, mv, rm, mkdir, touch 같은 파일 관리 명령어다.
누구나 아는 명령어지만, 보안관제 관점에서는 질문이 달라진다.
cp로 로그를 복사하면 원본의 시각과 소유자가 유지되는가?mv로 파일을 옮기면 inode와 수정 시각은 어떻게 되는가?rm으로 지운 파일은 정말 사라졌는가?이 차이를 모르면 분석 과정에서 증거를 스스로 훼손 하거나, 공격자가 지운 파일의 흔적을 놓칠 수 있다. 이번 글은 명령어 사용법과 함께 각 명령이 파일 시스템의 무엇을 바꾸는지 를 정리한다.
6편에서 본 것처럼 파일은 세 부분으로 저장된다.
| 부분 | 저장 내용 | 확인 방법 |
|---|---|---|
| 디렉터리 항목 | 파일 이름 → inode 번호 | ls -i |
| inode | 권한, 소유자, 크기, 시각, 링크 수, 데이터 위치 | stat |
| 데이터 블록 | 실제 내용 | cat |
| 명령 | 기본 용도 | 관제에서 자주 쓰는 옵션 |
|---|---|---|
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(시각 지정) — 공격자의 시각 위조에도 쓰임 |
stat | inode 정보 | -c 형식 지정 |

cp는 새 파일(새 inode) 을 만들고 내용을 복사한다. 옵션 없이 복사하면 새 파일의 소유자는 복사한 사람, 수정 시각은 복사한 시각이 된다. 증적을 이렇게 복사하면 원래 파일이 언제 수정되었는지 정보를 잃는다. 그래서 증적 복사는 cp -p 또는 cp -a를 쓴다.
같은 파일 시스템 안의 mv는 데이터를 옮기지 않고 디렉터리 항목(이름)만 바꾼다. inode 번호와 mtime은 그대로이고, inode의 ctime(속성 변경 시각)만 갱신된다. 다른 파일 시스템으로 옮기면 내부적으로 복사 후 원본 삭제 가 일어난다.
rm은 unlink System Call을 호출해 디렉터리 항목을 지우고 inode의 링크 수를 1 줄인다. 링크 수가 0이 되고 그 파일을 열고 있는 프로세스가 없을 때 비로소 inode와 데이터 블록이 "빈 공간"으로 반환된다. 이때도 데이터를 0으로 덮어쓰지는 않는다.
여기서 관제에 중요한 사실이 나온다. 공격자가 로그 파일을 rm 해도, 그 로그를 쓰고 있던 프로세스(rsyslog 등)가 파일을 계속 열고 있으면 내용이 살아 있다. /proc/<PID>/fd/를 통해 복사할 수 있다.
# 실습 디렉터리 (권한 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
아래 출력은 형식 설명용 예시다.
① 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 압축 해제처럼 정상 작업으로도 생길 수 있어 단독 근거로 삼지는 않는다.)
| 상황 | 위험 | 올바른 방법 |
|---|---|---|
| 증적 복사 | cp로 복사해 원본 시각·소유자 정보 손실 | cp -a + sha256sum |
| 원본 로그 열람 | 편집기로 열다 실수로 저장 | less, cat 등 읽기 전용 도구 |
| 분석 중 정리 | 의심 파일을 rm | 삭제 금지, 격리 디렉터리로 복사 |
| 공격자 로그 삭제 | rm /var/log/secure | 열린 fd에서 복구, SIEM에 전송된 사본 확인 |
| 시각 위조 | touch -d로 악성 파일을 오래된 파일처럼 위장 | mtime vs ctime 비교 |
| 숨김 파일 | .으로 시작하는 이름, ... 같은 디렉터리 | ls -la로 확인 |
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
원본과 사본의 해시가 같아야 "분석한 파일 = 원본과 동일" 을 증명할 수 있다.
# 삭제되었지만 열려 있는 파일
sudo lsof +L1 2>/dev/null
# 특정 프로세스의 삭제된 fd
sudo ls -l /proc/$(pgrep -o rsyslogd)/fd | grep deleted
[Event] SIEM: 서버에서 수집되던 secure 로그가 10:40 이후 끊김
↓
[확인] ls -li /var/log/secure → 새 inode, 크기 작음 (재생성된 파일)
lsof +L1 → rsyslogd 가 (deleted) secure 를 여전히 열고 있음
↓
[복구] /proc/<PID>/fd/<n> 에서 삭제 전 로그 복사 + 해시
↓
[IOC] 삭제 직전 로그인 기록, sudo 기록 → 계정·IP
↓
[판단] 의도적 로그 삭제 = 흔적 은폐 → 침해 확정 방향으로 등급 상향
cp는 새 inode를 만든다. 증적 복사는 cp -a + sha256sum 이 기본이다.mv는 이름만 바꾼다 (inode·mtime 유지, ctime 갱신).rm은 연결만 끊는다. 열려 있는 파일은 삭제 후에도 /proc/<PID>/fd로 복구 할 수 있다.touch -d로 mtime은 바꿀 수 있지만 ctime은 바뀐다. mtime ≪ ctime은 시각 위조 단서 다.다음 글 「12. 절대경로와 상대경로」 에서는 경로 표기 방식과 ., .., ~의 의미를 정리한다. 경로 개념은 웹 로그에서 자주 보이는 경로 탐색(Path Traversal) 공격 과 스크립트의 상대경로 취약점 으로 바로 이어진다.