Edit This Page

授权概述

了解有关 Kubernetes 授权的更多信息,包括使用支持的授权模块创建策略的详细信息。

在Kubernetes中,您必须在授权(授予访问权限)之前进行身份验证(登录),有关身份验证的信息, 请参阅 访问控制概述.

Kubernetes期望REST API请求中常见的属性。 这意味着Kubernetes授权适用于现有的组织范围或云提供商范围的访问控制系统, 除了Kubernetes API之外,它还可以处理其他API。

确定是允许还是拒绝请求

Kubernetes 使用 API ​​服务器授权 API 请求。它根据所有策略评估所有请求属性来决定允许或拒绝请求。 一个API请求的所有部分必须被某些策略允许才能继续。这意味着默认情况下拒绝权限。

(尽管 Kubernetes 使用 API ​​服务器,但是依赖于特定种类对象的特定字段的访问控制和策略由准入控制器处理。)

配置多个授权模块时,将按顺序检查每个模块。 如果任何授权模块批准或拒绝请求,则立即返回该决定,并且不会与其他授权模块协商。 如果所有模块对请求没有意见,则拒绝该请求。一个拒绝响应返回 HTTP 状态代码 403 。

审查您的请求属性

Kubernetes仅审查以下API请求属性:

确定请求动词

要确定资源API端点的请求谓词,请检查所使用的 HTTP 动词以及请求是否对单个资源或资源集合起作用:

HTTP 动词 request 动词
POST create
GET, HEAD get (单个资源), list (资源集合)
PUT update
PATCH patch
DELETE delete (单个资源), deletecollection (资源集合)

Kubernetes有时使用专门的动词检查授权以获得额外的权限。例如:

授权模块

检查API访问

kubectl提供auth can-i子命令,用于快速查询 API 授权层。 该命令使用SelfSubjectAccessReview API来确定当前用户是否可以执行给定操作,并且无论使用何种授权模式都可以工作。

$ kubectl auth can-i create deployments --namespace dev
yes
$ kubectl auth can-i create deployments --namespace prod
no

管理员可以将此与用户模拟结合使用,以确定其他用户可以执行的操作。

$ kubectl auth can-i list secrets --namespace dev --as dave
no

SelfSubjectAccessReviewauthorization.k8s.io API组的一部分,它将 API 服务器授权公开给外部服务。 该组中的其他资源包括:

可以通过创建普通 Kubernetes 资源来查询这些 API ,其中返回对象的响应“status”字段是查询的结果。

$ kubectl create -f - -o yaml << EOF
apiVersion: authorization.k8s.io/v1
kind: SelfSubjectAccessReview
spec:
  resourceAttributes:
    group: apps
    name: deployments
    verb: create
    namespace: dev
EOF

apiVersion: authorization.k8s.io/v1
kind: SelfSubjectAccessReview
metadata:
  creationTimestamp: null
spec:
  resourceAttributes:
    group: apps
    name: deployments
    namespace: dev
    verb: create
status:
  allowed: true
  denied: false

为您的授权模块使用标志

您必须在策略中包含一个标志,以指明您的策略包含哪个授权模块:

可以使用以下标志:

您可以选择多个授权模块。按顺序检查模块,以便较早的模块具有更高的优先级来允许或拒绝请求。

通过pod创建权限升级

能够在命名空间中创建 pod 的用户可能会升级其在该命名空间内的权限。 他们可以创建在该命名空间内访问其权限的 pod 。 他们可以创建用户无法自己读取 secret 的 pod ,或者在具有不同/更高权限的服务帐户下运行的 pod 。

Caution:

注意: 系统管理员在授予对 pod 创建的访问权限时要小心。 授予在命名空间中创建 pod(或创建pod的控制器)的权限的用户可以: 读取命名空间中的所有秘密;读取命名空间中的所有配置映射; 并模拟命名空间中的任何服务帐户并执行帐户可以执行的任何操作。 无论采用何种授权方式,这都适用。

What's next

Feedback