98. 포트·프로토콜 보안 점검 체크리스트

changseop lee·6일 전

📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 98편
이전 글: 97. Port 기반 공격 · 다음 글: 99. 서버 1대의 포트 노출 현황 종합 분석
참고(리눅스 시스템 기초): 44. 프로세스 네트워크 연결 점검 — 프로세스 단위 연결 점검 절차

1. 왜 알아야 하는가

서비스별로 글을 나눠 공부하면 각 내용은 이해되지만, 막상 서버 한 대를 점검하려고 하면 "무엇부터, 어디까지 봐야 하는가" 가 흩어져 있습니다. 점검은 기억이 아니라 목록으로 해야 빠뜨리지 않습니다.

체크리스트가 관제에 주는 이점은 다음과 같습니다.

  • 일관성: 누가 점검해도 같은 항목을 같은 기준으로 확인합니다.
  • 증거 기반: 항목마다 "어떤 명령 결과를 근거로 판정했는가"를 남깁니다.
  • 변화 탐지: 지난 점검 결과와 비교하면 새로 열린 포트, 바뀐 설정이 드러납니다.

이 글은 01~22편 내용을 점검 항목 형태로 압축합니다. 각 항목의 원리는 해당 편 링크로 대신합니다. 다음 글(24편)에서는 이 체크리스트로 서버 한 대를 처음부터 끝까지 분석합니다.


2. 핵심 개념

2-1. 점검 항목의 구성 요소

좋은 점검 항목은 다음 네 가지를 가집니다.

요소예
점검 대상SNMP 서비스
확인 방법(명령·설정 위치)ss -ulnp로 161 확인, snmpd.conf의 community·버전 설정
판정 기준v1/v2c 사용 시 기본 community 미사용, 관리망만 허용. 가능하면 v3
근거 기록명령 출력·설정 파일 해당 줄

"SNMP 안전한가? → 예"처럼 기준 없는 항목은 점검이 아니라 감상에 가깝습니다.

2-2. 판정 등급

등급의미예
양호기준 충족Telnet 미설치, 23 LISTEN 없음
취약기준 미충족, 조치 필요DB 포트 0.0.0.0 바인드 + 방화벽 전체 허용
주의기준은 충족하나 보완 권고SSH는 관리망만 허용되나 비밀번호 인증 허용
해당 없음서비스가 존재하지 않음SMB 미사용 서버의 SMB 항목
확인 불가권한·정보 부족네트워크 방화벽 규칙 미열람

"확인 불가"를 따로 두는 이유는 확인하지 않은 것을 양호로 적지 않기 위해서입니다.

2-3. 시리즈 항목 요약표

영역핵심 점검 질문관련 편
포트 체계·매핑LISTEN 포트마다 프로세스가 확인되는가01·02·20
웹HTTP가 HTTPS로 전환되는가, TLS 버전·인증서가 적절한가04·05·06
DNS재귀 질의가 내부로 제한되는가, 외부 DNS 직접 질의가 통제되는가07·08
DHCP허가된 DHCP 서버만 응답하는가09·10
평문 프로토콜Telnet·FTP 등 평문 서비스가 없는가11·12
메일오픈 릴레이가 아닌가, 인증 구간이 암호화되는가13
원격·공유SMB·RDP가 외부에 노출되지 않는가14·15
관리 프로토콜SNMP 버전·community, NTP 동기화16·17
인증·DBLDAP 평문 Bind 여부, DB 바인드·계정 허용 호스트18·19
위장·정책443 이상 통신, 노출 정책 준수21·22

3. 동작 원리

점검은 "넓게 → 좁게" 순서로 진행합니다.

점검 순서
그림 1. 수집 → 노출 판단 → 소유 확인 → 위험 요소 → 기록 순서로 점검합니다

 ① 인벤토리: 어떤 포트가 LISTEN 중인가 (ss -tulnp)
      ↓
 ② 식별: 각 포트의 프로세스·실행 파일·패키지·서비스 유닛 (20편 절차)
      ↓
 ③ 노출 범위: 바인드 주소(loopback / 특정 IP / 전체) + 호스트 방화벽 허용 범위
      ↓
 ④ 정책 대조: 22편 3분류(외부 공개 / 내부 전용 / 노출 금지)와 비교
      ↓
 ⑤ 프로토콜별 설정: 아래 체크리스트의 서비스별 항목 확인
      ↓
 ⑥ 로그·동기화: 인증 실패 로그 기록 여부, NTP 동기화, 원격 로그 전송
      ↓
 ⑦ 판정·기록: 양호 / 취약 / 주의 / 해당 없음 / 확인 불가 + 근거

