IBM Developer 博客

通过 IBM Developer 关注最新动态并获取信息

Kubernetes 在开发者和管理员中很受欢迎,人们都非常熟悉部署、扩展和管理容器化应用程序这些概念。而在讨论生产部署时,对生产部署至关重要的一个 Kubernetes 领域就是安全性。了解平台如何管理用户和应用程序的身份验证和授权十分重要。

如果您的 Kubernetes 集群包含敏感信息,例如银行账户明细、病历或任何机密信息,应利用 Kubernetes 提供的所有安全预防措施。此外,您还可以使用大量非 Kubernetes 特定的安全工具和方法来添加额外的安全层。

Kubernetes 重要的安全组件

Kubernetes API 服务器 (kube-apiserver) 是接收所有传入请求的组件。传入的请求经过处理以修改集群的状态。Kubernetes 中的所有请求都源自:

  • 外部用户
  • 服务帐户
  • Kubernetes 组件

在访问 kube-apiserver 之前,有一些安全组件可帮助您为应用程序引入安全措施。以下是可帮助您保护 Kubernetes 应用程序的组件:

  • 身份验证
  • 授权
  • 准入控制器

图 1 展示了 Kubernetes 工作流程图。在请求流经身份验证模块、授权模块和准入控制器后,将处理该请求。

图 1:Kubernetes 工作流程

Kubernetes 工作流程的流程图

身份验证模块

如果请求的来源未知,Kubernetes 会将其视为匿名请求。根据组件的配置,身份验证模块可能会允许或丢弃匿名请求。以下是一些最常用的身份验证策略:

  • 客户端证书
    认证中心可帮助创建 X509 证书,从而帮助验证客户端证书。

  • 静态令牌
    API 服务器使用静态文件读取不记名令牌。令牌文件是逗号分隔的文件,其中包含 secretuseruidgroup1group2

  • 基本身份验证
    Kubernetes 还支持基本身份验证。身份验证凭证以 passworduseruidgroup1group2 形式存储在 CSV 文件中。

  • 服务帐户令牌
    服务帐户由 kube-apiserver 创建,并且与 pod 关联。它用于验证签名的不记名令牌。

  • Webhook 令牌
    Kubernetes 在集群外部调用 REST API,以确定用户的身份。

了解有关 Kubernetes 身份验证的更多信息。

授权模块

一旦身份验证模块标识了请求的来源,主动授权模块就会根据用户的授权策略来评估请求的属性,以允许或拒绝该请求。每个请求都按顺序流经授权模块,如果任何模块提供允许或拒绝请求的决定,那么会自动接受或拒绝该请求。以下是一些常用的授权策略:

  • 请求属性
    授权模块将解析请求中的一组属性,以确定应解析、允许还是拒绝该请求。

  • 节点
    节点授权模式向 kubelets 授予访问服务、端点、节点、pod、密钥和节点持久卷的权限。

  • 基于属性的访问控制 (ABAC)
    使用 ABAC,可以通过根据请求的属性验证策略来允许请求。

  • 基于角色的访问控制 (RBAC)
    通过 RBAC,使用分配给各个用户的角色来管理对资源的访问。

  • Webhook
    与用于身份验证的 Webhook 模式类似,用于授权的 Webhook 模式使用远程 API 服务器来检查用户权限。

了解有关 Kubernetes 授权的更多信息。

准入控制器

准入控制器是在对请求进行身份验证和授权后,用于拦截对 API 服务器的请求的模块。在修改集群中对象的状态之前,控制器会验证和更改请求。控制器可以同时进行更改和验证。如果任何一个控制器拒绝请求,就会立即丢弃该请求,并且向用户返回错误,以便不处理该请求。您可以使用 --enable-admission-plugins 标志启用准入控制器。重要的准入控制器包括:

  • AlwaysAdmit
  • AlwaysPullImages
  • EventRateLimit
  • LimitRanger
  • NodeRestriction
  • PersistentVolumeClaimResize
  • PodSecurityPolicy
  • SecurityContextDeny
  • ServiceAccount

了解有关 Kubernetes 准入控制器的更多信息。

保护容器镜像

您应该安排定期扫描容器镜像。容器镜像扫描工具(例如 PortierisGrafeas)可检查镜像中包含的软件包,并帮助报告这些软件包中包含的任何已知漏洞。当您确定容器镜像包含带有漏洞的软件包时,应更新容器,以使其使用该软件包的固定版本。

最佳做法是不要通过 SSH 连接到正在运行的容器。如果纳入了 Kubernetes 的自我修复特性(可确保将发生故障的容器替换为新容器)和自动缩放功能(可自动创建和销毁容器),那么就无法手动执行修补过程。

CI/CD 最佳实践

可以将镜像扫描集成到持续集成和持续交付 (CI/CD) 流水线中。遵循一些最佳实践:

  • 扫描失败会导致构建失败。
  • 部署前扫描失败可能会使镜像无法部署。
  • 对已在生产中的镜像扫描失败可能会导致出现警报,从而使操作员能够采取补救措施。

有关 RBAC 的更多信息

基于角色的访问控制 (RBAC) 是一种向用户授予特定资源访问权的安全方法。以下是 RBAC 的大致步骤:

  1. 创建客户端证书。
  2. 创建用户。
  3. 向用户授予访问权。
    • 创建 Role
    • 创建 RoleBinding,其中 Role 将绑定到主题(此例中为用户)。
  4. 测试访问权。

RoleRoleBinding 的作用域为名称空间。如果要将 Role 分配给多个名称空间,那么使用 ClusterRoleClusterRoleBinding。以下是针对 RBAC 可参考的一些命令。

创建客户端证书

  1. 使用 OpenSSL 生成密钥:

     openssl genrsa -out <user.key> 2048
    
  2. 生成证书签署请求 (CSR):

     openssl req -new -key <user.key> -out <user.csr> -subj <subject>
    
  3. 生成证书:

     openssl x509 -req -in <user.csr> -CA <ca.crt> -CAkey <ca.key> -CAcreateserial -out <user.crt> -days <number of days>
    

创建用户

kubeconfig 中设置用户条目:

  kubectl config set-credentials <user> --client-certificate=<user.crt> --client-key=<user.key>
  kubectl config set-context user-context --cluster=<cluster name> --user=user
  kubectl config view
  kubectl config use-context <user context>

向用户授予访问权

创建 RoleRoleBinding YAML 文件,以将 read-pods 的操作分配给 <user>

  kubectl apply -f role.yaml
  kubectl apply -f role-binding.yaml

基本上,命令 kubectl get pods 应访存这些结果。

测试访问权

将上下文切换到用户上下文:

  kubectl config use-context <user context>

这应该会生成输出:

  kubectl get pods

注意:上述命令仅供参考。

结束语

本文描述了始终应考虑的一些 Kubernetes 重要安全组件。在实现应用程序现代化时,应优先考虑安全性。通过观看使用 RBAC、IAM、NetworkPolicy 和 PSP 确保多租户 Kubernetes 的安全性视频会议,可了解有关 Kubernetes 安全概念的更多信息。

本文翻译自:Basics of Kubernetes security(2020-11-19)