医院门户网站建设规划,17做网站广州,企业网站新模式,怎样做自己可以发布消息的网站供应链安全 目录 文章目录 供应链安全目录本节实战可信任软件供应链概述构建镜像Dockerfile文件优化镜像漏洞扫描工具#xff1a;Trivy检查YAML文件安全配置#xff1a;kubesec准入控制器#xff1a; Admission Webhook准入控制器#xff1a; ImagePolicyWebhook关于我最后…供应链安全 目录 文章目录 供应链安全目录本节实战可信任软件供应链概述构建镜像Dockerfile文件优化镜像漏洞扫描工具Trivy检查YAML文件安全配置kubesec准入控制器 Admission Webhook准入控制器 ImagePolicyWebhook关于我最后 本节实战
实战名称 实战安装Trivy-2023.6.4(测试成功) 实战安装kubesec-2023.6.4(测试成功) 实战准入控制器 ImagePolicyWebhook-2023.6.6(测试成功)
可信任软件供应链概述
**可信任软件供应链**指在建设基础架构过程中涉及的软件都是可信任的。
在K8s领域可信软件供应链主要是指镜像因为一些软件交付物都是镜像部署的最小载体。 构建镜像Dockerfile文件优化
减少镜像层一次RUN指令形成新的一层尽量Shell命令都写在一行减少镜像层。**清理无用文件**清理对应的残留数据例如yum缓存。**清理无用的软件包**基础镜像默认会带一些debug工具可以删除掉仅保留应用程序所需软件防止黑客利用。选择最小的基础镜像例如alpine**使用非root用户运行**USER指令指定普通用户 注意 一次RUN指令形成新的一层尽量Shell命令都写在一行减少镜像层。 删除掉这个缓存目录就行 alpine镜像大小5MB 镜像漏洞扫描工具Trivy
**Trivy**是一种用于容器镜像、文件系统、Git仓库的漏洞扫描工具。发现目标软件存在的漏洞。
Trivy易于使用只需安装二进制文件即可进行扫描方便集成CI系统。
项目地址https://github.com/aquasecurity/trivy 实战安装Trivy-2023.6.4(测试成功) 实验环境
实验环境
centos7实验软件
链接https://pan.baidu.com/s/17XstYWfyOWW3nyNgxhS4yQ?pwd0820
提取码0820
2023.6.4-trivy-code安装步骤
1、下载软件
[rootk8s-master1 ~]#ll -h trivy_0.18.3_Linux-64bit.tar.gz #自己去官网下载这里直接用提供的安装包
-rw-r--r-- 1 root root 11M Jun 4 07:39 trivy_0.18.3_Linux-64bit.tar.gz2、移动二进制文件到/usr/bin目录
[rootk8s-master1 ~]#mkdir trivy
[rootk8s-master1 ~]#mv trivy_0.18.3_Linux-64bit.tar.gz trivy
[rootk8s-master1 ~]#cd trivy/
[rootk8s-master1 trivy]#tar xf trivy_0.18.3_Linux-64bit.tar.gz
[rootk8s-master1 trivy]#ls
contrib LICENSE README.md trivy trivy_0.18.3_Linux-64bit.tar.gz
[rootk8s-master1 trivy]#mv trivy /usr/bin/3、测试
[rootk8s-master1 ~]#trivy --help
NAME:trivy - A simple and comprehensive vulnerability scanner for containersUSAGE:trivy [global options] command [command options] targetVERSION:0.18.3COMMANDS:image, i scan an imagefilesystem, fs scan local filesystemrepository, repo scan remote repositoryclient, c client modeserver, s server modeplugin, p manage pluginshelp, h Shows a list of commands or help for one commandGLOBAL OPTIONS:--quiet, -q suppress progress bar and log output (default: false) [$TRIVY_QUIET]--debug, -d debug mode (default: false) [$TRIVY_DEBUG]--cache-dir value cache directory (default: /root/.cache/trivy) [$TRIVY_CACHE_DIR]--help, -h show help (default: false)--version, -v print the version (default: false)安装结束。
示例
# 容器镜像扫描
trivy image nginx
trivy image -i nginx.tar# 打印指定高危、严重漏洞信息
trivy image -s HIGH nginx
trivy image -s HIGH,CRITICAL nginx# JSON格式输出并保存到文件
trivy image -f json -o output.json nginx漏洞数据库 检查YAML文件安全配置kubesec
**kubesec**是一个针对K8s资源清单文件进行安全配置评估的工具根据安全配置最佳实践来验证并给出建议。
官网https://kubesec.io
项目地址https://github.com/controlplaneio/kubesec 实战安装kubesec-2023.6.4(测试成功) 实验环境
实验环境
centos7实验软件
链接https://pan.baidu.com/s/1SvQ1ijvplpe-hfUv6cCUgQ?pwd0820
提取码0820
2023.6.4-kubesec-code安装步骤
1、下载软件
rootk8s-master1 ~]#ll -h kubesec_linux_amd64.tar.gz
-rw-r--r-- 1 root root 3.9M Jun 4 07:39 kubesec_linux_amd64.tar.gz2、解压
[rootk8s-master1 ~]#tar xf kubesec_linux_amd64.tar.gz
[rootk8s-master1 ~]#mv kubesec /usr/bin/3、验证
[rootk8s-master1 ~]#kubesec --helpValidate Kubernetes resource security policiesUsage:kubesec [command]Available Commands:help Help about any commandhttp Starts kubesec HTTP server on the specified portscan Scans Kubernetes resource YAML or JSONversion Prints kubesec versionFlags:-h, --help help for kubesecUse kubesec [command] --help for more information about a command.安装结束。
示例
kubesec scan deployment.yaml或者使用容器环境执行检查
docker run -i kubesec/kubesec scan /dev/stdin deployment.yamlkubesec内置一个HTTP服务器可以直接启用远程调用。
二进制
kubesec http 8080 Docker容器
docker run -d -p 8080:8080 kubesec/kubesec http 8080示例
curl -sSX POST --data-binary deployment.yaml http://192.168.31.71:8080/scan测试过程
[rootk8s-master1 ~]#kubectl create deployment web --imagenginx --dry-runclient -oyaml deployment.yaml
[rootk8s-master1 ~]#kubesec scan deployment.yaml[rootk8s-master1 ~]#docker run -d -p 8085:8080 kubesec/kubesec http 8080 #宿主机端口容器端口
[rootk8s-master1 ~]#curl -sSX POST --data-binary deployment.yaml http://172.29.9.31:8085/scan #宿主机的8085端口准入控制器 Admission Webhook
**Admission Webhook**准入控制器Webhook是准入控制插件的一种用于拦截所有向APISERVER发送的请求并且可以修改请求或拒绝请求。
Admission webhook为开发者提供了非常灵活的插件模式在kubernetes资源持久化之前管理员通过程序可以对指定资源做校验、修改等操作。例如为资源自动打标签、pod设置默认SA自动注入sidecar容器等。
相关Webhook准入控制器
MutatingAdmissionWebhook修改资源理论上可以监听并修改任何经过ApiServer处理的请求ValidatingAdmissionWebhook验证资源ImagePolicyWebhook镜像策略主要验证镜像字段是否满足条件 准入控制器 ImagePolicyWebhook 实战准入控制器 ImagePolicyWebhook-2023.6.6(测试成功) 实验环境
实验环境
1、win10,vmwrokstation虚机
2、k8s集群3台centos7.6 1810虚机1个master节点,2个node节点k8s versionv1.20.0docker://20.10.7实验软件
链接https://pan.baidu.com/s/1RGJtAhqWXMNVxk7vauaCeA?pwd0820
提取码0820
2023.6.6-ImagePolicyWebhook-code课件步骤 1、准备配置文件
在k8s-master1上操作
创建admission_configuration.yaml文件
#创建/etc/kubernetes/image-policy目录及/etc/kubernetes/image-policy/admission_configuration.yaml文件
[rootk8s-master1 ~]#mkdir /etc/kubernetes/image-policy/
[rootk8s-master1 ~]#vim /etc/kubernetes/image-policy/admission_configuration.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: ImagePolicyWebhookconfiguration:imagePolicy:kubeConfigFile: /etc/kubernetes/image-policy/connect_webhook.yaml # 连接镜像策略服务器配置文件allowTTL: 50 # 控制批准请求的缓存时间单位秒denyTTL: 50 # 控制拒绝请求的缓存时间单位秒retryBackoff: 500 # 控制重试间隔单位毫秒defaultAllow: true # 确定webhook后端失效的行为创建connect_webhook.yaml文件
[rootk8s-master1 ~]#vim /etc/kubernetes/image-policy/connect_webhook.yaml
apiVersion: v1
kind: Config
clusters:
- cluster:certificate-authority: /etc/kubernetes/image-policy/webhook.pem # 数字证书用于验证远程服务server: https://172.29.9.32:8081/image_policy # 镜像策略服务器地址必须是httpsname: webhook
contexts:
- context:cluster: webhookuser: apiservername: webhook
current-context: webhook
preferences: {}
users:
- name: apiserveruser:client-certificate: /etc/kubernetes/image-policy/apiserver-client.pem # webhook准入控制器使用的证书client-key: /etc/kubernetes/image-policy/apiserver-client-key.pem # 对应私钥证书注涉及的证书文件下一步将生成然后会拷贝到相应路径。 2、部署镜像服务器
(在k8s-node1上操作。)
自己用python开发一个简单的webhook端点服务器作用是拒绝部署的镜像乜有指定标签即latest。
1 自签HTTPS证书
来到k8s-node1节点
将压缩包image-policy-webhook.zip拷贝到k8s-node1节点并解压
[rootk8s-node1 ~]#ll
total 4
-rw-r--r-- 1 root root 2910 Jun 5 07:09 image-policy-webhook.zip
[rootk8s-node1 ~]#unzip image-policy-webhook.zip
Archive: image-policy-webhook.zipcreating: image-policy-webhook/inflating: image-policy-webhook/Dockerfile inflating: image-policy-webhook/main.py inflating: admission_configuration.yaml inflating: connect_webhook.yaml inflating: image-policy-certs.sh
[rootk8s-node1 ~]#ls
admission_configuration.yaml connect_webhook.yaml image-policy-certs.sh image-policy-webhook image-policy-webhook.zip查看当前image-policy-certs.sh自签脚本文件
[rootk8s-node1 ~]#cat image-policy-certs.sh
[rootk8s-node1 ~]#cat image-policy-certs.sh
cat ca-config.json EOF
{signing: {default: {expiry: 87600h },profiles: {kubernetes: { expiry: 87600h,usages: [signing,key encipherment,server auth,client auth]}}}
}
EOFcat ca-csr.json EOF
{CN: kubernetes,key: {algo: rsa,size: 2048},names: [{C: CN,L: Beijing,ST: Beijing}]
}
EOFcfssl gencert -initca ca-csr.json | cfssljson -bare ca -cat webhook-csr.json EOF
{CN: webhook,hosts: [172.29.9.32],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing}]
}
EOFcfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes webhook-csr.json | cfssljson -bare webhookcat apiserver-client-csr.json EOF
{CN: apiserver,hosts: [],key: {algo: rsa,size: 2048},names: [{C: CN,L: BeiJing,ST: BeiJing}]
}
EOFcfssl gencert -caca.pem -ca-keyca-key.pem -configca-config.json -profilekubernetes apiserver-client-csr.json | cfssljson -bare apiserver-client执行脚本
[rootk8s-node1 ~]#sh image-policy-certs.sh
[rootk8s-node1 ~]#ll
total 5784
-rw-r--r-- 1 root root 508 Oct 21 2021 admission_configuration.yaml
-rw-r--r-- 1 root root 956 Jun 5 07:15 apiserver-client.csr
-rw-r--r-- 1 root root 182 Jun 5 07:15 apiserver-client-csr.json
-rw------- 1 root root 1679 Jun 5 07:15 apiserver-client-key.pem
-rw-r--r-- 1 root root 1306 Jun 5 07:15 apiserver-client.pem
-rw-r--r-- 1 root root 294 Jun 5 07:15 ca-config.json
-rw-r--r-- 1 root root 960 Jun 5 07:15 ca.csr
-rw-r--r-- 1 root root 212 Jun 5 07:15 ca-csr.json
-rw------- 1 root root 1679 Jun 5 07:15 ca-key.pem
-rw-r--r-- 1 root root 1273 Jun 5 07:15 ca.pem
-rw-r--r-- 1 root root 5850685 Jun 5 07:15 cfssl.tar.gz
-rw-r--r-- 1 root root 632 Oct 21 2021 connect_webhook.yaml
-rw-r--r-- 1 root root 1365 Jun 5 07:13 image-policy-certs.sh
drwxr-xr-x 2 root root 39 Jul 9 2021 image-policy-webhook
-rw-r--r-- 1 root root 2910 Jun 5 07:09 image-policy-webhook.zip
-rw-r--r-- 1 root root 1001 Jun 5 07:15 webhook.csr
-rw-r--r-- 1 root root 202 Jun 5 07:15 webhook-csr.json
-rw------- 1 root root 1679 Jun 5 07:15 webhook-key.pem
-rw-r--r-- 1 root root 1330 Jun 5 07:15 webhook.pem拷贝证书文件到k8s-master1对应目录
[rootk8s-node1 ~]#scp webhook.pem apiserver-client-key.pem apiserver-client.pem root172.29.9.31:/etc/kubernetes/image-policy/
The authenticity of host 172.29.9.31 (172.29.9.31) cant be established.
ECDSA key fingerprint is SHA256:XfMhwZeoqC6kPHaF1uPzLdY9t2ZgNoNvyEd0kJd24eY.
ECDSA key fingerprint is MD5:ec:5e:37:9d:fc:e7:af:e1:9e:3a:ac:21:81:92:b5:91.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 172.29.9.31 (ECDSA) to the list of known hosts.
root172.29.9.31s password:
webhook.pem 100% 1330 1.3MB/s 00:00
apiserver-client-key.pem 100% 1679 858.4KB/s 00:00
apiserver-client.pem 100% 1306 330.6KB/s 00:00 [rootk8s-master1 ~]#cd /etc/kubernetes/image-policy/
[rootk8s-master1 image-policy]#ll
total 20
-rw-r--r-- 1 root root 509 Jun 5 07:01 admission_configuration.yaml
-rw------- 1 root root 1679 Jun 5 07:27 apiserver-client-key.pem
-rw-r--r-- 1 root root 1306 Jun 5 07:27 apiserver-client.pem
-rw-r--r-- 1 root root 633 Jun 5 07:04 connect_webhook.yaml
-rw-r--r-- 1 root root 1330 Jun 5 07:27 webhook.pem2 Docker容器启动镜像策略服务
构建镜像
[rootk8s-node1 ~]#pwd
/root
[rootk8s-node1 ~]#ls
admission_configuration.yaml apiserver-client-key.pem ca.csr ca.pem image-policy-certs.sh webhook.csr webhook.pem
apiserver-client.csr apiserver-client.pem ca-csr.json cfssl.tar.gz image-policy-webhook webhook-csr.json
apiserver-client-csr.json ca-config.json ca-key.pem connect_webhook.yaml image-policy-webhook.zip webhook-key.pem
[rootk8s-node1 ~]#cd image-policy-webhook
[rootk8s-node1 image-policy-webhook]#ls
Dockerfile main.py
[rootk8s-node1 image-policy-webhook]#cat Dockerfile
FROM python
RUN useradd python
RUN mkdir /data/www -p
COPY . /data/www
RUN chown -R python /data
RUN pip install flask -i https://mirrors.aliyun.com/pypi/simple/
WORKDIR /data/www
USER python
CMD python main.py
[rootk8s-node1 image-policy-webhook]#docker build -t image-policy-webhook .
[rootk8s-node1 image-policy-webhook]#docker images|grep image-policy-webhook
image-policy-webhook latest 331d1c0b42d8 18 seconds ago 936MB启动容器:
docker run -d -u root --nameimage-policy-webhook \
-v $PWD/webhook.pem:/data/www/webhook.pem \
-v $PWD/webhook-key.pem:/data/www/webhook-key.pem \
-e PYTHONUNBUFFERED1 -p 8081:8080 \
image-policy-webhook#注意这里的证书文件是放置在/root下的
#注意课件里宿主机端口用的是8080但自己宿主机8080端口被nodeCache占用了因此这里使用8081.[rootk8s-node1 ~]#docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7145eb5dfa6d image-policy-webhook /bin/sh -c python … 5 seconds ago Up 4 seconds 0.0.0.0:8081-8080/tcp, :::8081-8080/tcp image-policy-webhook
[rootk8s-node1 ~]#docker logs 7145eb5dfa6d* Serving Flask app main* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on all addresses (0.0.0.0)* Running on https://127.0.0.1:8080* Running on https://172.17.0.2:8080
Press CTRLC to quit
[rootk8s-node1 ~]#3、启用准入控制插件
[rootk8s-master1 ~]#vim /etc/kubernetes/manifests/kube-apiserver.yaml - --enable-admission-pluginsNodeRestriction,ImagePolicyWebhook - --admission-control-config-file/etc/kubernetes/image-policy/admission_configuration.yaml……- mountPath: /etc/kubernetes/image-policyname: image-policyreadOnly: true…… - hostPath:path: /etc/kubernetes/image-policytype: DirectoryOrCreatename: image-policy报错退出此时可以看到静态pod kube-apiserver-k8s-master1发生重启了。
4、测试
在k8s-node1上持续查看容器image-policy的日志
[rootk8s-node1 ~]#docker logs -f image-policy-webhook创建不带tag的deployment资源测试
[rootk8s-master1 image-policy]#kubectl create deployment web-no-tag --imagenginx
deployment.apps/web-no-tag created
[rootk8s-master1 image-policy]#kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
web-no-tag 0/1 0 0 10s
[rootk8s-master1 image-policy]#kubectl describe replicaset web-no-tag-78bd59988f创建tag的deployment资源测试
[rootk8s-master1 image-policy]#kubectl create deployment web-with-tag --imagenginx:1.16
deployment.apps/web-with-tag created
[rootk8s-master1 image-policy]#kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
web-no-tag 0/1 0 0 2m45s
web-with-tag 1/1 1 1 6s带有tag的镜像会被成功创建不带tag的镜像会被ImagePolicyWebhook拒绝符合预期。
测试结束。
关于我
我的博客主旨
排版美观语言精炼文档即手册步骤明细拒绝埋坑提供源码本人实战文档都是亲测成功的各位小伙伴在实际操作过程中如有什么疑问可随时联系本人帮您解决问题让我们一起进步 微信二维码 x2675263825 舍得 qq2675263825。 微信公众号 《云原生架构师实战》 语雀
https://www.yuque.com/xyy-onlyone csdn https://blog.csdn.net/weixin_39246554?spm1010.2135.3001.5421 知乎 https://www.zhihu.com/people/foryouone 最后
好了关于本次就到这里了感谢大家阅读最后祝大家生活快乐每天都过的有意义哦我们下期见