软件安全不是安全软件。此处我们关注的主题包括身份验证、Access Control、机密性、加密和权限管理。
streamingConnectionIdleTimeout
字段指定流连接在自动关闭之前空闲的最长时间。设置空闲超时可以防止拒绝服务攻击和连接耗尽。将字段值设置为 0
可禁用空闲超时。streamingConnectionIdleTimeout
字段设置为 0
禁用流连接超时。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
streamingConnectionIdleTimeout: 0
AlwaysAllow
模式下,API 服务器不执行任何授权检查,因为该模式允许所有请求。AlwaysAllow
作为授权模式之一的情况下启动 Kubernetes API 服务器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=...,AlwaysAllow,...
...
--root-ca-file
标记,该标记用于指定根证书颁发机构 (CA) 文件。因此,Kubernetes 控制器管理器不会向 Pod 发布相应的根 CA 证书。如果没有根 CA 证书,Pod 将无法在建立连接之前验证 API 服务器的服务证书。此类连接易受到中间人攻击。--root-ca-file
标记的情况下启动 Kubernetes 控制器管理器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: example.domain/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
AlwaysAllow
模式或 Webhook
模式授权请求。未指定授权模式时默认使用 AlwaysAllow
。在 AlwaysAllow
模式下,Kubelet 不执行任何授权检查,因为该模式允许所有请求。由于 Kubelets 是管理工作程序计算机工作负载的 Kubernetes 主要代理,攻击者可以使用不受控制的请求来访问保护不充分和安全敏感的服务 API。AlwaysAllow
。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authorization:
mode: AlwaysAllow
clientCAFile
字段。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
--kubelet-client-certificate
标记和 --kubelet-client-key
标记分别指定客户端证书和相应的私钥,以启用对 Kubelets 的基于证书的身份验证。
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
--kubelet-certificate-authority
标记验证 Kubelet 的服务证书。
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
Node
授权是一种特殊用途的授权模式,专门对 Kubelets 发出的 API 请求进行授权。这可确保 Kubelets 拥有正确操作所需的一组最低权限。Node
授权模式的情况下启动 Kubernetes API 服务器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=RBAC,Webhook
...
NodeRestriction
准入控制器。NodeRestriction
准入控制器限制每个 Kubelet 修改其 Node 和 Pod 对象,且拒绝对敏感系统对象的访问。这可以防止任何受损节点获取 Kubernetes 群集的其他节点上的权限。Pod
定义启动了未启用 NodeRestriction
准入控制器的 Kubernetes API 服务器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodSecurityPolicy
...
PodSecurityPolicy
准入控制器表明安全控制较弱,除非 Kubernetes 有 K-Rail、Kyverno、OPA/Gatekeeper 等替代策略执行工具。PodSecurityPolicy
准入控制器强制执行 Pod 安全策略,这些策略用于指定群集中允许的安全相关 Pod 属性。例如,通过使用 PodSecurityPolicy
,您可以在创建 Pod
时默认禁止特权容器并禁止特权提升。Pod
定义启动了未启用 PodSecurityPolicy
准入控制器的 Kubernetes API 服务器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
RBAC
) 根据组织内个人用户的角色控制对计算机或网络资源的访问。RBAC 是最安全的授权模式。RBAC
授权模式的情况下启动 Kubernetes API 服务器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=Node,Webhook
...
Pod
,因为缺少 securityContext
字段。
apiVersion: v1
kind: Pod
...
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
SecurityContextDeny
准入控制器阻止 Pod 设置允许在 Kubernetes 群集中进行权限提升的某些 SecurityContext 字段。除非 Kubernetes 有替代策略执行工具,例如适当的 Pod 安全策略,否则 SecurityContextDeny
应启用准入控制器。Pod
定义启动了未启用 SecurityContextDeny
准入控制器的 Kubernetes API 服务器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
--service-account-private-key-file
标记指定令牌签名密钥。--service-account-private-key-file
标记的情况下启动 Kubernetes 控制器管理器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
...
ServiceAccount
准入控制器会自动执行服务帐户管理。ServiceAccount
准入控制器的优点是可通过自动凭据轮换减少访问令牌泄露风险,并省去存储机密的必要。ServiceAccount
准入控制器默认处于启用状态,但已被故意禁用。Pod
定义启动 Kubernetes API 服务器并禁用 ServiceAccount
准入控制器。
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=ServiceAccount,PodNodeSelector
...
NamespaceLifecycle
准入控制器通过两种方式维护 Kubernetes 系统的完整性。首先,它防止在不存在的名称空间或正在终止的名称空间中创建对象。其次,它可以防止系统保留的命名空间(包含 Kubernetes 关键服务)被删除。NamespaceLifecycle
准入控制器默认处于启用状态,但用于启动 Kubernetes API 服务器的命令已使用 --disable-admission-plugin
标记将其禁用。--disable-admission-plugins
标记中所含的 NamespaceLifecycle
将禁用NamespaceLifecycle
准入控制器。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=...,NamespaceLifecycle,...
...
--peer-auto-tls
标记设置为 true
。因此,etcd 实例使用自签名证书与对等方进行 TLS 连接。
...
spec:
containers:
- command:
...
- etcd
...
- --peer-auto-tls=true
...
root
操作,但未授予完整的 root
权限。CAP_SYS_ADMIN
功能授予 Pod 执行尽可能广泛的系统管理操作的权限。CAP_SYS_ADMIN
功能。
...
kind: Pod
...
spec:
containers:
...
securityContext:
capabilities:
add:
- CAP_SYS_ADMIN
- SYS_TIME
...
privileged
字段允许容器拥有与主机上运行的其他流程几乎相同的权限。这扩大了攻击面,且违反了以最低权限运行映像的原则。privileged: true
在特权模式下运行。
...
kind: Pod
...
spec:
containers:
- name: ...
image: ...
securityContext:
privileged: true
...