시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 20/50편 (전체 020/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
누구나 쓸 수 있는(world-writable) 대표 경로는 세 곳이며, 보존 특성이 다릅니다.
| 경로 | 저장 위치 | 재부팅 후 | 공격자가 선호하는 이유 |
|---|---|---|---|
/tmp | 디스크 또는 tmpfs | tmpfs면 삭제 | 가장 흔한 작업 공간 |
/var/tmp | 디스크 | 유지 | 재부팅 후에도 도구·지속성 파일 유지 |
/dev/shm | tmpfs(메모리) | 삭제 | 디스크 흔적 최소화, 점검 누락이 잦음 |
/tmp 를 noexec 로 막음
↓ 공격자 우회
/var/tmp 또는 /dev/shm 에 파일 배치 → 실행
↓
세 경로를 "한 묶음"으로 점검해야 하는 이유
/var/tmp는 systemd-tmpfiles 정책상 오래된 파일만 정리(기본 30일)되므로, 그 사이 도구가 남아 있을 수 있습니다./dev/shm은 메모리 기반이라 디스크 포렌식에서 보이지 않습니다. 라이브 상태에서 확인하지 않으면 증거가 사라집니다.| 명령 | 용도 |
|---|---|
findmnt /var/tmp /dev/shm | 마운트 여부·옵션 |
find /tmp /var/tmp /dev/shm -xdev -type f -printf '%TY-%Tm-%Td %TH:%TM %u %m %p\n' | 파일 목록(시간·소유자·권한) |
find /tmp /var/tmp /dev/shm -type f -perm -u+x | 실행 권한 파일 |
ls -l /proc/*/exe 2>/dev/null | grep -E '/tmp/|/var/tmp/|/dev/shm/' | 임시 경로에서 실행 중인 프로세스 |
systemd-tmpfiles --cat-config | grep -E 'tmp|shm' | 자동 정리 정책 |
# 1) 마운트 옵션 점검
findmnt -no TARGET,OPTIONS /tmp /var/tmp /dev/shm
# 2) /dev/shm 옵션 강화 (/etc/fstab)
echo 'tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0' | sudo tee -a /etc/fstab
sudo mount -o remount /dev/shm
# 3) /var/tmp를 /tmp와 같은 옵션으로: bind 마운트 예시
echo '/tmp /var/tmp none bind 0 0' | sudo tee -a /etc/fstab
# 주의: /var/tmp는 재부팅 후 유지가 원래 목적이므로 서비스 영향 검토 후 적용
# 4) 세 경로의 실행 파일·실행 중 프로세스 점검
sudo find /tmp /var/tmp /dev/shm -xdev -type f -perm -u+x -ls 2>/dev/null
sudo ls -l /proc/*/exe 2>/dev/null | grep -E '/tmp/|/var/tmp/|/dev/shm/'
PostgreSQL처럼 /dev/shm을 공유 메모리로 쓰는 서비스도 있으므로 파일 존재 자체가 이상은 아닙니다. 소유자·이름·실행 권한으로 판단합니다.
$ findmnt -no TARGET,OPTIONS /dev/shm
/dev/shm rw,nosuid,nodev,noexec,inode64
$ sudo find /tmp /var/tmp /dev/shm -xdev -type f -perm -u+x -ls
$
실행 권한 파일이 없고, /dev/shm에는 서비스 소유의 공유 메모리 파일만 있는 상태가 정상입니다.
$ sudo find /var/tmp /dev/shm -xdev -type f -perm -u+x -printf '%TY-%Tm-%Td %TH:%TM %u %m %p\n'
2026-10-01 02:31 apache 755 /var/tmp/.font-unix/fc
2026-10-01 02:33 apache 755 /dev/shm/.s
$ sudo ls -l /proc/*/exe 2>/dev/null | grep /dev/shm
lrwxrwxrwx. 1 apache apache 0 Oct 1 02:34 /proc/8102/exe -> /dev/shm/.s
.font-unix 아래 실행 파일 → 이름 위장/dev/shm/.s가 현재 실행 중 → 프로세스 메모리·네트워크 연결을 먼저 수집해야 합니다(재부팅·종료 시 소멸).019편의 감시 규칙을 세 경로로 확장했을 때 남는 기록입니다(가상의 예시 로그).
type=SYSCALL msg=audit(1759728780.210:1801): arch=c000003e syscall=59 success=yes exit=0 ppid=8050 pid=8102 auid=4294967295 uid=48 comm=".s" exe="/dev/shm/.s" key="exec_tmp"
type=SYSCALL msg=audit(1759728790.004:1803): arch=c000003e syscall=42 success=yes exit=0 pid=8102 uid=48 comm=".s" exe="/dev/shm/.s" key="net_connect"
type=SOCKADDR msg=audit(1759728790.004:1803): saddr=02000BB8C0A8384D0000000000000000
| 필드 | 해석 |
|---|---|
exe="/dev/shm/.s" | 메모리 경로에서 실행 성공(noexec 미적용 상태) |
syscall=42 | connect(외부 연결 시도) |
saddr=0200 0BB8 C0A8384D | AF_INET(02), 포트 0x0BB8=3000, IP C0.A8.38.4D = 192.168.56.77 |
ausearch -i를 쓰면 SOCKADDR이 saddr={ fam=inet laddr=192.168.56.77 lport=3000 }처럼 해석되어 출력됩니다.
/dev/shm 실행 프로세스가 발견되면 종료보다 라이브 증거 수집을 먼저 합니다.# 019편 규칙에 이어서
-w /var/tmp/ -p x -k exec_tmp
-w /dev/shm/ -p x -k exec_tmp
-a always,exit -F arch=b64 -S connect -F uid=48 -k net_connect # Rocky apache 예시
<rule id="100270" level="12">
<if_group>audit</if_group>
<field name="audit.key">exec_tmp</field>
<field name="audit.exe">^/dev/shm/</field>
<description>/dev/shm에서 프로세스 실행 성공: $(audit.exe)</description>
</rule>
모든 connect를 감사하면 로그가 폭증하므로, 서비스 계정 UID처럼 범위를 좁혀 적용합니다.
/proc/PID/(exe, cmdline, maps, fd)와 파일 사본을 라이브 상태에서 먼저 확보합니다.| 경로 | 특성 / 점검 포인트 |
|---|---|
| /tmp | 일반 작업 공간 / noexec·실행 감시 |
| /var/tmp | 재부팅 후 유지 / 장기 잔존 도구 |
| /dev/shm | 메모리 기반 / 라이브 수집 필수 |
| 실행 중 확인 | ls -l /proc/*/exe | grep 임시경로 |
| 면접 포인트 | "/tmp만 막으면 공격자는 /var/tmp, /dev/shm으로 이동" |
다음 편 021. Linux 서버 보안 — /etc 디렉터리 변경 관리 에서는 설정 파일이 모여 있는 /etc 디렉터리의 변경 관리 방법을 다룹니다.
이전 편: 019. Linux 서버 보안 — /tmp 보안 — 마운트 옵션 nodev·nosuid·noexec
📚 시리즈 전체 보기: 시스템 보안 · 취약점