1.7.1.5 DevOps 서비스의 빌드시 패키지 취약점 검사하기
취약점 검사를 위한 소스 코드 스캐닝
Application Dependency Management (ADM) 서비스는 OCI DevOps 빌드 파이프라인 내에서 소스코드 빌드에 사용되는 라이브러리 패키지에 대한 취약점 검사하는 기능을 제공합니다. 빌드 스펙상에서 취약점 검사를 위한 VulnerabilityAudit 유형을 제공합니다.
현재는 Maven 패키지에 대한 스캐닝만 지원합니다.
취약점 검사 Build Step
아래와 같이 빌드 스펙에 VulnerabilityAudit 유형을 추가하고, 관련 설정을 합니다. 이를 사용하기 위해서는 사전에 Application Dependency Management (ADM) 서비스에 Knowledge Base를 생성해야 합니다.
-
VulnerabilityAudit 예시
steps: - type: VulnerabilityAudit name: "Vulnerability Audit Step" configuration: buildType: maven pomFilePath: ${OCI_PRIMARY_SOURCE_DIR}/pom.xml packagesToIgnore: - com.oracle.* - org.apache.logging maxPermissibleCvssV2Score: 10.0 maxPermissibleCvssV3Score: 10.0 knowledgeBaseId: ocid1.admknowledgebase.oc1.iad.restoftheocid vulnerabilityAuditCompartmentId: ocid1.compartment.oc1..restoftheocid vulnerabilityAuditName: testReport
-
configuration/buildType: 현재는 maven만 지원합니다.
-
configuration/packagesToIgnore: 취약점 검사에서 제외할 패키지를 지정합니다.
-
configuration/maxPermissibleCvssV2Score: 지정한 스코어를 초과하는 경우 빌드를 Failed로 표시하고 중지합니다.
-
configuration/maxPermissibleCvssV3Score: 지정한 스코어를 초과하는 경우 빌드를 Failed로 표시하고 중지합니다.
-
knowledgeBaseId: Application Dependency Management (ADM) 서비스에 Knowledge Base의 OCID
-
취약도 점수
-
Application Dependency Management (ADM) 서비스에서 Knowledge Base 만들기
-
OCI 콘솔에 로그인합니다.
-
좌측 상단 햄버거 메뉴에서 Developer Services > App Dependency Management > Knowledge Bases로 이동합니다.
-
대상 Compartment를 선택하고 Create Knowledge Base를 클릭하여 생성합니다.
- Name: 예) oci-hol-knowledge-base
-
생성된 Knowledge Base 상세정보로 가서 OCID를 복사해 둡니다.
DevOps 서비스에서 ADM 권한관련 Policy 추가하기
-
DevOps를 위해 만든 Policy에 다음을 추가합니다.
Allow dynamic-group BuildDynamicGroup to use adm-knowledge-bases in compartment <YourCompartmentName> Allow dynamic-group BuildDynamicGroup to manage adm-vulnerability-audits in compartment <YourCompartmentName>
DevOps 프로젝트 만들기
진행을 위해 1.7.1.1 DevOps 서비스를 이용한 Spring Boot 앱을 OKE에 배포 자동화하기을 따라 소스코드를 생성하고, Build Pipeline의 Build Stage까지 만든 상태에서 다음 과정을 추가합니다.
취약점 발생을 위한 변경작업
최신 Spring Boot 버전으로 프로젝트를 생성할 경우, 간단한 코드로 인해 취약점이 없을 수 있습니다. 강제 발생을 위해 아래와 같이 오래된 이전 버전으로 낮춥니다.
-
소스 코드의 pom.xml 상의 Spring Boot 버전을 낮춥니다. 예) 2.6.5
... <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> ...
Build Step에 취약점 검사 추가하기
-
Build Spec 정의
-
개발한 spring-boot-hello 소스 코드의 root 경로에 build_spec.yaml을 다음과 같이 정의합니다.
-
build_spec.yaml
- 기존 빌드스펙에, 코드를 빌드하기 전에 취약점 검사를 위한 Vulnerability Audit Step 단계를 추가합니다. 취약점 문제로 빌드를 중지하기 위해 스코어를 낮게 지정하였습니다.
version: 0.1 component: build timeoutInSeconds: 6000 shell: bash env: variables: appName: "spring-boot-hello" exportedVariables: - APP_NAME - OCIR_PATH - TAG steps: - type: Command name: "Init exportedVariables" timeoutInSeconds: 4000 command: | APP_NAME=$appName echo $APP_NAME - type: VulnerabilityAudit name: "Vulnerability Audit Step" configuration: buildType: maven pomFilePath: ${OCI_PRIMARY_SOURCE_DIR}/pom.xml packagesToIgnore: - com.oracle.* maxPermissibleCvssV2Score: 9.0 maxPermissibleCvssV3Score: 9.0 knowledgeBaseId: ocid1.admknowledgebase.oc1.ap-chuncheon-1... vulnerabilityAuditName: spring-boot-hello-vulnerability-audit - type: Command name: "Build Source" timeoutInSeconds: 4000 command: | echo "build" mvn clean install - type: Command timeoutInSeconds: 400 name: "Build Source - Post" command: | echo "add dependency" mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar) - type: Command name: "Define Image Tag - Commit ID" timeoutInSeconds: 30 command: | COMMIT_ID=`echo ${OCI_TRIGGER_COMMIT_HASH} | cut -c 1-7` BUILDRUN_HASH=`echo ${OCI_BUILD_RUN_ID} | rev | cut -c 1-7` [ -z "$COMMIT_ID" ] && TAG=$BUILDRUN_HASH || TAG=$COMMIT_ID - type: Command name: "Define OCIR Path" timeoutInSeconds: 30 command: | TENANCY_NAMESPACE=`oci os ns get --query data --raw-output` REPO_NAME=$appName OCIR_PATH=$OCI_RESOURCE_PRINCIPAL_REGION.ocir.io/$TENANCY_NAMESPACE/$REPO_NAME - type: Command timeoutInSeconds: 400 name: "Containerize" command: | docker build -t new-generated-image . docker images - type: Command name: "Check exportedVariables" timeoutInSeconds: 30 command: | [ -z "$APP_NAME" ] && APP_NAME=unknown [ -z "$OCIR_PATH" ] && OCIR_PATH=unknown [ -z "$TAG" ] && TAG=unknown echo "APP_NAME: " $APP_NAME echo "OCIR_PATH: " $OCIR_PATH echo "TAG: " $TAG outputArtifacts: - name: output-image type: DOCKER_IMAGE location: new-generated-image
-
-
작성된 코드를 git 명령어를 통해서 Code Repository에 저장합니다.
git add . git commit -m "build spec" git push
테스트
-
작성한 빌드 파이프라인으로 이동하여 Start Manual Run을 통해 빌드 파이프라인을 실행합니다.
-
빌드과정중에 취약점 검사에서 실패하는 것을 볼수 있습니다.
-
상세내역을 확인하기 위해 오른쪽 상단 점 세개를 클릭하여 View Details를 클릭합니다.
-
상세내역에서 취약점 검사 결과를 요약 정보를 볼 수 있습니다.
-
리포트 이름을 클릭하면, 전체 리포트를 볼 수 있습니다.
-
취약점 코드 링크를 취약점 데이터 베이스에 등록된 상세 정보를 확인할 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.