Docker에서 WebSocket 포트를 보호하려면 네트워크 보안, 암호화, 인증, 인증 및 컨테이너 구성을 포함하는 여러 모범 사례 계층이 포함되어있어 WebSocket 커뮤니케이션의 기밀성, 무결성 및 가용성을 유지합니다. 아래는 Docker에서 WebSocket 포트를 보호하기위한 모범 사례에 대한 자세한 설명입니다.
보안 WebSocket 프로토콜 (WSS) 사용
TLS (Transport Layer Security)에서 작동하는 보안 WebSocket 프로토콜 (WSS : //)을 항상 사용하십시오. 이는 클라이언트와 서버간에 전송 된 데이터를 암호화하여 도청 및 MITM (Man-in-the-Middle) 공격을 방지합니다. 암호화는 WebSocket 연결을 통해 전송 된 메시지의 기밀성과 무결성을 보장합니다. 웹 사이트 용 HTTP와 마찬가지로 WSS는 엄격한 전송 보안 및 혼합 컨텐츠 차단과 같은 브라우저 기반 보안 기능을 사용하여 전반적인 통신 보안을 향상시킬 수 있습니다. 암호화되지 않은 WS : // 프로토콜 사용을 피하십시오. 암호화가 필요하지 않은 신뢰할 수있는 환경에서 완전히 작동하지 않는 한.
인증 및 승인
WebSocket 연결은 HTTP와 같은 세션 기반 인증 메커니즘을 기본적으로 지원하지 않기 때문에 자체 인증 시스템을 구현하는 것이 중요합니다. 일반적인 접근법에는 JWT (JSON Web Tokens)를 사용한 토큰 기반 인증 또는 초기 HTTP 업그레이드 핸드 셰이크 중 쿠키가 포함됩니다. 인증 된 클라이언트 만 연결을 설정하기 위해 인증은 WebSocket 핸드 셰이크 단계에 연결되어야합니다.
승인은 연결 설정 단계에서 한 번만이 아니라 Message 또는 액션별로 시행되어야합니다. 이는 열린 WebSocket에 액세스 한 후 무단 사용자의 권한이 높아지는 것을 방지합니다.
도난 당하거나 재생 된 토큰에 대한 보안을 향상 시키려면 짧은 수명, 범위의 토큰 사용 또는 WebSocket 연결을 위해 특히 일회성 일회성 토큰을 발행하는 것을 고려하십시오. 이 토큰은 신속하게 만료되고 손상되면 위험을 줄입니다.
네트워크 격리 및 도커 네트워킹 모범 사례
컨테이너 포트를 공개 네트워크에 직접 노출하지 마십시오. 대신, Custom Docker Bridge 네트워크 내에 WebSocket 서비스를 호스팅하는 컨테이너를 배치하여 다른 서비스에서 분리하고 외부 액세스를 제한하십시오.
다른 컨테이너 그룹에 대한 별도의 Docker Network 브리지를 만듭니다. 예를 들어, 하나의 브리지 네트워크는 들어오는 트래픽을 호스트에서 WebSocket 서비스 컨테이너로 라우팅 할 수 있으며 WebSocket 컨테이너와 데이터베이스와 같은 다른 백엔드 서비스 간의 안전한 통신에 다른 개인 내부 네트워크를 사용할 수 있습니다.
Docker의 기본`Docker0` 네트워크 브리지 사용을 피하십시오. 기본적으로 모든 컨테이너를 연결하므로 Docker 호스트 내에서 원치 않는 측면 이동이 가능하기 때문입니다.
컨테이너 오케스트레이션에 Docker Swarm 또는 Kubernetes를 사용할 때 암호화 활성화 (`-opt encrypted`)와 함께 오버레이 네트워크를 사용하십시오. 이러한 네트워크는 클러스터 내에서 WebSocket Communications를 포함하여 노드 간 트래픽을 암호화하여 네트워크 계층의 차단으로부터 데이터를 보호합니다.
프록시 및로드 밸런싱
WebSocket 포트를 인터넷에 직접 노출시키지 마십시오. Nginx, Traefik 또는 Haproxy와 같은 리버스 프록시를 사용하여 WebSocket 트래픽을 라우팅하십시오. 프록시는 다음을 포함하여 많은 이점을 제공합니다.
- WebSocket 인스턴스가 TLS 인증서를 직접 관리 할 필요가 없도록 중앙 집중식 TLS 종료.
- WebSocket 서비스를 백엔드로 전달하기 전에 인증 확인.
-로드 밸런싱 또는 라우팅 규칙을 기반으로 한 트래픽 라우팅.
- 프록시 포트 만 외부에서 노출되므로 단순화 된 방화벽 구성.
- 보안 헤더 및 정책을보다 잘 제어합니다.
프록시는 또한 포트의 직접 노출이 공격 표면을 늘리는 것 외에도 네트워크 및 방화벽 규칙을 복잡하게 할 수 있으므로 위험을 완화시킵니다.
입력 검증 및 위생
WebSocket 연결은 핸드 셰이크 후 임의의 메시지를 허용하므로 모든 들어오는 데이터를 엄격하게 검증하고 소독해야합니다. 들어오는 모든 고객 데이터를 신뢰할 수없는 것으로 취급하십시오. JSON과 같은 구조화 된 데이터 형식에 대한 스키마 검증을 수행하여 페이로드가 예상 규범과 일치하고 주입 공격을 방지합니다.
서버 측 유효성 검사는 주입, 기형 데이터 및 비즈니스 로직 오류를 악용하려는 시도로부터 보호합니다. 마찬가지로 클라이언트 측 유효성 검사를 통해 서버에서받은 데이터가 처리하기에 안전하여 조작 또는 손상된 데이터로부터 보호합니다.
요율 제한 및 조절
WebSocket 연결 및 메시지에 대한 속도 제한을 구현하여 Service Denial-of-Service (DOS) 공격 또는 WebSocket 서비스의 남용을 방어합니다. IP 주소 당 연결 수와 제어 메시지 전송 요율을 제한하여 과도한 자원을 소비하거나 서비스 품질을 저하시킬 수있는 홍수를 방지하십시오.
보안 컨테이너 구성
- 루트 권한이있는 컨테이너를 실행하지 마십시오. 뿌리가 아닌 사용자를 사용하여 컨테이너가 실행되는 경우 가장 적은 사례 원칙을 사용하십시오.
- WebSocket 컨테이너 내부에서 Docker Deomon 소켓 (`/var/run/docker.sock`)을 장착하지 않으십시오.
- 컨테이너 기능을 WebSocket 서비스에 필요한 것으로 제한하십시오.
- 공식, 최소 및 정기적으로 업데이트 된 Docker 기본 이미지를 사용하여 공격 표면을 줄입니다.
비밀 관리
API 키, 토큰 또는 컨테이너 이미지 또는 소스 코드와 같은 하드 코딩 비밀을 피하십시오. Docker 비밀, 환경 변수 또는 보안 금고 솔루션을 사용하여 런타임에 자격 증명을 안전하게 주입하십시오. 정기적으로 비밀을 회전시킵니다.
로깅 및 모니터링
핸드 셰이크 시도, 인증 성공/실패, 메시지 오류 및 비정상적인 활동을 포함하여 WebSocket 연결에 대한 자세한 로깅을 활성화합니다. 모니터링 로그는 시도 된 공격을 식별하거나 조기에 오용하는 데 도움이됩니다.
의심스러운 활동에 대한 중앙 집중식 로깅 및 실시간 경고를 구현, 인증 시도 실패 또는 공격을 알 수있는 트래픽 스파이크.
정기 업데이트 및 보안 테스트
Docker Engine, 컨테이너 이미지, WebSocket 라이브러리 및 Patch 알려진 취약점에 대한 리버스 프록시를 포함한 모든 구성 요소를 업데이트하십시오.
자동화 된 취약성 스캐너 (예 : 스튜, 버프 스위트) 및 수동 침투 테스트와 같은 도구를 사용하여 WebSocket 엔드 포인트에 맞는 정기 보안 테스트를 수행하십시오. 비정상적이거나 악용 가능한 서버 동작을 감지하기위한 퍼즈 테스트 메시지가 권장됩니다.
크로스-오리진 및 원산지 점검
WebSocket 핸드 셰이크 중에 엄격한 원산지 헤더 점검을 시행하여 연결이 신뢰할 수있는 도메인에서 유래했는지 확인하십시오. 이는 악의적 인 웹 사이트가 열린 WebSocket 연결을 오용하려고 시도하는 CSWSH (Cross-Site WebSocket 납치대)를 방어하는 데 도움이됩니다.
세션 관리
안전한 세션 관리를 구현하십시오. 세션 납치 위험을 최소화하기 위해 WebSocket 인증 토큰을 위해 토큰 만료 및 갱신 메커니즘을 사용하십시오. 로그 아웃시 또는 비 활동 기간 후에 무효화.
불필요한 포트 노출을 피하십시오
컨테이너 호스트에 최소 필수 포트 만 노출하십시오. 보안 프록시 뒤에 있지 않는 한 Docker의`-p` 옵션을 사용하여 WebSocket 포트를 직접 게시하지 마십시오.
WebSocket 서비스가 내부적으로 만 통신 할 수 있도록 Docker 내부 또는 사용자 정의 네트워크를 사용하여 포트 노출을 제한하십시오.
요약
Docker에서 WebSocket 포트를 확보하려면 다층 접근 방식이 필요합니다.
- 암호화 된 통신을 위해 WSS (TLS를 통해 WebSocket)를 사용하십시오.
- WebSocket 핸드 셰이크 중에 Token 기반 방법으로 사용자를 인증합니다.
- 인증 후 각 조치 또는 메시지를 승인합니다.
- 암호화가 활성화 된 Docker 네트워크 격리 및 사용자 정의 브리지 또는 오버레이 네트워크를 사용하십시오.
- 프록시 webSocket 포트를 직접 노출시키지 않고 안전한 리버스 프록시를 통한 트래픽.
- 주입 공격을 방지하기 위해 모든 입력을 검증하고 소독합니다.
- DOS 공격을 완화하기 위해 속도 제한을 구현합니다.
- 최소한의 권한 및 비밀 관리를 포함한 Docker 컨테이너 보안 모범 사례를 따르십시오.
- 의심스러운 행동을 위해 WebSocket 활동을 모니터링하고 로그합니다.
- 구성 요소를 정기적으로 업데이트하고 보안 테스트를 수행합니다.
- 납치를 방지하기 위해 원산지 점검을 시행합니다.
- 만료 및 갱신으로 세션 토큰을 안전하게 관리합니다.