《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.8环境中验证

文章目录

  • 配置签名环境
    • 安装镜像签名的Operator
    • 为集群指定签名用的 sigstore
  • 测试验证
    • 使用未签名的镜像
    • 运行为签名镜像
    • 对本地镜像签名
  • 参考

本文先安装镜像签名 Operator,然后将 docker.io 的镜像导入到 OpenShift 本地,在强制 docker.io 的镜像必须签名。最后使用对来 docker.io 的本地进行签名并运行。

配置签名环境

安装镜像签名的Operator

  1. 执行命令下载配置文件
$ git clone https://github.com/liuxiaoyu-git/image-scanning-signing-service.git
$ cd image-scanning-signing-service
  1. 为一个worker节点打标签,让它作为运行签名的节点
$ WORKER="$(oc get nodes -l node-role.kubernetes.io/worker --no-headers -o custom-columns=":metadata.name" | head -1)"
$ echo ${WORKER}
$ oc label node ${WORKER} type=builder
  1. 查看所有worker节点状态,确认都变成“UPDATED”状态。
$ oc get machineconfigpool -w
NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
master   rendered-master-268f75295029d9dbe6755043c42427b3   True      False      False      3              3                   3                     0                      9d
worker   rendered-worker-8dac6881264caab39329d54ab649abbd   True      False      False      2              2                   2                     0                      9d
  1. 创建项目,然后部署 Operator 、签名store及其相关资源。
oc new-project image-management
oc apply -f deploy/crds/imagesigningrequests.cop.redhat.com_imagesigningrequests_crd.yaml
oc apply -f deploy/service_account.yaml
oc apply -f deploy/role.yaml
oc apply -f deploy/role_binding.yaml
oc apply -f deploy/scc.yaml
oc apply -f deploy/secret.yaml
oc apply -f deploy/lab_extras/operator.yaml
oc apply -f deploy/lab_extras/sigstore.yaml
  1. 查看部署的pod已经运行。
$ oc get pod -n image-management
NAME                              READY   STATUS      RESTARTS   AGE
image-security-6b9bb96765-4hlp5   1/1     Running     0          21s
sigstore-1-deploy                 0/1     Completed   0          18s
sigstore-1-wh7sj                  1/1     Running     0          16s

为集群指定签名用的 sigstore

  1. 获取sigstore的访问route的地址。
$ ROUTE=http://$(oc get route sigstore -o jsonpath='{..spec.host}' -n image-management)
  1. $ROUTE 的内容替换 deploy/lab_extras/registry-conf.yaml 文件中的 {{replace_with_sigstore_route}} 部分。
  2. deploy/lab_extras/registry-conf.yaml 文件内容进行 base64 编码。
$ base64 deploy/lab_extras/registry-conf.yaml -w 0
ZG9ja2VyOgogICAgIGRvY2tlci5pbzoKICAgICAgICAgc2lnc3RvcmU6IGh0dHA6Ly9zaWdzdG9yZS1pbWFnZS1tYW5hZ2VtZW50LmFwcHMuY2x1c3Rlci04ZDM1LjhkMzUuc2FuZGJveDE0MjAub3BlbnRsYy5jb20gCg==
  1. 用上一步返回的字符串结果替换 deploy/lab_extras/trust-machineconifg.yaml 文件中的 {{token}} 部分。
  2. 执行命令更新 worker节点,然后查看 worker 的 machineconfigpools 的状态,直到 READYMACHINECOUNT 状态都恢复成正常数量。
$ oc apply -f deploy/lab_extras/trust-machineconifg.yaml
$ oc get machineconfigpool worker -w
NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
worker   rendered-worker-8dac6881264caab39329d54ab649abbd   False     True       False      2              0                   0                     0                      9d
worker   rendered-worker-8dac6881264caab39329d54ab649abbd   False     True       False      2              1                   1                     0                      9d
worker   rendered-worker-8dac6881264caab39329d54ab649abbd   False     True       False      2              1                   1                     0                      9d
worker   rendered-worker-d977c1330ccf9a645aca738a56abe8af   True      False      False      2              2                   2                     0                      9d

测试验证

使用未签名的镜像

  1. 进入一个 worker 节点。
