SubjectAccessReview
apiVersion: authorization.k8s.io/v1
import "k8s.io/api/authorization/v1"
SubjectAccessReview
SubjectAccessReview 检查用户或组是否可以执行某操作。
apiVersion: authorization.k8s.io/v1
kind: SubjectAccessReview
metadata (ObjectMeta)
标准的列表元数据。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec (SubjectAccessReviewSpec),必需
spec 包含有关正在评估的请求的信息。
status (SubjectAccessReviewStatus)
status 由服务器填写,表示请求是否被允许。
SubjectAccessReviewSpec
SubjectAccessReviewSpec 是访问请求的描述。 resourceAuthorizationAttributes 和 nonResourceAuthorizationAttributes 二者必须设置其一,并且只能设置其一。
extra (map[string][]string)
extra 对应于来自鉴权器的 user.Info.GetExtra() 方法。 由于这是针对 Authorizer 的输入,所以它需要在此处反映。
groups ([]string)
原子:将在合并期间被替换
groups 是你正在测试的组。
nonResourceAttributes (NonResourceAttributes)
nonResourceAttributes 描述非资源访问请求的信息。
nonResourceAttributes 包括提供给 Authorizer 接口进行非资源请求鉴权时所用的属性。
nonResourceAttributes.path (string)
path 是请求的 URL 路径。
nonResourceAttributes.verb (string)
verb 是标准的 HTTP 动作。
resourceAttributes (ResourceAttributes)
resourceAuthorizationAttributes 描述资源访问请求的信息。
resourceAttributes 包括提供给 Authorizer 接口进行资源请求鉴权时所用的属性。
resourceAttributes.fieldSelector (FieldSelectorAttributes)
fieldSelector 描述基于字段的访问限制。此字段只能限制访问权限,而不能扩大访问权限。
此字段处于 Alpha 级别。要使用此字段,你必须启用
AuthorizeWithSelectors
特性门控(默认禁用)。FieldSelectorAttributes 表示一个限制访问的字段。建议 Webhook 的开发者们:
- 确保 rawSelector 和 requirements 未被同时设置
- 如果设置,则考虑 requirements 字段
- 如果设置,不要尝试解析或考虑 rawSelector 字段。
这是为了避免出现另一个 CVE-2022-2880(即我们不希望不同系统以一致的方式解析某个查询), 有关细节参见 https://www.oxeye.io/resources/golang-parameter-smuggling-attack 对于 kube-apiserver 的 SubjectAccessReview 端点:
- 如果 rawSelector 为空且 requirements 为空,则请求未被限制。
- 如果 rawSelector 存在且 requirements 为空,则 rawSelector 将被解析,并在解析成功的情况下进行限制。
- 如果 rawSelector 为空且 requirements 存在,则应优先使用 requirements。
- 如果 rawSelector 存在,requirements 也存在,则请求无效。
resourceAttributes.fieldSelector.rawSelector (string)
rawSelector 是字段选择算符的序列化形式,将被包含在查询参数中。 建议 Webhook 实现忽略 rawSelector。只要 requirements 不存在, kube-apiserver 的 SubjectAccessReview 将解析 rawSelector。
resourceAttributes.fieldSelector.requirements ([]FieldSelectorRequirement)
原子:将在合并期间被替换
requirements 是字段选择算符已解析的解释。资源实例必须满足所有 requirements 才能匹配此选择算符。 Webhook 实现应处理 requirements,但如何处理由 Webhook 自行决定。 由于 requirements 只能限制请求,因此如果不理解 requirements,可以安全地将请求鉴权为无限制请求。
FieldSelectorRequirement 是一个选择算符,包含值、键以及与将键和值关联起来的运算符。
resourceAttributes.fieldSelector.requirements.key (string),必需
key 是 requirements 应用到的字段选择算符键。
resourceAttributes.fieldSelector.requirements.operator (string),必需
operator 表示键与一组值之间的关系。有效的运算符有 In、NotIn、Exists、DoesNotExist。 运算符列表可能会在未来增加。
resourceAttributes.fieldSelector.requirements.values([]string)
原子:将在合并期间被替换
values 是一个字符串值的数组。如果运算符是 In 或 NotIn,则 values 数组必须非空。 如果运算符是 Exists 或 DoesNotExist,则 values 数组必须为空。
resourceAttributes.group (string)
group 是资源的 API 组。 "*" 表示所有资源。
resourceAttributes.labelSelector (LabelSelectorAttributes)
labelSelector 描述基于标签的访问限制。此字段只能限制访问权限,而不能扩大访问权限。
此字段处于 Alpha 级别。要使用此字段,你必须启用
AuthorizeWithSelectors
特性门控(默认禁用)。LabelSelectorAttributes 表示通过标签限制的访问。建议 Webhook 开发者们:
- 确保 rawSelector 和 requirements 未被同时设置
- 如果设置,则考虑 requirements 字段
- 如果设置,不要尝试解析或考虑 rawSelector 字段。
这是为了避免出现另一个 CVE-2022-2880(即让不同系统以一致的方式解析为何某个查询不是我们想要的), 有关细节参见 https://www.oxeye.io/resources/golang-parameter-smuggling-attack 对于 kube-apiserver 的 SubjectAccessReview 端点:
- 如果 rawSelector 为空且 requirements 为空,则请求未被限制。
- 如果 rawSelector 存在且 requirements 为空,则 rawSelector 将被解析,并在解析成功的情况下进行限制。
- 如果 rawSelector 为空且 requirements 存在,则应优先使用 requirements。
- 如果 rawSelector 存在,requirements 也存在,则请求无效。
resourceAttributes.labelSelector.rawSelector (string)
rawSelector 是字段选择算符的序列化形式,将被包含在查询参数中。 建议 Webhook 实现忽略 rawSelector。只要 requirements 不存在, kube-apiserver 的 SubjectAccessReview 将解析 rawSelector。
resourceAttributes.labelSelector.requirements ([]LabelSelectorRequirement)
原子:将在合并期间被替换
requirements 是字段选择算符已解析的解释。资源实例必须满足所有 requirements,才能匹配此选择算符。 Webhook 实现应处理 requirements,但如何处理由 Webhook 自行决定。 由于 requirements 只能限制请求,因此如果不理解 requirements,可以安全地将请求鉴权为无限制请求。
FieldSelectorRequirement 是一个选择算符,包含值、键以及将键和值关联起来的运算符。
resourceAttributes.labelSelector.requirements.key (string),必需
key 是选择算符应用到的标签键。
resourceAttributes.labelSelector.requirements.operator (string),必需
operator 表示键与一组值之间的关系。有效的运算符有 In、NotIn、Exists、DoesNotExist。
resourceAttributes.labelSelector.requirements.values ([]string)
原子:将在合并期间被替换
values 是一个字符串值的数组。如果运算符是 In 或 NotIn,则 values 数组必须非空。 如果运算符是 Exists 或 DoesNotExist,则 values 数组必须为空。 此数组在策略性合并补丁(Strategic Merge Patch)期间被替换。
resourceAttributes.name (string)
name 是 "get" 正在请求或 "delete" 已删除的资源。 ""(空字符串)表示所有资源。
resourceAttributes.namespace (string)
namespace 是正在请求的操作的命名空间。 目前,无命名空间和所有命名空间之间没有区别。 对于 LocalSubjectAccessReviews,默认为 ""(空字符串)。 对于集群范围的资源,默认为 ""(空字符串)。 对于来自 SubjectAccessReview 或 SelfSubjectAccessReview 的命名空间范围的资源, ""(空字符串)表示 "all"(所有资源)。
resourceAttributes.resource (string)
resource 是现有的资源类别之一。 "*" 表示所有资源类别。
resourceAttributes.subresource (string)
subresource 是现有的资源类别之一。 "" 表示无子资源。
resourceAttributes.verb (string)
verb 是 kubernetes 资源的 API 动作,例如 get、list、watch、create、update、delete、proxy。 "*" 表示所有动作。
resourceAttributes.version (string)
version 是资源的 API 版本。 "*" 表示所有版本。
uid (string)
有关正在请求的用户的 UID 信息。
user (string)
user 是你正在测试的用户。 如果你指定 “user” 而不是 “groups”,它将被解读为“如果 user 不是任何组的成员,将会怎样”。
SubjectAccessReviewStatus
SubjectAccessReviewStatus
allowed (boolean),必需
allowed 是必需的。 如果允许该操作,则为 true,否则为 false。
denied (boolean)
denied 是可选的。 如果拒绝该操作,则为 true,否则为 false。 如果 allowed 和 denied 均为 false,则 Authorizer 对是否鉴权操作没有意见。 如果 allowed 为 true,则 denied 不能为 true。
evaluationError (string)
evaluationError 表示鉴权检查期间发生一些错误。 出现错误的情况下完全有可能继续确定鉴权状态。 例如,RBAC 可能缺少一个角色,但仍存在足够多的角色进行绑定,进而了解请求有关的原因。
reason (string)
reason 是可选的。 它表示为什么允许或拒绝请求。
操作
create
创建 SubjectAccessReview
HTTP 请求
POST /apis/authorization.k8s.io/v1/subjectaccessreviews
参数
body: SubjectAccessReview,必需
dryRun (查询参数): string
fieldManager (查询参数): string
fieldValidation (查询参数): string
pretty (查询参数): string
响应
200 (SubjectAccessReview): OK
201 (SubjectAccessReview): Created
202 (SubjectAccessReview): Accepted
401: Unauthorized