首页 > 其他分享 >Dockerfile静态扫描

Dockerfile静态扫描

时间:2023-07-12 15:13:41浏览次数:41  
标签:prisma checkov 静态 扫描 -- policy docker Dockerfile

我们的产物都是基于同一Dockerfile生成,因此我们需要保证这个底层Dockerfile的安全性
Dockerfile的写法有很多,我一般会采用最简单的方式,即Dockerfile什么都不处理直接RUN
# 主要是时区跟源的问题,我们需要重封一次
[root@jenkins-bj-ali-ql1 conf.d]# cat Dockerfile
FROM alpine:latest
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk add --no-cache tzdata tini \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \
    && echo Asia/Shanghai > /etc/timezone \
    && apk del tzdata
[root@jenkins-bj-ali-ql1 conf.d]# docker build -t golang:base .
[root@jenkins-bj-ali-ql1 conf.d]# cat goDockerfile
FROM golang:base

WORKDIR /app
COPY main .
COPY configs/ configs/
COPY templates/ templates/
ENTRYPOINT ["/sbin/tini", "--"]
CMD /app/main ${GO_OPTIONS}
alpine与distroless是推荐的两个最底层镜像,他们很精简,distroless2M,alpine5.57M,不过distroless是不包含任何bash的,没放处理意外情况
  • 为了职业生涯,建议用alpine
  • 为了技术研究,建议用distroless

Checkov安装

heckov 不仅可以扫描dockfile, 也可以扫描 Cloudformation、AWS SAM、Kubernetes、Helm charts、Kustomize 、镜像checkov 不仅可以扫描dockfile, 也可以扫描 Cloudformation、AWS SAM、Kubernetes、Helm charts、Kustomize 、镜像
https://www.checkov.io/1.Welcome/Quick Start.html
https://github.com/bridgecrewio/checkov

需要先安装python3.7以上版本

curl -O https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
tar -zxvf Python-3.9.0.tgz
cd Python-3.9.0 && ./configure prefix=/usr/local/python3
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
python3 --version

使用pip3直接安装checkov,大概需要半小时...

pip3 install --upgrade pip
pip3 install checkov -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
checkov -h

真的是支持巨多的扫描,这也是我们选用它的原因,后续的安全扫描我们直接复用checkov即可
image
还支持cyclonedx_json的输出,那看来在sbom扫描处我们也可以用他替换syft生成清单
image

扫描一下刚才的Dockerfile跟goDockerfile,只列出问题内容

[root@jenkins-bj-ali-ql1 conf.d]# checkov -f Dockerfile --framework dockerfile --quiet --compact --skip-results-upload
dockerfile scan results:

Passed checks: 19, Failed checks: 3, Skipped checks: 0

Check: CKV_DOCKER_7: "Ensure the base image uses a non latest version tag"
	FAILED for resource: Dockerfile.FROM
	File: Dockerfile:1-1
	Guide: https://docs.paloaltonetworks.com/content/techdocs/en_US/prisma/prisma-cloud/prisma-cloud-code-security-policy-reference/docker-policies/docker-policy-index/ensure-the-base-image-uses-a-non-latest-version-tag.html
Check: CKV_DOCKER_3: "Ensure that a user for the container has been created"
	FAILED for resource: Dockerfile.
	File: Dockerfile:1-6
	Guide: https://docs.paloaltonetworks.com/content/techdocs/en_US/prisma/prisma-cloud/prisma-cloud-code-security-policy-reference/docker-policies/docker-policy-index/ensure-that-a-user-for-the-container-has-been-created.html
Check: CKV_DOCKER_2: "Ensure that HEALTHCHECK instructions have been added to container images"
	FAILED for resource: Dockerfile.
	File: Dockerfile:1-6
	Guide: https://docs.paloaltonetworks.com/content/techdocs/en_US/prisma/prisma-cloud/prisma-cloud-code-security-policy-reference/docker-policies/docker-policy-index/ensure-that-healthcheck-instructions-have-been-added-to-container-images.html
[root@jenkins-bj-ali-ql1 cmd]# checkov -f Dockerfile --quiet --compact --skip-results-upload --framework dockerfile
dockerfile scan results:

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

Check: CKV_DOCKER_3: "Ensure that a user for the container has been created"
	FAILED for resource: Dockerfile.
	File: Dockerfile:1-8
	Guide: https://docs.paloaltonetworks.com/content/techdocs/en_US/prisma/prisma-cloud/prisma-cloud-code-security-policy-reference/docker-policies/docker-policy-index/ensure-that-a-user-for-the-container-has-been-created.html
Check: CKV_DOCKER_2: "Ensure that HEALTHCHECK instructions have been added to container images"
	FAILED for resource: Dockerfile.
	File: Dockerfile:1-8
	Guide: https://docs.paloaltonetworks.com/content/techdocs/en_US/prisma/prisma-cloud/prisma-cloud-code-security-policy-reference/docker-policies/docker-policy-index/ensure-that-healthcheck-instructions-have-been-added-to-container-images.html
  1. 不让用tag为latest的镜像作为基础镜像
  2. 需要设定一个运行用户
  3. 需要设定健康检查

修改goDockerfile内容,毕竟我们真实打包制品用的是它

[root@jenkins-bj-ali-ql1 cmd]# cat Dockerfile
FROM golang:base

