소개
서버 보안에서 "공격 표면"은 권한이 없는 사용자가 침입하거나 데이터를 추출하려고 시도할 수 있는 모든 지점의 총합을 의미합니다. 공격 표면을 줄이는 핵심 방법 중 하나는 네트워크 포트를 관리하는 것입니다.
열린 포트는 모두 공격자가 진입할 수 있는 잠재적인 경로입니다. 서비스가 포트에서 수신 대기 중이라면 데이터를 받을 준비가 된 상태입니다. 해당 서비스에 취약점이 있거나 외부에 공개되어서는 안 되는 서비스라면 시스템이 위험해질 수 있습니다.
수신 대기 포트가 있다고 해서 반드시 위험한 것은 아니지만, 외부에 노출되어 있다는 의미는 됩니다. 보안 감사는 어떤 서비스에 접근할 수 있는지, 그리고 이러한 노출이 의도된 것인지 파악하는 것에서 시작합니다.
이 때문에 포트 감사는 기본적인 시스템 강화의 일부입니다. 우수한 보안은 소프트웨어에 패치를 적용하는 것뿐 아니라 불필요한 노출을 줄이는 것도 포함합니다.
이 실습에서는 기본적인 보안 감사를 수행합니다. 다음 작업을 진행합니다.
ss명령을 사용해 수신 대기 중인 모든 TCP 포트를 나열합니다.- 의심스럽거나 표준이 아닌 포트를 식별합니다.
- 포트를 연 프로세스와 사용자를 조사합니다.
수신 대기 중인 TCP 포트 나열
먼저 네트워크 상태를 전체적으로 확인합니다. 여기서는 오래된 netstat 도구를 대체하는 더 현대적이고 빠른 ss(Socket Statistics) 명령을 사용합니다.
감사를 수행할 때는 수신 대기 중인 TCP 포트와 해당 포트를 연 프로세스에 집중합니다.
프로세스 정보가 있어야 단순한 소켓 목록을 실제로 조치할 수 있는 정보로 바꿀 수 있습니다. 포트 번호만으로는 알 수 있는 내용이 적지만, 포트를 특정 프로세스와 사용자에 연결하면 해당 포트를 평가하고 관리할 수 있습니다.
다음 명령을 실행합니다.
sudo ss -lntp
옵션 이해하기:
-l(listening): 연결을 기다리는 소켓만 표시합니다.-n(numeric): 호스트 이름 대신 IP 주소와 포트 번호를 표시합니다. 더 빠르고 명확하게 확인할 수 있습니다.-t(tcp): TCP 소켓만 표시합니다.-p(processes): 해당 소켓을 사용하는 프로세스 이름과 PID(Process ID) 를 표시합니다.- 참고: 다른 사용자가 소유한 서비스의 프로세스 정보를 보려면
sudo가 필요합니다.
- 참고: 다른 사용자가 소유한 서비스의 프로세스 정보를 보려면
다음과 비슷한 출력이 표시됩니다.
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("node",pid=123,fd=18))
LISTEN 0 5 0.0.0.0:9999 0.0.0.0:* users:(("python3",pid=456,fd=3))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=789,fd=3))
Local Address:Port 열에는 서비스가 수신 대기 중인 위치가 표시됩니다. Process 열에서는 해당 서비스를 실행하는 프로그램을 확인할 수 있습니다.
또 다른 중요한 단서는 주소가 127.0.0.1인지 0.0.0.0인지입니다. localhost 전용 서비스는 해당 시스템 자체에서만 접근할 수 있지만, 0.0.0.0은 일반적으로 모든 네트워크 인터페이스에서 서비스가 수신 대기 중임을 의미합니다.
의심스러운 포트 식별
이제 출력 내용을 분석하여 이상한 항목이 있는지 확인합니다.
일반적인 서비스는 보통 "Well-Known Port"(0~1023) 에서 실행됩니다. 예를 들면 다음과 같습니다.
- 포트 22: SSH(Secure Shell)
- 포트 80: HTTP(Web Server)
- 포트 443: HTTPS(Secure Web Server)
보안 감사에서는 표준이 아닌 포트나 인식할 수 없는 서비스를 찾습니다.
익숙하지 않은 포트를 모두 위험하다고 판단하는 것이 목적은 아닙니다. 해당 포트가 어떤 용도로 사용되는지 확인해야 합니다. 서비스가 정상적인 서비스일 수도 있고, 일시적으로 실행 중일 수도 있으며, 실수로 열렸을 수도 있습니다. 감사는 알 수 없는 노출을 파악 가능한 노출로 바꾸는 과정입니다.
1 단계의 출력 내용을 다시 확인합니다. 포트 9999에서 수신 대기 중인 서비스가 표시되어야 합니다. 이 포트는 표준 시스템 포트가 아니므로 추가 조사가 필요합니다.
grep을 사용해 이 항목만 추출합니다.
sudo ss -lntp | grep 9999
출력 예시:
LISTEN 0 5 0.0.0.0:9999 0.0.0.0:* users:(("python3",pid=289,fd=3))
이 출력은 포트 9999 에서 프로세스가 실행 중임을 확인해 줍니다. 다음 단계에서는 이 프로세스가 정확히 무엇인지 알아봅니다.
프로세스 소유자 조사
포트가 열려 있다는 사실만으로는 충분하지 않습니다. 해당 서비스를 누가 실행 중인지 확인해야 합니다. root로 실행되는 의심스러운 프로세스는 긴급하게 처리해야 하는 심각한 상황입니다. 반면 제한된 사용자로 실행되는 프로세스는 위험이 더 낮을 수 있지만, 여전히 위험할 수 있습니다.
PID 찾기: 이전 명령의 출력 내용을 확인합니다. users: 부분에서 pid=... 값을 찾습니다.
- 예:
users:(("python3",pid=289,fd=3))-> PID 는 289입니다. - 참고: 실제 PID 는 다를 수 있습니다.
프로세스 검사하기: ps 명령을 사용해 이 PID 에 해당하는 프로세스의 세부 정보를 표시합니다. <PID>를 직접 확인한 실제 숫자로 바꿉니다.
ps -f -p <PID>
PID 가 289 인 경우의 예시는 다음과 같습니다.
ps -f -p 289
출력 분석하기:
UID PID PPID C STIME TTY TIME CMD
labex 289 189 0 10:00 pts/0 00:00:00 python3 -m http.server 9999
- UID: 프로세스를 실행하는 사용자입니다 (예:
labex). - CMD: 프로세스를 시작한 정확한 명령입니다 (예:
python3 -m http.server 9999).
이 출력은 labex 사용자가 포트 9999 에서 수신 대기하도록 의도된 Python HTTP 서버를 시작했음을 보여 줍니다. 실제 환경에서 이 실행을 승인하지 않았다면 프로세스를 즉시 종료해야 합니다.
이 마지막 단계는 책임 소재를 확인하는 과정입니다. 단순히 "어떤 포트가 열려 있는가"가 아니라 "어떤 사용자가 어떤 명령을 실행해 이 네트워크 노출을 만들었는가"를 확인합니다. 이 정보가 있어야 감사 결과를 사고 대응과 시스템 강화에 활용할 수 있습니다.
요약
이 실습에서는 시스템의 수신 대기 포트에 대한 보안 감사를 성공적으로 수행했습니다.
핵심 내용:
- 가시성:
sudo ss -lntp를 사용해 어떤 서비스가 연결을 기다리고 있는지 정확히 확인합니다. - 식별: 표준 포트를 파악하고, 9999 와 같은 표준이 아닌 포트를 조사 대상으로 분류합니다.
- 책임 소재 확인:
ps -f -p <PID>를 사용해 의심스러운 소켓을 실행한 사용자와 명령을 확인합니다.
정기적인 감사를 수행하면 백도어나 기타 웹 서버와 같은 승인되지 않은 서비스를 발견하고, 악용되기 전에 제거할 수 있습니다.



