在云原生的世界里,Kubernetes 已经成为了编排和管理容器化应用的事实标准。但随着其广泛应用,安全问题也日益凸显。Kubernetes 的安全基础主要涉及认证、授权与准入控制这三个关键方面。这就好比一座城堡,认证是检查谁可以进入城堡的门卫,授权是决定进入城堡的人可以做什么的规则制定者,而准入控制则是在人们进入城堡时进行最后检查的关卡。接下来,我们就详细了解一下这三个方面。
核心技术点:Kubernetes认证、授权机制
认证机制
认证是 Kubernetes 安全体系的第一道防线,它的主要作用是确认访问 Kubernetes API 服务器的用户或者客户端的身份。就像你去银行办理业务,银行工作人员需要查看你的身份证来确认你是谁一样。
Kubernetes 支持多种认证方式:
- X.509 客户端证书认证:这是一种基于公钥基础设施(PKI)的认证方式。客户端使用经过 CA(证书颁发机构)签名的 X.509 证书来证明自己的身份。Kubernetes API 服务器会验证证书的有效性以及证书中的信息,比如用户名、组等。例如,在一个企业内部的 Kubernetes 集群中,开发团队的成员可以使用由企业内部 CA 颁发的 X.509 证书来访问集群。这样,API 服务器就能够根据证书中的信息确认访问者的身份。
- 静态令牌文件认证:通过一个包含令牌和用户名映射的文件来进行认证。当客户端携带令牌访问 API 服务器时,服务器会在该文件中查找对应的用户名和组信息。这种方式适用于一些自动化脚本或者第三方工具访问集群的场景。比如,一个 CI/CD 流水线需要定期访问 Kubernetes 集群来部署应用,就可以使用静态令牌文件认证方式。
- 服务账户令牌认证:服务账户是 Kubernetes 为 Pod 内的应用提供的身份。每个 Pod 都可以关联一个服务账户,当 Pod 中的应用与 API 服务器进行通信时,会使用与该服务账户关联的令牌。例如,一个运行在 Kubernetes 集群中的微服务应用,通过服务账户令牌向 API 服务器查询其他服务的信息。
授权机制
授权是在认证通过之后,决定用户或者客户端是否有权限执行特定操作的过程。就像你进入银行后,银行会根据你的身份和权限决定你是否可以办理某些业务。
Kubernetes 主要使用基于角色的访问控制(RBAC)来进行授权:
- 角色与集群角色:角色定义了在一个命名空间内的一组权限,而集群角色则定义了集群范围内的一组权限。例如,一个名为 “pod - reader” 的角色可以定义为只允许读取命名空间内的 Pod 信息。而一个 “cluster - admin” 的集群角色则可以拥有对整个集群的所有资源的管理权限。
- 角色绑定与集群角色绑定:角色绑定将角色与用户、组或者服务账户关联起来,使得这些主体具有角色所定义的权限。集群角色绑定则是将集群角色与主体关联起来。比如,将 “pod - reader” 角色绑定到开发团队的某个用户,那么该用户在对应的命名空间内就只有读取 Pod 信息的权限。
核心技术点:准入控制器配置
准入控制器是 Kubernetes API 服务器的插件,它在请求被授权之后、对象被持久化之前对请求进行拦截和处理。可以把它想象成银行的业务审核人员,在你提交业务申请后,在正式办理业务之前,会对你的申请进行最后的审核。
准入控制器的类型
- 验证准入控制器:主要用于验证请求是否符合特定的规则。例如,一个验证准入控制器可以规定 Pod 必须包含特定的标签才能被创建。如果一个用户提交了一个没有该标签的 Pod 创建请求,验证准入控制器会拒绝该请求。
- 变更准入控制器:可以对请求进行修改,以确保请求符合某个策略。比如,一个变更准入控制器可以在创建 Pod 时自动为其添加一些默认的标签或者注解。
配置准入控制器
配置准入控制器需要修改 API 服务器的启动参数。在启动 API 服务器时,通过 “–enable - admission - plugins” 参数指定要启用的准入控制器列表。例如:
kube - apiserver --enable - admission - plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook在这个例子中,启用了多个准入控制器,包括命名空间生命周期管理、资源配额限制、服务账户管理等。
实操模块:Kubernetes认证、授权及准入控制配置示例
认证配置示例
以下是一个使用 X.509 客户端证书认证的示例:
- 生成 CA 证书和密钥:
openssl genrsa -out ca.key2048openssl req -x509 -new -nodes -key ca.key -subj"/CN=KUBERNETES-CA"-days365-out ca.crt这里使用 OpenSSL 工具生成了一个 CA 私钥(ca.key)和一个自签名的 CA 证书(ca.crt)。
2.生成客户端证书和密钥:
openssl genrsa -out client.key2048openssl req -new -key client.key -subj"/CN=client"-out client.csr openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days365生成了客户端的私钥(client.key)、证书签名请求(client.csr)和经过 CA 签名的客户端证书(client.crt)。
3.配置 kubectl 使用客户端证书:
kubectl configset- clusters.my - cluster --certificate -authority=ca.crt --server=https://<API_SERVER_IP>:<PORT>kubectl configset- credentials.my - user --client -certificate=client.crt --client -key=client.key kubectl configset- contexts.my - context --cluster=my - cluster --user=my - user kubectl config use - context my - context通过这些命令,配置了 kubectl 使用生成的客户端证书来访问 Kubernetes API 服务器。
授权配置示例
以下是一个使用 RBAC 进行授权的示例:
- 创建角色:
apiVersion:rbac.authorization.k8s.io/v1kind:Rolemetadata:namespace:defaultname:pod-readerrules:-apiGroups:[""]resources:["pods"]verbs:["get","watch","list"]这个 YAML 文件定义了一个名为 “pod - reader” 的角色,该角色在 “default” 命名空间内具有读取 Pod 信息的权限。
2.创建角色绑定:
apiVersion:rbac.authorization.k8s.io/v1kind:RoleBindingmetadata:name:read-podsnamespace:defaultsubjects:-kind:Username:janeapiGroup:rbac.authorization.k8s.ioroleRef:kind:Rolename:pod-readerapiGroup:rbac.authorization.k8s.io这个 YAML 文件将 “pod - reader” 角色绑定到用户 “jane”,使得 “jane” 在 “default” 命名空间内具有读取 Pod 信息的权限。
准入控制配置示例
假设我们要启用 “LimitRanger” 准入控制器:
- 修改 API 服务器启动参数:
在 API 服务器的启动命令中添加 “–enable - admission - plugins=LimitRanger”。例如,如果你使用的是 systemd 管理 API 服务器,可以编辑/etc/systemd/system/kube - apiserver.service文件:
[Service] ExecStart=/usr/local/bin/kube - apiserver \ --enable - admission - plugins=LimitRanger \ ...然后重新加载 systemd 配置并重启 API 服务器:
systemctl daemon - reload systemctl restart kube - apiserver- 创建 LimitRange 对象:
apiVersion:v1kind:LimitRangemetadata:name:mem-cpu-limit-rangespec:limits:-default:memory:512Micpu:500mdefaultRequest:memory:256Micpu:250mtype:Container这个 YAML 文件定义了一个 LimitRange 对象,规定了容器的默认资源请求和限制。
解决的问题:认证失败、授权错误等安全问题
认证失败问题
如果出现认证失败的问题,可能有以下几种原因和解决方法:
- 证书过期:检查客户端证书的有效期,如果证书过期,需要重新生成证书。可以使用前面提到的 OpenSSL 命令重新生成证书。
- 证书签名问题:确保客户端证书是由 API 服务器信任的 CA 签名的。可以检查 CA 证书和客户端证书的信息,确保签名链的正确性。
- 令牌错误:如果使用静态令牌文件或者服务账户令牌,检查令牌是否正确,是否被篡改或者过期。
授权错误问题
授权错误可能是由于角色和角色绑定配置不正确导致的:
- 角色定义错误:检查角色的规则是否正确,是否包含了所需的资源和操作权限。例如,如果一个用户需要创建 Pod,那么角色的规则中应该包含 “create” 动词。
- 角色绑定错误:检查角色绑定是否将正确的角色与正确的主体(用户、组或服务账户)关联起来。可以使用
kubectl get rolebindings和kubectl get clusterrolebindings命令查看角色绑定的信息。
读者收益与后续内容衔接
通过学习本节内容,你已经能够为 Kubernetes 集群配置基本的安全防护机制,包括认证、授权和准入控制。掌握了这些内容后,你可以解决常见的认证失败、授权错误等安全问题,为 Kubernetes 集群的安全运行提供保障。
下一节我们将深入学习云原生安全中的网络安全防护策略,进一步完善对本章云原生安全实践主题的认知。通过后续的学习,你将能够构建更加全面的云原生安全防护体系。 —
🍃 系列专栏导航
- 🔖 《深入浅出云原生》
- 🍃 博客概览:《程序员技术成长导航,专栏汇总》