$ WORKER="$(oc get nodes -l node-role.kubernetes.io/worker --no-headers -o custom-columns=":metadata.name" | head -1)"
$ oc debug node/${WORKER}
Starting pod/ip-10-0-156-171us-east-2computeinternal-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.156.171
If you don't see a command prompt, try pressing enter.
sh-4.4# chroot /host
  1. 查看 /etc/containers/policy.json 和 /etc/containers/registries.d/docker.io.yaml 文件内容,其中包含“docker.io”和“sigstore”相关内容。
sh-4.4# cat /etc/containers/policy.json
{"default": [{"type": "insecureAcceptAnything"}],"transports": {"docker": {"docker.io": [{"type": "signedBy","keyType": "GPGKeys","keyPath": "/root/pubkey.gpg"}
]
},"docker-daemon": {"": [{"type": "insecureAcceptAnything"}
]
}}
} sh-4.4# cat /etc/containers/registries.d/docker.io.yaml
docker:docker.io:sigstore: http://sigstore-image-management.apps.cluster-8d35.8d35.sandbox1420.opentlc.com
  1. 从 “docker.io” 拉镜像,确认提示“** A signature was required, but no signature exists**”。
sh-4.4# podman pull docker.io/library/mysql
Trying to pull docker.io/library/mysql:latest...
Error: Source image rejected: A signature was required, but no signature exists
  1. 退出 worker
sh-4.4# exit

运行为签名镜像

  1. 创建新项目,然后将来自 “docker.io” 的镜像测试镜像导入到本地,最后基于它创建新应用。
$ oc new-project nginx-test
$ oc import-image nginx --from="docker.io/nginxinc/nginx-unprivileged" --confirm -n nginx-test
$ oc new-app nginx -n nginx-test
  1. 查看应用 pod 状态,确认是“ImagePullBackOff” 状态
$ oc get pod -n nginx-test
NAME                    READY   STATUS             RESTARTS   AGE
nginx-9dd546c49-wp682   0/1     ImagePullBackOff   0          25s
  1. 查看上一步的 pod 的状态,确认在 Events 中提示“image rejected: A signature was required, but no signature exists”。
$ oc describe pod nginx-9dd546c49-wp682 -n nginx-test
。。。。
Events:Type     Reason          Age                 From               Message----     ------          ----                ----               -------Normal   Scheduled       109s                default-scheduler  Successfully assigned nginx-test/nginx-9dd546c49-wp682 to ip-10-0-170-27.us-east-2.compute.internalNormal   AddedInterface  108s                multus             Add eth0 [10.131.0.18/23] from openshift-sdnWarning  Failed          30s (x6 over 107s)  kubelet            Error: ImagePullBackOffNormal   Pulling         15s (x4 over 108s)  kubelet            Pulling image "docker.io/nginxinc/nginx-unprivileged@sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052"Warning  Failed          15s (x4 over 108s)  kubelet            Failed to pull image "docker.io/nginxinc/nginx-unprivileged@sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052": rpc error: code = Unknown desc = Source image rejected: A signature was required, but no signature existsWarning  Failed          15s (x4 over 108s)  kubelet            Error: ErrImagePullNormal   BackOff         1s (x7 over 107s)   kubelet            Back-off pulling image "docker.io/nginxinc/nginx-unprivileged@sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052"

对本地镜像签名

  1. 查看 deploy/lab_extras/signing-request.yaml 文件内容,它发出对名为 “nginx:latest” 的 ImageStreamTag 的镜像进行签名的请求。
$ more deploy/lab_extras/signing-request.yaml
apiVersion: imagesigningrequests.cop.redhat.com/v1alpha1
kind: ImageSigningRequest
metadata:name: nginx-1
spec:containerImage:kind: ImageStreamTagname: nginx:latest
$ oc apply -f deploy/lab_extras/signing-request.yaml -n nginx-test
  1. 查看 image-management 的 pod, 然后查看名称随机生成的 pod 日志,
