대상 OS: Rocky Linux 9

침해사고의 공통점 중 하나는 “한 프로세스가 뚫리면, 그 프로세스가 할 수 있는 만큼 다 한다”는 점입니다.
애플리케이션 취약점이든 공급망이든, 결국 공격자는 파일을 읽고/쓰고, 네트워크로 나가고, 시스템을 바꾸려 합니다.
그래서 운영 보안의 현실적인 목표는 “침입을 0으로”가 아니라, “뚫려도 영향 범위를 작은 방으로 가두기”입니다.
Rocky Linux 9에서는 systemd 서비스 단위 샌드박싱 옵션으로 이 ‘방’을 꽤 단단하게 만들 수 있습니다.

이 글은 systemd의 대표적인 격리 옵션(ProtectSystem/PrivateTmp/NoNewPrivileges 등)과 네트워크/시스템콜 제한을 서비스별로 점진 적용하는 방법을 정리합니다.

---

1) systemd 샌드박싱이 주는 효과(위협 모델)

1)

파일시스템 쓰기 범위를 줄여 웹쉘/드롭퍼가 “아무 데나 파일 생성”하는 걸 어렵게 만든다

2)

/tmp를 분리해 서비스가 다른 프로세스의 임시 파일/소켓을 엿보거나 악용하기 어렵게 만든다

3)

권한 상승 경로를 줄여 “프로세스 내부에서 sudo 없이도 가능한 우회”를 어렵게 만든다

4)

네트워크/시스템콜을 줄여 데이터 유출/원격 C2 연결/우회 기법의 비용을 올린다

주의
- 샌드박싱은 ‘호환성’과 트레이드오프가 있습니다.
- 그래서 한 번에 강하게 적용하기보다, 작은 옵션부터 단계적으로 올리는 방식이 운영에 안전합니다.

---

2) 적용 전 점검: 대상 서비스의 유닛/권한/파일 경로 파악

1)

유닛 파일 경로 확인

systemctl status yourservice --no-pager
systemctl cat yourservice | sed -n '1,200p'

2)

현재 실행 계정(User/Group) 확인

systemctl show yourservice -p User -p Group -p DynamicUser

3)

서비스가 실제로 쓰는 파일 경로(로그/캐시/런타임) 추정

ps aux | grep -i yourservice | head -n 20
sudo ss -ltnp | head -n 80
sudo ss -lunp | head -n 80

이 단계에서 “쓰기 필요한 경로(/var/lib/…, /var/log/…, /run/…)”를 정리해두면, 이후에 ProtectSystem을 걸 때 훨씬 덜 흔들립니다.

---

3) 가장 안전한 1단계: drop-in override로 시작하기

패키지 유닛을 직접 수정하면 업데이트 때 덮어써집니다.
Rocky Linux 9에서는 drop-in override를 기본으로 하세요.

1)

drop-in 디렉터리 생성

sudo mkdir -p /etc/systemd/system/yourservice.service.d

2)

가벼운 샌드박싱부터 적용(1차)

sudo tee /etc/systemd/system/yourservice.service.d/10-sandbox.conf >/dev/null