System Hardening 정책 가이드 (운영 서버 기준)¶
Main Gateway 및 다중 서비스(Node.js / Next.js / DB / Redis) 운영 서버의
시스템 레벨 보안 강화를 위한 표준 정책을 정의함.
단순 설정 방법이 아닌 운영 보안 기준 + 실제 적용 기준을 포함함.
1. 기본 원칙¶
운영 서버는 다음 원칙을 반드시 준수함.
- 최소 권한 원칙 적용
- 실행 경로 통제
- 불필요한 기능 비활성화
- 커널 및 네트워크 보안 강화
- 사용자 writable 경로에서 실행 금지
/etc/fstab 예시 표기 규칙¶
이 문서의 /etc/fstab 예시는 다음 기준으로 사용함.
- device / LVM / UUID 기반 마운트는
[SOURCE]placeholder 를 실제 값으로 치환함 tmpfs,proc같은 pseudo filesystem 은 source 값을 그대로 사용함- bind mount 는 source path 자체를 그대로 사용함
확인 명령:
findmnt -no SOURCE /home
findmnt -no SOURCE /var
lsblk -f
예:
findmnt -no SOURCE /home
/dev/mapper/rl-home
위 결과라면 다음과 같이 해석함.
/dev/mapper/rl-home /home xfs defaults,nodev,nosuid 0 0
아래 예시는 [SOURCE] 로 치환하지 않음.
tmpfs /tmp tmpfs defaults,nodev,nosuid,noexec,mode=1777 0 0
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0
/var/tmp /var/tmp none bind 0 0
2. /tmp 보안 마운트 정책 (필수)¶
운영 서버에서는 /tmp 실행을 금지함.
/etc/fstab 기준¶
tmpfs /tmp tmpfs defaults,nodev,nosuid,noexec,mode=1777 0 0
적용 명령¶
sudo mount -o remount /tmp
정책 목적¶
- 임시 디렉토리에서 실행 파일 실행 차단
- SUID 기반 권한 상승 차단
- 디바이스 파일 생성 차단
- 재부팅 시 자동 초기화
권한 확인¶
/tmp 디렉토리는 반드시 sticky bit 가 설정되어 있어야 함.
ls -ld /tmp
정상 예시
drwxrwxrwt
t (sticky bit)가 없는 경우 다음 명령으로 수정함.
sudo chmod 1777 /tmp
3. /var/tmp 보안 정책 (필수)¶
/var/tmp는 디스크 유지가 필요한 임시 파일 영역임.
실행 금지 정책을 적용함.
기본 운영 기준은 디스크 기반 유지 + nodev,nosuid,noexec 적용임.
/etc/fstab 기준 예시 1: 전용 filesystem 이 있는 경우¶
[SOURCE] /var/tmp xfs defaults,nodev,nosuid,noexec 0 0
/etc/fstab 기준 예시 2: /var 는 별도 filesystem 이지만 /var/tmp 전용 LV 는 없는 경우¶
/var/tmp /var/tmp none bind 0 0
/var/tmp /var/tmp none remount,bind,nodev,nosuid,noexec 0 0
위 방식은 /var 디스크 위의 실제 /var/tmp 디렉터리를 그대로 사용하면서
/var/tmp 에만 별도 mount 옵션을 적용하는 운영 방식임.
적용 명령¶
전용 filesystem 방식:
sudo mount /var/tmp
bind mount 방식:
sudo mount --bind /var/tmp /var/tmp
sudo mount -o remount,bind,nodev,nosuid,noexec /var/tmp
주의¶
tmpfs /var/tmp는/var/tmp의 지속성 의미를 바꾸므로 기본 기준으로 사용하지 않음tmpfs /var/tmp는 Gateway, appliance, 일시적 워크로드 서버처럼 역할이 명확한 경우에만 예외적으로 검토함- 일부 프로그램은
/var/tmp의 재부팅 후 유지 특성을 기대할 수 있으므로 적용 후 동작 확인이 필요함 - 감사/컴플라이언스 대응이 강한 환경에서는 bind mount 보다
/var/tmp전용 LV 또는 별도 filesystem 구성을 더 선호할 수 있음 - bind + remount 2줄 방식은
findmnt --verify에서target specified more than once경고를 낼 수 있으나 일반적으로 비정상 상태는 아님
전용 LV 분리 절차 (감사 / 격리 강화)¶
/var/tmp 를 bind mount 대신 전용 LV 로 분리하려면
VG 에 free extents 가 있거나 새 PV(디스크)를 추가해야 함.
사전 확인:
sudo vgs
sudo lvs
예시 절차:
sudo lvcreate -L 20G -n vartmp rl
sudo mkfs.xfs /dev/mapper/rl-vartmp
sudo mkdir -p /mnt/vartmp.new
sudo mount /dev/mapper/rl-vartmp /mnt/vartmp.new
sudo chmod 1777 /mnt/vartmp.new
sudo rsync -aHAX /var/tmp/ /mnt/vartmp.new/
/etc/fstab 등록 예시:
[SOURCE] /var/tmp xfs defaults,nodev,nosuid,noexec 0 0
전환 시 유지보수 시간 권장:
sudo cp -a /etc/fstab /etc/fstab.bak
sudo umount /var/tmp
sudo mount /var/tmp
sudo restorecon -RF /var/tmp
확인:
findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS /var/tmp
ls -ld /var/tmp
설명:
- 엄격한 STIG/감사 환경에서는 bind 방식보다 전용 LV 구성이 더 해석이 명확함
4. /dev/shm 보안 정책 (선택 / 강화)¶
/dev/shm 는 메모리 기반 공유 영역(tmpfs)임.
보안 요구가 높은 환경에서는 nodev,nosuid,noexec 를 명시적으로 적용할 수 있음.
/etc/fstab 기준 (예시)¶
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0
적용 명령¶
sudo mount -o remount,nodev,nosuid,noexec /dev/shm
주의¶
- 일반적인 웹/Gateway 서버에서는 적용 가능한 경우가 많음
- 일부 프로그램이
/dev/shm를 실행 가능한 임시 영역처럼 사용할 경우 동작에 영향이 있을 수 있으므로 적용 후 점검 필요 - 보안 강화 목적상 고려할 수 있으나, 범용 운영 서버의 절대 필수 기준으로 단정하지는 않음
5. /home 보안 정책 (필수)¶
/home은 사용자 데이터 영역임.
서비스의 최종 실행 경로로는 사용하지 않음.
/etc/fstab 기준 예시 1: /home 을 작업 경로로 사용하지 않는 경우¶
[SOURCE] /home xfs defaults,nodev,nosuid,noexec 0 0
적용 예시:
sudo systemctl daemon-reload
sudo mount -o remount /home
/etc/fstab 기준 예시 2: /home 을 작업 경로로 사용하는 경우¶
[SOURCE] /home xfs defaults,nodev,nosuid 0 0
적용 예시:
sudo systemctl daemon-reload
sudo mount -o remount /home
- 기본적으로
nodev,nosuid를 적용함. /home을 작업 경로로 사용하지 않는 운영 서버에서는noexec적용을 권장함./home/[User]/[ProjectName]를 서버 직접 빌드, 원격 접속 개발, 검증 작업 경로로 사용하는 경우에는noexec를 적용하지 않음.- 즉,
/home noexec는 절대 규칙이 아니라 작업 방식에 따라 갈리는 정책임.
6. 서비스 계정 정책 (필수)¶
서비스 실행 계정은 로그인 불가 계정으로 생성함.
useradd -r -s /usr/sbin/nologin appsvc
정책:
- sudo 권한 부여 금지
- 비밀번호 설정 금지
- 홈 디렉토리 최소화
- SSH 접근 금지
7. cron 접근 통제 (필수)¶
일반 사용자 cron 사용을 제한함.
echo "root" | sudo tee /etc/cron.allow
echo "adminuser" | sudo tee -a /etc/cron.allow
- 허용된 사용자만 cron 사용 가능
- 불필요한 crontab 사용 금지
cron.allow 권한 설정¶
cron 허용 사용자 파일은 일반 사용자 수정이 불가능하도록 권한을 제한함.
sudo chmod 600 /etc/cron.allow
sudo chown root:root /etc/cron.allow
8. sysctl 보안 정책 (필수)¶
설정 파일¶
/etc/sysctl.d/99-security.conf
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.yama.ptrace_scope = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
fs.suid_dumpable = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.core.somaxconn = 8192
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.icmp_echo_ignore_broadcasts = 1
적용¶
sudo sysctl --system
9. Core Dump 비활성화 (필수)¶
/etc/security/limits.conf
* hard core 0
10. SELinux 정책 (필수)¶
- Enforcing 유지
- Permissive 금지
- Disable 금지
확인:
sudo getenforce
11. /proc 가시성 통제 (선택 / 고급)¶
전역 /proc mount 에 hidepid=2 를 적용하면 다른 사용자의 프로세스 정보 노출을 줄일 수 있음.
다만 일반적인 RHEL 9 / systemd 운영 서버에서는 systemd, D-Bus, 모니터링 도구와 충돌 여지가 있으므로
기본 기준으로 사용하지 않음.
대신 필요한 서비스에만 systemd 단위로 ProtectProc=invisible 적용을 검토함.
왜 root + 운영자 1명 환경에서도 검토 대상인가¶
사람 사용자 수가 적더라도 system user 는 여러 개 존재함.
nginxdbuspolkitdmysqlredis- 애플리케이션 전용 계정
웹 취약점(RCE, LFI, SSRF 연계 등)으로 특정 서비스 계정 권한이 탈취되면
다른 프로세스 정보 열람 자체가 정찰 정보가 될 수 있음.
즉 hidepid=2 나 ProtectProc= 의 보안 동기는 유효함.
다만 RHEL 9 에서는 그 통제를 전역 /proc 에 거는 방식보다 서비스 단위로 거는 방식이 운영상 더 안전함.
hidepid=2 적용 예시 (기본 기준 아님)¶
proc /proc proc defaults,hidepid=2 0 0
즉시 적용 예시:
sudo mount -o remount,hidepid=2 /proc
점검 예시:
mount | grep ' on /proc '
ps -ef
sudo systemctl status dbus polkit
주의:
- RHEL 9 / systemd 환경에서는 기본 권장값으로 사용하지 않음
- 적용 전후로
dbus,polkit, 모니터링 에이전트, 관리 도구 동작을 반드시 확인함 - 문제가 발생하면 즉시 롤백함
롤백 예시:
sudo mount -o remount,hidepid=0 /proc
ProtectProc=invisible 적용 예시 (권장 대안)¶
예시:
[Service]
ProtectProc=invisible
ProcSubset=pid
적용 절차 예시 (nginx.service):
sudo systemctl edit nginx.service
드롭인 예시:
[Service]
ProtectProc=invisible
ProcSubset=pid
반영:
sudo systemctl daemon-reload
sudo systemctl restart nginx
sudo systemctl status nginx
운영 기준:
- 전역
hidepid=2는 멀티유저/고격리 환경에서만 별도 검토 - 일반 운영 서버에서는 서비스 단위
ProtectProc=방식이 더 안전함 nginx같은 Reverse Proxy 서비스는 적용 후보가 될 수 있음sshd, 모니터링 에이전트, 프로세스 열람이 필요한 서비스는 영향 평가 후 적용함
12. 실행 경로 통제¶
- 서비스는 /var 하위에서만 실행
- /home, /tmp, /var/tmp에서 실행 금지
- 사용자 writable 경로에서 바이너리 실행 금지
13. 점검 명령¶
sudo mount | grep tmp
sudo sysctl -a | grep kptr
sudo getenforce
sudo crontab -l
sudo cat /etc/fstab
findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS /var/tmp
findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS /home
findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS /var
findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS /dev/shm
목적¶
/var/tmp,/tmp,/home,/dev/shmmount 보안 옵션 확인- sysctl 보안 설정 확인
- SELinux 상태 확인
- cron 접근 정책 확인
- fstab mount 정책 확인
14. /tmp 와 /var/tmp 차이¶
| 경로 | 특성 |
|---|---|
| /tmp | 재부팅 시 초기화 가능 |
| /var/tmp | 재부팅 후에도 유지 |
따라서 일부 프로그램은 /var/tmp 를 사용할 수 있으므로 noexec 정책 적용 후 서비스 동작 여부를 반드시 확인함.