01集群安装
考试大纲
集群安装:10%
- 使用网络安全策略来限制集群级别的访问
- 使用 CIS 基准检查 Kubernetes 组件(etcd, kubelet, kubedns, kubeapi)的安全配置
- 正确设置带有安全控制的 Ingress 对象
- 保护节点元数据和端点
- 最小化 GUI 元素的使用和访问
- 在部署之前验证平台二进制文件
默认网络策略
题目描述:
- 为所有类型为 Ingress+Egress 的流量在 namespace
testing
中创建一个名为denypolicy
的新默认拒绝 NetworkPolicy - 此新的 NetworkPolicy 必须拒绝 namespace
testing
中的所有的 Ingress + Egress 流量 - 将新创建的默认拒绝 NetworkPolicy 应用与在 namespace
testing
中运行的所有 Pod
官方文档:
参考解答:
# vim defaultdeny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: denypolicy
namespace: testing
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
流量限制 NetworkPolicy
题目描述:
-
创建一个名为
pod-restriction
的 NetworkPolicy 来限制对在 namespacedev-team
中运行的 Podproducts-service
的访问 -
只允许以下 Pod 连接到 Pod
products-service
-
namespace
qaqa
中的Pod - 位于任何 namespace,带有标签
environment: testing
的 Pod
你可以在/cks/net/po.yaml
找到一个模板清单文件
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
官方文档:
参考解答:
检查 namespace 标签
# 查看 qaqa 命名空间标签
kubectl get ns --show-labels
# NAME STATUS AGE LABELS
# qaqa Active 78m kubernetes.io/metadata.name=qaqa
# 查看 pod 标签
kubectl get pod -n dev-team --show-labels
# NAME READY STATUS RESTARTS AGE LABELS
# products-service 1/1 Running 0 79m environment=testing
# 注意:如果 Pod 或者 Namespace 没有标签,则需要打上标签
kubectl label ns qaqa kubernetes.io/metadata.name=qaqa
kubectl label pod products-service environment=testing -n dev-team
创建网络安全策略
# cat networkpolicy-pod-restriction.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: pod-restriction
namespace: dev-team
spec:
podSelector:
matchLabels:
environment: testing
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: qaqa
- podSelector:
matchLabels:
environment: testing
# 创建
# kubectl apply -f /cks/net/po.yaml
启用 API Server 认证
题目描述:
- 重新配置 cluster 的 Kubernetes API服务以确保只允许经过身份验证和授权的REST请求
使用授权模式 Node,RBAC 和准入控制器 NodeRestriction
删除用户 system:anonymous
的 ClusterRoleBinding 来进行清理
注意:所有 kubectl 配置环境/文件也被配置为使用未经身份验证和未授权的访问。您不必更改它,但请注意,一旦完成 cluster 的安全加固,kubectl 的配置将无法工作
你可以使用位于 Cluster 的 master 节点上,cluster 原本的 kubectl 配置文件 /etc/kubernetes/admin.conf
,以确保经过身份验证和授权的请求任然被允许
参考解答:
更改授权模式和添加 NodeRestriction 准入控制器
vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
删除 clusterrolebinding
API Server TLS 通信配置
题目描述:
- 修改 apiserver
通过 TLS 加强 kube-apiserver 安全配置,要求
1、kube-apiserver 除了 TLS 1.3
及以上的版本可以使用,其他版本都不允许使用。
2、密码套件(Cipher suite)为 TLS_AES_128_GCM_SHA256
- 修改 etcd
通过 TLS 加强 ETCD 安全配置,要求
1、密码套件(Cipher suite)为 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
官方文档:
参考解答:
修改apiserver
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加或修改相关内容,并保存(先检查一下,如果考试环境里已经给你这两条了,则你只需要修改即可)
- --tls-cipher-suites=TLS_AES_128_GCM_SHA256
- --tls-min-version=VersionTLS13 # 如果题目要求 TLS 1.2,则就写 VersionTLS12
修改 etcd
vim /etc/kubernetes/manifests/etcd.yaml
# 添加或修改相关内容,并保存
- --cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
静候 3 分钟查看集群监控状态
kube-bench 修复不安全项
题目描述:
-
针对 kubeadm 创建的 cluster 运行 CIS 基准测试工具时,发现了多个必须立即解决的问题
-
通过配置修复所有问题并重新启动受影响的组件以确保新的设置生效
修复针对 API 服务器发现的所有以下违规行为:
1.2.7 Ensure that the --authorization-mode argument is not set to AlwaysAllow FAIL
1.2.8 Ensure that the --authorization-mode argument includes Node FAIL
1.2.9 Ensure that the --authorization-mode argument includes RBAC FAIL
1.2.18 Ensure that the --insecure-bind-address argument is not set FAIL
修复针对 kubelet 发现的所有以下违规行为:
Fix all of the following violations that were found against the kubelet:
4.2.1 Ensure that the anonymous-auth argument is set to false FAIL
4.2.2 Ensure that the --authorization-mode argument is not set to AlwaysAllow FAIL
注意:尽可能使用 Webhook 身份验证/授权。
修复针对 etcd 发现的所有以下违规行为:
Fix all of the following violations that were found against etcd:
2.2 Ensure that the --client-cert-auth argument is set to true FAIL
参考解答:
切换到 Master 的 root 下
开始操作前先备份
cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
cp /etc/kubernetes/manifests/etcd.yaml /tmp
cp /var/lib/kubelet/config.yaml /tmp
修改 api-server
可以使用这条命令查。考试时,可以不查的,直接按照考试题目里的要求做就行。可能很多不安全项,但只修改考题要求的哪几项就行的。
注意:在修改之前最好备份一下,可以备份到 /tmp 目录下,不要备份到当前目录
# 修改config文件
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 修改authorization-mode为Node,RBAC
- --authorization-mode=Node,RBAC
# 删除 insecure-bind-address
- --insecure-bind-address=0.0.0.0
检查 kubelet,注意:master 和 node 里面都要看一下
修改:
# 修改config文件
vim /var/lib/kubelet/config.yaml
# 修改内容
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false #将 true 改为 false
webhook:
cacheTTL: 0s
enabled: true # 修改为 true。注意,这两个 enabled 千万不要搞混,anonymous 应该为 false,webhook 应该为 true。考试时,可能只有一个是错误的。
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook #改为 Webhook
webhook:
检查 etcd
修改 etcd:
# 修改 etcd.yaml
- --client-cert-auth=true #修改为 true
# 修改完成后,重新加载配置文件,并重启kubelet
systemctl daemon-reload
systemctl restart kubelet
注意:做下一题之前,确保所有的 pod 都是 Running,特别是 kube-apiserver-master01 也正常。(考试时,也要确保这个 apiserver 是正常的)可以通过 kubectl get pod -A
进行查看