033. Linux 서버 보안 — DNS 리졸버·hosts 파일 보안

changseop lee·6일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 33/50편 (전체 033/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

서버가 update.example.com 같은 이름으로 접속할 때, 그 이름을 IP로 바꾸는 순서는 /etc/nsswitch.conf가 결정합니다. 기본값은 hosts 파일을 먼저, DNS를 나중에 봅니다.

hosts: files dns           (/etc/nsswitch.conf)
          │      │
          │      └─ ② /etc/resolv.conf 의 nameserver 에 질의
          │            Ubuntu: 127.0.0.53 (systemd-resolved 스텁) → 실제 DNS 서버
          └─ ① /etc/hosts 에 있으면 여기서 끝 (DNS 질의 없음)

hosts 파일에 한 줄만 추가해도 DNS를 거치지 않고 원하는 IP로 연결을 돌릴 수 있다는 점이 보안상 핵심입니다.

2. 왜 중요한가

  • 공격자는 보안 업데이트 서버·보안 솔루션 관리 서버 도메인을 127.0.0.1로 돌려 업데이트·에이전트 통신을 차단할 수 있습니다.
  • 반대로 정상 도메인을 공격자 서버 IP로 돌리면, 서버가 스스로 악성 서버에 접속하게 됩니다.
  • DNS 질의 로그(네트워크 측)에서는 hosts 파일로 해석된 이름이 보이지 않으므로, 서버 측 파일 점검이 필요합니다.

3. 핵심 명령어 / 설정

파일·명령점검 내용
/etc/nsswitch.conf의 hosts:해석 순서(files → dns가 일반적)
/etc/hostslocalhost·자기 자신 외 항목의 용도
/etc/resolv.confnameserver 주소(Ubuntu는 보통 심볼릭 링크)
resolvectl status (Ubuntu)인터페이스별 실제 DNS 서버
getent hosts 이름nsswitch 순서대로 해석한 결과
dig +short 이름DNS에 직접 질의한 결과(hosts 무시)

4. 실습 (실습 예시)

# 1) 해석 순서와 설정 파일 확인
grep '^hosts:' /etc/nsswitch.conf
ls -l /etc/resolv.conf && cat /etc/resolv.conf
resolvectl status 2>/dev/null | grep -E 'DNS Servers|Current DNS'   # Ubuntu

# 2) hosts 파일에서 기본 항목 외 확인
grep -vE '^\s*(#|$)|localhost' /etc/hosts

# 3) 해석 결과 비교: getent(hosts 포함) vs dig(DNS만)
for d in mirrors.rockylinux.org wazuh.lab.local; do
  echo "$d  getent=$(getent hosts $d | awk '{print $1}')  dns=$(dig +short $d | tail -1)"
done

getent와 dig 결과가 다르면 hosts 파일이 DNS 결과를 덮어쓰고 있다는 뜻이므로 그 항목의 용도를 확인합니다.

5. 정상 상태

$ grep '^hosts:' /etc/nsswitch.conf
hosts:      files dns myhostname
$ grep -vE '^\s*(#|$)|localhost' /etc/hosts
192.168.56.10  rocky9-web01
192.168.56.100 wazuh.lab.local

자기 호스트명과 문서화된 내부 서버 항목만 존재하는 상태가 정상입니다.

6. 이상 상태

$ grep -vE '^\s*(#|$)|localhost' /etc/hosts
192.168.56.10  rocky9-web01
127.0.0.1      wazuh.lab.local
127.0.0.1      mirrors.rockylinux.org
$ stat -c '%y' /etc/hosts
2026-10-01 03:28:40.000000000 +0900
  • 보안 관제 서버(wazuh.lab.local)와 업데이트 미러를 localhost로 돌림 → 에이전트 이벤트 전송 차단 + 보안 업데이트 차단
  • 새벽 변경 시각 → 앞선 편들의 하드닝 해제 행위와 같은 시간대로 묶어 분석

7. 로그 분석 (분석 방법)

hosts 파일 변경과 그 영향이 함께 나타납니다(가상의 예시 로그).

type=PATH msg=audit(1759735720.010:2701): item=0 name="/etc/hosts" inode=33554561 nametype=NORMAL key="net_conf"
type=SYSCALL msg=audit(1759735720.010:2701): syscall=257 success=yes auid=1002 uid=0 comm="tee" exe="/usr/bin/tee" key="net_conf"
Oct  1 03:28:52 rocky9-web01 wazuh-agentd: WARNING: (1218): Unable to send message to 'wazuh.lab.local'.
시각이벤트의미
03:28:40/etc/hosts 수정이름 해석 조작
03:28:52에이전트 전송 실패관제 서버 통신 단절

에이전트 로그가 서버 안에만 남고 관제 서버에는 도착하지 않으므로, 관제 측에서는 에이전트 연결 끊김(disconnected) Alert로 먼저 보이게 됩니다. 연결 끊김을 단순 장애로 닫지 말고 원인을 확인해야 하는 이유입니다.

8. SOC 관제 포인트

  • /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf는 realtime FIM + report_changes로 감시합니다.
  • hosts 파일에 보안 솔루션·업데이트·관제 서버 도메인이 등장하면 즉시 확인합니다.
  • 에이전트 disconnected Alert가 발생하면 해당 서버의 이름 해석·방화벽·서비스 상태 변경을 함께 조회합니다.

9. 탐지 규칙

<rule id="100390" level="12">
  <if_sid>550</if_sid>
  <field name="file">^/etc/hosts$</field>
  <match>wazuh|update|mirror|security|repo</match>
  <description>hosts 파일에 보안·업데이트 관련 도메인 항목 변경</description>
</rule>

<match>는 Alert 전체 로그(변경 diff 포함)에서 문자열을 찾으므로 report_changes="yes"가 켜져 있어야 위 조건이 동작합니다. 기본 레벨의 hosts 변경 Alert(550)는 그대로 두고 고위험 조건만 상향합니다.

10. 대응 방법

  1. 초기 확인 — hosts·resolv.conf·nsswitch 변경 내용과 시각, getent/dig 결과 차이를 확인합니다.
  2. 범위 확인 — 같은 변경이 다른 서버에 있는지, 영향을 받은 통신(에이전트·업데이트)이 무엇인지 확인합니다.
  3. 증거 확보 — 변경 전후 파일 사본(FIM diff), audit 로그, 에이전트 로그를 보존합니다.
  4. 차단/조치 — 비인가 항목을 제거하고 에이전트 재연결·업데이트 가능 상태를 확인합니다.
  5. 재발 방지 — 이름 해석 관련 파일을 realtime FIM에 포함하고 고위험 도메인 조건 룰을 운영합니다.

11. 핵심 정리

구분핵심 내용
해석 순서nsswitch hosts: files dns → hosts 파일 우선
비교 방법getent hosts(파일 포함) vs dig(DNS만)
악용 패턴보안·업데이트·관제 도메인을 127.0.0.1로
관제 측 신호에이전트 disconnected → 원인 조사 필요
면접 포인트"hosts로 해석된 이름은 DNS 로그에 안 남는다"

12. 다음 편 예고

다음 편 034. Linux 서버 보안 — 로그인 배너와 버전 정보 노출 최소화 에서는 공격자의 정보 수집을 돕는 로그인 배너와 버전 정보 노출을 줄이는 방법을 다룹니다.


이전 편: 032. Linux 서버 보안 — NTP(chrony) 시간 동기화 보안
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글