Linux 시스템 보안 기초 · 37/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
열린 포트는 곧 공격 표면입니다. 그런데 '포트가 열렸다'는 것만으로 위험을 판단하면 오탐이 됩니다. 핵심은 어떤 주소에 바인딩되었는가 — 즉 로컬 전용인지 전체 노출인지입니다. 이번 편은 그 차이를 정확히 봅니다.
바인딩 주소의 의미:
| 주소 | 의미 | 노출 |
|---|---|---|
127.0.0.1 / ::1 | 루프백(로컬 전용) | 외부 접근 불가 |
0.0.0.0 | 모든 IPv4 인터페이스 | 외부 노출 |
:: | 모든 IPv6 인터페이스 | 외부 노출 |
| 특정 IP | 해당 인터페이스만 | 제한적 |
127.0.0.1:3306(로컬 전용 DB)은 안전하지만 0.0.0.0:3306(전체 노출 DB)은 위험합니다 — 같은 포트라도 다릅니다.
127.0.0.1:5432 vs 0.0.0.0:5432
│ 로컬만 접근 │ 외부에서 접근 가능
▼ ▼
안전(내부 통신용) 위험(DB가 인터넷에 노출)
서비스는 시작 시 특정 주소:포트에 소켓을 바인딩합니다. 루프백(127.0.0.1)에 바인딩하면 같은 호스트의 프로세스만 접속할 수 있고, 0.0.0.0에 바인딩하면 방화벽이 막지 않는 한 외부에서 접속 가능합니다.
흔한 사고: DB나 관리용 서비스가 실수로 0.0.0.0에 바인딩되어 인터넷에 노출되는 것. 그래서 점검은 '열린 포트 목록'이 아니라 '외부 노출(0.0.0.0/::) 포트 목록'에 집중해야 합니다.
# 외부 노출(0.0.0.0 / ::) 리스닝 포트만 필터
sudo ss -tulnp | grep -E '0\.0\.0\.0:|\[::\]:'
# 로컬 전용 포트 (참고)
sudo ss -tulnp | grep -E '127\.0\.0\.1:|\[::1\]:'
# 포트별 소유 프로세스 상세
sudo ss -tulnp | awk 'NR==1 || /LISTEN/'
실습 컨테이너 실제 실행 결과입니다. (실제 캡처)
$ sudo ss -tulnp | grep -E '0\.0\.0\.0:|\[::\]:'
tcp LISTEN 0 128 0.0.0.0:22 users:(("sshd",pid=1491,fd=3))
외부 노출 포트가 SSH(22)뿐입니다. 만약 여기에 0.0.0.0:3306(MySQL), 0.0.0.0:6379(Redis) 등이 나오면, 인증 없는 DB가 인터넷에 노출된 심각한 상황일 수 있어 즉시 조치해야 합니다.
0.0.0.0 노출'같은 포트, 다른 바인딩'의 위험 차이를 구분하는 것이 이 편의 핵심입니다.
노출 포트 변화는 공격 표면 변화이자 백도어 리스너 지표입니다. Wazuh는 netstat/ss 기반 점검으로 열린 포트를 정기 수집하고, 기준선을 벗어난 포트를 알람합니다. 외부 스캐너(예: 네트워크 스캔) 결과와 호스트 정보를 결합하면 '실제로 인터넷에 노출된 포트'를 정확히 파악할 수 있습니다.
[ ] 외부 노출(0.0.0.0/::) 포트만 필터
[ ] 노출 포트의 소유 프로세스 확인
[ ] DB·관리 포트의 로컬 전용 여부 확인
[ ] 신규 리스닝 포트 탐지
다음 편에서는 38. 비정상 네트워크 연결 탐지 를 다룹니다. 들어오는 포트에서 나아가, 나가는 '비정상 연결'을 탐지하는 법을 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.