$ oc get pod -n image-management
NAME                                   READY   STATUS      RESTARTS   AGE
c3b5f7ff-d047-4f62-a0eb-c57a469cbfab   0/1     Completed   0          57s
image-security-6b9bb96765-hvnvr        1/1     Running     0          9m26s
sigstore-1-m2cq7                       1/1     Running     0          13m
$ oc logs -f c3b5f7ff-d047-4f62-a0eb-c57a469cbfab -n image-management
time="2021-11-12T14:28:15Z" level=error msg="unable to write system event: \"write unixgram @00016->/run/systemd/journal/socket: sendmsg: no such file or directory\""
Trying to pull docker.io/nginxinc/nginx-unprivileged@sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052...
Getting image source signatures
Copying blob sha256:54247d3512a9e6bc95687e0b652e10044079c9bbf7af9d69fa1d428e41bff84f
Copying blob sha256:0f7e43c994f13c51289d21fc1a72d13fed47631a99ce7b524dfe8d1a45958477
Copying blob sha256:052722e881c1465eb58c9ac2bafc164a254188c9f06bd0933d99757ec992fc00
Copying blob sha256:a330b6cecb98cd2425fd25fce36669073f593b3176b4ee14731e48c05d678cdd
Copying blob sha256:96bc90d52cf2f2f47520455d64faad604a264bcaa579617419087d59b9f84461
Copying blob sha256:3aeee11385fd3301401d6e72c873fcbb9e7dc1a486e793d76d62b0034a27ac3a
Copying blob sha256:5885822443274cc7a636331e79ae9909810cfbe9344c1b93abfc8a78b9e35a3a
Copying config sha256:9f271e225e01a0a3868f080ae7cfaf36a957a79f8141c96c5604352e9629729e
Writing manifest to image destination
Storing signatures
9f271e225e01a0a3868f080ae7cfaf36a957a79f8141c96c5604352e9629729e
Untagged: docker.io/nginxinc/nginx-unprivileged@sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052
Deleted: 9f271e225e01a0a3868f080ae7cfaf36a957a79f8141c96c5604352e9629729e
  1. 查看签名请求对象,其中在 “status” 中有 “message: Image Signed” 。
$ oc get imagesigningrequests nginx-1 -o yaml -n nginx-test
。。。
status:conditions:- lastTransitionTime: 2021-11-12 14:27:51.956766002 +0000 UTC m=+487.950431898message: Signing Pod Launched 'image-management/c3b5f7ff-d047-4f62-a0eb-c57a469cbfab'status: "True"type: Initialization- lastTransitionTime: 2021-11-12 14:28:41.161360642 +0000 UTC m=+537.155026498message: Image Signedstatus: "True"type: FinishedendTime: 2021-11-12 14:28:41.161360642 +0000 UTC m=+537.155026498phase: CompletedsignedImage: sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052startTime: 2021-11-12 14:27:51.956766002 +0000 UTC m=+487.950431898unsignedImage: sha256:ed41d4160dd6bf386f5e611a44f6d5467c83e26bb131b459a34459fc5a42e052
  1. 再次查看 nginx-test 项目中的 pod,确认现在是 Running 状态了。如果没有自动部署,可以重新部署一次。
$ oc get pod -n nginx-test
NAME                    READY   STATUS    RESTARTS   AGE
nginx-9dd546c49-wp682   1/1     Running   0          9m28s
$ oc rollout restart deployment/nginx
deployment.apps/nginx restarted
  1. 可以用浏览器访问“${ROUTE}/nginxinc”,其中包含签名用的“sigstore”文件。

参考

https://github.com/RedHatDemos/SecurityDemos/blob/master/2021Labs/OpenShiftSecurity/documentation/lab5.adoc
https://github.com/redhat-cop/image-scanning-signing-service.git
https://access.redhat.com/verify-images-ocp4

