Integrieren Sie Sicherheitstools in GitLab
Konfigurieren Sie das Sicherheitstool für GitLab, das im Basissystem nicht unterstützt wird.
Vorbereitungen
Erforderliche Rolle: sn_devops.admin
Prozedur
- Navigieren zu DevOps > Integrationen > Toolintegrationen und öffnen Sie den Datensatz für die Integration des GitLab-Orchestration-Tools.
- Navigieren Sie zur zugehörigen Liste Zuordnungen der Tool-Integrationsfähigkeiten.
-
Wählen Sie Neuaus, 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 Integration Capabilities (Integrationsfunktionen), und wählen Sie Neuaus.
-
Geben Sie die folgenden Werte in die Formularfelder ein.
Feld Wert Toolintegration GitLab Zuordnung der Fähigkeit Fähigkeitszuordnungsdatensatz, der in Schritt 4 erstellt wurde. 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 die Geschäftsregel BR Seeded tool integrations not editable, um Sicherheitstools mit GitLab zu integrieren. -
Ändern Sie die Skripteinbindung sn_devops_ints.DevOpsGitLabIntegrationHandler , indem Sie zu Systemdefinitionen > Skripteinbindungnavigieren und nach dem Skript DevOpsGitLabIntegrationHandler suchen.
- Ändern Sie die Methode „handleEvent“, um die Ergebnisse von Sicherheitsscans aus der GitLab-Pipeline zu verarbeiten. Stellen Sie sicher, dass der Name Ihrer Sicherheitsstufe in Ihrer GitLab-Pipeline mit dem Namen übereinstimmt, den Sie in der Variablen VERACODE_STAGE_NAME, CMApx_ONE_STAGE_NAME oder CMApx_SAST_STAGE_NAME in der Methode „handleEvent“ aktualisieren. Ersetzen Sie den Code der Methode „handleEvent“ durch das folgende Codefragment.
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 Sicherheitsstufe mit den Variablen VERACODE_STAGE_NAME, CMApx_ONE_STAGE_NAME bzw. CMApx_SAST_STAGE_NAME in der Methode handleEvent übereinstimmt.
VERACODE_STAGE_NAME steht 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“ steht 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“ steht 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 Skript DevOpsGitLabIntegrationHandler 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 von Sicherheitsscans aus der GitLab-Pipeline zu verarbeiten. Stellen Sie sicher, dass der Name Ihrer Sicherheitsstufe in Ihrer GitLab-Pipeline mit dem Namen übereinstimmt, den Sie in der Variablen VERACODE_STAGE_NAME, CMApx_ONE_STAGE_NAME oder CMApx_SAST_STAGE_NAME in der Methode „handleEvent“ aktualisieren. Ersetzen Sie den Code der Methode „handleEvent“ durch das folgende Codefragment.