019. Linux 서버 보안 — /tmp 보안 — 마운트 옵션 nodev·nosuid·noexec

changseop lee·3일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 19/50편 (전체 019/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

/tmp는 모든 사용자가 쓸 수 있는 디렉터리입니다(권한 1777, sticky bit). 그래서 침해 후 공격 도구를 내려받아 실행하는 장소로 자주 쓰입니다. 마운트 옵션은 이 위치에서 할 수 있는 일을 파일시스템 수준에서 제한합니다.

옵션막는 것
nodev장치 파일(블록/문자 디바이스) 해석 금지
nosuidsetuid/setgid 비트 무시 → /tmp의 SUID 파일로 권한 상승 불가
noexec파일 직접 실행 금지 (./tool 형태)
/tmp/tool 실행 시도
  ├─ ./tool            → noexec 이면 "Permission denied"
  ├─ bash /tmp/x.sh    → 실행됨 (bash가 파일을 "읽어서" 해석)
  └─ python3 /tmp/x.py → 실행됨 (인터프리터 우회)

즉 noexec는 완전한 차단이 아니라 난이도를 높이는 장치이며, 탐지와 함께 써야 합니다.

2. 왜 중요한가

  • 많은 자동화 공격은 /tmp에 바이너리를 내려받아 chmod +x 후 실행합니다. noexec만으로도 이런 단순 공격의 상당수가 실패하고, 실패 자체가 로그로 남습니다.
  • nosuid는 공격자가 만든 SUID 파일을 통한 권한 상승 경로를 차단합니다.
  • Rocky 9과 Ubuntu 22.04는 기본 설치 시 /tmp가 루트 파일시스템의 일부라 이 옵션들이 적용되지 않은 상태인 경우가 많습니다.

3. 핵심 명령어 / 설정

명령용도
findmnt /tmp/tmp가 별도 마운트인지, 옵션 확인
findmnt -no OPTIONS /tmp옵션만 출력
systemctl status tmp.mountsystemd tmpfs 마운트 유닛 상태
/etc/fstab 항목영구 마운트 설정
mount -o remount,noexec /tmp런타임 옵션 변경

4. 실습 (실습 예시)

# 1) 현재 상태
findmnt /tmp || echo "/tmp는 별도 마운트가 아님(루트 파일시스템의 일부)"

# 2) tmpfs로 분리 + 옵션 적용 (/etc/fstab에 추가)
echo 'tmpfs /tmp tmpfs defaults,rw,nodev,nosuid,noexec,size=1G,mode=1777 0 0' | sudo tee -a /etc/fstab
sudo systemctl daemon-reload
sudo mount /tmp            # 실행 중인 프로세스가 /tmp를 쓰고 있으면 재부팅 후 적용 권장
findmnt /tmp

# 3) 동작 확인
cp /usr/bin/id /tmp/id_test && chmod +x /tmp/id_test
/tmp/id_test               # Permission denied 예상
rm -f /tmp/id_test

tmpfs는 메모리 기반이라 재부팅 시 내용이 사라집니다. 사고 대응 시 /tmp 증거는 재부팅 전에 확보해야 한다는 점도 함께 기억합니다.

5. 정상 상태

$ findmnt /tmp
TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw,nosuid,nodev,noexec,relatime,size=1048576k,inode64
$ /tmp/id_test
-bash: /tmp/id_test: Permission denied

6. 이상 상태

$ findmnt -no OPTIONS /tmp
rw,nosuid,nodev,relatime,size=1048576k,inode64
$ grep /tmp /etc/fstab
tmpfs /tmp tmpfs defaults,rw,nodev,nosuid,noexec,size=1G,mode=1777 0 0
  • fstab에는 noexec가 있는데 현재 마운트에는 없음 → 누군가 mount -o remount,exec /tmp 실행 가능성
  • 실행 직전에만 옵션을 풀고 다시 걸어 두는 경우도 있으므로 remount 이벤트 자체를 탐지해야 합니다.

7. 로그 분석 (분석 방법)

/tmp 실행 시도와 remount는 다음처럼 남습니다(가상의 예시 로그).

type=SYSCALL msg=audit(1759720200.330:1701): arch=c000003e syscall=59 success=no exit=-13 ppid=7801 pid=7810 auid=4294967295 uid=48 comm="bash" exe="/usr/bin/bash" key="exec_tmp"
type=PATH msg=audit(1759720200.330:1701): item=0 name="/tmp/.x/kworker" nametype=NORMAL
type=SYSCALL msg=audit(1759720260.102:1709): arch=c000003e syscall=165 success=yes auid=1002 uid=0 comm="mount" exe="/usr/bin/mount" key="mount_change"
type=EXECVE msg=audit(1759720260.102:1709): argc=4 a0="mount" a1="-o" a2="remount,exec" a3="/tmp"
필드해석
syscall=59 success=no exit=-13execve 실패, -13 = EACCES(noexec로 거부)
name="/tmp/.x/kworker"숨김 디렉터리 + 커널 스레드 이름 위장
uid=48, auid unsetapache 프로세스 하위에서 실행 시도
syscall=165 + remount,execmount 시스템 콜로 noexec 해제

실패한 실행 시도도 중요한 증거입니다. 공격자가 무엇을 하려 했는지(파일명, 경로)를 보여주기 때문입니다.

8. SOC 관제 포인트

  • /tmp, /var/tmp, /dev/shm에서의 execve(성공·실패 모두)를 수집합니다.
  • mount 명령의 remount 이벤트를 하드닝 해제 징후로 분류합니다.
  • 숨김 디렉터리(/tmp/.x), 커널 스레드처럼 보이는 이름(kworker, kthreadd)은 위장 패턴입니다.

9. 탐지 규칙

# /etc/audit/rules.d/40-tmp.rules
-w /tmp/ -p x -k exec_tmp
-w /var/tmp/ -p x -k exec_tmp
-w /dev/shm/ -p x -k exec_tmp
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=unset -k mount_change
<rule id="100260" level="10">
  <if_group>audit</if_group>
  <field name="audit.key">exec_tmp</field>
  <description>임시 디렉터리에서 파일 실행 시도: $(audit.file.name)</description>
</rule>

-w 디렉터리 -p x는 해당 경로 아래 파일이 실행될 때 기록합니다. 인터프리터로 읽어 실행하는 경우(bash x.sh)는 -p r 이벤트로 나타나므로, 필요하면 F영역에서 다루는 execve 인자 분석으로 보완합니다.

10. 대응 방법

  1. 초기 확인 — 실행 시도된 파일의 경로·실행 사용자·부모 프로세스와 현재 마운트 옵션을 확인합니다.
  2. 범위 확인 — 같은 파일명·해시가 다른 서버의 임시 디렉터리에 있는지 확인합니다.
  3. 증거 확보 — 재부팅 전에 /tmp 파일 사본과 해시, audit 로그를 확보합니다(tmpfs는 재부팅 시 소멸).
  4. 차단/조치 — 마운트 옵션을 복원하고 파일을 격리한 뒤, 실행 주체 프로세스를 조사합니다.
  5. 재발 방지 — fstab 옵션과 현재 마운트 옵션을 함께 기준선에 포함하고 remount를 탐지합니다.

11. 핵심 정리

옵션효과 / 한계
nodev장치 파일 무효화
nosuidSUID/SGID 무시 → 권한 상승 경로 차단
noexec직접 실행 차단 / 인터프리터 우회 가능
탐지execve 실패(exit=-13), mount remount 이벤트
면접 포인트"noexec는 차단이 아니라 난이도 상승 + 탐지 기회"

12. 다음 편 예고

다음 편 020. Linux 서버 보안 — /var/tmp·/dev/shm 보안 점검 에서는 /tmp와 같은 위험을 가진 /var/tmp와 /dev/shm 을 점검합니다.


이전 편: 018. Linux 서버 보안 — AppArmor 프로파일 상태 점검(Ubuntu)
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글