Kubernetes API 服务器处理来自集群内运行的用户或应用的 REST API 调用,以实现集群管理。考虑到 Kubernetes 控制平面的网关,您可以使用 kubectl、客户端库或通过直接发出 API 请求来访问 API 服务器。管理 Kubernetes API 服务器授权的方法之一是使用 Kubernetes 基于角色的访问权限控制(RBAC)。您也可以使用许可控制器来验证 API 服务器请求。
保护 API 服务器应从控制其访问权限入手。互联网安全中心(CIS)提供了相关的配置最佳实践来强化和保护 API 服务器。
在您的主节点上运行以下命令:
ps -ef | grep kube-apiserver
在输出中,检查并确保:
--anonymous-auth
参数显示为 false
。该设置可确保未被其他身份验证方法拒绝的请求不会被视为匿名请求,因此按照策略将被允许访问。
--basic-auth-file
参数不存在。基本身份验证将使用明文凭据,而不是首选令牌或证书进行身份验证。
--insecure-allow-any-token
参数不存在。该设置将确保只允许使用经过身份验证的安全令牌。
–kubelet-https
参数要么不存在,要么显示为 true
。该配置可确保 API 服务器与 kubelet 之间的连接在传输过程中通过传输层安全性(TLS)而受到保护。
--insecure-bind-address
参数不存在。该配置将防止 API 服务器绑定到不安全的地址,以防在未经身份验证和未加密的情况下访问您的主节点,从而最大限度降低攻击者可能读取传输中的敏感数据的风险。
--insecure-port
参数显示为 0
。该设置将阻止 API 服务器在不安全的端口上提供服务,从而防止对主节点的未经身份验证和未加密的访问,并将攻击者控制集群这一风险降至最低。
--secure-port
参数要么不存在,要么显示为 1 到 65535 之间的一个整数。它的作用是确保您的所有流量都通过 https 提供身份验证和授权。
--profiling
参数显示为 false
。除非您遭遇瓶颈或需要解决某些问题,否则不需要预测功能;而且,该参数的存在还会让您不必要地暴露系统和程序的详细信息。
--repair-malformed-updates
参数显示为 false
。该设置将确保 API 服务器拒绝客户端发出的格式故意错误的请求。
--enable-admission-plugins
参数设置为一个不含 AlwaysAdmit
的值。如果您将此设置配置为 AlwaysAdmit,那么即使请求未得到许可控制器插件的明确允许,它也会承认该请求,这样就会降低插件的有效性。
--enable-admission-plugins
参数设置为一个包含 AlwaysPullImages
的值。该配置可确保用户不能仅通过获知镜像的名称就将镜像从节点提取到任何容器集中。启用该控制后,将始终在启动容器之前提取镜像,而这需要有效的凭据。
--enable-admission-plugins
参数设置为一个包含 SecurityContextDeny
的值。该控制可确保您无法以容器集安全策略中未描述的方式来自定义容器集层面上的安全环境。
--disable-admission-plugins
参数设置为一个不含 NamespaceLifecycle
的值。不要禁用该控制,因为它可以确保不会在不存在的命名空间或已设置为终止的命名空间中创建对象。
--audit-log-path
参数设置为您希望用于存储审计日志的相应路径。对任何可用的 Kubernetes 组件(包括 Kubernetes API 服务器)启用审计始终是一个很好的安全实践。
--audit-log-maxage
参数设置为 30
天,或任何您必须存储审核日志文件以符合内部和外部数据保留策略的天数。
--audit-log-maxbackup
参数设置为 10
,或任何一个可以帮助您满足旧日志文件保留数量合规性要求的数字。
--audit-log-maxsize
参数设置为 100
,或任何一个可以帮助您满足合规性要求的数字。请注意,这里的数字 100 表示 100 MB。
--authorization-mode
参数存在,但不能设置为 AlwaysAllow
。该设置可确保 API 服务器仅允许已得到授权的请求,尤其是在生产集群中。
--token-auth-file
参数不存在。该参数(如果存在)使用基于令牌的静态身份验证,而这种身份验证方式存在几个安全缺陷;请改用其他身份验证方式,例如证书。
--kubelet-certificate-authority
参数存在。当 API 服务器与 kubelet 之间存在连接时,该设置将有助于防止中间人攻击。
--kubelet-client-certificate
和 --kubelet-client-key
参数存在。该配置可确保 API 服务器向 kubelet 的 HTTPS 端点验证自身。(默认情况下,API 服务器不执行这一步骤。)
--service-account-lookup
参数存在,且设置为 true
。该设置旨在防止 etcd 中存在这样的实例:API 服务器仅验证身份验证令牌的有效性,但不确保请求中包含服务帐户令牌。
--enable-admission-plugins
参数设置为一个包含 PodSecurityPolicy
的值。
--service-account-key-file
参数存在,且设置为一个用于签署服务帐户令牌的单独公钥/私钥对。如果您不指定公钥/私钥对,它将使用来自 TLS 服务证书的私钥,这样就会禁止您轮转服务帐户令牌的密钥。
--etcd-certfile
和 --etcd-keyfile
参数存在,以便 API 服务器使用客户端证书和密钥向 etcd 服务器标识自己。请注意,etcd 会存储本质上可能敏感的对象,因此任何客户端连接都必须使用 TLS 加密。
--disable-admission-plugins
参数设置为不含 ServiceAccount
。该配置将确保在创建新容器集时,它不会使用同一命名空间内的默认服务帐户。
--tls-cert-file
和 --tls-private-key-file
参数存在,以确保 API 服务器仅通过 TLS 提供 HTTPS 流量。
--client-ca-file
参数存在,以确保为 Kube 集群部署配置 TLS 和客户端证书身份验证。
--etcd-cafile
参数存在,其设置旨在确保 API 服务器必须通过 SSL 证书颁发机构文件向 etcd 服务器验证自身。
--tls-cipher-suites
参数的设置是以使用强加密密码为原则。
--authorization-mode
参数存在,且设置为一个包含 Node
的值。该配置将限制 kubelet 可以读取哪些与其节点关联的对象。
--enable-admission-plugins
参数设置为包含值 NodeRestriction
。该插件可确保 kubelet 只能修改自己的 Node API 对象以及那些与其节点关联的 Pod API 对象。
--encryption-provider-config
参数设置为 EncryptionConfig
文件,而该文件中应包含所需的所有资源。该设置可确保存放在 etcd 键值存储中的所有 REST API 对象都是静态加密的。
确保对所有所需的资源使用 aescbc
加密提供程序,因为该加密提供程序被认为是最强的。
--enable-admission-plugins
参数包含值 EventRateLimit
,用于设置 API 服务器所接受的事件数量限制,以优化集群的性能。
--feature-gates
参数不要设置为包含 AdvancedAuditing=false
的值。换句话说,请确保未出于审计和调查目的而禁用高级审计。
--request-timeout
参数要么不设置,要么设置为适当的值(既不太短也不太长)。默认值为 60 秒。
--authorization-mode
参数存在,且设置为一个包含 Kubernetes RBAC 的值。
该设置可确保 RBAC 处于打开状态。除了打开 RBAC 之外,您还应该遵循其他一些有关如何最好地使用 RBAC 的建议,其中包括: