DevSecOps에 고유 앱 제공

DevSecOps 의 도구 체인을 활용하여 지속적 통합 및 지속적 배포를 위한 자체 애플리케이션을 통합하는 방법은 다양합니다.

샘플 사용

원활한 지속적인 통합과 배포를 위해 자체 애플리케이션을 DevSecOps 툴체인으로 통합하려면 샘플 설정을 시작하십시오.

Node.js 예시

제공되는 기본 샘플 앱을 사용하여 DevSecOps 도구 체인을 작성하십시오. hello-compliance-app 는 정적 웹 페이지를 제공하는 Node.js 서버를 호스팅합니다.

다른 샘플

또는 다음 샘플 중 하나를 사용하여 시작할 수 있습니다

  • 코드 엔진 준수 앱: 이 저장소에는 Code Engine 빌드 전략을 설명하는 Node.js 애플리케이션이 포함되어 있으며, Code Engine 애플리케이션 또는 Code Engine 작업으로 배포할 수 있습니다.
  • Go-compliance-app: 이 저장소에는 Gin을 사용하는 Go 마이크로서비스가 포함되어 있으며, helm 를 사용하여 배포됩니다.
  • Python-compliance-app: 이 저장소에는 Flask를 사용하는 Python 마이크로서비스가 포함되어 있으며, helm 를 사용하여 배포됩니다.
  • Node-cloudant-compliance-app: 이 저장소에는 kubectl 를 사용하여 배포된 Node.js 애플리케이션이 포함되어 있으며, 이는 Infrastructure-As-Code(Terraform)를 통해 생성된 Cloudant 인스턴스와 상호 작용합니다.

추론된 DevSecOps 구성을 사용하십시오

DevSecOps 의 CI 툴체인에 자신만의 애플리케이션 소스 코드 저장소를 추가한 후에는 추론된 DevSecOps 파이프라인 구성 기능을 사용하여 즉시 시작할 수 있습니다. 이 기능:

  • 초기 사용자 정의가 필요하지 않습니다.
  • .pipeline-config.yaml DevSecOps 파이프라인 구성 파일의 내용을 추론합니다.
  • 코드를 구축, 테스트, 배포하는 데 필요한 스크립트를 식별합니다.
  • 이 스크립트에 대한 코드를 제공합니다.

이 기능을 사용하면 마이크로 서비스나 애플리케이션을 DevSecOps 파이프라인에 쉽고 빠르게 온보딩하고, DevSecOps 채택을 간소화할 수 있습니다.

지정된 소스 코드 리포지토리에 대한 CI 파이프라인 구성 yaml 파일 생성(독립 실행형 모드에서 DevSecOps 구성 추론)

정적 방식/독립형 모드로 지정된 소스 코드 리포지토리에 대한 파이프라인 구성 파일을 생성할 수 있습니다. 이 기능은 추론된 DevSecOps 구성과 동일한 로직에 의존하며 DevSecOps 규정 준수 기본 이미지의 특정 스크립트를 통해 제공됩니다.

전제조건

  • 로컬 환경에서 도커 엔진 가동 및 실행하기
  • yq를 사용하여 다음 명령을 실행합니다

사용량

스크립트는 규정 준수 기본 이미지의 다음 경로에 있습니다: /opt/one-pipeline/polyglot/tools/enable-devsecops.sh.

스크립트 사용법은 다음과 같습니다 enable-devsecops.sh [--configuration <key>=value]* [--configuration-file <filename>] [--version <v9|v10|v11>]* <path to source code directory>

다음 스니펫은 이 스크립트를 사용하는 방법을 설명합니다.

# clone the source code repository that you want to generate CI pipeline config for
git clone https://us-south.git.cloud.ibm.com/open-toolchain/hello-containers
cd hello-containers

