1、可信任供应链概述

可信任供应链:旨在构建基础架构中,涉及的软件都是可信任的

在k8s领域可信任软件供应链主要是指镜像,因为一些软件交付物就是镜像,部署的最小载体
5、供应链安全 - 图1

2、构建Dockerfile优化

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

示例:构建python web镜像

  1. FROM python
  2. RUN useradd python
  3. RUN mkdir /data/www -p
  4. COPY . /data/www
  5. RUN chown -R python /data
  6. RUN pip install flask -i https://mirrors.aliyun.com/pypi/simple/
  7. WORKDIR /data/www
  8. USER python
  9. CMD python main.py

3、镜像漏洞扫描工具:Trivy

Trivy:是一种用于容器镜像、文件系统、Git仓库的漏洞扫描工具。发现目标软件存在的漏洞。

Trivy易于使用,只需安装二进制文件即可进行扫描,方便集成CI系统。

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

示例

  1. # 容器镜像扫描
  2. trivy image nginx
  3. trivy image -i nginx.tar
  4. # 打印指定(高危、严重)漏洞信息
  5. trivy image -s HIGH nginx
  6. trivy image -s HIGH, CRITICAL nginx
  7. # JSON格式输出并保存到文件
  8. trivy image nginx -f json -o /root/output.json

4、检查yaml文件安全配置:kubesec

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

官网:https://kubesec.io

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

示例:

  1. kubesec scan deployment.yaml
  2. 或者使用容器环境执行检查
  3. docker run -i kubesec/kubesec scan /dev/stdin < deployment.yaml

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

二进制:

kubesec http 8080 &

Docker:

docker run -d -p 8080:8080 kubesec/kubesec http 8080

示例:

  1. curl -sSX POST --data-binary @deployment.yaml http://192.168.31.71:8080/scan

5、准入控制器:Admission Webhook

Admission Webhook:准入控制器Webhook是准入控制插件的一种,用于拦截所有想APISERVER发送的请求,并且可以修改请求或拒绝请求。

Admission Webhook为开发者提供了非常灵活的插件模式,在kubernetes资源持久化之前,管理员通过程序可以对指定资源做校验、修改等操作。例如为资源打标签、pod设置默认SA,自动注入sidecar容器等。

相关Webhook准入控制器:

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

5、供应链安全 - 图2

6、准入控制器:ImageRolicyWebhook

5、供应链安全 - 图3

1、启用准入控制插件

  1. --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook
  2. --admission-control-config-file=/etc/kubernetes/image-policy/admission_configuration.yml
  3. 并使用hostpath数据卷将宿主机/etc/kubernetes/image-policy目录挂载到容器中

2、准备配置文件

  1. cat admission_configuration.yaml
  2. apiVersion: apiserver.config.k8s.io/v1
  3. kind: AdmissionConfiguration
  4. plugins:
  5. - name: ImagePolicyWebhook
  6. configuration:
  7. imagePolicy:
  8. kubeConfigFile: /etc/kubernetes/image-policy/connect_webhook.yaml # 连接镜像策略服务器配置文件
  9. allowTTL: 50 # 控制批准请求的缓存时间,单位秒
  10. denyTTL: 50 # 控制批准请求的缓存时间,单位秒
  11. retryBackoff: 500 # 控制重试间隔,单位毫秒
  12. defaultAllow: true # 确定webhook后端失效的行为
  1. cat connect_webhook.yaml
  2. apiVersion: v1
  3. kind: Config
  4. clusters:
  5. - cluster:
  6. certificate-authority: /etc/kubernetes/image-policy/webhook.pem # 数字证书,用于验证远程服务
  7. server: https://192.168.31.73:8080/image_policy # 镜像策略服务器地址,必须是https
  8. name: webhook
  9. contexts:
  10. - context:
  11. cluster: webhook
  12. user: apiserver
  13. name: webhook
  14. current-context: webhook
  15. preferences: {}
  16. users:
  17. - name: apiserver
  18. user:
  19. client-certificate: /etc/kubernetes/image-policy/apiserver-client.pem # webhook准入控制器使用的证书
  20. client-key: /etc/kubernetes/image-policy/apiserver-client-key.pem # 对应私钥证书
  • 注:涉及的证书文件,下一步生成,拷贝到该文件中对应路径

3、部署镜像服务器

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

3.1 自签HTTPS证书

3.2 Docker容器启动镜像策略服务

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

4、测试

  1. kubectl create deployment web1 --image=nginx:1.16
  2. kubectl create deployment web2 --image=nginx