시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 21/50편 (전체 021/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
/etc는 계정, 인증, 서비스, 네트워크, 스케줄 설정이 모두 모인 곳입니다. 침해 후 지속성·권한 상승 흔적의 대부분이 이 디렉터리 변경으로 나타납니다.
변경 관리는 세 질문에 답하는 구조입니다.
① 무엇이 바뀌었나? → 기준선 diff / FIM (해시·권한·소유자)
② 누가·언제 바꿨나? → auditd (auid, 시각, 실행 프로그램)
③ 정상적인 변경인가? → 패키지 소속(rpm -qf / dpkg -S) + 변경관리 기록
/etc 파일은 패키지 업데이트에서도 수시로 바뀌므로 "바뀌었다"만으로는 판단할 수 없습니다. 패키지 변경과 사람에 의한 변경을 구분해야 합니다./etc/cron.d/의 낯선 파일)은 관리자가 만들었거나 침입자가 만든 것입니다. 둘 중 무엇인지 확인하는 것이 핵심 분석입니다.| 도구 | 용도 | 비고 |
|---|---|---|
rpm -qf 파일 / dpkg -S 파일 | 파일의 패키지 소속 | 미소속이면 "not owned" |
rpm -V 패키지 | 패키지 설치 이후 변경 여부 | 025편에서 상세 |
find /etc -newer 기준파일 -type f | 특정 시점 이후 변경 파일 | 빠른 1차 범위 확인 |
| etckeeper | /etc를 git으로 이력 관리 | Rocky는 EPEL, Ubuntu는 기본 저장소 |
| Wazuh FIM(syscheck) | 해시·권한·소유자 변경 탐지 | 기본 12시간 주기, realtime 옵션 |
# 1) 최근 24시간 내 변경된 /etc 파일
sudo find /etc -xdev -type f -mtime -1 -printf '%TY-%Tm-%Td %TH:%TM %u %p\n' | sort
# 2) 패키지에 속하지 않은 파일 찾기 (Rocky 예시, 시간이 걸림)
sudo find /etc/cron.d /etc/sudoers.d /etc/profile.d /etc/systemd/system -type f \
-exec sh -c 'rpm -qf "$1" >/dev/null 2>&1 || echo "NOT-OWNED $1"' _ {} \;
# Ubuntu: dpkg -S "$1" 로 대체
# 3) etckeeper로 이력 관리 (Ubuntu 예시)
sudo apt install -y etckeeper
sudo etckeeper vcs log --oneline | head
sudo etckeeper vcs diff
etckeeper는 패키지 설치 전후에 자동 커밋하므로, 패키지가 만든 변경과 사람이 만든 변경이 커밋 단위로 분리되어 보입니다.
$ sudo etckeeper vcs log --oneline | head -3
a1c3f02 committing changes in /etc made by "apt install nginx"
9be1d44 daily autocommit
4f20aa1 sshd: PermitRootLogin no (CHG-2026-0915)
변경마다 패키지 명령 또는 변경관리 번호가 붙어 있어 설명 가능한 상태입니다.
$ sudo find /etc/cron.d /etc/sudoers.d ... (생략)
NOT-OWNED /etc/cron.d/0hourly-sync
NOT-OWNED /etc/sudoers.d/99-sysupdate
$ sudo etckeeper vcs diff --stat
cron.d/0hourly-sync | 1 +
sudoers.d/99-sysupdate | 1 +
0hourly(cronie 패키지 소속)와 이름이 비슷한 0hourly-sync가 패키지 미소속/etc 변경을 FIM과 auditd로 동시에 보면 "무엇"과 "누가"가 연결됩니다(가상의 예시 로그).
** Alert 1759712500.10231: - ossec,syscheck,syscheck_entry_added,
2026 Oct 01 02:15:00 (rocky9-web01) any->syscheck
Rule: 554 (level 5) -> 'File added to the system.'
File '/etc/cron.d/0hourly-sync' added
Mode: realtime
type=SYSCALL msg=audit(1759712500.002:960): syscall=257 success=yes auid=1002 uid=0 comm="cp" exe="/usr/bin/cp" key="cron_change"
type=PATH msg=audit(1759712500.002:960): item=1 name="/etc/cron.d/0hourly-sync" nametype=CREATE
| 출처 | 알려주는 것 |
|---|---|
| Wazuh 554 | 파일 추가 사실, 해시, 감지 방식(realtime) |
| auditd | 생성 프로그램(cp), 사용자(auid=1002), 정확한 시각 |
FIM의 Mode: scheduled라면 변경 시각이 아니라 스캔 시각이므로, 정확한 시간은 auditd로 확인해야 합니다.
/etc 전체를 FIM으로 보되, 핵심 하위 디렉터리(cron*, sudoers.d, ssh, systemd/system, profile.d, pam.d)는 realtime으로 설정합니다.dnf/apt 로그 시간과 겹치는 변경은 정상 가능성을 먼저 검토합니다.<!-- agent ossec.conf: 핵심 디렉터리 실시간 FIM -->
<syscheck>
<directories realtime="yes" check_all="yes" report_changes="yes">/etc/ssh,/etc/sudoers.d,/etc/cron.d,/etc/pam.d,/etc/profile.d,/etc/systemd/system</directories>
</syscheck>
report_changes="yes"는 텍스트 파일의 변경 내용(diff) 을 Alert에 포함합니다. 비밀번호 등 민감정보가 들어갈 수 있는 파일은 <nodiff>로 제외합니다.
| 질문 | 확인 수단 |
|---|---|
| 무엇이 바뀌었나 | 기준선 diff, Wazuh FIM(550/553/554) |
| 누가·언제 | auditd(auid, comm, 시각) |
| 정상인가 | rpm -qf/dpkg -S + 변경관리 기록 |
| 이력·복구 | etckeeper(git) |
| 면접 포인트 | "패키지 미소속 신규 파일이 1순위 분석 대상" |
다음 편 022. Linux 서버 보안 — 커널 보안 파라미터(sysctl) 하드닝 에서는 커널 동작을 조정하는 보안 관련 sysctl 파라미터를 점검합니다.
이전 편: 020. Linux 서버 보안 — /var/tmp·/dev/shm 보안 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점