WORKDIR /app
COPY main .
COPY configs/ configs/
COPY templates/ templates/
USER work 								# 加了这里
HEALTHCHECK NONE						# 加了这里
ENTRYPOINT ["/sbin/tini", "--"]
CMD /app/main ${GO_OPTIONS}
[root@jenkins-bj-ali-ql1 cmd]# checkov -f Dockerfile --quiet --compact --skip-results-upload --framework dockerfile
dockerfile scan results:

Passed checks: 6, Failed checks: 0, Skipped checks: 0

集成jenkins pipeline

本次Checkov用来扫描Dockerfile,而Dockerfile是固定的,因此实际情况中应当在编写好用于后续封装制品Dockerfile后扫描后根据报告修改问题即可,理论上不需要在pipeline中每次都再次扫描,不过为了整体完整性,依然会加入到pipeline Package中作为前置条件

		stage('Package') {
            steps {
                script {
                    sh "/bin/cp -rpf /var/lib/jenkins/workspace/conf.d/goDockerfile Dockerfile"
                    def dcfstatus = sh(script: "checkov -f Dockerfile --quiet --compact --skip-results-upload --framework dockerfile", returnStatus: true)
                    if (dcfstatus != 0) {
                        error "Dockerfile insecure"
                    }
                    sh "docker build -t ${JOB_NAME}:${BUILD_NUMBER} ."
                }
            }
        }

其他Dockerfile扫描工具
Checkov
docker scan

标签:prisma,checkov,静态,扫描,--,policy,docker,Dockerfile
From: https://www.cnblogs.com/bfmq/p/17547524.html

相关文章

  • SAST扫描
    这是一种无需运行程序即可调试代码的方法。它根据预定义的规则集分析代码。SonarQube允许所有开发人员编写更清洁、更安全的代码。它支持多种用于扫描的编程语言(Java、Kotlin、Go、JavaScript)。它还支持为代码覆盖率运行单元测试。它可以轻松地与Jenkins和AzureDevOps集成......
  • Dockerfile与docker-compose搭建php环境
     目录结构 php.conf文件内容server{ listen 80; server_name localhost; location/{ root /usr/share/nginx/html/web; index index.phpindex.htmlindex.htm; } error_page 500502503504 /50x.html; location=/50x.html{ root /usr/share/nginx/......
  • 《Kali渗透基础》08. 弱点扫描(二)
    @目录1:OpenVAS/GVM1.1:介绍1.2:安装1.3:使用2:Nessus2.1:介绍2.2:安装2.3:使用3:Nexpose本系列侧重方法论,各工具只是实现目标的载体。命令与工具只做简单介绍,其使用另见《安全工具录》。本文以kali-linux-2023.2-vmware-amd64为例。1:OpenVAS/GVM1.1:介绍OpenVAS(OpenVulne......
  • 联想扫描王 1.0.4
    联想扫描王官网现已上线,该应用支持高清扫描,纸质文件秒变电子档。主要功能•支持智能切边、梯形校正,PDF、JPEG格式可自由转换;•支持一码互连,多设备自由同步,快速批量互传文件;•支持精准识别,快速提取文本,一键复制、粘贴、摘录;•支持图片处理功能,去阴影、增亮,添加批注标记;•......
  • SBOM扫描
    软件物料清单(SBOM)是一个完整的、正式结构化的组件、库和模块列表,这些组件、库和模块是构建(即编译和链接)给定软件以及它们之间的供应链关系所需的。这些组件可以是开源的或专有的,免费的或付费的,可以广泛使用或限制访问。完成SBOM扫描分为两步生成SBOM清单基于清单进行安......
  • 107.你知道静态绑定和动态绑定吗?讲讲?
    107.你知道静态绑定和动态绑定吗?讲讲?1.对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2.对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。3.静态绑定:绑定的是对象的静态类型,某特性(比如函数依赖于对象的静态类型......
  • 95.静态成员与普通成员的区别是什么?
    95.静态成员与普通成员的区别是什么?1.生命周期静态成员变量从类被加载开始到类被卸载,一直存在;普通成员变量只有在类创建对象后才开始存在,对象结束,它的生命期结束;2.共享方式静态成员变量是全类共享;普通成员变量是每个对象单独享用的;3.定义位置普通成员变量存储在栈或堆中,而......
  • 78.类如何实现只能静态分配和只能动态分配
    78.类如何实现只能静态分配和只能动态分配1.前者是把new、delete运算符重载为private属性。后者是把构造、析构函数设为protected属性,再用子类来动态创建2.建立类的对象有两种方式:①静态建立,例如Aa;静态建立一个类对象,就是由编译器为对象在栈空间中分配内存。使用这种方法,......
  • 单片机扫描矩阵键盘
    采用分时复用的方法,定时置位行,检测列,确定按下的按键,输出不同的按键值。voidKbScanProcess(void){//uint8_tRow=0;//按键所在行//uint8_tCol=0;//按键所在列//uint8_tRowCount=0;//按键触发行的个数,用于判断多个按键按下uint8_tColCount=0;//按键触发列的个数,用......
  • JAVA static静态变量依赖spring实例化变量,可能导致初始化出错
    在Java中,静态变量是在类加载时初始化的,而实例变量是在对象实例化时初始化的。如果静态变量依赖于Spring实例化的变量,可能会导致初始化出错的问题。这是因为Spring的实例化过程是在运行时进行的,而类加载和静态变量初始化是在编译时进行的。当静态变量依赖于Spring实例化的变量时,如果......