Kubernetes教程

Kubernetes API访问控制

Kubernetes API访问控制是其安全性的重要组成部分,它确保了对Kubernetes的各种客户端进行认证和鉴权操作。API请求访问的安全性对于这样的系统来说是非常重要的考虑因素,如果不对请求加以限制,那么可能会导致请求被滥用,甚至受到黑客的攻击。

用户可以使用 kubectl、客户端库或构造 REST 请求来访问 Kubernetes API。人类用户和 Kubernetes 服务账号都可以被鉴权访问 API。当请求到达 API 时,它会经历多个阶段,如下图所示:

Kubernetes API 请求处理步骤示意图

一、传输安全

默认情况下,Kubernetes API服务器在第一个非localhost网络接口的6443端口上进行监听,并受TLS保护。在一个典型的Kubernetes生产集群中,API使用443端口。该端口可以通过--secure-port标志进行更改,而监听IP地址可以通过--bind-address标志进行更改。

API服务器会出示证书。该证书可以使用私有证书颁发机构(CA)签名,也可以基于链接到公认的CA的公钥基础架构签名。该证书和相应的私钥可以通过使用--tls-cert-file和--tls-private-key-file标志进行设置。

如果你的集群使用私有证书颁发机构,你需要在客户端的~/.kube/config文件中提供该CA证书的副本,以便你可以信任该连接并确认该连接没有被拦截。另外,你的客户端可以在此阶段出示TLS客户端证书。

二、认证

如上图步骤 1 所示,建立 TLS 后,HTTP 请求将进入认证(Authentication)步骤。集群创建脚本或者集群管理员配置 API 服务器,使之运行一个或多个身份认证组件。认证步骤的输入整个 HTTP 请求;但是,通常组件只检查头部或/和客户端证书。

认证模块包含:

  • 客户端证书
  • 密码
  • 普通令牌
  • 引导令牌
  • JSON Web 令牌(JWT,用于服务账号)

可以指定多个认证模块,在这种情况下,服务器依次尝试每个验证模块,直到其中一个成功。如果请求认证不通过,服务器将以 HTTP 状态码 401 拒绝该请求。反之,该用户被认证为特定的 username,并且该用户名可用于后续步骤以在其决策中使用。部分验证器还提供用户的组成员身份,其他则不提供。

三、鉴权

如上图的步骤 2 所示,将请求验证为来自特定的用户后,请求必须被鉴权。请求必须包含请求者的用户名、请求的行为以及受该操作影响的对象。 如果现有策略声明用户有权完成请求的操作,那么该请求被鉴权通过。

例如,如果 Bob 有以下策略,那么他只能在 projectCaribou 名称空间中读取 Pod。

{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "bob",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}

如果 Bob 执行以下请求,那么请求会被鉴权,因为允许他读取 projectCaribou 名称空间中的对象。

{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}

如果 Bob 在 projectCaribou 名字空间中请求写(create 或 update)对象如果 Bob 在 projectCaribou 名字空间中请求写(create 或 update)对象,其鉴权请求将被拒绝。如果 Bob 在诸如 projectFish 这类其它名字空间中请求读取(get)对象,其鉴权也会被拒绝。

Kubernetes 鉴权要求使用公共 REST 属性与现有的组织范围或云提供商范围的访问控制系统进行交互。使用 REST 格式很重要,因为这些控制系统可能会与 Kubernetes API 之外的 API 交互。

Kubernetes 支持多种鉴权模块,例如 ABAC 模式、RBAC 模式和 Webhook 模式等。管理员创建集群时,他们配置应在 API 服务器中使用的鉴权模块。如果配置了多个鉴权模块,则 Kubernetes 会检查每个模块,任意一个模块鉴权该请求,请求即可继续;如果所有模块拒绝了该请求,请求将会被拒绝(HTTP 状态码 403)。

四、准入控制

准入控制模块是可以修改或拒绝请求的软件模块, 除鉴权模块可用的属性外,准入控制模块还可以访问正在创建或修改的对象的内容。

准入控制器可以对创建、修改、删除或(通过代理)连接对象的请求进行操作,但不会对仅读取对象的请求起作用。 有多个准入控制器被配置时,服务器将依次调用它们。

如上图的步骤 3 所示,与身份认证和鉴权模块不同,如果任何准入控制器模块拒绝某请求,则该请求将立即被拒绝。除了拒绝对象之外,准入控制器还可以为字段设置复杂的默认值。可用的准入控制模块在准入控制器中进行了描述。请求通过所有准入控制器后,将使用检验例程检查对应的 API 对象,然后将其写入对象存储(如步骤 4 所示)。

五、审计

Kubernetes 审计提供了一套与安全相关的、按时间顺序排列的记录,其中记录了集群中的操作序列。 集群对用户、使用 Kubernetes API 的应用程序以及控制平面本身产生的活动进行审计。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录