export compliance_base_image=$(curl -L https://us-south.git.cloud.ibm.com/open-toolchain/compliance-pipelines/-/raw/open-v10/definitions/ci-trigger.yaml?ref_type=heads | yq '.spec.params[] | select(.name == "compliance-baseimage") | .default')

# environment variable compliance_base_image should contains a value like icr.io/continuous-delivery/toolchains/devsecops/devsecops-baseimage:3.109.7_commons-1.50.2 or upper

# define hint for unit-test and acceptance-test configuration properties as the hello-containers
# sample has specific npm script entries for it

docker run --platform linux/amd64 -v.:/src --rm -it $compliance_base_image /opt/one-pipeline/polyglot/tools/enable-devsecops.sh --configuration hint-npm-unit-testing-script=test-unit --configuration hint-npm-acceptance-testing-script=test-fvt /src

--configuration 옵션(또는 키 값 쌍이 있는 파일과 함께 --configuration-file <file path> )을 사용하여 특정 매개변수를 제공할 수 있습니다.

제공된 매개 변수는 DevSecOps 추출 프로세스를 구성하며 사용 가능한 매개 변수는 여기에 설명되어 있습니다: 추출 지점 구성

docker run --platform linux/amd64 -v.:/src --rm -it $compliance_base_image /opt/one-pipeline/polyglot/tools/enable-devsecops.sh --configuration hint-npm-unit-testing-script=test-unit --configuration hint-npm-acceptance-testing-script=test-fvt /src

결과

polyglot-spots.json.pipeline-config.yaml 파일이 소스 코드 저장소의 루트 디렉터리에 추가됩니다.

  • polyglot-spots.json 는 소스 코드 검사에서 발견된 특정 지점의 지도이며 버릴 수 있습니다.
  • .pipeline-config.yaml cI 파이프라인에서 사용할

이제 애플리케이션 온보딩에 설명된 대로 .pipeline-config.yaml 을 소스 코드 git 리포지토리로 푸시하고 애플리케이션 리포지토리로 사용할 수 있습니다.

스테이지 매개변수 추가

각 샘플 앱의 소스 코드에는 .pipeline-config.yaml 파일이 포함되어 있습니다. .pipeline-config.yaml 파일은 파이프라인 실행 프로세스의 모든 단계에서 지속적 통합 및 지속적 배포 툴체인이 사용하는 핵심 구성 파일입니다.

각 스테이지에 필요한 다음 특성이 포함된 .pipeline-config.yaml 구성 파일을 추가하십시오.

image
스테이지를 실행하는 데 사용되는 Docker 이미지 이름. 예를 들어, 다음 코드를 사용하여 이미지에 서명하십시오.
image: icr.io/continuous-delivery/pipeline/image-signing:1.0.   0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
abort_on_failure

스테이지에서 오류가 발생하면 파이프라인 실행을 중지하려면 이 속성을 true 로 설정하십시오. 이 특성이 false 로 설정되면 단계가 경고 상태 (황색 상태라고도 함) 로 전달됨으로 표시되고 파이프라인이 계속 실행됩니다.

script

해당 단계에서 필요한 작업을 수행하는 스크립트. 앱 저장소 내의 스크립트 디렉터리에 스크립트를 생성하고, 이 위치에서 스크립트를 호출하십시오. 예를 들어, 다음 코드 스니펫은 이미지에 서명할 때 script 섹션의 컨텐츠를 표시합니다.

script: |
   #!/usr/bin/env bash
   STAGE_DIND="true"
   STAGE_ABORT_ON_FAILURE="false"
   STAGE_IMAGE_PULL_POLICY="IfNotPresent"
   source scripts/sign_image.sh
dind

실행 중인 파이프라인에서 docker 기능을 사용하려면 이 속성을 true 로 설정하십시오. 필요한 매개변수를 결정한 후에는 파이프라인의 여러 단계를 정의할 수 있습니다.

setup

이 단계를 정의하여 사전 설정 스크립트를 실행하십시오.

setup:
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert any required pre-build tasks in this stage."
test

이 단계를 정의하여 앱의 테스트 케이스를 실행하십시오.

test:
   abort_on_failure: false
image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
script: |
   #!/usr/bin/env bash
   cd ../"$(load_repo app-repo path)"
   #npm ci
   #npm test
   source test/test.sh
static-scan

코드에서 정적 스캔을 실행하려면 이 단계를 정의하십시오.

static-scan:
   dind: true
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert script to invoke/execute static scan tool like SonarQube on the application source code."
containerize

이 단계를 정의하여 앱을 빌드하고 컨테이너화하세요.

containerize:
   dind: true
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash

   if [[ "$PIPELINE_DEBUG" == 1 ]]; then
   trap env EXIT
   env
   set -x
   fi
   source scripts/build_setup.sh
   source scripts/build.sh
deploy

이 단계를 정의하여 앱을 대상 환경에 배포하십시오.

deploy:
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash

   if [[ "$PIPELINE_DEBUG" == 1 ]]; then
   trap env EXIT
   env
   set -x
   fi
   source scripts/deploy_setup.sh
   source scripts/deploy.sh
sign-artifact

기본적으로 DevSecOps CI 툴체인은 컨테이너화 단계에서 빌드되는 모든 이미지에 서명합니다. 도구 체인 설정 중에 제공되는 GPG키는 이미지에 서명 하는 데 사용됩니다. 이미지 서명 프로세스를 사용자 정의하려면 .pipeline-config.yaml 에 다음 단계 정의를 추가하십시오.

sign-artifact:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/image-signing:1.0.      0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
   script: |
   #!/usr/bin/env bash
   STAGE_DIND="true"
   STAGE_ABORT_ON_FAILURE="false"
   STAGE_IMAGE_PULL_POLICY="IfNotPresent"
   source scripts/sign_image.sh
acceptance-test

이 단계를 정의하여 배포 후 수용 테스트를 실행하십시오.

acceptance-test:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   export APP_URL=$(cat ../app-url)
   source scripts/setup_go.sh
   echo "APP_URL :- ${APP_URL}"
   go run acceptance-test/acceptance-test.test.go
release

이 단계를 정의하여 이전 단계에서 생성된 증거 자료와 관련 자료를 업로드하십시오.

release:
   abort_on_failure: false
   image: icr.io/continuous-delivery/toolchains/devsecops/compliance-baseimage:2.26.      1@sha256:a780174a64474187b01b5e40a1721d8307f02897ac6f3eba2d482d4f4926edf1
   script: |
   #!/usr/bin/env bash
   source scripts/release.sh
scan-artifact

생성된 아티팩트에서 취약성에 대한 스캔을 실행하려면 이 단계를 정의하십시오.

scan-artifact:
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.      6@sha256:7f588468622a981f89cf5e1212aaf75fface9da6169b5345ca52ab63d8215907
   script: |
   #!/usr/bin/env bash
   source scripts/va_scan.sh
dynamic-scan

배치된 애플리케이션에서 동적 스캔을 실행하려면 이 단계를 정의하십시오.

dynamic-scan:
   dind: true
   abort_on_failure: false
   image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
   script: |
   #!/usr/bin/env bash
   echo "Please insert script to invoke/execute dynamic scan tool like OWASP ZAP on the built and deployed application."

스테이지에 대한 자세한 정보는 사용자 정의 스크립트 를 참조하십시오.