DlpAskFeedback
Sends a message via Slack or MS Teams to the user whose activity violated DLP policies and triggered the incident.
python · Enterprise DLP by Palo Alto Networks
Source
import dateparser import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 DATE_FORMAT = "%Y-%m-%d %H:%M:%S" OPTIONS = [{"text": "Yes", "style": "primary"}, {"text": "No", "style": "primary"}] def create_blocks(message: str, entitlement: str, reply: str) -> list: value = json.dumps({"entitlement": entitlement, "reply": reply}) blocks: list = [{"type": "section", "text": {"type": "mrkdwn", "text": message}}] elements = [] for option in OPTIONS: element = {"type": "button", "text": {"type": "plain_text", "emoji": True, "text": option["text"]}, "value": value} if "style" in option: element["style"] = option["style"] elements.append(element) actions = {"type": "actions", "elements": elements} blocks.append(actions) return blocks def send_slack_message(entitlement, task, user_id, message): lifetime = "1 day" expiry_date = dateparser.parse("in " + lifetime, settings={"TIMEZONE": "UTC"}) expiry = datetime.strftime(expiry_date, DATE_FORMAT) if expiry_date else None entitlement_string = f'{entitlement}@{demisto.investigation().get("id")}' if task: entitlement_string += f"|{task}" send_notification_args = {"ignoreAddURL": "true", "using-brand": "SlackV3"} reply = "Thank you for your response." blocks = json.dumps(create_blocks(message, entitlement_string, reply)) send_notification_args["blocks"] = json.dumps( {"blocks": blocks, "entitlement": entitlement_string, "reply": reply, "expiry": expiry, "default_response": "NoResponse"} ) if user_id: send_notification_args["to"] = user_id demisto.results(demisto.executeCommand("send-notification", send_notification_args)) else: raise Exception("A user must be provided.") def send_ms_teams_message(entitlement, task, user_id, message): investigation_id: str = demisto.investigation()["id"] adaptive_card: dict = { "contentType": "application/vnd.microsoft.card.adaptive", "content": { "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.0", "type": "AdaptiveCard", "msteams": {"width": "Full"}, "body": [{"type": "TextBlock", "text": message, "wrap": True}], "actions": [ { "type": "Action.Submit", "title": "Yes", "data": { "response": "Yes", "entitlement": entitlement, "investigation_id": investigation_id, "task_id": task, }, }, { "type": "Action.Submit", "title": "No", "data": {"response": "No", "entitlement": entitlement, "investigation_id": investigation_id, "task_id": task}, }, ], }, } command_arguments: dict = {"adaptive_card": json.dumps(adaptive_card), "using-brand": "Microsoft Teams"} if user_id: command_arguments["team_member"] = user_id demisto.results(demisto.executeCommand("send-notification", command_arguments)) else: raise Exception("A user must be provided.") def main(): args = demisto.args() res = demisto.executeCommand( "addEntitlement", {"persistent": demisto.get(args, "persistent"), "replyEntriesTag": demisto.get(args, "replyEntriesTag")} ) if isError(res[0]): demisto.results(res) sys.exit(0) entitlement = demisto.get(res[0], "Contents") file_name = args.get("file_name") data_profile_name = args.get("data_profile_name") snippets = args.get("snippets", "") app_name = args.get("app_name", "Unknown App") user_display_name = args.get("user_display_name") question_type = args.get("question_type") include_violation_detail = args.get("include_violation_detail") task = args.get("task") user_id = demisto.get(args, "user_id") messenger = args.get("messenger") message = "" if include_violation_detail == "True": res = demisto.executeCommand( "pan-dlp-slack-message", { "user": user_display_name, "file_name": file_name, "data_profile_name": data_profile_name, "app_name": app_name, "snippets": snippets, }, ) if isError(res[0]): demisto.results(res) sys.exit(0) demisto.info(f"DLPAskFeedback - received slack message {json.dumps(res)}") message = demisto.get(res[0], "Contents.message") message = message.encode("latin-1", "backslashreplace").decode("unicode-escape") message += "\n\n" if question_type == "ABOUT_EXEMPTION": message += f"Do you want to request a temporary exemption for {file_name}?" else: message += "Please confirm if this file contains sensitive information:" try: if messenger.upper() == "SLACK": send_slack_message(entitlement, task, user_id, message) else: send_ms_teams_message(entitlement, task, user_id, message) except ValueError as e: if "Unsupported Command" in str(e): return_error( "The command is unsupported by any integration instance. If you have SlackV3 or above enabled, " "please use SlackAskV2 instead." ) else: return_error("An error has occurred while executing the send-notification command", error=e) if __name__ in ("__builtin__", "builtins", "__main__"): main()
README
Sends a message via Slack to the user whose file upload violated DLP policies and triggered the incident.
Script Data
| Name | Description |
|---|---|
| Script Type | python3 |
| Cortex XSOAR Version | 5.5.0 |
Dependencies
This script uses the following commands and scripts.
- send-notification
Used In
This script is used in the following playbooks and scripts.
- DLP Incident Feedback Loop
Inputs
| Argument Name | Description |
|---|---|
| messenger | The messenger to use for sending notification, |
| file_name | The name of the file that triggered the incident. |
| data_profile_name | The name of the DLP data profile that detected the violation. |
| app_name | The application that performed the upload. |
| task | A manual task that this task can close. |
| user_display_name | The user name displayed in the Slack message. |
| user_id | The user ID to identify the recipient in Slack. |
| snippets | The snippets of the violation. |
| include_violation_detail | Whether to include violation details in the message. |
| question_type | Whether to ask the user about the file content or about exemption. |
Outputs
There are no outputs for this script.