①~④는 모든 서버에 공통이고, ⑤는 서버에 실제로 있는 서비스만 봅니다. 즉 ①의 결과가 ⑤의 범위를 결정합니다.


4. 실제 명령어 / 실습

실습 환경: 본인 소유 Linux VM (Rocky Linux 또는 Ubuntu). 인터페이스 ens33은 예시입니다. 아래 스크립트는 설정을 바꾸지 않는 읽기 전용 점검 스크립트입니다.

4-1. 1차 분류 스크립트

#!/usr/bin/env bash
# port-audit.sh — LISTEN 포트를 읽기 전용으로 점검하는 실습용 스크립트
# 사용: sudo bash port-audit.sh
RISKY=" 21 23 69 111 135 137 138 139 161 445 1433 1521 2375 3306 3389 5432 5900 6379 9200 11211 27017 "

printf "%-5s %-26s %-16s %-10s %s\n" "PROTO" "LOCAL" "PROCESS" "SCOPE" "NOTE"
ss -H -tulnp | while read -r proto state recvq sendq local peer proc; do
  port="${local##*:}"
  addr="${local%:*}"
  pname=$(printf '%s' "$proc" | grep -oP '\(\("\K[^"]+' | head -n1)
  case "$addr" in
    127.*|"[::1]"|*%lo) scope="loopback" ;;
    0.0.0.0|"*"|"[::]") scope="ALL" ;;
    *) scope="specific" ;;
  esac
  note=""
  [[ "$RISKY" == *" $port "* ]] && note="위험 포트"
  [[ "$scope" == "ALL" && -n "$note" ]] && note="$note / 모든 인터페이스 → 우선 확인"
  printf "%-5s %-26s %-16s %-10s %s\n" "$proto" "$local" "${pname:--}" "$scope" "$note"
done
sudo bash port-audit.sh | tee "port-audit-$(hostname)-$(date +%F).txt"

-H(헤더 생략) 옵션은 비교적 최근 iproute2에 있으므로, 없다는 오류가 나면 ss -tulnp | tail -n +2로 대체합니다. 결과 파일을 날짜별로 저장해 두면 다음 점검 때 diff로 변화를 볼 수 있습니다.

4-2. 방화벽·서비스 보조 확인

# 호스트 방화벽 허용 목록
sudo firewall-cmd --list-all        # Rocky
sudo ufw status verbose             # Ubuntu

# 활성화된 서비스 유닛 목록 (LISTEN 포트와 대조용)
systemctl list-units --type=service --state=running --no-pager

# 평문 서비스 패키지 설치 여부
rpm -q telnet-server vsftpd 2>/dev/null          # Rocky
dpkg -l | grep -E 'telnetd|vsftpd'                # Ubuntu

# 시간 동기화
timedatectl | grep -E "synchronized|NTP service"

4-3. 변화 비교

diff port-audit-web01-2026-09-01.txt port-audit-web01-2026-09-26.txt

📷 [실습 화면 삽입] port-audit.sh 실행 결과 (SCOPE와 NOTE 열이 표시된 화면)

📷 [실습 화면 삽입] 이전 점검 결과와의 diff 출력 (새로 생긴 LISTEN 포트가 표시된 화면)


5. 결과 확인

스크립트 출력 형식 예시(값은 환경마다 다름)

PROTO LOCAL                      PROCESS          SCOPE      NOTE
udp   127.0.0.53%lo:53           systemd-resolve  loopback
udp   [::1]:323                  chronyd          loopback
tcp   0.0.0.0:22                 sshd             ALL
tcp   *:3306                     mariadbd         ALL        위험 포트 / 모든 인터페이스 → 우선 확인
tcp   127.0.0.1:6379             redis-server     loopback   위험 포트
tcp   192.168.10.20:8081         python3          specific

스크립트는 1차 분류일 뿐입니다. 위험 포트라도 loopback이면 외부 노출 위험은 낮고, 반대로 목록에 없는 포트(8081)도 20편 절차로 정체를 확인해야 합니다.

서비스별 체크리스트

공통

  • 모든 LISTEN 포트의 프로세스·실행 파일·서비스 유닛을 확인했다
  • 필요 없는 서비스는 중지·비활성화(systemctl disable --now)했다
  • 호스트 방화벽이 기본 거부이며 허용 규칙마다 출발지가 한정되어 있다
  • 시스템 시간이 동기화되어 있고 로그에 시간대가 식별된다

