1,RBACпредставлять
В Kubernetes существует 6 режимов авторизации: ABAC (управление доступом на основе атрибутов), RBAC (управление доступом на основе ролей), Webhook, Node, AlwaysDeny (всегда запрещать) и AlwaysAllow (всегда разрешать). Начиная с версии 1.6, Kubernetes по умолчанию включает политику управления доступом RBAC. RBAC доступен как стабильная функция с версии 1.8. Включите RABC, установив --authorization-mode=RBAC. В RABC API авторизация выполняется по следующим шагам: 1) Определение роли: При определении роли будут указаны правила контроля доступа для этой роли к ресурсам 2) Привязка роли: Привязка субъекта к роли, и выполните над пользователем следующие операции: Авторизация доступа.
1.1 Роли и кластерные роли
В API RBAC роли содержат правила, представляющие наборы разрешений. Здесь разрешения только предоставляются, а не запрещаются. В Kubernetes есть два типа ролей: обычные роли и кластерные роли. Роли можно определить в пространстве имен с помощью Role, или роли в масштабе кластера можно определить с помощью ClusterRole. Роль можно использовать только для предоставления доступа к ресурсам в одном командном пространстве. Ниже приведена роль под названием «pod-reader», определенная в пространстве команд «по умолчанию». Эта роль может получать доступ к модулям в пространстве имен «по умолчанию»:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
Кластерной роли (ClusterRole) могут быть предоставлены разрешения на следующие ресурсы:
- Общекластерные ресурсы (аналогично Node)
- конечная точка без ресурсов (аналогично «/healthz»)
- Ресурсы для всех пространств имен в кластере (например, Pods)
Ниже приведен пример предоставления роли кластера доступа на чтение к файлу секретного словаря:
kind:ClusterRole
apiVersion:rbac.authorization.k8s.io/v1
metadata:
# "namespace" omitted since ClusterRoles are not namespaced
name:secret-reader
rules:
- apiGroups:[""]
resources:["secrets"] #明确资源类型
verbs:["get","watch","list"]
1.2 Привязка ролей и привязка ролей кластера
Привязка ролей используется для привязки роли к одному или группе пользователей для достижения цели авторизации пользователей. Участники делятся на пользователей, группы и учетные записи служб. Привязка ролей также делится на обычную привязку ролей и привязку кластерной роли. Привязки ролей могут ссылаться только на роли в одном и том же пространстве имен. В приведенном ниже примере привязка роли в пространстве имен «по умолчанию» связывает пользователя «jane» с ролью «pod-reader», которая предоставляет «jane» доступ к модулям в пространстве имен «default».
# This role binding allows "jane" to read pods in the "default" namespace.
kind:RoleBinding
apiVersion:rbac.authorization.k8s.io/v1
metadata:
name:read-pods
namespace:default
subjects: #主体
- kind:User
name:jane
apiGroup:rbac.authorization.k8s.io
roleRef: #引用的角色
kind:Role
name:pod-reader
apiGroup:rbac.authorization.k8s.io
Привязки ролей также могут предоставлять доступ, ссылаясь на роли кластера.Когда доступ субъекта к ресурсам ограничен этим пространством имен, это позволяет администраторам определить набор общих ролей для всего кластера, который затем можно повторно использовать в нескольких пространствах имен. Например, следующая привязка роли ссылается на роль кластера, но пользователь «dave» может только читать ресурс secrets в пространстве имен «development»:
# This role binding allows "dave" to read secrets in the "development" namespace.
kind:RoleBinding
apiVersion:rbac.authorization.k8s.io/v1
metadata:
name:read-secrets
namespace:development# This only grants permissions within the "development" namespace.
subjects:
- kind:User
name:dave
apiGroup:rbac.authorization.k8s.io
roleRef:
kind:ClusterRole
name:secret-reader
apiGroup:rbac.authorization.k8s.io
Кластерные роли можно использовать для авторизации как на уровне кластера, так и во всем пространстве имен. В следующем примере пользователи из группы «менеджер» получают доступ к ресурсам секретного словаря во всех пространствах имен.
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind:ClusterRoleBinding
apiVersion:rbac.authorization.k8s.io/v1
metadata:
name:read-secrets-global
subjects:
- kind:Group
name:manager
apiGroup:rbac.authorization.k8s.io
roleRef:
kind:ClusterRole
name:secret-reader
apiGroup:rbac.authorization.k8s.io
1.3 ресурс
В Kubernetes к основным ресурсам относятся: Pods, Nodes, Services, Deployment, Replicasets, Statefulsets, Namespace, Persistents, Secrets, ConfigMap и т. д. Кроме того, под некоторыми ресурсами есть подресурсы, например подресурсы log под Pod:
GET /api/v1/namespaces/{namespace}/pods/{name}/log
Следующий пример показывает, "pod-and-pod-logs-reader» имеет доступ к «pods» и «pods/log»:
kind:Role
apiVersion:rbac.authorization.k8s.io/v1
metadata:
namespace:default
name:pod-and-pod-logs-reader
rules:
- apiGroups:[""]
resources:["pods","pods/log"]
verbs:["get","list"]
Вы также можете указать конкретный экземпляр ресурса через resourceNamess, чтобы ограничить роль только контролем доступа к экземпляру:
kind:Role
apiVersion:rbac.authorization.k8s.io/v1
metadata:
namespace:default
name:configmap-updater
rules:
- apiGroups:[""]
resources:["configmaps"]
resourceNames:["my-configmap"]
verbs:["update","get"]
1.4 основной корпус
Участниками авторизации RBAC могут быть группы, пользователи или учетные записи служб. Пользователи представлены строками, такими как «alice», «bob@example.com» и т. д. Конкретная форма зависит от имени пользователя, настроенного администратором в модуле аутентификации. system: зарезервирован для использования системой Kubernetes и поэтому не может использоваться в качестве префикса для пользователей. Группы также предоставляются модулем аутентификации в формате, аналогичном формату пользователей.
Пример привязки тела к роли:
Пользователь с именем "alice@example.com":
subjects:
- kind:User
name:"alice@example.com"
apiGroup:rbac.authorization.k8s.io
Группа под названием «frontend-admins»:
subjects:
- kind:Group
name:"frontend-admins"
apiGroup:rbac.authorization.k8s.io
В пространстве имен kube-system учетная запись службы с именем «по умолчанию»:
subjects:
- kind:ServiceAccount
name:default
namespace:kube-system
В пространстве имен «qa» все сервисные аккаунты:
subjects:
- kind:Group
name:system:serviceaccounts:qa
apiGroup:rbac.authorization.k8s.io
Все сервисные аккаунты:
subjects:
- kind:Group
name:system:serviceaccounts
apiGroup:rbac.authorization.k8s.io
Все авторизованные пользователи (версия 1.5+):
subjects:
- kind:Group
name:system:authenticated
apiGroup:rbac.authorization.k8s.io
Все неаутентифицированные пользователи (версия 1.5+):
subjects:
- kind:Group
name:system:unauthenticated
apiGroup:rbac.authorization.k8s.io
Все пользователи (версия 1.5+):
subjects:
- kind:Group
name:system:authenticated
apiGroup:rbac.authorization.k8s.io
- kind:Group
name:system:unauthenticated
apiGroup:rbac.authorization.k8s.io
2, инструменты командной строки
Kubernetes может выполнять привязку ролей с помощью командных инструментов.
2.1 kubectl create rolebinding
Привязка роли в указанном пространстве имен:
1) В пространстве имен «acme» назначьте кластерную роль «admin» пользователю «bob»:
$ kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme
2) В пространстве имен «acme» назначьте кластерную роль «admin» учетной записи службы «acme:myapp»:
$ kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme
2.2 kubectl create clusterrolebinding
Привязка ролей в кластере:
1) Во всем кластере назначьте роль кластера «cluster-admin» пользователю «root»:
$ kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root
2) Во всем кластере назначьте роль кластера «system:node» пользователю «kubelet»:
$ kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet
3) Во всем кластере предоставьте роль кластера «просмотр» учетной записи службы «acme:myapp»:
$ kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp
3, разрешения сервисного аккаунта
По умолчанию политика RBAC предоставляет разрешения для компонентов панели мониторинга, узлов и контроллеров, но не предоставляет доступ к учетным записям служб за пределами пространства имен «kube-system». Это позволяет администраторам назначать определенные роли сервисным учетным записям по мере необходимости.
Методы от самого безопасного к наименее безопасному следующие:
1) для предоставления ролей учетной записи службы для данного приложения(Лучшие практики)
Для этого необходимо, чтобы имя serviveAccountName было указано в спецификации Pod и чтобы учетная запись службы была создана (через API, kubectl create serviceaccount и т. д.). Например, в пространстве имен «my-namespace» предоставьте служебной учетной записи «my-sa» роль кластера «просмотр»:
kubectl create rolebinding my-sa-view \
--clusterrole=view \
--serviceaccount=my-namespace:my-sa \
--namespace=my-namespace
2) предоставляется в пространстве имен"Посмотреть"Кластерные роли дают"По умолчанию"сервисный аккаунт
Если приложение не указывает serviceAccountName, оно будет использовать учетную запись службы «по умолчанию». Например, в пространстве имен «my-namespace» предоставьте учетной записи службы «по умолчанию» роль кластера «просмотр»:
kubectl create rolebinding default-view \
--clusterrole=view \
--serviceaccount=my-namespace:default \
--namespace=my-namespace
В настоящее время в пространстве имен «kube-system» многие плагины работают как учетная запись службы «по умолчанию». Чтобы разрешить суперпользователю доступ к этим подключаемым модулям, предоставьте роль «cluster-admin» учетной записи «default» в пространстве имен «kube-system».
$ kubectl create clusterrolebinding add-on-cluster-admin \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:default
3) в пространстве имен предоставьте роли всем учетным записям служб:
Если вы хотите, чтобы все приложения в пространстве имен имели роль, независимо от используемой ими учетной записи службы, вы можете предоставить роли группам учетных записей служб. Например, в пространстве имен «my-namespace» предоставьте роль кластера «view» группе «system:serviceaccounts:my-namespace»:
$ kubectl create rolebinding serviceaccounts-view \
--clusterrole=view \
--group=system:serviceaccounts:my-namespace \
--namespace=my-namespace
4), чтобы предоставить роль всем учетным записям служб в кластере. (Не рекомендуется)
Если вы не хотите управлять разрешениями для каждого пространства имен, вы можете разрешить доступ ко всему кластеру. Например, на уровне всего кластера предоставьте роль кластера «просмотр» для «sytem:serviceaccounts»:
$ kubectl create clusterrolebinding serviceaccounts-view \
--clusterrole=view \
--group=system:serviceaccounts
5), чтобы предоставить доступ суперпользователя ко всем учетным записям служб в кластере. (настоятельно не рекомендуется)
Если права доступа менее важны, вы можете предоставить доступ суперпользователя ко всем учетным записям служб.
$ kubectl create clusterrolebinding serviceaccounts-cluster-admin \
--clusterrole=cluster-admin \
--group=system:serviceaccounts
4, свободныйRBACразрешение
Следующая политика позволяет всем учетным записям служб действовать в качестве администраторов кластера. Приложения, работающие в контейнерах, автоматически получают учетные данные служебной учетной записи и выполняют все действия API. Это включает в себя просмотр словаря конфиденциальности и изменение разрешений, которые не являются рекомендуемыми политиками доступа.
$ kubectl create clusterrolebinding permissive-binding \
--clusterrole=cluster-admin \
--user=admin \
--user=kubelet \
--group=system:serviceaccounts
использованная литература
1. Адрес «Обзор авторизации»:Это специально.IO/docs/admin/…
2. Адрес «Использование авторизации RBAC»: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
Об авторе:
Цзи Сянъюань, менеджер по продукции компании Beijing Shenzhou Aerospace Software Technology Co., Ltd. Авторские права на эту статью принадлежат оригинальному автору.