Код-ревью Senior RBAC и Helm обновлено

Ревью: RBAC для CI

Вопрос

Эти права выданы CI-пайплайну, который деплоит одно приложение в namespace shop. Найди проблемы.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ci-deployer
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: ci-deployer
subjects:
  - kind: ServiceAccount
    name: default
    namespace: shop
roleRef:
  kind: ClusterRole
  name: ci-deployer
  apiGroup: rbac.authorization.k8s.io

Коротко

Минимальные права: Ещё лучше GitOps: CI только обновляет git, а изменения в кластер вносит Argo CD или Flux со своими правами, и учётные данные кластера не покидают его.

Что должен найти ревьюер

  1. Безопасностьстрока 6
    Wildcard по группам, ресурсам и глаголам: это права cluster-admin. Перечислить только нужное: deployments, services, configmaps, ingresses и глаголы get, list, create, patch, update.
  2. Безопасностьстрока 11
    ClusterRoleBinding распространяет права на весь кластер, а CI работает в одном namespace. Нужен RoleBinding в shop.
  3. Безопасностьстрока 16
    Права выданы ServiceAccount default: его получают все поды namespace, то есть любое приложение в shop станет администратором кластера. Нужен отдельный ServiceAccount для CI.
  4. Безопасность
    Права на чтение секретов и pods/exec CI для деплоя не нужны; если деплой идёт через Helm, учесть, что Helm хранит релизы в Secret (нужны права на secrets только в своём namespace).

Разбор

Минимальные права:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: ci-deployer
  namespace: shop
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: ci-deployer
  namespace: shop
rules:
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "configmaps"]
    verbs: ["get", "list", "create", "update", "patch"]
  - apiGroups: ["networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["get", "list", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ci-deployer
  namespace: shop
subjects:
  - kind: ServiceAccount
    name: ci-deployer
    namespace: shop
roleRef:
  kind: Role
  name: ci-deployer
  apiGroup: rbac.authorization.k8s.io

Ещё лучше GitOps: CI только обновляет git, а изменения в кластер вносит Argo CD или Flux со своими правами, и учётные данные кластера не покидают его.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.