Files
kuboard-press/learning/k8s-advanced/sec/rbac/sa.md
huanqing.shao 522f824969 permissive
2019-12-25 22:38:58 +08:00

98 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 175
layout: LearningLayout
description: Kubernetes教程_Role-based_access_control_(RBAC)基于角色的访问控制_是Kubernetes中支持的一种授权方式。使用rbac.authorization.k8s.io_API来驱动授权决策_允许管理员通过该API动态配置授权策略。
meta:
- name: keywords
content: Kubernetes 教程,Kubernetes 授权,Kubernetes RBAC,Kubernetes权限,Service Account Permissions
---
# RBAC Service Account Permissions
<AdSenseTitle/>
> 参考文档:[Using RBAC Authorization](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
默认的 RBAC 策略为 control-plane 组件、节点还有控制器授予对应范围内的权限,但是并不为 `kube-system` 名称空间之外的 Service Account 授予任何权限(除了所有已认证用户都被授予的 discovery 权限)。
用户可以按照需要为特定的 service account 指定特定的角色。细粒度的角色绑定方式可以提高整体的安全性,但是带来了更多的管理负担。粗粒度的授权策略可能为 service account 授予了额外的不需要的 API 访问权限(存在越权的风险),但是更容易管理。
从最高的安全到最低的安全性,本文罗列了为 Service Account 授权的如下五种方式:
* 为每个应用程序的 Service Account 绑定一个角色(最佳实践)
要求应用程序在其 podSpec 中指定 `serviceAccountName`,并未为其创建对应的 Service Account通过 API、yaml 文件、`kubectl create serviceaccount` 等)
例如,授予名称空间 “my-namespace” 中名为 “my-sa” 的 Service Account 只读权限:
``` sh
kubectl create rolebinding my-sa-view \
--clusterrole=view \
--serviceaccount=my-namespace:my-sa \
--namespace=my-namespace
```
* 为名称空间中的 “default” Service Account 绑定一个角色
如果应用程序不指定 `serviceAccountName`,将使用 “default” Service Account。
::: tip 注意
“default” Service Account 中的权限将被应用到同名称空间中所有不指定 `serviceAccountName` 的 Pod 中。
:::
例如,为名称空间 “my-namespace” 中的 “default” Service Account 收取 只读权限:
``` sh
kubectl create rolebinding default-view \
--clusterrole=view \
--serviceaccount=my-namespace:default \
--namespace=my-namespace
```
许多 [add-on](https://kubernetes.io/docs/concepts/cluster-administration/addons/) 当前都在`kube-system` 名称空间中运行并使用该名称空间中的 “default” Service Account。为 `kube-system` 名称空间中的 “default” Service Account 授予 cluster-admin 权限,将使这些 add-on 获得超级用户的访问权限。
``` sh
kubectl create clusterrolebinding add-on-cluster-admin \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:default
```
* 为名称空间中的所有 Service Account 绑定一个角色
如果想要让某个名称空间中所有的应用程序都共有一个角色无论应用程序使用哪个Service Account可以为名称空间中的 Service Account Group 授予角色。
例如,为名称空间 “my-namespace” 中所有的 Service Account 授予同名称空间下的只读权限:
``` sh
kubectl create rolebinding serviceaccounts-view \
--clusterrole=view \
--group=system:serviceaccounts:my-namespace \
--namespace=my-namespace
```
* 为集群内所有的 Service Account 绑定一个有限权限的角色(不推荐)
如果不想按名称空间管理权限,可以在集群级别为所有 Service Account 授予一个角色。
例如,为集群内所有的 Service Account 授予针对所有名称空间的只读权限:
``` sh
kubectl create clusterrolebinding serviceaccounts-view \
--clusterrole=view \
--group=system:serviceaccounts
```
* 为集群内所有的 Service Account 绑定一个超级用户的角色(强烈不推荐)
如果您完全不想考虑划分权限的事情,可以为所有的 Service Account 授予超级用户的访问权限。
::: danger 警告
这将允许任何用户读取 secret 或创建以超级用户身份运行的 Pod。
:::
``` sh
kubectl create clusterrolebinding serviceaccounts-cluster-admin \
--clusterrole=cluster-admin \
--group=system:serviceaccounts
```