설명
1부터 1023 사이의 포트는 전통적으로 시스템 서비스에 사용됩니다. 호스트에 공개하는 포트와 컨테이너 안에서 수신하는 포트는 구분해야 하며, 낮은 포트를 매핑했다는 이유만으로 컨테이너에 root 권한이 부여되지는 않습니다.
낮은 포트에서 수신하는 데 필요한 권한은 네트워크 네임스페이스의 ip_unprivileged_port_start 설정에도 영향을 받습니다. 일반 애플리케이션은 가능하면 높은 포트를 사용하고 불필요한 NET_BIND_SERVICE 권한을 제거하세요.
잠재적 영향
- 불필요한 네트워크 capability는 서비스가 침해되었을 때 사용할 수 있는 권한을 늘립니다.
- 필요 이상으로 공개한 서비스는 외부 접근 시도를 받을 수 있습니다.
- 프로토콜 요구를 확인하지 않고 포트를 바꾸면 서비스가 중단될 수 있습니다.
해결 방법
- 호스트 공개 포트와 컨테이너 수신 포트의 필요성을 각각 확인하세요. 포트 변경을 지원하는 애플리케이션은 1024 이상 포트를 검토하세요.
- 필요하지 않은
NET_BIND_SERVICEcapability를 제거하고 실제 사용자와 네임스페이스 설정에서 정상 동작을 시험하세요. - 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를 제거하는 예입니다. 외부 공개 범위는 별도로 제한하세요.