콘텐츠로 이동

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 는 여러 개 존재함.

  • nginx
  • dbus
  • polkitd
  • mysql
  • redis
  • 애플리케이션 전용 계정

웹 취약점(RCE, LFI, SSRF 연계 등)으로 특정 서비스 계정 권한이 탈취되면
다른 프로세스 정보 열람 자체가 정찰 정보가 될 수 있음.

hidepid=2ProtectProc= 의 보안 동기는 유효함.
다만 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/shm mount 보안 옵션 확인
  • sysctl 보안 설정 확인
  • SELinux 상태 확인
  • cron 접근 정책 확인
  • fstab mount 정책 확인

14. /tmp 와 /var/tmp 차이

경로 특성
/tmp 재부팅 시 초기화 가능
/var/tmp 재부팅 후에도 유지

따라서 일부 프로그램은 /var/tmp 를 사용할 수 있으므로 noexec 정책 적용 후 서비스 동작 여부를 반드시 확인함.