SelfSubjectAccessReview
apiVersion: authorization.k8s.io/v1
import "k8s.io/api/authorization/v1"
SelfSubjectAccessReview
SelfSubjectAccessReview 检查当前用户是否可以执行某操作。
不填写 spec.namespace 表示“在所有命名空间中”。
Self 是一个特殊情况,因为用户应始终能够检查自己是否可以执行某操作。
apiVersion: authorization.k8s.io/v1
kind: SelfSubjectAccessReview
metadata (ObjectMeta)
metadata是标准的列表元数据。更多信息: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadataspec (SelfSubjectAccessReviewSpec),必需
spec包含有关正在评估的请求的信息。user和group必须为空。status (SubjectAccessReviewStatus)
status由服务器填写,表示请求是否被允许。
SelfSubjectAccessReviewSpec
SelfSubjectAccessReviewSpec 是访问请求的描述。
resourceAttributes 和 nonResourceAttributes
二者必须设置其一,并且只能设置其一。
nonResourceAttributes (NonResourceAttributes)
nonResourceAttributes描述非资源访问请求的信息。nonResourceAttributes 包括提供给 Authorizer 接口进行非资源请求鉴权时所用的属性。
nonResourceAttributes.path (string)
path是请求的 URL 路径。nonResourceAttributes.verb (string)
verb是标准的 HTTP 动作。
resourceAttributes (ResourceAttributes)
resourceAttributes描述资源访问请求的信息。resourceAttributes 包括提供给 Authorizer 接口进行资源请求鉴权时所用的属性。
resourceAttributes.fieldSelector (FieldSelectorAttributes)
fieldSelector描述基于字段的访问限制。此字段只能限制访问权限,而不能扩大访问权限。FieldSelectorAttributes 表示一个限制访问的字段。建议 Webhook 的开发者们:
- 确保
rawSelector和requirements未被同时设置。 - 如果设置了
fieldSelector,则考虑requirements字段。 - 如果设置了
fieldSelector,不要尝试解析或考虑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描述基于标签的访问限制。此字段只能限制访问权限,而不能扩大访问权限。LabelSelectorAttributes 表示通过标签限制的访问。建议 Webhook 开发者们:
- 确保
rawSelector和requirements未被同时设置。 - 如果设置了
labelSelector,则考虑requirements字段。 - 如果设置了
labelSelector,不要尝试解析或考虑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 版本。"*" 表示所有版本。
操作
create 创建 SelfSubjectAccessReview
HTTP 请求
POST /apis/authorization.k8s.io/v1/selfsubjectaccessreviews
参数
body: SelfSubjectAccessReview,必需
dryRun (查询参数): string
fieldManager (查询参数): string
fieldValidation (查询参数): string
pretty (查询参数): string
响应
200 (SelfSubjectAccessReview): OK
201 (SelfSubjectAccessReview): Created
202 (SelfSubjectAccessReview): Accepted
401: Unauthorized