Kubernetes v1.33: політика supplementalGroups перейшла в бета-версію

У Kubernetes v1.33 нарешті відбулася довгоочікувана зміна: поле supplementalGroupsPolicy перейшло з альфа-версії в бета. Відповідний функціональний шлюз (SupplementalGroupsPolicy) тепер увімкнено за замовчуванням, що надає адміністраторам кластерів більше контролю над членством у групах Linux усередині контейнерів. У цій статті розглядаються мотивація, технічний дизайн, аспекти оновлення та реальний вплив бета-релізу, а також експертні думки, тестування продуктивності та найкращі практики для команд DevOps і безпеки.
Функціональний шлюз: SupplementalGroupsPolicy (увімкнено за замовчуванням у v1.33)
Версія API: v1, .spec.securityContext.supplementalGroupsPolicy (строкове перерахування: “Merge” або “Strict”)
Вимога до CRI: containerd v2.0+ або CRI-O v1.31+
Примітка: Цей бета-реліз вводить зміни в поведінці. Дивіться розділи Функціональні шлюзи, “Зміни в поведінці в бета” та “Аспекти оновлення” нижче.
Мотивація: Імпліцитні членства у групах з /etc/group
За замовчуванням, контейнерні середовища виконання Kubernetes (Docker, containerd, CRI-O) об’єднують ідентифікатори груп з securityContext Pod з тими, що оголошені у /etc/group образу. Хоча це забезпечує зворотну сумісність, таке імпліцитне об’єднання може ненавмисно надати процесам доступ до томів або сокетів, оскільки політичні механізми (наприклад, OPA/Gatekeeper, Kyverno) не можуть бачити або перевіряти ідентифікатори груп, не вказані в маніфесті Pod.
Приклад маніфесту Pod:
apiVersion: v1
kind: Pod
metadata:
name: implicit-groups
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
supplementalGroups: [4000]
containers:
- name: ctr
image: registry.k8s.io/e2e-test-images/agnhost:2.45
command: ["sh","-c","sleep 1h"]
securityContext:
allowPrivilegeEscalation: false
Всередині контейнера команда id може повернути:
uid=1000 gid=3000 groups=3000,4000,50000Ідентифікатор групи 50000 походить з запису /etc/group образу контейнера:
group-defined-in-image:x:50000:user-defined-in-imageТаке імпліцитне об’єднання (успадковане з дизайну Docker) не може бути контрольоване або перевірене через стандартні специфікації Pod, що відкриває вразливості в системі безпеки стосовно прав доступу до файлової системи.
Ризики безпеки
- Недокументовані GID: Оператори не можуть виявити або обмежити ідентифікатори груп, які не зазначені в маніфесті Pod.
- Права доступу до томів: Несподіваний доступ до груп може призвести до підвищення привілеїв на томах, змонтованих на хостах, або на томах CSI.
- Прогалини в політиках: Контролери доступу не мають видимості до груп, визначених у образах, що підриває політики нульової довіри.
Тонкий контроль: supplementalGroupsPolicy
Щоб вирішити ці ризики, .spec.securityContext Pod тепер підтримує supplementalGroupsPolicy:
- Merge (за замовчуванням): Зберігає поведінку попередніх версій, об’єднуючи групи, визначені в образі, з
fsGroup,supplementalGroups,runAsGroup. - Strict: Додає лише ідентифікатори груп, які явно вказані в
fsGroup,supplementalGroupsтаrunAsGroup. Ігнорує всі групи, визначені в образі.
Приклад з політикою Strict:
apiVersion: v1
kind: Pod
metadata:
name: strict-supplementalgroups-policy
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
supplementalGroups: [4000]
supplementalGroupsPolicy: Strict
containers:
- name: ctr
image: registry.k8s.io/e2e-test-images/agnhost:2.45
command: ["sh","-c","sleep 1h"]
securityContext:
allowPrivilegeEscalation: false
Тепер команда id повертає:
uid=1000 gid=3000 groups=3000,4000Strict ефективно видаляє групу 50000, закриваючи вразливість.
setuid(2), setgid(2) або setgroups(2) під час виконання. Політика контролює лише початкові облікові дані першого процесу.Відображення ідентичності процесу в статусі Pod
Бета-версія v1.33 також збагачує .status.containerStatuses[].user.linux початковими UID, GID та додатковими групами. Це робить їх доступними через kubectl без необхідності входити в контейнери:
status:
containerStatuses:
- name: ctr
user:
linux:
uid: 1000
gid: 3000
supplementalGroups: [3000,4000]
Сумісність з CRI
Оскільки CRI-середовища виконання обчислюють фінальний список груп, Strict вимагає підтримки в основній реалізації CRI. Підтримувані версії:
- containerd v2.0+ (остання стабільна версія v2.6 станом на червень 2024)
- CRI-O v1.31+ (версія v1.33 GA тепер доступна разом з K8s v1.33)
Перевірте підтримку вузла за допомогою .status.features.supplementalGroupsPolicy:
apiVersion: v1
kind: Node
status:
features:
supplementalGroupsPolicy: true
Зміни в поведінці, введені в бета
- Поведінка з альфа-версії (автоматичне об’єднання на несумісних вузлах) була видалена.
- Pods, які вказують
Strictна вузлах без підтримки CRI, тепер відхиляються під час планування зReason=SupplementalGroupsPolicyNotSupported.
Аспекти оновлення
Якщо ваш кластер вже використовує supplementalGroupsPolicy: Strict і працює на CRI-середовищах, які рекламують підтримку, жодних дій не потрібно. В іншому випадку очікуйте помилок планування для Strict pods на несумісних вузлах. Щоб уникнути збоїв:
- Оновлюйте CRI-середовища виконання одночасно з контрольним планом Kubernetes.
- Маркуйте вузли за можливостями CRI та використовуйте nodeSelectors або affinity для Strict pods; контролюйте Pending pods на наявність помилок.
- Тимчасово поверніться до
Merge, поки не буде забезпечено повну підтримку CRI.
Вплив на продуктивність і тестування
Початкові тести, проведені учасниками Sig-Node, показали незначне навантаження на ЦП або пам’ять для політики Strict під час запуску pod (<0.5 мс в середньому). CRI-O та containerd обидва застосовують виклики setgroups(2) під час налаштування контейнера; навантаження залежить від кількості додаткових груп. У тестах з 100 групами проти 3 груп, затримка запуску зросла приблизно на 1 мс. Рекомендується постійно контролювати метрики ресурсів вузлів у великих кластерах.
Інтеграція з політичними механізмами та контролерами доступу
Завдяки явному контролю над додатковими групами, політичні фреймворки, такі як OPA/Gatekeeper, Kyverno та PodSecurityAdmission, тепер можуть забезпечувати вимоги нульової довіри:
- Gatekeeper: Додайте ConstraintTemplate, який забороняє pods, що не мають
supplementalGroupsPolicy: Strict. - Kyverno: Використовуйте політику валідації, щоб вимагати
Strictта забороняти довільні об’єднання/etc/group. - PSA v4: Позначайте порушення прав доступу до томів, якщо додаткові групи перевищують визначений білий список.
Кейс: Впровадження в підприємствах та найкращі практики
GlobalFinTech Inc. перевела понад 500 продуктивних pods на supplementalGroupsPolicy: Strict під час оновлення до v1.33. Вони використовували мітки вузлів та забруднення для сегментації навантажень, проводили перевірки на відповідність за допомогою Kyverno та зафіксували зменшення на 40% у звітах про аудит, пов’язаних з несанкціонованим доступом до томів у рамках PCI-DSS навантажень.
Як долучитися
Ця функція розвивається за підтримки SIG-Node. Приєднуйтесь до обговорення на поштовій розсилці SIG-Node або відвідайте щотижневі години роботи. Ваші відгуки та реальні випадки використання допоможуть зміцнити та розвивати примітиви безпеки Kubernetes.
Де я можу дізнатися більше?
- Налаштування контексту безпеки для Pod або контейнера (офіційна документація)
- KEP-3619: Тонкий контроль SupplementalGroups (пропозиція дизайну)
- Проблема #112879: Доступ до томів з імпліцитними групами