시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 37/50편 (전체 037/450)
학습 단계: 3단계 · 이상 징후
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
설정 드리프트(configuration drift) 는 서버가 정해 둔 기대 상태에서 조금씩 멀어지는 현상입니다. 001~036편에서 만든 하드닝도 시간이 지나면 다양한 이유로 무너집니다.
기대 상태 (하드닝 완료, 기준선 저장)
│
├─ ① 운영 변경 : 장애 대응 중 임시 완화 후 원복 누락 (예: setenforce 0)
├─ ② 패키지 변경 : 업데이트가 설정 파일을 덮어쓰거나 .rpmnew 생성
├─ ③ 신규 배포 : 표준 이미지가 아닌 수동 설치 서버
└─ ④ 침해 : 공격자가 의도적으로 설정 완화
↓
현재 상태 ── 차이(drift) ──→ "어떤 원인인가?" 를 분류하는 것이 분석의 핵심
이 단계(3단계 · 이상 징후)부터는 "설정이 맞는가"가 아니라 "설정이 왜 바뀌었는가" 를 판단합니다.
| 드리프트 원인 | 판별 단서 | 처리 |
|---|---|---|
| ① 운영 변경 | 변경관리 티켓, 관리자 세션, 업무 시간 | 원복 일정 확인 |
| ② 패키지 변경 | 같은 시각 dnf/apt 로그, .rpmnew/.dpkg-dist 파일 | 설정 병합 |
| ③ 비표준 배포 | 서버 생성 시점부터 차이, 여러 항목 동시 불일치 | 표준 이미지로 정비 |
| ④ 침해 | 티켓 없음, 업무 외 시간, 여러 축 동시 완화, 서비스 계정 관여 | 사고 분석 절차 |
| 점검 명령 | 용도 |
|---|---|
find /etc -name '*.rpmnew' -o -name '*.rpmsave' -o -name '*.dpkg-dist' -o -name '*.dpkg-old' | 패키지 업데이트로 생긴 설정 사본 |
diff -r 기준선 현재 | 수집 항목별 차이 |
ansible-playbook site.yml --check --diff | 구성 관리 도구의 "적용 시 바뀔 내용"(드리프트) 미리보기 |
# 1) 기준선 재수집 후 차이 요약 (002편 수집 스크립트 재사용 가정)
B=/root/baseline/2026-10-01; N=/root/baseline/$(date +%F)
for f in accounts.txt units.txt listen.txt; do
echo "== $f"; diff "$B/$f" "$N/$f" | grep '^[<>]'
done
sha256sum -c "$B/conf.sha256" 2>/dev/null | grep -v ': OK$'
# 2) 패키지 원인 드리프트 단서
sudo find /etc \( -name '*.rpmnew' -o -name '*.rpmsave' -o -name '*.dpkg-dist' \) -printf '%TY-%Tm-%Td %p\n'
# 3) 변경 시각을 패키지 이력과 비교
stat -c '%y %n' /etc/ssh/sshd_config
sudo dnf history list | head -5 # Ubuntu: grep Start-Date /var/log/apt/history.log | tail
== listen.txt
> tcp 0.0.0.0:443 httpd
/etc/httpd/conf/httpd.conf: FAILED
$ sudo find /etc -name '*.rpmnew' ...
$ sudo dnf history list | head -3
25 | install mod_ssl | 2026-10-02 14:00 | Install | 3
443 포트 추가와 httpd 설정 변경이 mod_ssl 설치(변경관리 CHG-2026-1002) 시각과 일치 → ① 운영 변경으로 분류, 기준선 갱신 대상입니다.
== accounts.txt
> sysbak:0:/bin/bash
== listen.txt
> tcp 0.0.0.0:8081 python3
/etc/ssh/sshd_config.d (신규 00-tmp.conf)
SELinux: Enforcing → Permissive
$ sudo dnf history list | head -2
22 | install nmap gcc socat | 2026-10-01 02:40 | Install | 9
드리프트 원인 분류에는 "변경 시각"을 축으로 여러 로그를 나란히 놓는 방식이 효과적입니다(가상의 예시 정리).
시각 출처 이벤트
02:13:05 audit(sshd_config) 00-tmp.conf 생성 (auid=1002)
02:14:09 secure(useradd) sysbak UID=0 생성
02:16:00 audit(priv_conf) sudoers.d/99-sysupdate 생성
02:40:15 dnf.rpm.log nmap, socat 설치
03:20:05 journal 재부팅 (journal volatile 전환 후)
──────────────────────────────────────────────────────────
공통점: 같은 auid(1002 = devops), 업무 외 시간, 변경관리 기록 없음
드리프트 항목 하나하나는 Low 레벨이라도, 같은 사용자·같은 시간대로 묶이면 하나의 사고(Incident)로 격상됩니다. 이 묶는 작업이 5단계(SOC 연계)의 correlation으로 이어집니다.
.rpmnew/.dpkg-dist와 패키지 로그로 빠르게 정상 처리합니다.<!-- 같은 에이전트에서 10분 내 서로 다른 하드닝 관련 룰이 3건 이상 → 상향 -->
<rule id="100430" level="13" frequency="3" timeframe="600">
<if_matched_group>hardening_drift</if_matched_group>
<same_location />
<description>짧은 시간 내 다수 하드닝 설정 완화(설정 드리프트 집중)</description>
</rule>
이 룰이 동작하려면 앞선 편의 개별 룰(SELinux 해제, sshd drop-in, UID 0 생성 등)에 공통 그룹 hardening_drift를 추가해야 합니다. 047편에서 룰 모음을 정리하며 그룹 체계를 맞춥니다.
| 원인 | 판별 단서 |
|---|---|
| 운영 변경 | 변경관리 티켓, 업무 시간, 관리자 세션 |
| 패키지 변경 | dnf/apt 로그 시각 일치, .rpmnew/.dpkg-dist |
| 비표준 배포 | 생성 시점부터 다수 항목 불일치 |
| 침해 | 티켓 없음, 업무 외 시간, 여러 축 동시 완화 |
| 면접 포인트 | "원복 전에 원인 분류 — 침해 드리프트는 겉모습이 같다" |
다음 편 038. Linux 서버 보안 — 설정 변경 추적 — auditd와 기준선 diff 에서는 드리프트의 "누가·언제"를 확정하는 설정 변경 추적(auditd + 기준선 diff) 을 다룹니다.
이전 편: 036. Linux 서버 보안 — 커널 모듈·USB 저장장치 제한
📚 시리즈 전체 보기: 시스템 보안 · 취약점