容器安全之dockerfile安全扫描(代码片段)

自由早晚乱余生 自由早晚乱余生     2023-03-29     657

关键词:

一、Dockerfile 扫描工具

  • checkov
  • hadolint(构建最佳实践Docker 镜像。)
  • 也可以考虑 docker scan

二、checkov

Dockerfile Configuration Scaning-checkov

checkov 不仅可以扫描dockfile, 也可以扫描 CloudformationAWS SAMKubernetesHelm chartsKustomize 、镜像等。

Checkov 支持对 Dockerfile 文件的策略进行评估。 使用 checkov 扫描包含 Dockerfile 的目录时,它将验证该文件是否符合 Docker 最佳实践,例如不使用 root 用户、确保运行状况检查存在以及不公开 SSH 端口。

可以在此处找到 Dockerfile 策略检查的完整列表。

2.1、示例配置错误的 Dockerfile

FROM node:alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000 22
HEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1
USER root
CMD ["node","app.js"]

2.2、安装

Requirements

  • Python >= 3.7 (Data classes are available for Python 3.7+)
  • Terraform >= 0.12
pip3 install checkov   -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

2.3、在 CLI 中运行

checkov -d . --framework dockerfile

2.4、示例输出

# checkov -d . --framework dockerfile
[ dockerfile framework ]: 100%|████████████████████|[1/1], Current File Scanned=..\\..\\..\\..\\Dockerfile


       _               _
   ___| |__   ___  ___| | _______   __
  / __| \'_ \\ / _ \\/ __| |/ / _ \\ \\ / /
 | (__| | | |  __/ (__|   < (_) \\ V /
  \\___|_| |_|\\___|\\___|_|\\_\\___/ \\_/

By bridgecrew.io | version: 2.3.102
Update available 2.3.102 -> 2.3.121
Run pip3 install -U checkov to update


dockerfile scan results:

Passed checks: 21, Failed checks: 2, Skipped checks: 0

Check: CKV_DOCKER_11: "Ensure From Alias are unique for multistage builds."
        PASSED for resource: /Dockerfile.
        File: /Dockerfile:1-9
        Guide: https://docs.bridgecrew.io/docs/ensure-docker-from-alias-is-unique-for-multistage-builds
Check: CKV_DOCKER_7: "Ensure the base image uses a non latest version tag"
        PASSED for resource: /Dockerfile.
        File: /Dockerfile:1-9
        Guide: https://docs.bridgecrew.io/docs/ensure-the-base-image-uses-a-non-latest-version-tag
Check: CKV_DOCKER_9: "Ensure that APT isn\'t used"
        PASSED for resource: /Dockerfile.
        File: /Dockerfile:1-9
        Guide: https://docs.bridgecrew.io/docs/ensure-docker-apt-is-not-used
Check: CKV_DOCKER_5: "Ensure update instructions are not use alone in the Dockerfile"
        PASSED for resource: /Dockerfile.
        File: /Dockerfile:1-9
        Guide: https://docs.bridgecrew.io/docs/ensure-update-instructions-are-not-used-alone-in-the-dockerfile
Check: CKV_DOCKER_10: "Ensure that WORKDIR values are absolute paths"
        PASSED for resource: /Dockerfile.
        File: /Dockerfile:1-9
        Guide: https://docs.bridgecrew.io/docs/ensure-docker-workdir-values-are-absolute-paths
Check: CKV_DOCKER_2: "Ensure that HEALTHCHECK instructions have been added to container images"
        PASSED for resource: /Dockerfile.HEALTHCHECK
        File: /Dockerfile:7-7
        Guide: https://docs.bridgecrew.io/docs/ensure-that-healthcheck-instructions-have-been-added-to-container-images
Check: CKV_DOCKER_3: "Ensure that a user for the container has been created"
        PASSED for resource: /Dockerfile.USER
        File: /Dockerfile:8-8
        Guide: https://docs.bridgecrew.io/docs/ensure-that-a-user-for-the-container-has-been-created
Check: CKV2_DOCKER_14: "Ensure that certificate validation isn\'t disabled for git by setting the environment variable \'GIT_SSL_NO_VERIFY\' to any value"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_6: "Ensure that certificate validation isn\'t disabled with the NODE_TLS_REJECT_UNAUTHORIZED environmnet variable"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_12: "Ensure that certificate validation isn\'t disabled for npm via the \'NPM_CONFIG_STRICT_SSL\' environmnet variable"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_5: "Ensure that certificate validation isn\'t disabled with the PYTHONHTTPSVERIFY environmnet variable"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_7: "Ensure that packages with untrusted or missing signatures are not used by apk via the \'--allow-untrusted\' option"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_11: "Ensure that the \'--force-yes\' option is not used, as it disables signature validation and allows packages to be downgraded which can leave the system in a broken or inconsistent state"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_8: "Ensure that packages with untrusted or missing signatures are not used by apt-get via the \'--allow-unauthenticated\' option"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_13: "Ensure that certificate validation isn\'t disabled for npm or yarn by setting the option strict-ssl to false"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_4: "Ensure that certificate validation isn\'t disabled with the pip \'--trusted-host\' option"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_10: "Ensure that packages with untrusted or missing signatures are not used by rpm via the \'--nodigest\', \'--nosignature\', \'--noverify\', or \'--nofiledigest\' options"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_2: "Ensure that certificate validation isn\'t disabled with curl"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_3: "Ensure that certificate validation isn\'t disabled with wget"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_1: "Ensure that sudo isn\'t used"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV2_DOCKER_9: "Ensure that packages with untrusted or missing GPG signatures are not used by dnf, tdnf, or yum via the \'--nogpgcheck\' option"
        PASSED for resource: /Dockerfile.RUN
        File: /Dockerfile:4-4
Check: CKV_DOCKER_1: "Ensure port 22 is not exposed"
        FAILED for resource: /Dockerfile.EXPOSE
        File: /Dockerfile:6-6
        Guide: https://docs.bridgecrew.io/docs/ensure-port-22-is-not-exposed

                6 | EXPOSE 3000 22

Check: CKV_DOCKER_8: "Ensure the last USER is not root"
        FAILED for resource: /Dockerfile.USER
        File: /Dockerfile:8-8
        Guide: https://docs.bridgecrew.io/docs/ensure-the-last-user-is-not-root

                8 | USER root

三、hadolint

GitHub - hadolint/hadolint: Dockerfile linter, validate inline bash, 用 Haskell 编写

3.1、在线网站

Dockerfile Linter (hadolint.github.io)

3.2、DockerFile

FROM node:alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000 22
HEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1
USER root
CMD ["node","app.js"]

3.3、基于容器运行

docker run --rm -i hadolint/hadolint < Dockerfile
# OR
docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfile

3.4、Centos 安装运行

[root@ops-pinpoint-123 tmp]# wget https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64
[root@ops-pinpoint-123 tmp]# chmod +x hadolint-Linux-x86_64
[root@ops-pinpoint-123 tmp]# hadolint-Linux-x86_64 ./Dockerfile
[root@ops-pinpoint-123 tmp]# ./hadolint-Linux-x86_64  /root/Dockerfile  
/root/Dockerfile:8 DL3002 warning: Last USER should not be root

我们可以发现 hadolint 扫描出来的是基于他特定的规则和最佳实践。

四、两者对比

我们前面进行检查的 Dockerfile 是一样的,我们发现两者给出来的信息还是有些差异的。

hadolint 检测出来的 USERROOT 的问题。 checkov 不仅检测出了 USERROOT 的问题, 还有一个 22 端口的问题。因为 22 端口一般都是我们 ssh 使用的端口,我们也不应该暴露出来。

并发编程-线程安全策略之并发容器(j.u.c)中的集合类(代码片段)

J.U.C总览脑图 同步容器: 并发容器 概述同步容器是通过synchronized来实现同步的,所以性能较差。而且同步容器也并不是绝对线程安全的,在一些特殊情况下也会出现线程不安全的行为。那么有没有更好的方式代替... 查看详情

云原生安全:trivy+harbor实现镜像漏洞的简单高效扫描(代码片段)

...题,在云原生领域同样如此。  云原生中的服务都是以容器的方式运行,而容器则是基于镜像启动,本篇文章则从“镜像”漏洞扫描来从“根本”去发现、解决云原生的“安全”问题。Trivy简介  Trivy是一种适用于CI的简单而... 查看详情

docker容器之dockerfile镜像(代码片段)

一.创建ssh镜像1.创建镜像目录2.创建编写dockerfile文件 3.生成镜像 4. 启动容器并修改root密码二. 构建Systemctl镜像1.创建镜像目录方便管理 2.创建编写dockerfile文件3. 生成镜像 4.启动容器,并挂载宿主机目录挂载到容器中ÿ... 查看详情

从零开始学多线程之构建快(代码片段)

.... 本篇博客将要讲解的知识点使用java提供的线程安全容器和同步工具.来构建线程安全的类.这些同步工具包括:同步容器、并发容器和阻塞队列. 开始 查看详情

dockerfile实战之部署python网站(代码片段)

Dockerfile实战之部署python网站一、创建python文件二、编写Dockerfile脚本三、创建镜像1.生成镜像2.查看镜像四、创建容器1.生成容器2.查看容器状态五、测试网站一、创建python文件#coding:utf8fromflaskimportFlaskapp=Flask(__name__)@app.route(\'/python... 查看详情

k8s:开源安全平台kubescape实现pod的安全合规检查/镜像漏洞扫描(代码片段)

...前面生产环境中的k8s集群安全不可忽略,即使是内网环境容器化的应用部署虽然本质上没有变化,始终是机器上的一个进程但是提高了安全问题的处理的复杂性分享一个开源的k8s集群安全合规检查/漏洞扫描工具kubescape博文内容... 查看详情

15.并发容器之concurrentlinkedqueue(代码片段)

 1.ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安... 查看详情

内网安全之:socks隧道(代码片段)

郑重声明:本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络... 查看详情

kubernetes安全策略:保护您的数据仓库并阻止黑客(代码片段)

...tes安全秘籍简介1.3.1配置Kubernetes对象的RBAC1.3.2使用安全的容器基础映像1.3.3配置Kubernetes的网络和策略1.3.4使用Kubernetes安全扫描器进行安全审计二、配置Kubernetes集群2.1Minikube安装2.1.1Minikube的安装步骤:2.2配置KubernetesRBAC2.2.1Kuber... 查看详情

云原生之docker实战使用dockerfile构建docker镜像(代码片段)

【云原生之Docker学习】使用Dockerfile构建docker镜像一、Docker镜像的分层架构1.镜像的分层示意图2.镜像的组成①.unionfilesystem②.镜像层——bootfs③.镜像层——rootfs④.镜像层——依赖环境⑤.容器层3.镜像的分层图示二、镜像与容器的... 查看详情

web安全之信息收集(代码片段)

...文件4.3确定网站采用的语言4.4前端框架4.5中间服务器4.6Web容器服务器4.7后端框架4.8CDN信息4.9探测有没有WAF4.10扫描敏感目录5.搜索引擎利用5.1搜索引擎如何运行5.2搜索技巧5.3快照5.4Github6.社会工程学6.1企业信息收集6.2人员信息收集6... 查看详情

并发容器和框架之concurrenthashmap(代码片段)

了解HashMap的人都知道HashMap是线程不安全的(多线程下的put方法达到一定大小,引发rehash,导致闭链,最终占满CPU),同时线程安全的HashTable效率又令人望而却步(每个方法都进行同步,效率低下),所以在这种情境下为并发而... 查看详情

servlet规范之安全(代码片段)

...tionFormBasedAuthenticationLoginFormNotesHTTPSClientAuthentication额外的容器认证机制服务器对认证信息的跟踪指定安全限制条件组合约束Example处理请求未被发现的HTTP协议方法安全约束配置的规则处理未被发现的HTTP方法默认策略LoginandLogoutWeb... 查看详情

java并发编程之工具类(代码片段)

...供了相应的支撑,与此同时,java还提供了一系列的并发容器和原子类,来使得并发编程更容易。一。并发容器(一)。同步容器同步容器指的是容器本身使用synchronized关键字来同步访问,包括我们都知道的HashTable,也包括Vector... 查看详情

docker容器之镜像管理,端口映射,容器互联(代码片段)

docker镜像的分层Dockerfile中的每个指令都会创建一个新的镜像层;镜像层将会被缓存和复用;当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;某一层的镜像缓存失效... 查看详情

dcoker之容器数据卷,以及定制镜像dockerfile配置与设置(代码片段)

容器数据卷(重要)1:cp命令平常数据在宿主机,如果单纯的获取宿主机的数据,可用cp命令,如:先启动一个nginx容器并在外部可以使用8800端口访问:dockercontainerrun-d-it--nametest_nginx-p8800:80nginx启动... 查看详情

k8s之docker容器的备份和容灾方案(代码片段)

...展之道。所以大家变得尤为重视。Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源;跨平台应用容器引擎服务。那么今天我们就讨论说说在kubernetes集群管理中Docker容器是如何备份、恢 查看详情

k8s之docker容器的备份和容灾方案(代码片段)

...展之道。所以大家变得尤为重视。Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源;跨平台应用容器引擎服务。那么今天我们就讨论说说在kubernetes集群管理中Docker容器是如何备份、恢 查看详情