API Server 配置安全篇

1、确保 —anonymous-auth 参数设置为false

  • 描述
    • 禁用对API Server的匿名请求
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证 —anonymousi-auth参数设置为false
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—anonymous-auth=false这个参数
  • 默认(1.15.1)
    • 匿名可以访问api server
  • 参考

  • 描述

    • 不要使用基本身份验证
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证 —basic-auth-file参数不被设置
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—basic-auth-file这个参数
  • 默认(1.15.1)
    • 基本身份验证是没有被设置的
  • 参考

  • 描述

    • 不要使用基于Token的基本身份验证
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—token-auth-file参数不被设置
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—token-auth-file这个参数
  • 默认(1.15.1)
    • 基于Token的基本身份验证没有被设置的
  • 参考

  • 描述

    • 使用https进行kubelet连接
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证 —kubelet-https 参数设置为true或者没有设置
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—kubelet-https=true或者删除—kubelet-https这个参数
  • 默认(1.15.1)
    • 使用https进行kubelet连接
  • 参考

  • 描述

    • 启用基于证书的kubelet身份验证
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—kubelet-client-certificate和—kubelet-client-key参数存在并设置正确
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,—kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt 和—kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key(具体路径根据实际情况配置)
  • 默认(1.15.1)
    • 未设置基于证书的kubelet身份验证
  • 参考

  • 描述

    • 在建立连接之前验证kubelet的证书
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证 —kubelet-certificate-authority参数存在并设置正确
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—kubelet-certificate-authority=这个参数
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 不要总是授权所有请求
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—authorization-mode参数不是AlwaysAllow
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,编辑—authorization-mode=Node,RBAC这个参数
  • 默认(1.15.1)
    • Node,RBAC
  • 参考

  • 描述

    • 限制kubelet节点只读取与其关联的对象,节点授权模式只允许kubelets读取与其节点关联的Secret、ConfigMap、PersistentVolume和PersistentVolumeClaim对象。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—authorization-mode
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,编辑—authorization-mode=Node,RBAC这个参数
  • 默认(1.15.1)
    • Node,RBAC
  • 参考

  • 描述

    • 基于角色的访问控制(RBAC)允许对不同实体可以在集群中的不同对象上执行的操作进行细粒度控制。建议使用RBAC授权模式。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—authorization-mode
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,编辑—authorization-mode=Node,RBAC这个参数
  • 默认(1.15.1)
    • Node,RBAC
  • 参考

  • 描述

    • 限制API服务器接受请求的速度,使用EventRateLimit允许控制对API服务器将在给定时间片内接受的事件数量施加限制。不正常的工作负载可能会使API服务器崩溃,使其不可用。这特别适用于多租户集群,其中可能有一小部分行为不端的租户会对集群的整体性能产生重大影响。因此,建议限制API服务器将接受的事件速率。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—enable-admission-plugins
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,编辑—enable-admission-plugins=…,EventRateLimit,… 和—admission-control-config-file=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 设置允许控制插件AlwaysAdmit允许所有请求,不过滤任何请求。在Kubernetes v1.13中已经弃用了AlwaysAdmit许可控制器。它的行为相当于关闭所有的入口控制器。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—enable-admission-plugins
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除AlwaysAdmit
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 将准入控制策略设置为AlwaysPullImages,将强制每个新pod每次拉取所需的image。在多租户集群中,可以确保用户的私有image只能由具有凭据来提取它们的人使用。没有这个允许控制策略,一旦一个image被拉到一个节点,来自任何用户的任何pod都可以通过已知的image名称来使用它,而不需要对image所有者进行任何授权检查。当启用此插件时,总是在启动容器之前拉取image,这意味着需要有效的凭据。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—enable-admission-plugins
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,编辑—enable-admission-plugins=…,EventRateLimit, AlwaysPullImages
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • SecurityContextDeny参数用于准入控制器可以拒绝使用了SecurityContext字段的Pod,此字段可以允许集群中的特权升级。当集群中没有使用PodSecurityPolicy时,应该使用此方法。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—enable-admission-plugins假如PodSecurityPolicy不在其中应该添加SecurityContextDeny
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,编辑—enable-admission-plugins=…,SecurityContextDeny,…
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 当您创建一个pod时,如果您没有指定一个服务帐户,它将自动分配相同名称空间中的默认服务帐户。您应该创建自己的服务帐户,并让API服务器管理其安全令牌。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—disable-admission-plugins参数不含有ServiceAccount
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—disable-admission-plugins=ServiceAccount
  • 默认(1.15.1)
    • 已经开启,没有配置到—disable-admission-plugins参数中
  • 参考

  • 描述

    • 拒绝在正在终止的Namespace中创建对象。将准入控制策略设置为NamespaceLifecycle可以确保不能在不存在的Namespace中创建对象,并且在Namespace终止时不会用于创建新对象。建议这样做,以加强名称空间终止过程的完整性,并确保新对象的可用性。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—disable-admission-plugins参数不含有NamespaceLifecycle
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—disable-admission-plugins=NamespaceLifecycle
  • 默认(1.15.1)
    • 已经开启,没有配置到—disable-admission-plugins参数中
  • 参考

  • 描述

    • 拒绝创建与PodSecurityPolicy不匹配的Pod。PodSecurityPolicy是集群级别的资源,它控制Pod可以执行的操作和它能够访问的内容。PodSecurityPolicy对象定义了一组pod必须在哪些条件下运行才能被系统接受。PodSecurityPolicy由控制Pod可以访问的安全特性的设置和策略组成,因此必须使用这些设置和策略来控制Pod访问权限。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—enable-admission-plugins参数含有PodSecurityPolicy
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—enable-admission-plugins=…,PodSecurityPolicy,…
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 限制kubelet可以修改的节点和Pod对象。使用NodeRestriction插件可以确保kubelet被限制在它可以修改的节点和Pod对象中。这样的kubelet将只允许修改它们自己的节点API对象,并且只允许修改绑定到它们的节点的Pod API对象。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—enable-admission-plugins参数含有NodeRestriction
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—enable-admission-plugins=…,NodeRestriction,…
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 不要绑定不安全的API服务。如果您将apiserver绑定到一个不安全的地址,基本上任何可以通过不安全端口连接到它的人都可以对您的主节点进行未经身份验证和未加密的访问。apiserver不会对不安全的绑定进行任何身份验证检查,到不安全API端口的流量也不会被封装,从而允许攻击者可能在传输过程中读取敏感数据。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—insecure-bind-address参数不被设置
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—insecure-bind-address
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 不要绑定到不安全的端口。将apiserver设置为服务于不安全端口将允许对您的主节点进行未经身份验证和未加密的访问。这将允许能够访问此端口的攻击者轻松地控制集群。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—insecure-port参数设置为0
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—insecure-port=0
  • 默认(1.15.1)
    • 8080
  • 参考

  • 描述

    • 不要禁用安全端口。安全端口用于为https提供身份验证和授权。如果禁用它,就不会提供https流量,所有流量都是未加密的。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—insecure-port参数要么不设置,要么设置为1到65535之间的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—insecure-port=6443或者不配置此项
  • 默认(1.15.1)
    • 6443
  • 参考

  • 描述

    • 如果不需要,禁用分析。概要分析允许识别特定的性能瓶颈。它生成大量的程序数据,这些数据可能被用来揭示系统和程序细节。如果您没有遇到任何瓶颈,并且不需要使用分析器进行故障排除,建议关闭分析器以减少潜在的攻击面。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—profilingt=false
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—profilingt=false
  • 默认(1.15.1)
    • true
  • 参考

  • 描述

    • 在Kubernetes API服务器上启用审计,并设置所需的审计日志路径。审计Kubernetes API服务器提供了一组与安全性相关的按时间顺序排列的记录,这些记录记录了各个用户、管理员或系统的其他组件影响系统的活动的顺序。尽管目前Kubernetes只提供基本的审计功能,但应该启用它。您可以通过设置适当的审计日志路径来启用它。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—audit-log-path参数被设置
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—audit-log-path=/var/log/apiserver/audit.log
  • 默认(1.15.1)
    • 没有开启
  • 参考

  • 描述

    • 保留日志至少30天或视情况而定。保留日志至少30天,可以确保您能够及时返回并调查或关联任何事件。将您的审计日志保留期设置为30天或根据您的业务需求设置。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—audit-log-maxage参数设置为30天或者其他适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—audit-log-maxage=30
  • 默认(1.15.1)
    • 没有开启
  • 参考

  • 描述

    • 保留10个或适当数量的旧日志文件。Kubernetes自动旋转日志文件。保留旧的日志文件可以确保您有足够的日志数据来进行任何调查或关联。例如,如果您将文件大小设置为100 MB,并将旧日志文件的数量保持为10,那么您可能有大约1 GB的日志数据可供分析使用。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—audit-log-maxbackup参数设置为10天或者其他适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—audit-log-maxbackup=10
  • 默认(1.15.1)
    • 没有开启
  • 参考

  • 描述

    • 在达到100 MB或更大时旋转日志文件。Kubernetes自动旋转日志文件。保留旧的日志文件可以确保您有足够的日志数据来进行任何调查或关联。例如,如果您将文件大小设置为100 MB,并将旧日志文件的数量保持为10,那么您可能有大约1 GB的日志数据可供分析使用。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—audit-log-maxsize参数设置为100或者其他适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,删除—audit-log-maxsize=100
  • 默认(1.15.1)
    • 没有开启
  • 参考

  • 描述

    • API服务器请求设置适当的全局请求超时。设置全局请求超时允许将API服务器请求超时限制扩展到适合用户连接速度的持续时间。默认情况下,它被设置为60秒,这在较慢的连接上可能会出现问题,一旦请求的数据量超过60秒内可以传输的数据量,就会导致集群资源无法访问。但是,将此超时限制设置为太大会耗尽API服务器资源,使其容易受到拒绝服务攻击。因此,建议将此限制设置为适当的值,并仅在需要时更改60秒的默认限制。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—request-timeout参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—request-timeout=60s
  • 默认(1.15.1)
    • 默认60秒
  • 参考

  • 描述

    • 在验证令牌之前验证服务帐户。如果—service-account-lookup未启用,apiserver只验证身份验证令牌是否有效,而不验证请求中提到的service account令牌是否实际存在于etcd中。这允许在删除相应的服务帐户之后仍然使用服务帐户令牌。这是一个检查到使用时间安全问题的例子。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—service-account-lookup参数设置为true
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—service-account-lookup=true
  • 默认(1.15.1)
    • true
  • 参考

  • 描述

    • 显式地为apiserver上的服务帐户设置一个服务帐户公钥文件。 默认情况下,如果没有—service-account-key-file被指定给apiserver,它将使用来自TLS服务证书的私钥来验证服务帐户令牌。为了确保服务帐户令牌的密钥可以根据需要进行旋转,应该使用单独的公钥/私钥对对服务帐户令牌进行签名。因此,应该使用—service-account-key-file将公钥指定给apiserver。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—service-account-key-file参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—service-account-key-file=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • etcd应该配置为使用TLS加密进行客户端连接。etcd是Kubernetes部署的一个高可用的键值存储,用于所有REST API对象的持久存储。这些对象本质上是敏感的,应该由客户机身份验证来保护。这要求API服务器使用客户端证书和密钥向etcd服务器标识自己。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—etcd-certfile 和 —etcd-keyfile参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—etcd-certfile= 和—etcd-keyfile=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 在API服务器上设置TLS连接。API服务器通信包含敏感参数,这些参数在传输过程中应该保持加密。将API服务器配置为只服务HTTPS流量。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—tls-cert-file 和—tls-private-key-file参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—tls-cert-file= 和—tls-private-key-file=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 在API服务器上设置TLS连接。API服务器通信包含敏感参数,这些参数在传输过程中应该保持加密。将API服务器配置为只服务HTTPS流量。如果设置了—client-ca-file参数,则提交由client-ca-file中的某个权威机构签署的客户机证书的任何请求都将使用与客户机证书的CommonName对应的身份进行身份验证。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—client-ca-file参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—client-ca-file=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • etcd应该配置为使用TLS加密进行客户端连接。etcd是Kubernetes部署的一个高可用的键值存储,用于所有REST API对象的持久存储。这些对象本质上是敏感的,应该由客户机身份验证来保护。这要求API服务器使用SSL证书授权文件向etcd服务器标识自己。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—etcd-cafile参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—etcd-cafile=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 加密etcd键值存储。etcd是一个高可用的键值存储,Kubernetes部署将其用于所有REST API对象的持久存储。这些对象在本质上是敏感的,应该在休息时加密以避免任何泄露。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—encryption-provider-config参数设置为适合的值
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件,添加—encryption-provider-config=
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • 在使用etcd加密的地方,应该配置适当的提供者。在使用etcd加密时,务必确保使用了适当的加密提供程序集。目前,aescbc, kms和secretbox可能是合适的选择。
  • 检查
    • ps -ef | grep kube-apiserver
    • 从—encryption-provider-config参数获取EncryptionConfig文件集。验证aescbc、kms或secretbox已设置为所有所需资源的加密提供者。
  • 配置
  • 默认(1.15.1)
    • 没有设置
  • 参考

  • 描述

    • TLS密码有许多已知的弱点,这可能会降低它们提供的保护。默认情况下,Kubernetes支持许多TLS密码套件,包括一些存在安全问题的套件,这削弱了所提供的保护。
  • 检查
    • ps -ef | grep kube-apiserver
    • 验证—tls-cipher-suites参数是否设置为下面的补救过程中概述的那样。
  • 配置
    • 编辑/etc/kubernetes/manifests/kube-apiserver.yaml配置文件
    • —tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • 默认(1.15.1)
    • 默认情况下,Kubernetes API服务器支持多种TLS密码
  • 参考