跳转至

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 来限制对在 namespace dev-team 中运行的 Pod products-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

kubectl delete clusterrolebinding system:anonymous

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 分钟查看集群监控状态

kubectl get pod -n kube-system

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 下

ssh master01
sudo -i

开始操作前先备份

cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp
cp /etc/kubernetes/manifests/etcd.yaml /tmp
cp /var/lib/kubelet/config.yaml /tmp

修改 api-server

可以使用这条命令查。考试时,可以不查的,直接按照考试题目里的要求做就行。可能很多不安全项,但只修改考题要求的哪几项就行的。

kube-bench master

注意:在修改之前最好备份一下,可以备份到 /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 里面都要看一下

kube-bench 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

kube-bench run --targets 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进行查看