OpenShift 4 - 为集群配置镜像签名功能,只能运行被签名的本地镜像相关推荐

  1. RedHat AS4-U2下Mysql 5.0的集群配置

    最近看到过很多关于cluster的资料,一直在研究linux系统级的负载均衡和高可用,但是还没有完全成功,只是实现了一些简单的服务:今天在搜集资料中看到有关mysql的cluster,看上去不是很复杂 ...

  2. RabbitMQ 镜像集群配置_05

    接上一篇:(企业级) RabbitMQ 普通集群配置_04 文章目录 一.RabbitMQ 策略实战 1. 创建RabbitMQ 策略 2. ly-01节点查看创建RabbitMQ 策略 3. 登录l ...

  3. RabbitMQ(三) 集群配置

    RabbitMQ--集群配置 之前不管是搞Redis.SQL.Mongo还是其他的东西,一律都没说过集群要怎么搞,电脑实在是带不动.说透彻点就是懒,懒得搭也懒得写,今日深刻意识到错误,做学问是不能懒的 ...

  4. RabbitMQ 普通集群配置_04

    接上一篇:(企业级) 搭建集群 RabbitMQ SHELL脚本实战_03 文章目录 RabbiMQ简介 RabbiMQ模式 RabbiMQ特点 环境部署总览 一.基础配置及RabbitMQ 安装 1 ...

  5. OpenShift 4 - 在集群节点用crictl对Pod/Image/Container进行操作

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 查看crictl命令的配置文件 用crictl命令操作Pod/Image/C ...

  6. OpenShift 4 - 设置集群节点和Pod容器的时间和时区

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 OpenShift的时间和时区 节点和容器的时间 节点和容器的时区 节点时间 ...

  7. 分布式业务Redis安装与集群配置

    Redis在百度百科里的解释:Redis是一个开源的使用ANSI  C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,包括C#.Java.PHP等等 ...

  8. Apache Hadoop3.x 分布式集群配置安装

    文章目录 一.前提说明 二.准备工作 三.开始 1 安装虚拟机 2 Hadoop运行环境搭建 2.1 ping 2.2 安装软件 2.3 关闭防火墙 2.4 创建普通用户 2.5修改虚拟机IP为静态 ...

  9. Linux ANSYS Fluent计算集群配置

    目录 0 Linux系统及ANSYS版本 1 Linux系统安装及相关配置 1.1 系统安装 1.2 CentOS 配置ntfs挂载 1.3 SSH相关配置 2 ANSYS 安装 3 实际计算操作及相 ...

最新文章

  1. python遍历目录_Python遍历目录的4种方法
  2. DotNET多线程使用初探
  3. The Last Non-zero Digit POJ - 1150(n!mod p)
  4. java se程序设计课后答案,JAVA SE程序设计及实践
  5. Ubuntu下安装配置VIM/GVIM(GUI-Vim)
  6. python文件名带日期变量,获取日期并将其另存为文件名python
  7. vue3 src/main.js文件配置
  8. ISP PIPLINE (六) AWB
  9. 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架
  10. mac 修改pip镜像为国内镜像
  11. linux rpm解压命令,LINUX下各种解压命令收藏
  12. excel转置怎么操作_EXCEL/WPS如何快速将一行转置成一列,一列转置成一行?
  13. Loongson_灵珑9S2A 逸珑8089 3B1500龙芯电脑的使用感触
  14. 速记计算机键盘,键盘字母排列的速记公式
  15. 工业品微营销时代_做网络营销_原创有价值的文章更容易带来流量 上海添力
  16. 【kimol君的无聊小发明】—用python写图片下载器
  17. 计算机考研报录比10比1,2020考研报录比高达10:1!2021择校应避开哪些重灾区?
  18. ubuntu18.04设置清华镜像源
  19. 全国高校人工智能高级研修班正式启动招募,互动式教学期待你的加入
  20. NodeJs的安装与配置(安装包)

热门文章

  1. iphone个系列尺寸_iPhone“立体边框”壁纸来了,拥有3D效果
  2. 还不会动效?优秀的可临摹素材,给你做个示范
  3. TSCAN算法matlab,使用TscanCode和scan-build进行静态分析
  4. 单元测试的编写(asp.net) (VS2017)
  5. 地震射线追踪与有限差分正演模拟小软件
  6. GCC(-pg) profile mcount | ftrace基础原理
  7. Linux内核深入理解中断和异常(5):外部中断
  8. Linux网络协议指令:ifconfig/netstat(net-tools)工具 .vs. iproute2
  9. CentOS7在/etc/grub2.conf引导中配置1G大页内存
  10. Vector Packet Processing(VPP) (一)简介