1. Biblioteca
  2. 포트
  3. 포트 보안

Actualizado hace 1 mes

열려 있는 포트 하나하나가 서비스입니다. 모든 서비스는 코드입니다. 신뢰할 수 없는 네트워크 입력을 파싱하는 코드는 언제든 발견될 수 있는 취약점을 품고 있습니다.

이건 피해망상이 아닙니다—수학입니다. 네트워크 데이터를 처리하는 코드가 많을수록 버그가 생길 가능성도 커집니다. 한 번도 써본 적 없는 인쇄 서비스의 버퍼 오버플로우가 웹 서버의 그것만큼이나 시스템 전체를 효과적으로 무너뜨릴 수 있습니다. 차이가 있다면, 웹 서버는 당신이 선택해서 실행한 것이라는 점입니다.

진짜 중요한 질문

대부분의 보안 가이드는 "무엇을 차단해야 할까?"라는 질문으로 시작합니다. 이건 잘못된 질문입니다. 올바른 질문은 이것입니다: 실제로 필요한 게 무엇인가?

웹 서버에는 포트 80과 443이 필요합니다. SSH 서버에는 포트 22가 필요합니다. 데이터베이스 서버에는 데이터베이스 포트가 필요합니다—하지만 인터넷 전체가 아닌 애플리케이션 서버에서만 접근할 수 있어야 합니다. 그 외의 모든 것은 득도 없이 위험만 감수하는 것입니다.

이렇게 관점을 바꾸는 것—나쁜 것을 차단하려는 방식에서, 필요한 것만 허용하는 방식으로—이 진정한 보안의 토대입니다. 이를 기본 차단(default-deny)이라고 하며, 이 원칙은 모든 것을 바꿔놓습니다.

무엇이 수신 대기 중인지 파악하기

포트를 닫으려면 먼저 무엇이 열려 있는지 확인해야 합니다.

Linux에서는 ss -tulpn 명령어로 수신 대기 중인 모든 TCP 및 UDP 포트와 연결된 프로세스를 볼 수 있습니다. 출력 결과는 포트 631이 열려 있다는 사실뿐만 아니라, 그것이 CUPS—인쇄 시스템—임을 알려줍니다. 인쇄를 하지 않는다면, 아무 이유 없이 돌아가는 코드가 있는 셈입니다.

macOS에서는 lsof -i -P -n 명령어로 비슷한 정보를 얻을 수 있습니다. Windows에서는 netstat -ano 명령어로 수신 대기 포트와 프로세스 ID를 확인한 후 작업 관리자에서 교차 확인할 수 있습니다.

외부 관점—네트워크에서 실제로 접근 가능한 것—을 확인하려면, nmap -sT localhost로 직접 스캔하거나, 더 좋게는 다른 컴퓨터에서 스캔해서 방화벽을 통해 무엇이 보이는지 확인하세요.

뜻밖의 것들이 보일 겁니다. 기본 설치는 요청한 적 없는 서비스들을 실행합니다: 네트워크 검색 프로토콜, 원격 프로시저 호출, 프린터 공유, 파일 공유. 이 하나하나가 패킷을 기다리는 코드입니다.

불필요한 것 중단하기

무엇이 실행 중인지 파악했다면, 각 서비스를 평가하세요: 내가 이걸 사용하는가? 앞으로 사용할 일이 있는가?

systemd 기반 Linux(Ubuntu, Fedora, Debian)에서 서비스를 영구적으로 비활성화하려면:

sudo systemctl disable --now cups.service    # 인쇄
sudo systemctl disable --now avahi-daemon    # 네트워크 검색
sudo systemctl disable --now bluetooth       # 블루투스

--now 옵션은 서비스를 즉시 중단하고 부팅 시 시작되지 않도록 막아줍니다. 명령어 하나로, 공격 경로 하나가 사라집니다.

macOS에서 서비스는 /Library/LaunchDaemons/~/Library/LaunchAgents/에 있습니다. launchctl unload /path/to/service.plist 명령어로 언로드할 수 있습니다.

Windows에서는 서비스(services.msc)를 열고, 서비스를 찾아 중지한 후 시작 유형을 '사용 안 함'으로 설정하세요. 또는 PowerShell을 사용할 수도 있습니다: Set-Service -Name "ServiceName" -StartupType Disabled -Status Stopped.

안전망으로서의 방화벽

서비스를 중단하는 것이 우선입니다. 방화벽은 백업입니다.

서비스를 비활성화했더라도 방화벽을 기본 차단으로 설정하세요. 악성코드가 포트를 열려고 하거나, 실수로 무언가를 활성화했을 때 방화벽이 이를 잡아줍니다.

UFW를 사용하는 Linux에서:

sudo ufw default deny incoming
sudo ufw allow 22/tcp       # SSH (필요한 경우)
sudo ufw allow 80/tcp       # HTTP (웹을 제공하는 경우)
sudo ufw allow 443/tcp      # HTTPS
sudo ufw enable

아무것도 허용하지 않는 것에서 시작하세요. 필요한 것만 추가하고, 이유를 문서화하세요.

더 촘촘하게 제어하려면, 특정 출처에서만 포트에 접근할 수 있도록 제한하세요. 집 네트워크에서만 SSH를 사용한다면:

sudo ufw allow from 192.168.1.0/24 to any port 22

이제 포트 22는 열려 있지만, 당신의 네트워크에서만 접근할 수 있습니다. 나머지 인터넷에서는 아무것도 보이지 않습니다.

Windows에서는 Windows Defender 방화벽 또는 PowerShell을 사용하세요:

New-NetFirewallRule -DisplayName "Block SMB" -Direction Inbound -LocalPort 445 -Protocol TCP -Action Block

네트워크 분리: 피해 범위 제한하기

일부 포트는 반드시 열려 있어야 합니다. 이때의 질문은: 누구에게 열어줄 것인가?

데이터베이스 서버는 포트가 접근 가능해야 합니다—하지만 애플리케이션 서버에서만이지, 인터넷에서는 절대 안 됩니다. 내부 네트워크 세그먼트에 배치하세요. 애플리케이션 서버는 엄격한 규칙이 적용된 DMZ에 위치합니다: 데이터베이스와 통신할 수 있지만, 데이터베이스는 외부로 연결을 시작할 수 없습니다.

공격자가 웹 애플리케이션을 침해하면 데이터베이스에 접근할 수 있지만, 데이터베이스에서 더 이상 나아갈 수는 없습니다. 피해 범위가 여기서 멈춥니다.

이것이 심층 방어입니다: 하나의 시스템이 침해되더라도 모든 것이 무너지지 않도록 제한을 겹겹이 쌓는 것입니다.

지속적인 실천

포트 관리는 한 번으로 끝나는 작업이 아닙니다. 시스템은 조금씩 달라집니다. 테스트용으로 무언가를 설치했다가 삭제하는 것을 잊기도 합니다. 업데이트가 새로운 서비스를 활성화하기도 합니다. 의존성이 예상치 못한 데몬을 끌어들이기도 합니다.

주기적으로—한 달에 한 번이면 적당합니다—포트 검색 명령어를 다시 실행하세요. 예상과 비교해보세요. 새로운 것이 보이면 조사하세요. 사용하지 않는 것은 제거하세요.

목표는 모든 것을 의식적으로 선택하는 것입니다. 열려 있는 포트는 모두 당신이 선택했고, 실제로 필요하며, 가능한 한 엄격하게 제한된 것이어야 합니다.

불필요한 포트 닫기에 대한 자주 묻는 질문

포트를 닫아도 안전한지 어떻게 알 수 있나요?

포트를 사용하는 서비스를 모른다면 조사하세요. 해당 서비스를 사용하지 않는다면 닫으세요. 확신이 없다면 일시적으로 비활성화하고 무언가가 작동하지 않는지 확인하세요. 인쇄, 네트워크 검색, 원격 데스크톱 같은 대부분의 기본 서비스는 대부분의 사용자에게 사실 필요하지 않습니다.

포트를 닫으면 인터넷 연결이 끊기나요?

아닙니다. 아웃바운드 연결(웹 브라우저 사용, 이메일 전송)은 인바운드 포트가 열려 있을 필요가 없습니다. 포트를 닫는 것은 들어오는 연결을 수신 대기하는 서비스에만 영향을 줍니다. 평소 인터넷 사용에는 아무런 영향이 없습니다.

서비스를 중단하는 것과 방화벽으로 포트를 차단하는 것의 차이는 무엇인가요?

서비스를 중단하면 수신 대기하는 코드 자체가 사라집니다. 방화벽으로 포트를 차단하면 서비스는 계속 실행되지만 네트워크 트래픽이 닿지 못하게 막습니다. 둘 다 하세요: 필요하지 않은 서비스는 중단하고, 방화벽을 백업 레이어로 두세요.

SSH를 사용하지 않는다면 포트 22를 닫아야 하나요?

당연히 그래야 합니다. 컴퓨터에 SSH로 접속하지 않는다면, SSH 데몬을 실행할 이유가 없습니다. 서비스를 비활성화하고 포트에 방화벽을 설정하세요. 나중에 SSH가 필요해지면 몇 분 안에 다시 활성화할 수 있습니다.

¿Fue útil esta página?

😔
🤨
😃
불필요한 포트 닫기 • Biblioteca • Connected