원격 접속·관리

  • Telnet(23)·rsh 계열 서비스가 없다
  • SSH는 관리망·배스천에서만 허용되고 root 직접 로그인이 제한된다
  • RDP(3389)·VNC(5900)가 외부에 노출되지 않는다
  • SNMP는 v3 사용 또는 기본 community(public/private) 미사용, 관리망만 허용한다

파일·메일·웹

  • FTP 대신 SFTP 등 암호화 프로토콜을 사용한다
  • SMB(445)가 외부에 노출되지 않고 구버전 프로토콜(SMBv1)이 비활성화되어 있다
  • 메일 서버가 오픈 릴레이가 아니며 인증 구간이 TLS로 보호된다
  • 웹 서비스는 HTTPS를 제공하고 인증서 유효기간·이름이 올바르다

인증·데이터

  • LDAP 인증은 StartTLS·LDAPS·SASL로 보호된다
  • DB 포트는 필요한 주소에만 바인드되고 계정 허용 호스트에 %가 없다
  • Redis 등 인증 선택형 서비스에 인증이 설정되어 있다

아웃바운드·이상 통신

  • DNS·NTP·SMTP 아웃바운드가 지정 서버로만 향한다
  • 알 수 없는 프로세스의 443 ESTABLISHED 연결이 없다

6. 패킷 / 로그 분석

6-1. 점검 결과 판정 예시

점검 결과정상일 수 있는 경우의심해야 하는 경우
지난 점검 대비 새 LISTEN 포트변경 요청에 따른 신규 서비스 배포변경 기록 없음, 패키지 외 실행 파일
위험 포트가 loopback에만 바인드로컬 전용 캐시·DB(정상 구성)방화벽 포워딩·프록시로 외부에 중계되고 있음
프로세스 이름 미표시(-)권한 없이 실행했거나 커널 소켓root로 실행해도 프로세스를 알 수 없는 LISTEN
실행 중이지만 LISTEN 없는 서비스클라이언트형 서비스(에이전트 등)이름과 달리 외부로 연결만 하는 알 수 없는 서비스
인증 실패 로그가 전혀 없음실제로 실패가 없었음로그 설정이 꺼져 있어 기록되지 않음

6-2. 점검 근거로 남길 로그·출력

# 서비스별 최근 인증 실패 기록 여부 (예시)
sudo journalctl -u sshd --since "7 days ago" | grep -c "Failed password"   # Rocky
sudo journalctl -u ssh --since "7 days ago" | grep -c "Failed password"    # Ubuntu

# 현재 외부로 연결 중인 프로세스
sudo ss -tnp state established | grep -v "127.0.0.1"

"로그가 0건"과 "로그가 기록되지 않음"은 다른 결과입니다. 0건이라면 해당 서비스가 실패를 기록하도록 설정되어 있는지도 함께 확인해 근거에 남깁니다.


7. 보안관제 관점

  • 점검 결과는 관제의 기준선입니다. "이 서버는 22·443만 LISTEN"이라는 기록이 있어야 새 포트·새 연결을 이상으로 판정할 수 있습니다.
  • 흔적 위치: 점검 결과 파일(날짜별), 변경 관리 기록, 호스트 방화벽 설정, 서비스별 로그, EDR·자산 관리 시스템의 포트 정보.
  • 한계: 호스트 점검은 "지금 이 순간"의 상태입니다. 점검 사이에 열렸다 닫힌 포트는 보이지 않으므로 방화벽·NSM 로그 같은 연속 데이터와 함께 봐야 합니다.
  • 오탐 주의: 스크립트의 위험 포트 표시는 포트 번호 기반 1차 분류입니다. 02편에서 다룬 것처럼 번호만으로 결론 내리지 않고 프로세스로 확인합니다.
  • 외부에서 보는 노출 점검(스캔)은 05. 네트워크 스캔 · 공격 징후 분석 시리즈, 방화벽 규칙 감사는 06. 방화벽 · IDS/IPS 분석 시리즈에서 다룹니다.

8. 핵심 정리

  • 점검 항목은 대상 · 확인 방법 · 판정 기준 · 근거를 갖춰야 합니다.
  • 판정에는 "확인 불가"를 두어, 확인하지 않은 것을 양호로 적지 않습니다.
  • 점검 순서는 인벤토리 → 식별 → 노출 범위 → 정책 대조 → 서비스별 설정 → 로그·동기화 → 판정입니다.
  • 읽기 전용 스크립트로 1차 분류하고, 결과를 날짜별로 저장해 diff로 변화를 추적합니다.
  • 점검 결과는 관제의 기준선이 되며, 이후 새 포트·새 연결을 이상으로 판정하는 근거가 됩니다.

다음 글: 24. 서버 1대의 포트 노출 현황 종합 분석

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

0개의 댓글