Kubernetes安全篇5:供应链安全

可信任软件供应链概述

可信任软件供应链:指在建设基础架构过程中,涉及的软件都是可信任的。
在K8s领域可信软件供应链主要是指镜像,因为一些软件交付物都是镜像部署的最小载体。

Kubernetes安全篇5:供应链安全

构建镜像Dockerfile文件优化

减少镜像层:一次RUN指令形成新的一层,尽量Shell命令都写在一行,减少镜像层。
清理无用文件:清理对应的残留数据,例如yum缓存。
清理无用的软件包:基础镜像默认会带一些debug工具,可以删除掉,仅保留应用程序所需软件,防止黑客利用。
选择最小的基础镜像:例如alpine
使用非root用户运行:USER指令指定普通用户

镜像漏洞扫描工具:Trivy

Trivy:是一种用于容器镜像、文件系统、Git仓库的漏洞扫描工具。发现目标软件存在的漏洞。Trivy易于使用,只需安装二进制文件即可进行扫描,方便集成CI系统。

项目地址:https://github.com/aquasecurity/trivy

Kubernetes安全篇5:供应链安全

容器镜像扫描

trivy image nginx
trivy image -i nginx.tar

Kubernetes安全篇5:供应链安全

打印指定(高危、严重)漏洞信息

trivy image -s HIGH nginx
trivy image -s HIGH,CRITICAL nginx

Kubernetes安全篇5:供应链安全

JSON格式输出并保存到文件

trivy image nginx -f json -o /root/output.json

检查YAML文件安全配置:kubesec

kubesec:是一个针对K8s资源清单文件进行安全配置评估的工具,根据安全配置最佳实践来验证并给出建议。

官网:https://kubesec.io

项目地址:https://github.com/controlplaneio/kubesec

项目地址:https://github.com/controlplaneio/kubesec

示例:

kubectl create deployment nginx-deploy --image=nginx --dry-run=client -o yaml >nginx-deploy.yaml
kubesec scan nginx-deploy.yaml
docker run -i kubesec/kubesec scan /dev/stdin < nginx-deploy.yaml

Kubernetes安全篇5:供应链安全
Kubernetes安全篇5:供应链安全

kubesec内置一个HTTP服务器,可以直接启用,远程调用。

二进制
kubesec http 8080 &
Docker容器
docker run -d -p 8080:8080 kubesec/kubesec http 8080
示例:
curl -sSX POST --data-binary @nginx-deploy.yaml http://11.0.1.111:8080/scan

准入控制器: Admission Webhook

Admission Webhook:准入控制器Webhook是准入控制插件的一种,用于拦截所有向APISERVER发送的请求,并且可以修改请求或拒绝请求。Admission webhook为开发者提供了非常灵活的插件模式,在kubernetes资源持久化之前,管理员通过程序可以对指定资源做校验、修改等操作。例如为资源自动打标签、pod设置默认SA,自动注入sidecar容器等。

相关Webhook准入控制器:

MutatingAdmissionWebhook:修改资源,理论上可以监听并修改任何经过ApiServer处理的请求
ValidatingAdmissionWebhook:验证资源
ImagePolicyWebhook:镜像策略,主要验证镜像字段是否满足条件

Kubernetes安全篇5:供应链安全
Kubernetes安全篇5:供应链安全

准入控制器: ImagePolicyWebhook

实验过程原理:

Kubernetes安全篇5:供应链安全

1、启用准入控制插件(master节点)
vi /etc/kubernetes/manifests/kube-apiserver.yaml

Kubernetes安全篇5:供应链安全

--enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
--admission-control-config-file=/etc/kubernetes/image-policy/admission_configuration.yaml

并使用hostpath数据卷将宿主机/etc/kubernetes/image-policy目录挂载到容器中

Kubernetes安全篇5:供应链安全
Kubernetes安全篇5:供应链安全

2、准备配置文件

mkdir -p /etc/kubernetes/image-policy/ && cd /etc/kubernetes/image-policy/

vi admission_configuration.yaml

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
  - name: ImagePolicyWebhook
    configuration:
      imagePolicy:
        kubeConfigFile: <kubeconfig 文件路径>
        allowTTL: 50
        denyTTL: 50
        retryBackoff: 500
        defaultAllow: flase
Kubernetes安全篇5:供应链安全

 cp ~/.kube/config /etc/kubernetes/image-policy/connect_webhook.yaml

根据第三步匹配的相应证书匹配相应配置文件:

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/image-policy/webhook.pem  # 数字证书,用于验证远程服务
    server: https://11.0.1.111:8080/image_policy # 镜像策略服务器地址,必须是https
  name: webhook
contexts:
- context:
    cluster: webhook
    user: apiserver
  name: webhook
current-context: webhook
preferences: {}
users:
- name: apiserver
  user:
    client-certificate: /etc/kubernetes/image-policy/apiserver-client.pem # webhook准入控制器使用的证书
    client-key: /etc/kubernetes/image-policy/apiserver-client-key.pem # 对应私钥证书

3、部署镜像服务器

自己用python开发一个简单的webhook端点服务器,作用是拒绝部署的镜像没有指定标签(即latest)。

Kubernetes安全篇5:供应链安全

自签HTTPS证书:
bash image-policy-certs.sh

image-policy-webhook目录下:
main.py:用来检测是否使用选定版本镜像

Kubernetes安全篇5:供应链安全

docker build -t howell/image-policy-webhook .

Docker容器启动镜像策略服务

docker run -d -u root --name=image-policy-webhook \
-v $PWD/webhook.pem:/data/www/webhook.pem \
-v $PWD/webhook-key.pem:/data/www/webhook-key.pem \
-e PYTHONUNBUFFERED=1 -p 8080:8080 \
howell/image-policy-webhook

docker logs image-policy-webhook

Kubernetes安全篇5:供应链安全

4、测试

image_policy 策略是镜像 tag 是 latest 的不允许创建。
kubectl create deployment web1 --image=nginx:1.16
kubectl create deployment web2 --image=nginx

Kubernetes安全篇5:供应链安全

发布者:LJH,转发请注明出处:https://www.ljh.cool/34055.html

(0)
上一篇 2023年4月2日 下午3:49
下一篇 2023年4月2日 下午4:56

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注