웰-노운 포트? 그게 왜
어제 친구에게 서버의 포트포워딩 관련하여 질문을 받았고, 해결해주면서 문득 아래 세가지 의문이 들었음
(1) 다들 웰-노운 포트가 위험하다고 하긴하는데 왜 위험할까?
(2) 진짜 위험하긴 할까? 무엇이 위험한걸까?
(3) 포트를 다른 포트로 바꾼다고 해도 포트 스캐닝을 하면 어떤 포트가 열려있는지 알게되는데 무엇이 다를까?
그래서 찾아보고 정리해봤다 (궁금한건 못 참지!)
0. 기본적인 포트의 범주
우선 먼저 알고가면 좋을 기본적인 포트의 범주를 정리해보았다
범위 | 이름 | 설명 | 예시 |
0~1023 | Well-Known Ports | 시스템 및 표준 서비스용 | HTTP(80), HTTPS(443), SSH(22), FTP(21) |
1024~49151 | Registered Ports | 특정 애플리케이션 등록용 | MySQL(3306), PostgreSQL(5432), Docker(2375) |
49152~65535 | Dynamic / Private Ports | 임시 사용, 클라이언트용 웹 브라우저의 임시 포트 |
1. 웰-노운 포트를 그대로 사용할 경우의 단점
조사해보니 일단 잘 알려진 포트들을 그냥 쓰면 아래와 같은 단점이 있기 때문에 바꾸려 한다는 것을 알게 되었다
(1) Root 권한 필요 (feat. Linux)
기본적으로 리눅스에서 1024이하의 포트를 사용하려면 root 권한이 필요하다
전혀 몰랐는데 맨날 루트 권한으로 작업해서 그랬나보다...
따라서 1024를 쓰는 프로세스는 이미 root 권한으로 실행된다는 것이고, 해당 프로세스에 취약점이 발견되면 서버 전체(서비스)에 위협으로 남는다
그렇기 때문에 Nginx나 Apache 같은 애들을 리버스 프록시로 쓰고, 내부 프로세스를 비권한 포트에서 실행하라는 것!
더군다나 대부분의 서버 애플리케이션(Nginx, Apache 등)은 '권한을 낮추는 메커니즘'을 사용하여 root 권한을 유지하지 않는단다...
뭔말이냐면 프로그램 초기 실행 때는 root로 실행되지만, 동작에 필요한 포트를 바인딩하고 나면 스스로의 권한을 일반 사용자로 낮춘단다
확인해보니 실제로 그러했음;;; (하지만 그 일반 사용자 계정이 root 권한을 가지고 있다면..? ㅋ)
세줄 요약하면 아래와 같다
(1) 1024 이하의 포트는 root 권한이 필요
(2) root 권한을 들고 돌아가는 서비스는 서버 전체에 영향을 줄 수 있음 (공격당하면 크리티컬)
(3) 그렇기 때문에 Nginx와 같은 서버 앱은 보안책으로 root -> 일반 계정으로 권한을 셀프 강등
(2) 포트 스캐닝 & 자동화 공격의 타겟
해커들은 보통 80(HTTP), 443(HTTPS), 22(SSH), 3306(MySQL) 같은 잘 알려진 포트들을 우선적으로 스캔하며 공격을 시도한다 (나 같아도 그러겠다)
그렇기 때문에 포트 스캐닝까지는 막을 수 없지만, 단순히 웰노운 포트만, IP 바꿔가며 시도하는 무작위 공격에는 안전할 수 있다는 것
(3) DDoS 및 봇 트래픽 증가
앞선 (2)의 해커 내용과 비슷한데 80(HTTP), 443(HTTPS)은 웹 봇, 크롤러나 스크립트 공격이 가장 많이 접근하는 포트이다
이러면 쓸데없는 트래픽이 많아지고, 서버 리소스를 불필요하게 소모할 가능성이 있다는 것이 문제
(4) 서비스 간 충돌 가능성
한 포트를 다른 친구들끼리 공유하게 되면 포트 충돌 이슈가 생길 수 있다
더군다나 대부분의 OS에서는 하나의 포트는 하나의 프로세스만 사용할 수 있어서 A가 12345 포트를 선점하고 있을 때, B가 12345 포트 바인딩을 시도한다면 실패가 뜨게된다
원칙적으로 가능하지만 포트 공유를 피하는 이유는 충돌과 예상치 못한 동작(오작동)이 주요 원인!
`SO_REUSEADDR` 같은 옵션을 사용하면 공유할 수도 있지만, 특정 조건과 복잡한 동작 방식에 잘 안쓴다고...
사실 쉽게 생각해보면 프로세스 A와 B 둘다 12345 포트에서 듣고 있으면, A 요청이 B로 갈수도 있고, B요청이 A로 갈수도 있고, 둘다 못들을 수도 있다...
이럴거면 Nginx 하나둬서 리버스 프록시를 쓰지 굳이 1개의 포트를 2개의 프로세스가 공유할 이유가 없는 것!!
2. 보완 방법
(1) 리버스 프록시
위에서 여러번 얘기나왔듯 너무 당연하게도 Nginx 같은 친구를 먼저 두고 관리하는게 베스트!
(2) 방화벽 설정
특정 IP만 접근 가능하게 설정할 수가 있다
예를들자면 아래와 같은 식
sudo ufw allow from 192.168.1.100 to any port 22
(3) 침입 방지 시스템 활용
찾아보니 Fail2ban 같이 여러 번 실패한 IP를 자동 차단하는 도구도 있다는걸 알게됐다;;
예를 들자면 SSH 22번 포트 5번 실패 시 차단하는 식... 좋은데..?
내 서버에 적용해보고 방법 공유할 겸 포스팅 해야겠다 히히
분명 보완방법은 수도없이 많지만, 오늘 요지는 웰-노운 포트를 그대로 사용할 경우의 단점을 알아보는 것이었으니 이만 줄였다
공부할수록 신기했음
마치 창과 방패의 꼬꼬물 대결 같달까?
이렇게 찌르면? 이걸 막아? 이건 어떠냐? 오?? 이번엔!! 의 무한반복...
서버 하나 만든 것 뿐인데 정말 많은 공부가 되고 있다
앞으론 또 무엇을 배울지 두근두근...!
'etc' 카테고리의 다른 글
홈서버 한달 소비 전력 실측 (feat. Beelink S12 Pro) (0) | 2025.01.13 |
---|---|
유튜브 2 배속 이상 재생하기 (feat. 유튜브 배속 늘리기) (0) | 2025.01.12 |
티스토리 구글 검색 노출 안됨 해결방법(feat. sitemap.xml 가져올 수 없음) (0) | 2025.01.07 |
Jenkins workspace Name은 pipeline Name을 따라간다는 것 알고 있는가..? (0) | 2024.11.27 |