DSPMCreateRiskSlackBlocks

This XSOAR automation script generates a Slack message block to notify users of risks detected by a Data Security Posture Management (DSPM) tool. The Slack block is dynamically constructed based on the details of the security incident and includes options for users to take specific actions, such as creating a Jira ticket or remediating the risk.

python · DSPM

Source

import demistomock as demisto  # noqa: F401
from CommonServerPython import *  # noqa: F401
from typing import Any


def create_slack_block(incident: dict, rule_names_dict: dict, incidentLink: str) -> dict:
    """
    Creates a Slack block message structure for a DSPM incident.

    The Slack block contains incident details such as Incident ID, DSPM Risk ID, Rule Name,
    Severity, Asset Information, and Remediation instructions. Additionally, a radio button
    to 'Create a Jira ticket' is included, and if the rule name matches specific conditions,
    an option to 'Remediate a Risk' is added.

    Args:
        incident (dict): A dictionary containing details of the DSPM incident.
        rule_names_dict (dict): A dictonary of rule names that trigger the addition of a 'Remediate a Risk' option.

    Returns:
        block (dict): A structured Slack block message in JSON format to be sent to Slack.
    """
    rule_name = incident.get("ruleName")

    # Slack block structure
    block: dict[str, list[dict[str, Any]]] = {
        "blocks": [
            {
                "type": "header",
                "text": {
                    "type": "plain_text",
                    "text": "THE FOLLOWING RISK HAS BEEN DETECTED BY THE DSPM :warning:",
                    "emoji": True,
                },
            },
            {
                "type": "section",
                "block_id": "section_incident_details",
                "text": {
                    "type": "mrkdwn",
                    "text": f"*XSOAR Incident ID:* {incident.get('incidentId')}\n"
                    f"*XSOAR Incident link:* {incidentLink}\n"
                    f"*DSPM Risk ID:* {incident.get('riskFindingId')}\n"
                    f"*Rule Name:* {incident.get('ruleName')}\n"
                    f"*Severity:* {incident.get('severity')}\n"
                    f"*Asset Name:* {incident.get('assetName')}\n"
                    f"*Asset ID:* {incident.get('assetId')}\n"
                    f"*Project ID:* {incident.get('projectId')}\n"
                    f"*Cloud Provider:* {incident.get('cloudProvider')}\n"
                    f"*Service Type:* {incident.get('serviceType')}\n"
                    f"*First Discovered:* {incident.get('firstDetectedOn')}\n"
                    f"*Remediate Instruction:* {incident.get('remediateInstruction')}\n",
                },
            },
            {"type": "divider"},
            {
                "type": "actions",
                "elements": [
                    {
                        "type": "radio_buttons",
                        "options": [
                            {
                                "text": {"type": "plain_text", "text": "Create a Jira ticket", "emoji": True},
                                "value": "Create a Jira ticket",
                            }
                        ],
                        "action_id": "actionId-0",
                    }
                ],
            },
            {
                "type": "input",
                "element": {
                    "type": "plain_text_input",
                    "placeholder": {"type": "plain_text", "text": "Please enter a valid Project Name", "emoji": True},
                    "action_id": "project_name",
                },
                "label": {"type": "plain_text", "text": "Enter Project Name", "emoji": True},
            },
            {
                "type": "input",
                "element": {
                    "type": "plain_text_input",
                    "placeholder": {"type": "plain_text", "text": "Please enter a valid Issue type", "emoji": True},
                    "action_id": "Issue_type",
                },
                "label": {"type": "plain_text", "text": "Enter Issue Type", "emoji": True},
            },
            {"type": "divider"},
        ]
    }

    # Log the block structure to verify correctness
    demisto.info(f"Block structure before modification: {json.dumps(block, indent=2)}")

    # Add the "Remediate a Risk" radio button option if ruleName exists in rule_names_dict
    if rule_name in rule_names_dict:
        try:
            # Ensure the 'actions' block exists at the correct index
            elements = block["blocks"][3].get("elements", [{}])[0].get("options", [])
            elements.insert(
                0,
                {
                    "text": {
                        "type": "plain_text",
                        "text": f"Remediate a Risk - {rule_names_dict.get(rule_name)}",
                        "emoji": True,
                    },
                    "value": "Remediate a Risk",
                },
            )
        except (AttributeError, IndexError, TypeError) as e:
            demisto.error(f"Error inserting 'Remediate a Risk' option: {str(e)}")
            raise
    res = {"block": block}
    return res


""" MAIN FUNCTION """


def main():  # pragma: no cover
    """
    The main function for creating and storing a Slack block message based on DSPM risk data.

    It processes the DSPM incident details, creates a Slack block and outputs the block.
    If the rule name matches certain conditions, a 'Remediate a Risk'
    option is added to the Slack block.

    Returns:
        None: Results are returned via demisto.results() and CommandResults().
    """
    rule_names_dict = {
        "Sensitive asset open to world": (
            "This action would block the public access to specific containers in storage account "
            "(Azure) or to the bucket (AWS/GCP) based on the cloud provider."
        ),
        "Empty storage asset": (
            "This action would delete the storage account (Azure) or the storage bucket (AWS/GCP) based on the cloud provider."
        ),
    }
    try:
        incident = demisto.args().get("dspmIncident")
        incidentLink = demisto.args().get("incidentLink")
        slackBlock = create_slack_block(incident, rule_names_dict, incidentLink)

        return_results(
            CommandResults(
                outputs_prefix="slackBlock",
                outputs=slackBlock,
            )
        )

    except Exception as excep:
        return_error(f"Failed to execute CreateDSPMRiskSlackBlocks. Error: {str(excep)}")


""" ENTRY POINT """

if __name__ in ("__main__", "__builtin__", "builtins"):  # pragma: no cover
    main()

README

This XSOAR automation script generates a Slack message block to notify users of risks detected by a Data Security Posture Management (DSPM) tool. The Slack block is dynamically constructed based on the details of the security incident and includes options for users to take specific actions, such as creating a Jira ticket or remediating the risk.

Script Data


Name Description
Script Type python3
Cortex XSOAR Version 6.10.0

Inputs


Argument Name Description
dspmIncident  

Outputs


Path Description Type
slackBlock Custom Slack for risk details notification. Unknown