当前位置:   article > 正文

云原生应用安全保障三部曲【上】_云原生安全

云原生安全

本文来自极狐GitLab 资源中心。原文链接:https://resources.gitlab.cn/articles/e9bdf136-2810-4a0a-88b0-e56e0b4f338b。

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channel=content&utm_source=csdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。

更多关于极狐GitLab :https://gitlab.cn 或者 DevOps 的最佳实践,可以关注文末的极狐GitLab 公众号。

Docker 的出现改变了应用程序的运行方式与交付模式:应用程序运行在容器内而软件的交付变成了容器镜像的交付。随着这几年云原生的火热,容器的采用率也是逐年上升。根据 Anchore 发布的《Anchore 2021 年软件供应链安全报告》显示容器的采用成熟度已经非常高了,65% 的受访者表示已经在重度使用容器了,而其他 35% 表示也已经开始了对容器的使用:

在这里插入图片描述

但是容器的安全问题却不容乐观,这个可以在公众号文章极狐GitLab DevSecOps 七剑下天山之容器镜像安全扫描查看详情。

由于容器是由容器镜像生成的,如何保证容器的安全,在很大程度上取决于如何保证容器镜像的安全。而对于容器镜像安全的保证,可以秉承预防为主,防治结合的理念来进行。所谓防,就是要在编写 Dockerfle 的时候,遵循最佳实践来编写安全的 Dockerfile;还要采用安全的方式来构建容器镜像;所谓治,既要使用容器镜像扫描,又要将扫描流程嵌入到 CI/CD 中,如果镜像扫描出漏洞,则应该立即终止 CI/CD Pipeline,并反馈至相关人员,进行修复后重新触发 CI/CD Pipeline。

下面就从即防又治的角度来讲述如何确保容器镜像安全。

遵从最佳实践,编写 Dockerfile

选择合适的基础镜像

Dockerfile 的第一句通常都是FROM some_image,也就是基于某一个基础镜像来构建自己所需的业务镜像,基础镜像通常是应用程序运行所需的语言环境,比如 Go、Java、PHP 等,对于某一种语言环境,一般是有多个版本的。以 Golang 为例,即有golang:1.12.9,也有 golang:1.12.9-alpine3.9,不同版本除了有镜像体积大小的区别,也会有安全漏洞数量之别。上述两种镜像的体积大小以及所包含的漏洞数量(用 trivy 扫描)对比如下:

在这里插入图片描述

可以看到 golang:1.12.9-alpine3.9比 golang:1.12.9有更小的镜像体积(351MB vs 814MB),更少的漏洞数量(24 vs 1306)。所以,在选取基础镜像的时候,要做出正确选择,不仅能够缩小容器镜像体积,节省镜像仓库的存储成本,还能够减少漏洞数量,缩小受攻击面,提高安全性。

以非 root 用户启动容器

在 Linux 系统中,root 用户意味着超级权限,能够很方便的管理很多事情,但是同时带来的潜在威胁也是巨大的,用 root 身份执行的破坏行动,其后果是灾难性的。在容器中也是一样,需要以非 root 的身份运行容器,通过限制用户的操作权限来保证容器以及运行在其内的应用程序的安全性。在 Dockerfile 中可以通过添加如下的命令来以非 root 的身份启动并运行容器:

RUN addgroup -S jh && adduser -S devsecops -G j

USER devsecops
  • 1
  • 2
  • 3

上述命令创建了一个名为 jh的 Group,一个名为devsecops的用户,并将用户 devsecops 添加到了 jh Group 下,最后以 devsecops启动容器。

sysdig 发布的《Sysdig 2021 年容器安全和使用报告》中显示,58% 的容器在以 root 用户运行。足以看出,这一点并未得到广泛的重视。

不安装非必要的软件包

很多用户在是编写 Dockerfile 的时候,习惯了直接写 apt-get update && apt-get install xxx,网上也有很多这样的例子(包括 GitHub)。用户需要清楚 xxx 这个包是否真的要用,否则这种情况会造成镜像体积的变大以及受攻击面的增加。

以 ubuntu:20.04 为例来演示安装 vim curl telnet 这三个常用软件包,给镜像体积以及漏洞数量带来的影响:

在这里插入图片描述

可以看出,因为安装了 vim curl telnet这三个常见的软件包,导致镜像体积增加了一倍(从 72.4MB 到 158MB),漏洞数量翻了接近一番(从 60 到 119)。因此,在编写 Dockerfile 的时候,一定要搞清楚哪些包是必须安装的,而哪些包是非必需安装的。不要认为 apt-get install使用起来很爽就都安装。

针对其他操作系统的包管理器存在同样的问题,诸如 apk add,yum install 等。

采用多阶段构建

多阶段构建不仅能够对于容器镜像进行灵活的修改,还能够在很大程度上减小容器镜像体积,减少漏洞数量(这个第一点有异曲同工之妙)。

选择来源可靠且经常更新的镜像

由于镜像构建的灵活性和便捷性,任何一个人都可以构建容器镜像并推送至 Dockerhub 供其他人使用。所以在搜索某一个镜像的时候,会出现很多类似的结果,这时候就需要仔细辨别:镜像是否有官方提供的,镜像是否一直有更新,镜像是否可以找到对应的 Dockerfile 来查看到底是如何构建的。信息不全且长时间无更新的镜像,其安全性无法得到保证,不应该使用此类镜像,这时候可以选择自己使用这些规则来构建可用的安全景象。

当然,除此以外,还有很多编写 Dockerfile 的最佳时间,诸如不要把敏感信息编写在 Dockerfile 并构建在镜像中,避免敏感信息造成泄漏;要用工具(如 Hadolint)来对 Dockerfile 进行扫描,以发现 Dockerfile 编写过程中的一些问题等等。

良好的 Dockerfile 编写习惯是保证容器镜像安全的第一步,接下来还需要用安全的方式来构建容器镜像。

学习极狐GitLab 的相关资料:

  1. 极狐GitLab 官网:https://gitlab.cn
  2. 极狐GitLab 官网文档:https://docs.gitlab.cn
  3. 极狐GitLab 论坛:https://forum.gitlab.cn/
  4. 极狐GitLab 安装配置:https://gitlab.cn/install

搜索【极狐GitLab】公众号,后台输入加群,备注gitlab,即可加入官方微信技术交流群。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/983730
推荐阅读
相关标签
  

闽ICP备14008679号