《OpenShift 4.x HOL教程汇总》
文本已在 OpenShift 4.15 + RHACS 4.4.3 环境中进行验证。
在进行以下操作前请安装 RHACS 环境。
基于镜像部署应用
- 执行命令下载文件。
$ git clone https://github.com/liuxiaoyu-git/sample-blog-for-rhacs-tutorial.git
$ SAMPLE_PATH=$PWD/sample-blog-for-rhacs-tutorial
- 确认 nginx/Dockerfile 是基于 docker.io/nginx:1.20 镜像构建的。
$ cd $SAMPLE_PATH/default/docker/nginx/
$ more Dockerfile | grep FROM
FROM docker.io/nginx:1.20
- 然后根据 Dockerfile 创建 nginx 镜像。
$ oc new-project sample-blog
$ oc new-build --name=nginx --strategy=docker --binary
$ oc start-build nginx --from-dir=. --follow
- 确认 django/Dockerfile 是基于 docker.io/python:3.9 镜像构建的。
$ cd $SAMPLE_PATH/default/docker/django/
$ more Dockerfile | grep FROM
FROM docker.io/python:3.9.16
- 然后根据 Dockerfile 创建 django 镜像。
$ oc new-build --name=django --strategy=docker --binary
$ oc start-build django --from-dir=. --follow
- 查看生成的 ImageStream 和 Image,其中 Image 是保存在 OpenShift 内部 ImageRegistry 中的镜像,此时还没有部署运行在 OpenShift 中。
$ oc get is
NAME IMAGE REPOSITORY TAGS UPDATED
django image-registry.openshift-image-registry.svc:5000/sample-blog/django latest 2 minutes ago
nginx image-registry.openshift-image-registry.svc:5000/sample-blog/nginx latest 20 minutes ago
$ oc get image | grep sample-blog
sha256:11253e2ba01c6fc2a6857e19119df0aed272b3825d5ef6e7e4679ed166cf508b image-registry.openshift-image-registry.svc:5000/sample-blog/nginx@sha256:11253e2ba01c6fc2a6857e19119df0aed272b3825d5ef6e7e4679ed166cf508b
sha256:29a4d64a8e64b1c136ee834743ff0ada9a0ff80c12eca1d1ed6a5d8cdc2c9271 image-registry.openshift-image-registry.svc:5000/sample-blog/django@sha256:29a4d64a8e64b1c136ee834743ff0ada9a0ff80c12eca1d1ed6a5d8cdc2c9271
- 确认此时 RHACS 中的 IMAGES 中查不到和 sample-blog 相关的 Image,这说明在 OpenShift 内部 ImageRegistry 中的镜像是不会被 RHACS 扫描的,直到它被部署运行起来。
- 运行以下命令,分别使用 docker.io/mysql:8.0.26、docker.io/redis:6.0.8、image-registry.openshift-image-registry.svc:5000/sample-blog/django:latest 和 image-registry.openshift-image-registry.svc:5000/sample-blog/nginx:latest 镜像部署应用资源。
$ cd $SAMPLE_PATH/default/k8s/base/
$ more mysql-statefulset.yaml
$ more redis-statefulset.yaml
$ more nginx-deployment.yaml
$ more django-deployment.yaml
- 执行命令创建 Deployment、Service、Route 等资源。
$ ./entrypoint.sh
$ oc apply -k .
- 在完成后可在 OpenShift 的开发者视图的 “拓扑” 中确认部署到的应用资源。
使用 RHACS 分析安全风险
注意:扫描到的 CVE 有可能随时间变化。
- 在 RHACS 的 Dashborad 中可以看到以下两部分:风险最高的 Image 和 Deployment。
- 点击进入 Images at the most risk 的 View all 按钮,可以看到在下面 IMAGES 页面中前 4 个是上面用到的 Image。镜像包含了数量不等的 CVE 和 Fixable CVE。
- 进入 RHACS 的 Violations 菜单,按照 Severity 排序,可以看到前 6 个 High 级别的违规都和刚刚部署的应用资源相关。
- 依次查看上图中 2 个违规涉及到的 Policy,主要有以下 2 类:1)镜像包含 CVE 漏洞,2)部署包含 PASSWORD 敏感信息。
- 在 Violation 说明的 Deployment 栏中可查看涉及到的相关镜像。例如以下 docker.io/mysql:8.0.26 镜像包含的 Critical 级别 CVE。
- 另外,在违规中还有违反 No resource requests or limits specified、Pod Service Account Token Automatically Mounted 等 Policy 的项目。
修复安全风险
- 确认新的 Dockfile 中使用了来自 redhat 的容器镜像。
$ cat $SAMPLE_PATH/improved/docker/nginx/Dockerfile | grep FROM
FROM registry.access.redhat.com/ubi8/nginx-120
$ cat $SAMPLE_PATH/improved/docker/django/Dockerfile | grep FROM
FROM registry.access.redhat.com/ubi8/python-39
- 重新根据新的 Dockerfile 重新构建新版镜像。
$ cd $SAMPLE_PATH/improved/docker/nginx
$ oc new-build --name=nginx-2 --strategy=docker --binary --to=nginx:v0.1
$ oc start-build nginx-2 --from-dir=. --follow
$ cd $SAMPLE_PATH/improved/docker/django/
$ oc new-build --name=django-2 --strategy=docker --binary --to=django:v0.1
$ oc start-build django-2 --from-dir=. --follow
- 查看构建的 Image 和生成的 ImageStream,已经有新的镜像了。
$ oc get is
NAME IMAGE REPOSITORY TAGS UPDATED
django image-registry.openshift-image-registry.svc:5000/sample-blog/django v0.1,latest 51 seconds ago
nginx image-registry.openshift-image-registry.svc:5000/sample-blog/nginx v0.1,latest About a minute ago
$ oc get image | grep sample-blog
sha256:11253e2ba01c6fc2a6857e19119df0aed272b3825d5ef6e7e4679ed166cf508b image-registry.openshift-image-registry.svc:5000/sample-blog/nginx@sha256:11253e2ba01c6fc2a6857e19119df0aed272b3825d5ef6e7e4679ed166cf508b
sha256:9ad852a977eb8ec4ccb3b2ae1501ad9c45320194476e49c9a4f401ee7f9397c5 image-registry.openshift-image-registry.svc:5000/sample-blog/nginx@sha256:9ad852a977eb8ec4ccb3b2ae1501ad9c45320194476e49c9a4f401ee7f9397c5
sha256:29a4d64a8e64b1c136ee834743ff0ada9a0ff80c12eca1d1ed6a5d8cdc2c9271 image-registry.openshift-image-registry.svc:5000/sample-blog/django@sha256:29a4d64a8e64b1c136ee834743ff0ada9a0ff80c12eca1d1ed6a5d8cdc2c9271
sha256:332f648bc477789f86ac611d5d54d09daa394902f8b54659717b695b223452be image-registry.openshift-image-registry.svc:5000/sample-blog/django@sha256:332f648bc477789f86ac611d5d54d09daa394902f8b54659717b695b223452be
- 查看以下 4 个文件,确认 mysql 和 redis 部署将上面用到的 docker.io 镜像都换成了 Red Hat 的官方镜像,而 nginx 和 django 使用了 v0.1 版本的本地镜像。
$ cd $SAMPLE_PATH/improved/k8s/base/
$ more mysql-statefulset.yaml
$ more redis-statefulset.yaml
$ more django-deployment.yaml
$ more nginx-deployment.yaml
- 另外确认在以上部署中新建了对应的 secret 或 configmap 替换了原有的明文,同时还使用了新建的 ServiceAccount 替换了项目级 default sa。
- 执行命令,根据新的配置更新应用资源。
$ oc delete -k $SAMPLE_PATH/default/k8s/base/
$ ./entrypoint.sh
$ oc apply -k .
安全风险修复结果
- 在 Violations 中可以看到只有 1 个 High 级别违规了,确认是 registry.redhat.io/rhel8/mysql-80 镜像引起的。
- 在 access.redhat.com 网站查找 rhel8/mysql-80 镜像,确认其中确实包含一个 Important 的 CVE,编号为:RHSA-2022:8638。
演示视频
参考
https://qiita.com/shin7446/items/e0aeb58625b4586274f7