낮은 포트 매핑과 권한 점검

필요한 포트만 공개하고 서비스에 불필요한 네트워크 권한을 제거하세요.

설명

1부터 1023 사이의 포트는 전통적으로 시스템 서비스에 사용됩니다. 호스트에 공개하는 포트와 컨테이너 안에서 수신하는 포트는 구분해야 하며, 낮은 포트를 매핑했다는 이유만으로 컨테이너에 root 권한이 부여되지는 않습니다.

낮은 포트에서 수신하는 데 필요한 권한은 네트워크 네임스페이스의 ip_unprivileged_port_start 설정에도 영향을 받습니다. 일반 애플리케이션은 가능하면 높은 포트를 사용하고 불필요한 NET_BIND_SERVICE 권한을 제거하세요.

잠재적 영향

  • 불필요한 네트워크 capability는 서비스가 침해되었을 때 사용할 수 있는 권한을 늘립니다.
  • 필요 이상으로 공개한 서비스는 외부 접근 시도를 받을 수 있습니다.
  • 프로토콜 요구를 확인하지 않고 포트를 바꾸면 서비스가 중단될 수 있습니다.

해결 방법

  • 호스트 공개 포트와 컨테이너 수신 포트의 필요성을 각각 확인하세요. 포트 변경을 지원하는 애플리케이션은 1024 이상 포트를 검토하세요.
  • 필요하지 않은 NET_BIND_SERVICE capability를 제거하고 실제 사용자와 네임스페이스 설정에서 정상 동작을 시험하세요.
  • DHCP처럼 정해진 포트가 필요한 프로토콜은 그 요구를 유지하고 네트워크 접근 범위를 제한하세요. 높은 포트도 인증이나 방화벽을 대신하지 않습니다.

예시

DHCP 클라이언트는 서버의 UDP 67 포트로 요청합니다. 두 번째 예제는 6700/udp에서 수신하도록 구성한 별도 애플리케이션용이며 DHCP 서버의 대체 구성이 아닙니다. APP_IMAGE에 해당 이미지를 지정하세요.

변경 전

yaml
services:
  dhcpd:
    image: networkboot/dhcpd:latest
    ports:
      - "67:67/udp"

변경 후

yaml
services:
  app:
    image: ${APP_IMAGE:?set APP_IMAGE}
    ports:
      - "6700:6700/udp"
    cap_drop:
      - NET_BIND_SERVICE

설명:

  • 변경 전: DHCP 서버의 UDP 67 포트를 공개합니다. 필요한 프로토콜 포트라는 점을 고려해 접근 범위와 실제 권한을 검토하세요.
  • 변경 후: 포트를 변경할 수 있는 애플리케이션이 높은 포트에서 수신하고 불필요한 capability를 제거하는 예입니다. 외부 공개 범위는 별도로 제한하세요.

참조