OpenShift Security (19) - 用红帽官方镜像加固云原生应用安全(视频)

89 篇文章 3 订阅
76 篇文章 6 订阅

OpenShift 4.x HOL教程汇总
文本已在 OpenShift 4.15 + RHACS 4.4.3 环境中进行验证。


在进行以下操作前请安装 RHACS 环境。

基于镜像部署应用

  1. 执行命令下载文件。
$ git clone https://github.com/liuxiaoyu-git/sample-blog-for-rhacs-tutorial.git
$ SAMPLE_PATH=$PWD/sample-blog-for-rhacs-tutorial
  1. 确认 nginx/Dockerfile 是基于 docker.io/nginx:1.20 镜像构建的。
$ cd $SAMPLE_PATH/default/docker/nginx/
$ more Dockerfile | grep FROM
FROM docker.io/nginx:1.20
  1. 然后根据 Dockerfile 创建 nginx 镜像。
$ oc new-project sample-blog
$ oc new-build --name=nginx --strategy=docker --binary
$ oc start-build nginx --from-dir=. --follow
  1. 确认 django/Dockerfile 是基于 docker.io/python:3.9 镜像构建的。
$ cd $SAMPLE_PATH/default/docker/django/
$ more Dockerfile | grep FROM
FROM docker.io/python:3.9.16
  1. 然后根据 Dockerfile 创建 django 镜像。
$ oc new-build --name=django --strategy=docker --binary
$ oc start-build django --from-dir=. --follow
  1. 查看生成的 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
  1. 确认此时 RHACS 中的 IMAGES 中查不到和 sample-blog 相关的 Image,这说明在 OpenShift 内部 ImageRegistry 中的镜像是不会被 RHACS 扫描的,直到它被部署运行起来。
    在这里插入图片描述
  2. 运行以下命令,分别使用 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
  1. 执行命令创建 Deployment、Service、Route 等资源。
$ ./entrypoint.sh
$ oc apply -k .
  1. 在完成后可在 OpenShift 的开发者视图的 “拓扑” 中确认部署到的应用资源。
    在这里插入图片描述

使用 RHACS 分析安全风险

注意:扫描到的 CVE 有可能随时间变化。

  1. 在 RHACS 的 Dashborad 中可以看到以下两部分:风险最高的 Image 和 Deployment。
    在这里插入图片描述
  2. 点击进入 Images at the most risk 的 View all 按钮,可以看到在下面 IMAGES 页面中前 4 个是上面用到的 Image。镜像包含了数量不等的 CVE 和 Fixable CVE。
    在这里插入图片描述
  3. 进入 RHACS 的 Violations 菜单,按照 Severity 排序,可以看到前 6 个 High 级别的违规都和刚刚部署的应用资源相关。
    在这里插入图片描述
  4. 依次查看上图中 2 个违规涉及到的 Policy,主要有以下 2 类:1)镜像包含 CVE 漏洞,2)部署包含 PASSWORD 敏感信息。
    在这里插入图片描述
    在这里插入图片描述
  5. 在 Violation 说明的 Deployment 栏中可查看涉及到的相关镜像。例如以下 docker.io/mysql:8.0.26 镜像包含的 Critical 级别 CVE。
    在这里插入图片描述
  6. 另外,在违规中还有违反 No resource requests or limits specified、Pod Service Account Token Automatically Mounted 等 Policy 的项目。
    在这里插入图片描述
    在这里插入图片描述

修复安全风险

  1. 确认新的 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
  1. 重新根据新的 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
  1. 查看构建的 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
  1. 查看以下 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
  1. 另外确认在以上部署中新建了对应的 secret 或 configmap 替换了原有的明文,同时还使用了新建的 ServiceAccount 替换了项目级 default sa。
  2. 执行命令,根据新的配置更新应用资源。
$ oc delete -k $SAMPLE_PATH/default/k8s/base/ 
$ ./entrypoint.sh
$ oc apply -k .

安全风险修复结果

  1. 在 Violations 中可以看到只有 1 个 High 级别违规了,确认是 registry.redhat.io/rhel8/mysql-80 镜像引起的。
    在这里插入图片描述
  2. 在 access.redhat.com 网站查找 rhel8/mysql-80 镜像,确认其中确实包含一个 Important 的 CVE,编号为:RHSA-2022:8638。
    在这里插入图片描述

演示视频

参考

https://qiita.com/shin7446/items/e0aeb58625b4586274f7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值