Integrieren Sie Sicherheitstools mit GitLab
Konfigurieren Sie das Sicherheitstool für GitLab Was im Basissystem nicht unterstützt wird.
Vorbereitungen
Erforderliche Rolle: sn_devops.admin
Prozedur
- Navigieren zu DevOps > Integrationen > Toolintegrationen Und öffnen Sie den Integrationsdatensatz des GitLab-Orchestration-Tools.
- Navigieren Sie zur zugehörigen Liste Tool-Integration-Fähigkeitszuordnungen.
-
Wählen Sie Aus Neu , Und geben Sie die folgenden Werte in die Formularfelder ein.
Feld Wert Toolintegration GitLab Tooltypfähigkeit Sicherheit - Wählen Sie Absenden.
- Navigieren Sie zur zugehörigen Liste Integrationsfähigkeiten, und wählen Sie aus Neu .
-
Geben Sie die folgenden Werte in die Formularfelder ein.
Feld Wert Toolintegration GitLab Zuordnung der Fähigkeit In Schritt 4 erstellter Fähigkeitszuordnungsdatensatz. Aktion Benachrichtigung Hinweis:Bearbeiten Sie keine Toolaktionsdatensätze.Aktiv Ausgewählt Zeitüberschreitung (ms) Zeitüberschreitung für den entsprechenden Subflow. Wenn die Ausführung des Subflows diesen Wert überschreitet, tritt eine Zeitüberschreitungsausnahme auf. Der Wert wird in Millisekunden (ms) angegeben. Der Standardwert ist 45.000 (45 Sekunden). Subflow-Name sn_devops_vul_ints.devops_security_notification Domäne global Hinweis:Deaktivieren Sie BR Seeded tool integrations not editableBusiness-Regel zur Integration von Sicherheitstools in GitLab. -
Ändern Sie sn_devops_ints.DevOpsGitLabIntegrationHandler Skripteinbindung, indem Sie zu navigieren Systemdefinitionen > Skripteinbindung , Und suchen nach DevOpsGitLabIntegrationHandlerSkript.
- Ändern Sie die Methode handleEvent, um die Ergebnisse der Sicherheitsscans aus der GitLab-Pipeline zu verarbeiten. Stellen Sie sicher, dass Ihr Name der Sicherheitsphase in Ihrer GitLab-Pipeline mit dem Namen übereinstimmt, den Sie in der Variable „VERACODE_STAGE_NAME“, „CMARX_ONE_STAGE_NAME“ oder „CMARX_SAST_STAGE_NAME“ in der handleEvent-Methode aktualisieren. Ersetzen Sie den HandleEvent-Methodencode durch den folgenden Code-Fragment.
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"); } },In den folgenden Beispielen zeigt die GitLab-Pipeline, dass der Name der Sicherheitsphase mit den Variablen VERACODE_STAGE_NAME, CMARX_ONE_STAGE_NAME oder CMARX_SAST_STAGE_NAME in der handleEvent-Methode identisch ist.
VERACODE_STAGE_NAME ist für 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 ist für 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 ist für 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’ - Fügen Sie dem DevOpsGitLabIntegrationHandler-Skript die Methode getPipelineWithSecurityEventPayload hinzu.
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; },
- Ändern Sie die Methode handleEvent, um die Ergebnisse der Sicherheitsscans aus der GitLab-Pipeline zu verarbeiten. Stellen Sie sicher, dass Ihr Name der Sicherheitsphase in Ihrer GitLab-Pipeline mit dem Namen übereinstimmt, den Sie in der Variable „VERACODE_STAGE_NAME“, „CMARX_ONE_STAGE_NAME“ oder „CMARX_SAST_STAGE_NAME“ in der handleEvent-Methode aktualisieren. Ersetzen Sie den HandleEvent-Methodencode durch den folgenden Code-Fragment.