Kubernetes 1.35: защита от произвольного кода в kubeconfig через allowlist

В январе 2026 года вышла версия Kubernetes 1.35, которая принесла важное улучшение безопасности для всех, кто использует kubectl и клиентскую библиотеку client-go. Речь идет о механизме, позволяющем администраторам и разработчикам контролировать, какие именно исполняемые файлы могут быть запущены из

Kubernetes 1.35: защита от произвольного кода в kubeconfig через allowlist

В январе 2026 года вышла версия Kubernetes 1.35, которая принесла важное улучшение безопасности для всех, кто использует kubectl и клиентскую библиотеку client-go. Речь идет о механизме, позволяющем администраторам и разработчикам контролировать, какие именно исполняемые файлы могут быть запущены из kubeconfig для получения учетных данных. Новая функциональность, разработанная SIG-Auth и SIG-CLI, реализована в виде политик и белого списка credential-плагинов и доступна в бета-версии без необходимости включения feature gates.

Проблема, которую решает нововведение, давно назрела. Встроенная возможность kubectl запускать произвольные исполняемые файлы через поле users[n].exec.command в kubeconfig — мощный инструмент. Она позволяет интегрироваться с внешними провайдерами аутентификации, например, с облачными IAM-решениями или корпоративными системами единого входа. Однако эта же гибкость создает серьезную угрозу: если злоумышленнику удастся скомпрометировать процесс генерации kubeconfig — через атаку на цепочку поставок или взлом CI/CD-пайплайна — он сможет заставить kubectl выполнить произвольный код с правами текущего пользователя. При этом пользователь может даже не подозревать, что его конфигурационный файл запускает вредоносный скрипт.

Как работает новая защита в Kubernetes 1.35

Механизм защиты основан на двух новых полях в конфигурационном файле kuberc: credentialPluginPolicy и credentialPluginAllowlist. Первое задает общую политику: разрешены ли вообще внешние credential-плагины, а второе — явный список исполняемых файлов (с путями), которым разрешен запуск. Если поле не задано, поведение остается прежним — kubectl выполняет любой плагин, указанный в kubeconfig. Однако при добавлении хотя бы одного из этих полей kubectl начинает проверять каждый запуск плагина на соответствие политике.

Например, можно задать политику, разрешающую только те плагины, которые явно перечислены в allowlist. Если kubeconfig попытается запустить неизвестный исполняемый файл, kubectl откажется его выполнять и выдаст ошибку. Это дает администраторам возможность жестко контролировать, какие именно программы могут быть использованы для аутентификации. При этом сам механизм работает на уровне client-go, поэтому он доступен не только kubectl, но и любым другим инструментам, использующим эту библиотеку.

Что это значит для пользователей?

Для обычных разработчиков и администраторов Kubernetes нововведение означает дополнительный уровень защиты без необходимости писать код. Достаточно добавить несколько строк в файл kuberc, который обычно находится в ~/.kube/kuberc. Например, чтобы разрешить только плагины aws-iam-authenticator и gke-gcloud-auth-plugin, нужно указать их полные пути в allowlist. kubectl будет выполнять только эти программы, а любые другие — игнорировать. Это особенно актуально для организаций, которые используют автоматически сгенерированные kubeconfig-файлы, например, через облачные платформы или инструменты вроде Rancher.

Предыстория и контекст

Проблема выполнения произвольного кода через kubeconfig не нова. В сообществе Kubernetes неоднократно поднимались вопросы безопасности credential-плагинов. В 2023 году была опубликована CVE-2023-3676, связанная с возможностью выполнения вредоносных команд через exec-плагины. Тогда уязвимость заключалась в том, что kubectl не проверял подпись или источник плагина. Новый механизм в версии 1.35 — прямой ответ на эти угрозы. Он не блокирует полностью функциональность, а дает инструменты для ее безопасного использования.

Интересно, что подобные механизмы уже существуют в других экосистемах. Например, в Docker есть настройка allowed registries, а в Git — allowed signers. Kubernetes идет по тому же пути: предоставляет администраторам контроль, не ломая обратную совместимость. Поскольку функция пока бета, ее можно опробовать без риска для стабильности кластера.

Технические подробности реализации

С технической стороны изменения затронули структуру ExecProvider в client-go. Добавлено новое поле PluginPolicy, которое может принимать одно из значений: PermitAll, PermitIfInAllowlist или DenyAll. По умолчанию, если политика не задана, используется PermitAll — то есть поведение не меняется. При установке PermitIfInAllowlist kubectl проверяет, что полный путь к исполняемому файлу совпадает с одним из путей в allowlist. Сравнение происходит по абсолютному пути после разрешения всех симлинков, что усложняет обход через создание ссылок.

В kuberc эти поля выглядят следующим образом. Поле credentialPluginPolicy принимает строку "PermitIfInAllowlist" или "DenyAll". Поле credentialPluginAllowlist — это список строк, каждая из которых — абсолютный путь к разрешенному исполняемому файлу. Важно, что allowlist работает только в сочетании с политикой PermitIfInAllowlist; если политика DenyAll, то никакие плагины не выполняются вообще.

Кого затронет и как

Нововведение в первую очередь затронет администраторов, которые управляют множеством кластеров и используют автоматическую генерацию kubeconfig. Им придется обновить свои kuberc-файлы, чтобы не потерять возможность аутентификации. Разработчикам, использующим kubectl локально, тоже стоит обратить внимание: если они когда-либо скачивали kubeconfig из ненадежных источников, теперь у них есть способ защититься. Для пользователей managed Kubernetes-сервисов, таких как Google Kubernetes Engine или Amazon EKS, изменения будут незаметны, пока их администраторы не внедрят политики.

В российском контексте это особенно актуально для компаний, которые используют самописные или форкнутые решения для генерации конфигов. Если в цепочку поставок такого решения проникнет вредоносный код, allowlist может стать последней линией обороны. Кроме того, многие организации в РФ переходят на Kubernetes в условиях санкционных ограничений, и безопасность конфигураций становится критически важной.

Что будет дальше

Функция находится в бета-стадии, поэтому в следующих версиях Kubernetes ожидается ее стабилизация и, возможно, расширение. В сообществе уже обсуждается возможность добавления поддержки цифровых подписей для credential-плагинов, что позволило бы проверять не только путь, но и происхождение исполняемого файла. Пока же рекомендуется всем, кто заботится о безопасности, начать тестирование allowlist в тестовых кластерах. Для этого достаточно установить Kubernetes 1.35, создать kuberc с нужными полями и убедиться, что kubectl работает корректно.

Итог

Kubernetes 1.35 делает важный шаг в повышении безопасности клиентских инструментов. Возможность ограничить исполнение credential-плагинов через белый список — это не просто новая настройка, а ответ на реальные угрозы, связанные с атаками на цепочку поставок. Администраторам стоит как можно скорее ознакомиться с документацией и внедрить политики в своих организациях, чтобы снизить риск компрометации через kubeconfig.