시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 19/50편 (전체 019/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
/tmp는 모든 사용자가 쓸 수 있는 디렉터리입니다(권한 1777, sticky bit). 그래서 침해 후 공격 도구를 내려받아 실행하는 장소로 자주 쓰입니다. 마운트 옵션은 이 위치에서 할 수 있는 일을 파일시스템 수준에서 제한합니다.
| 옵션 | 막는 것 |
|---|---|
nodev | 장치 파일(블록/문자 디바이스) 해석 금지 |
nosuid | setuid/setgid 비트 무시 → /tmp의 SUID 파일로 권한 상승 불가 |
noexec | 파일 직접 실행 금지 (./tool 형태) |
/tmp/tool 실행 시도
├─ ./tool → noexec 이면 "Permission denied"
├─ bash /tmp/x.sh → 실행됨 (bash가 파일을 "읽어서" 해석)
└─ python3 /tmp/x.py → 실행됨 (인터프리터 우회)
즉 noexec는 완전한 차단이 아니라 난이도를 높이는 장치이며, 탐지와 함께 써야 합니다.
/tmp에 바이너리를 내려받아 chmod +x 후 실행합니다. noexec만으로도 이런 단순 공격의 상당수가 실패하고, 실패 자체가 로그로 남습니다.nosuid는 공격자가 만든 SUID 파일을 통한 권한 상승 경로를 차단합니다./tmp가 루트 파일시스템의 일부라 이 옵션들이 적용되지 않은 상태인 경우가 많습니다.| 명령 | 용도 |
|---|---|
findmnt /tmp | /tmp가 별도 마운트인지, 옵션 확인 |
findmnt -no OPTIONS /tmp | 옵션만 출력 |
systemctl status tmp.mount | systemd tmpfs 마운트 유닛 상태 |
/etc/fstab 항목 | 영구 마운트 설정 |
mount -o remount,noexec /tmp | 런타임 옵션 변경 |
# 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 증거는 재부팅 전에 확보해야 한다는 점도 함께 기억합니다.
$ 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
$ 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
noexec가 있는데 현재 마운트에는 없음 → 누군가 mount -o remount,exec /tmp 실행 가능성/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=-13 | execve 실패, -13 = EACCES(noexec로 거부) |
name="/tmp/.x/kworker" | 숨김 디렉터리 + 커널 스레드 이름 위장 |
uid=48, auid unset | apache 프로세스 하위에서 실행 시도 |
syscall=165 + remount,exec | mount 시스템 콜로 noexec 해제 |
실패한 실행 시도도 중요한 증거입니다. 공격자가 무엇을 하려 했는지(파일명, 경로)를 보여주기 때문입니다.
/tmp, /var/tmp, /dev/shm에서의 execve(성공·실패 모두)를 수집합니다.mount 명령의 remount 이벤트를 하드닝 해제 징후로 분류합니다./tmp/.x), 커널 스레드처럼 보이는 이름(kworker, kthreadd)은 위장 패턴입니다.# /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 인자 분석으로 보완합니다.
| 옵션 | 효과 / 한계 |
|---|---|
| nodev | 장치 파일 무효화 |
| nosuid | SUID/SGID 무시 → 권한 상승 경로 차단 |
| noexec | 직접 실행 차단 / 인터프리터 우회 가능 |
| 탐지 | execve 실패(exit=-13), mount remount 이벤트 |
| 면접 포인트 | "noexec는 차단이 아니라 난이도 상승 + 탐지 기회" |
다음 편 020. Linux 서버 보안 — /var/tmp·/dev/shm 보안 점검 에서는 /tmp와 같은 위험을 가진 /var/tmp와 /dev/shm 을 점검합니다.
이전 편: 018. Linux 서버 보안 — AppArmor 프로파일 상태 점검(Ubuntu)
📚 시리즈 전체 보기: 시스템 보안 · 취약점