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


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

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

    基于镜像部署应用

    1. 执行命令下载文件。
    $ git clone https://github.com/liuxiaoyu-git/sample-blog-for-rhacs-tutorial.git
    $ SAMPLE_PATH=$PWD/sample-blog-for-rhacs-tutorial
    
    • 1
    • 2
    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
    • 2
    • 3
    1. 然后根据 Dockerfile 创建 nginx 镜像。
    $ oc new-project sample-blog
    $ oc new-build --name=nginx --strategy=docker --binary
    $ oc start-build nginx --from-dir=. --follow
    
    • 1
    • 2
    • 3
    1. 确认 django/Dockerfile 是基于 docker.io/python:3.9 镜像构建的。
    $ cd $SAMPLE_PATH/default/docker/django/
    $ more Dockerfile | grep FROM
    FROM docker.io/python:3.9
    
    • 1
    • 2
    • 3
    1. 然后根据 Dockerfile 创建 django 镜像。
    $ oc new-build --name=django --strategy=docker --binary
    $ oc start-build django --from-dir=. --follow
    
    • 1
    • 2
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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
    • 2
    • 3
    • 4
    • 5
    1. 执行命令创建 Deployment、Service、Route 等资源。
    $ ./entrypoint.sh
    $ oc apply -k .
    
    • 1
    • 2
    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
    • 2
    • 3
    • 4
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    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
    • 2
    • 3
    • 4
    • 5
    1. 另外确认在以上部署中新建了对应的 secret 或 configmap 替换了原有的明文,同时还使用了新建的 ServiceAccount 替换了项目级 default sa。
    2. 执行命令,根据新的配置更新应用资源。
    $ oc delete -k $SAMPLE_PATH/default/k8s/base/ 
    $ ./entrypoint.sh
    $ oc apply -k .
    
    • 1
    • 2
    • 3

    安全风险修复结果

    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

  • 相关阅读:
    Sevlet规范:HttpServlet类 和 HttpServletRequest接口 源码解析
    Zookeeper配置启动教程
    数据结构与算法----详解二叉树的遍历(迭代、递归)
    AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)
    Atcoder TUPC 2023(東北大学プログラミングコンテスト 2023)P. Sub Brackets(dinic 二分图最大独立集)
    oak深度相机入门教程-行人识别
    前端框架纯js版本
    探究Spring Boot中@PostConstruct注解的使用场景
    【JavaWeb】案例一:记录用户的上次访问时间
    Ubuntu宝塔显示磁盘被占满的解决方法
  • 原文地址:https://blog.csdn.net/weixin_43902588/article/details/126610545