セキュリティツールをと統合する GitLab
ベースシステムでサポートされていない GitLab のセキュリティツールを構成します。
始める前に
必要なロール:sn_devops.admin
手順
- 移動先 DevOps >統合>ツール統合 をクリックし、GitLab オーケストレーションツール統合レコードを開きます。
- [ツール統合機能マッピング] 関連リストに移動します。
-
新規 を選択し、フォームフィールドに次の値を入力します。
Field (フィールド) 値 ツール統合 GitLab ツールタイプの機能 セキュリティ - [送信] を選択します。
- [統合機能] 関連リストに移動し、[ 新規] を選択します。
-
フォームフィールドに次の値を入力します。
Field (フィールド) 値 ツール統合 GitLab 機能マッピング ステップ 4 で作成した機能マッピングレコード。 アクション 通知 注:ツールアクションレコードは編集しないでください。アクティブ 選択済み タイムアウト (ミリ秒) 対応するサブフローのタイムアウト。サブフローの実行がこの値を超えると、タイムアウト例外が発生します。値はミリ秒 (ms) 単位です。既定値は 45,000 (45 秒) です。 サブフロー名 sn_devops_vul_ints.devops_security_notification ドメイン global 注:セキュリティツールを GitLab と統合するには、 BR Seeded tool integrations not editable ビジネスルールを非アクティブ化します。 -
sn_devops_ints.DevOpsGitLabIntegrationHandler script インクルードを変更するには、[システム定義] > [スクリプトインクルード] に移動し、DevOpsGitLabIntegrationHandlerスクリプトを検索します。
- GitLab パイプラインからのセキュリティスキャン結果を処理するように handleEvent メソッドを変更します。GitLab パイプラインのセキュリティステージ名が、handleEvent メソッドの VERACODE_STAGE_NAME、CMARX_ONE_STAGE_NAME、または CMARX_SAST_STAGE_NAME 変数で更新した名前と同じであることを確認します。handleEvent メソッドのコードを次のコードスニペットに置き換えます。
handleEvent: function(eventGr) { try { var renameHandler = new sn_devops.DevOpsPipelineRenameHandler(this.refTable, this.appContext, this.relatedRecord); renameHandler.handlePipelineRename(eventGr); var payload = JSON.parse(eventGr.getValue("original_payload")); this._logger.debug("typeof payload >>" + typeof payload); if (!gs.nil(payload) && typeof payload === 'object') { var status = this.getTaskExecutionStatus(payload); this._logger.debug("Task Execution status -> " + status); if (gs.nil(status)) this.updateInboundEvent(eventGr, { processing_details: gs.getMessage('Task execution status [{0}] is not handled', payload.build_status), state: sn_devops.DevOpsCommonConstants.INBOUND_EVENT_STATE_IGNORED }); else { // create fake start event for cancelled job if (status == 'cancelled') { this.createFakeEvent(eventGr, payload, 'running'); } var normalizedObject = {}; normalizedObject.taskExecution = this.getTaskExecutionObject(eventGr, payload, status); normalizedObject.orchestrationTask = this.getOrchestrationTaskObject(normalizedObject.taskExecution, payload); normalizedObject.callback = this.getCallbackObject(normalizedObject.taskExecution, payload); var devopsUtil = new sn_devops.DevOpsUtil(this.refTable, this.appContext, this.relatedRecord); normalizedObject = devopsUtil.schemaValidationForTransformedPayload(normalizedObject); var VERACODE_STAGE_NAME = 'SN_VERACODE'; var CMARX_ONE_STAGE_NAME = 'SN_CMARX_ONE_STAGE_NAME'; var CMARX_SAST_STAGE_NAME = 'SN_CMARX_SAST_STAGE_NAME'; if (!gs.nil(payload.build_stage) && ( payload.build_stage == VERACODE_STAGE_NAME || payload.build_stage == CMARX_ONE_STAGE_NAME || payload.build_stage == CMARX_SAST_STAGE_NAME ) && this.isCompleted(normalizedObject.taskExecution)) { var queryParams = sn_devops.DevOpsQueryParamsHelper.convertToSingular(JSON.parse(eventGr.getValue('query_params'))); if (gs.nil(normalizedObject.taskExecution.securityScan)) { normalizedObject.taskExecution.securityScan = { securityScanSummaryCount: 0 }; } normalizedObject.taskExecution.securityScan.securityScanSummaryCount += 1; } this._logger.debug("Normalized Object: " + JSON.stringify(normalizedObject)); return JSON.stringify(normalizedObject); } } else this.updateInboundEvent(eventGr, { processing_details: gs.getMessage('Payload is missing or invalid'), state: sn_devops.DevOpsCommonConstants.INBOUND_EVENT_STATE_ERROR }); } catch (error) { throw sn_devops.DevOpsErrorHelper.createDevOpsScriptIncludeError(error, sn_devops_ints.DevOpsIntegrationsCommonMessages.GITLAB_INBOUND_EVENT_PROCESS_ISSUE, "DevOpsGitLabIntegrationHandler.handleEvent", "handleEvent"); } },次の例では、GitLab パイプラインは、セキュリティステージ名がそれぞれ handleEvent メソッドの VERACODE_STAGE_NAME、CMARX_ONE_STAGE_NAME、または CMARX_SAST_STAGE_NAME 変数と同じであることを示しています。
VERACODE_STAGE_NAME は Veracode 用です。image: maven:latest stages: - build - SN_VERACODE - Deploy build_1: stage: build tags: - local-runner1 script: - echo "build" security_test: stage: SN_VERACODE tags: - local-runner1 script: - | curl "https://<instance>.service-now.com/api/sn_devops/v1/devops/tool/security?toolId=<gitlab_tool_sys_id> " \ --request POST \ --header "Accept:application/json" \ --header "Content-Type:application/json" \ --data "{ \"pipelineInfo\": { \"buildNumber\": \"${CI_JOB_ID}\", \"taskExecutionUrl\": \"${CI_JOB_URL}/\" }, \"securityResultAttributes\": { \"scanner\": \"Veracode\", \"applicationName\": \"Application\" } }" \ --user 'devops.system':’password’CMARX_ONE_STAGE_NAMEはCheckmarx One用です。
image: maven:latest stages: - build - SN_CMARX_ONE_STAGE_NAME - Deploy build_1: stage: build tags: - local-runner1 script: - echo "build" security_test: stage: SN_CMARX_ONE_STAGE_NAME tags: - local-runner1 script: - | curl "https://<instance>.service-now.com/api/sn_devops/v1/devops/tool/security?toolId=<gitlab_tool_sys_id> " \ --request POST \ --header "Accept:application/json" \ --header "Content-Type:application/json" \ --data "{ \"pipelineInfo\": { \"buildNumber\": \"${CI_JOB_ID}\", \"taskExecutionUrl\": \"${CI_JOB_URL}/\" }, \"securityResultAttributes\": { \"scanner\": \"Checkmarx One\", \"projectId\": \"projectId\", \"scanId\": \"scanId\", } }" \ --user 'devops.system':’password’CMARX_SAST_STAGE_NAMEはCheckmarx SASTの略です。
image: maven:latest stages: - build - SN_CMARX_SAST_STAGE_NAME - Deploy build_1: stage: build tags: - local-runner1 script: - echo "build" security_test: stage: SN_CMARX_SAST_STAGE_NAME tags: - local-runner1 script: - | curl "https://<instance>.service-now.com/api/sn_devops/v1/devops/tool/security?toolId=<gitlab_tool_sys_id> " \ --request POST \ --header "Accept:application/json" \ --header "Content-Type:application/json" \ --data "{ \"pipelineInfo\": { \"buildNumber\": \"${CI_JOB_ID}\", \"taskExecutionUrl\": \"${CI_JOB_URL}/\" }, \"securityResultAttributes\": { \"scanner\": \"Checkmarx\", \"projectId\": \"projectId\" } }" \ --user 'devops.system':’password’ - getPipelineWithSecurityEventPayload メソッドを DevOpsGitLabIntegrationHandler スクリプトに追加します。
getPipelineWithSecurityEventPayload: function(payload) { var gr = new GlideRecordSecure('sn_devops_task_execution'); gr.addEncodedQuery("execution_url=" + payload.pipelineInfo.taskExecutionUrl); gr.query(); var task = null; if (gr.next()) { task = gr; } if (gs.nil(task) || gs.nil(task.orchestration_task) || gs.nil(task.orchestration_task.step)) { throw "Pipeline Info not found"; } var step = task.orchestration_task.step.getRefRecord(); var pipelineDAO = new sn_devops.DevOpsPipelineDAO(); var query = 'sys_id=' + step.pipeline; var pipeline = pipelineDAO.getLimitedRecordsByEncodedQuery(query); return pipeline; },
- GitLab パイプラインからのセキュリティスキャン結果を処理するように handleEvent メソッドを変更します。GitLab パイプラインのセキュリティステージ名が、handleEvent メソッドの VERACODE_STAGE_NAME、CMARX_ONE_STAGE_NAME、または CMARX_SAST_STAGE_NAME 変数で更新した名前と同じであることを確認します。handleEvent メソッドのコードを次のコードスニペットに置き換えます。