В Kubernetes v1.36 поле
.spec.externalIPs у Service официально помечено как deprecated. Удаление запланировано на v1.43. Если вы используете externalIPs в своих манифестах, пора планировать миграцию.В чём проблема
Поле
externalIPs появилось как способ направить внешний трафик на кластерные поды без облачного балансировщика. Идея простая: указываете IP, и kube-proxy создаёт правила iptables для маршрутизации трафика.Проблема в том, что API не проверяет, кому принадлежит указанный IP. Любой пользователь с правами на создание или редактирование Service может указать произвольный внешний адрес.
kube-proxy послушно создаст NAT-правила, и трафик, предназначенный для этого IP, уйдёт в под атакующего.Это классическая атака «человек посередине». В мультитенантных кластерах, где у тенантов есть права на управление сервисами в своём неймспейсе, один скомпрометированный тенант может перехватывать трафик всего кластера. Уязвимость описана в CVE-2020-8554 ещё в декабре 2020 года.
Вот пример вредоносного сервиса, который перехватывает трафик к внешнему IP:
apiVersion: v1
kind: Service
metadata:
name: mitm-externalip
spec:
ports:
- name: http
port: 80
targetPort: 8080
selector:
app: echoserver
type: ClusterIP
externalIPs:
- 104.16.185.241
После создания такого сервиса весь трафик с нод кластера к
104.16.185.241:80 будет перенаправлен на под echoserver. Без каких-либо предупреждений.Почему так долго тянули
Проект Kubernetes рекомендовал отключать
externalIPs ещё с версии 1.21, когда появился admission controller DenyServiceExternalIPs. Но SIG Network посчитала, что блокировка по умолчанию стала бы слишком серьёзным breaking change.Спустя пять лет подход изменился. В v1.36 добавлен feature gate
AllowServiceExternalIPs (по умолчанию true). Процесс удаления разбит на этапы:В v1.36
kube-proxy получает возможность не создавать правила для externalIPs через feature gate. Использование поля генерирует deprecation warning.В последующих релизах feature gate будет по умолчанию переключён на
false, а затем поле будет полностью удалено. Финальное удаление запланировано на v1.43.Что делать
Проверьте свои манифесты на наличие
externalIPs:kubectl get svc -A -o json | jq '.items[] | select(.spec.externalIPs != null) | {name: .metadata.name, ns: .metadata.namespace, ips: .spec.externalIPs}'Варианты замены зависят от сценария. Для облачных кластеров подойдут Service типа
LoadBalancer. Для bare-metal окружений стоит посмотреть в сторону MetalLB или другого контроллера внешних балансировщиков. Для HTTP-трафика есть реализации Gateway API.Если вы уже используете Cilium в режиме замены
kube-proxy, уязвимость CVE-2020-8554 вас не затрагивала, но миграция с externalIPs всё равно нужна, потому что само поле из API исчезнет.Шесть лет жизни с известной MITM-уязвимостью подходят к концу. Поле
externalIPs получило статус deprecated в v1.36 и будет удалено в v1.43. Времени достаточно, но аудит манифестов лучше провести сейчас, пока это ещё предупреждения, а не ошибки.➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#локализация