Introduction
Using Gitlab-CI you can check your application for security threats which helps to prevents vulnerabilities early in the development process, allowing to be fixed before deployment.
Here i will show you how to integrate following security tests in Gitlab CI/CD pipeline.
- Dependency Scanning
- License Scanning
- Static Application Security Testing (SAST)
- Dynamic Application Security Testing (DAST)
lets get started with Dependency Scanning by adding it to your .gitlab-ci.yml
Dependency Scanning
Automatically finds security vulnerabilities in your dependencies while you are developing and testing your applications, such as when you are using an external (open source) libraries with known vulnerabilities
image: node:latest stages: - dependency_scanning cache: paths: - node_modules/ dependency_scanning: stage: dependency_scanning only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env DEP_SCAN_DISABLE_REMOTE_CHECKS="${DEP_SCAN_DISABLE_REMOTE_CHECKS:-false}" --volume "$PWD:/code" --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$SP_VERSION" /code artifacts: paths: [gl-dependency-scanning-report.json]
As you can see in the yaml this testing will only triggered for merge requests. The result of the test will be available in Artifacts [gl-dependency-scanning-report.json]. You can download this from GitLab Pipelines page.
Static Application Security Testing (SAST)
We can analyze our source code for vulnerabilities using the SAST (Static Application Security Testing). Integrate the following stage to your existing.gitlab-ci.yml
file.
sast: stage: sast only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env SAST_CONFIDENCE_LEVEL="${SAST_CONFIDENCE_LEVEL:-3}" --volume "$PWD:/code" --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/sast:$SP_VERSION" /app/bin/run /code artifacts: paths: [gl-sast-report.json]
Dependency Scanning
This is very helpful when your application is using an external (open source) library which is known to be vulnerable. In order to integrate this Dependency scanning, you can integrate given stage to your existing .gitlab-ci.yml
file
dependency_scanning: stage: dependency_scanning only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env DEP_SCAN_DISABLE_REMOTE_CHECKS="${DEP_SCAN_DISABLE_REMOTE_CHECKS:-false}" --volume "$PWD:/code" --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$SP_VERSION" /code artifacts: paths: [gl-dependency-scanning-report.json]
Result will be available as gl-dependency-scanning-report.json in artifacts.
License Management
This stage searches our project dependencies for their licenses. Just integrate the given stage in your existing .gitlab-ci.yml
License Management report, compares the licenses between the source and target branches, and shows the information right on the merge request. Blacklisted licenses will be highlighted with an x
red icon next to it.
license_management: stage: license_management only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env SOURCE_CODE="$PWD" --volume "$PWD":/code --rm "registry.gitlab.com/gitlab-org/security-products/license-management:latest" analyze /code artifacts: paths: [gl-license-management-report.json]
Our final .gitlab-ci.yml should look like this.
image: node:latest stages: - dast - dependency_scanning - sast - license_management cache: paths: - node_modules/ dast: stage: dast only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: docker run --interactive --rm --volume $(pwd)/wrk:/output:rw --volume $(pwd)/wrk:/zap/wrk:rw registry.gitlab.com/gitlab-org/security-products/dast:${VERSION:-latest} /analyze -t http://example.com -r report.html artifacts: paths: [wrk/gl-dast-report.json,wrk/report.html] dependency_scanning: stage: dependency_scanning only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env DEP_SCAN_DISABLE_REMOTE_CHECKS="${DEP_SCAN_DISABLE_REMOTE_CHECKS:-false}" --volume "$PWD:/code" --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$SP_VERSION" /code artifacts: paths: [gl-dependency-scanning-report.json] sast: stage: sast only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env SAST_CONFIDENCE_LEVEL="${SAST_CONFIDENCE_LEVEL:-3}" --volume "$PWD:/code" --volume /var/run/docker.sock:/var/run/docker.sock "registry.gitlab.com/gitlab-org/security-products/sast:$SP_VERSION" /app/bin/run /code artifacts: paths: [gl-sast-report.json] license_management: stage: license_management only: - merge_requests image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind script: - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') - docker run --env SOURCE_CODE="$PWD" --volume "$PWD":/code --rm "registry.gitlab.com/gitlab-org/security-products/license-management:latest" analyze /code artifacts: paths: [gl-license-management-report.json]
Leave a Reply