diff --git a/.gitignore b/.gitignore index 1a02111a..ee0b85ed 100644 --- a/.gitignore +++ b/.gitignore @@ -397,3 +397,4 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml .DS_Store +.vscode/* diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..b242572e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "githubPullRequests.ignoredPullRequestBranches": [ + "main" + ] +} \ No newline at end of file diff --git a/Customer Guides/Nl2KQL Guide/Readme.md b/Customer Guides/Nl2KQL Guide/Readme.md index 2881d7c4..0fc4dc7b 100644 --- a/Customer Guides/Nl2KQL Guide/Readme.md +++ b/Customer Guides/Nl2KQL Guide/Readme.md @@ -1,21 +1,21 @@  -# Microsoft Copilot For Security +# Microsoft Security Copilot ## Featured Capability: Generate Hunting Queries ### Introduction -**Advanced Hunting in Copilot For Security ** -Copilot For Security is now enabled with purpose-built skills that leverage the generative AI capabilities of GPT-4 to reason over a natural-language prompt and generate a KQL query capable of retrieving data from Advanced Hunting tables in Microsoft Defender and top data tables in Microsoft Sentinel. See the full list of supported tables in [Appendix](#appendix). +**Advanced Hunting in Security Copilot ** +Security Copilot is now enabled with purpose-built skills that leverage the generative AI capabilities of GPT-4 to reason over a natural-language prompt and generate a KQL query capable of retrieving data from Advanced Hunting tables in Microsoft Defender and top data tables in Microsoft Sentinel. See the full list of supported tables in [Appendix](#appendix). This new functionality replaces an earlier implementation with a vastly improved algorithm and access to the latest Azure OpenAI models. Research is underway that would extend the functionality to additional data tables in Sentinel. ### Getting Started **Prerequisites** -1. Access to Microsoft Copilot For Security -2. Access to Defender Advanced Hunting and Microsoft Sentinel with the same credentials used to access Copilot For Security . +1. Access to Microsoft Security Copilot +2. Access to Defender Advanced Hunting and Microsoft Sentinel with the same credentials used to access Security Copilot . 3. Access to the necessary features and licenses in Defender and Sentinel to activate all supported tables. **Activating the Skillset** - Enable “Natural language to Defender 365 KQL” and “Natural language to Sentinel KQL” in the admin console under “My connections”. -- The NL2KQL skills can be automatically selected by Copilot For Security based on your prompt. +- The NL2KQL skills can be automatically selected by Security Copilot based on your prompt. - In the prompt box, type “/kql” to select the skill explicitly before entering a prompt. ### Use Case Scenarios @@ -40,7 +40,7 @@ You can also ask questions such as: 1. Be unambiguous: try to ask questions with a clear subject. 2. Ask one question at a time: ask for a single task/type of information at a time when possible. 3. Be specific: if you know anything about the data you are looking for, help provide that information in your question. -4. Use other skills: You can use Copilot For Security 's other skills to help gather information that might provide useful context while writing hunting queries. +4. Use other skills: You can use Security Copilot 's other skills to help gather information that might provide useful context while writing hunting queries. **Example guidelines:** | Ambiguous | Good | Explanation | diff --git a/Customer Guides/Prompting Tips for Copilot For Security/readme.md b/Customer Guides/Prompting Tips for Copilot For Security/readme.md index b30e3788..cd779e78 100644 --- a/Customer Guides/Prompting Tips for Copilot For Security/readme.md +++ b/Customer Guides/Prompting Tips for Copilot For Security/readme.md @@ -1,6 +1,6 @@  -# Prompting Tips with Microsoft Copilot for Security +# Prompting Tips with Microsoft Security Copilot | Best Practice | Description | |-------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -11,7 +11,7 @@ | **Be Positive and Respectful** | Use positive instructions instead of negative ones. Be respectful and appropriate for the workplace and avoid any biased, inappropriate, or violent content. Use the singular "they" pronoun to refer to people and avoid guessing their gender, roles, or feelings. | | **Treat Copilot as your Compadre** | Address Copilot as "you" instead of "model" or "assistant". | | **Treat new Copilot sessions as if they are a Stranger** | Sessions currently cannot reference other sessions. Meaning, if you ask a question in relation to an answer provided in a previous session, your new Copilot struggle will likely struggle to address without enough context. Please be mindful of this working with Copilot. | -| **Make Copilot do the Heavy Lifting when it comes to summarizing your sessions** | Concluding your session, leverage Copilot for Security to summarize the prompts’ responses for whatever audience you choose. | +| **Make Copilot do the Heavy Lifting when it comes to summarizing your sessions** | Concluding your session, leverage Security Copilot to summarize the prompts’ responses for whatever audience you choose. | | **Bridge your KQL knowledge gap with NL2KQL skills and KQL custom plugins** | Use the natural language to KQL (NL2KQL) plugin to hunt for information in your data sources using plain English. Junior KQL users will appreciate our KQL custom plugins to execute common KQL queries via natural language. | | **Automate wherever possible** | Use promptbooks and custom promptbooks to automate common security workflows, which require iterative responses to collate and summarize the information you seek. | | **It's okay to experiment. In fact, it’s encouraged!** | We’re venturing unchartered territory as a market with Security LLMs. Don’t be afraid to experiment with different ways of framing your prompts and evaluate the results based on your needs and expectations. You may be pleasantly surprised to find new things you never thought possible. Share your learnings with us in the comments of our blog. | diff --git a/Customer Guides/Readme.md b/Customer Guides/Readme.md index 0f22410f..61362511 100644 --- a/Customer Guides/Readme.md +++ b/Customer Guides/Readme.md @@ -1,19 +1,19 @@  -# Microsoft Copilot for Security - Customer Guide -Welcome to the Microsoft Copilot for Security Customer Guide! This document serves as your comprehensive resource for leveraging specific skill sets, querying sample prompts, managing identities, and addressing various security scenarios within Microsoft Copilot for Security. Whether you're new to the platform or looking to deepen your understanding, this guide will equip you with the knowledge and tools needed to maximize the effectiveness of CMicrosoft Copilot for Security +# Microsoft Security Copilot - Customer Guide +Welcome to the Microsoft Security Copilot Customer Guide! This document serves as your comprehensive resource for leveraging specific skill sets, querying sample prompts, managing identities, and addressing various security scenarios within Microsoft Security Copilot. Whether you're new to the platform or looking to deepen your understanding, this guide will equip you with the knowledge and tools needed to maximize the effectiveness of Microsoft Security Copilot. # Introduction -Microsoft Copilot for Security is a powerful platform designed to empower security professionals with advanced capabilities for threat detection, incident response, and security operations. By harnessing the latest advancements in artificial intelligence and machine learning, Microsoft Copilot for Security enables organizations to proactively defend against cyber threats, streamline security workflows, and protect critical assets. +Microsoft Security Copilot is a powerful platform designed to empower security professionals with advanced capabilities for threat detection, incident response, and security operations. By harnessing the latest advancements in artificial intelligence and machine learning, Microsoft Security Copilot enables organizations to proactively defend against cyber threats, streamline security workflows, and protect critical assets. # Key Features # 1. Specific Skill Sets -Microsoft Copilot for Security offers a diverse range of skill sets tailored to address specific security challenges and scenarios. These skill sets are designed to provide actionable insights, automate repetitive tasks, and enhance overall security posture. +Microsoft Security Copilot offers a diverse range of skill sets tailored to address specific security challenges and scenarios. These skill sets are designed to provide actionable insights, automate repetitive tasks, and enhance overall security posture. # 2. Sample Prompts -To effectively utilize Microsoft Copilot for Security's capabilities, it's essential to understand how to formulate queries and prompts that yield relevant insights. Sample prompts cover a variety of security topics. +To effectively utilize Microsoft Security Copilot's capabilities, it's essential to understand how to formulate queries and prompts that yield relevant insights. Sample prompts cover a variety of security topics. # 3. Identity Management -Managing identities and access controls is critical for maintaining security and compliance within an organization. Microsoft Copilot for Security provides robust identity management features, allowing you to authenticate users, authorize access, and monitor user activity. +Managing identities and access controls is critical for maintaining security and compliance within an organization. Microsoft Security Copilot provides robust identity management features, allowing you to authenticate users, authorize access, and monitor user activity. # 4. Scenarios -Microsoft Copilot for Security for Security can be applied to a wide range of security scenarios, including but not limited to threat hunting, incident response, and compliance monitoring. +Microsoft Security Copilot can be applied to a wide range of security scenarios, including but not limited to threat hunting, incident response, and compliance monitoring. diff --git a/Images/Community Plugins/DefenderDailyOperations/GetDefenderDevices.png b/Images/Community Plugins/DefenderDailyOperations/GetDefenderDevices.png new file mode 100644 index 00000000..780b102f Binary files /dev/null and b/Images/Community Plugins/DefenderDailyOperations/GetDefenderDevices.png differ diff --git a/Images/Community Plugins/DefenderDailyOperations/GetLatestEmailsByRecipient.png b/Images/Community Plugins/DefenderDailyOperations/GetLatestEmailsByRecipient.png new file mode 100644 index 00000000..3829932c Binary files /dev/null and b/Images/Community Plugins/DefenderDailyOperations/GetLatestEmailsByRecipient.png differ diff --git a/Images/Community Plugins/RedactPII/RedactPIIPrompt.png b/Images/Community Plugins/RedactPII/RedactPIIPrompt.png new file mode 100644 index 00000000..e0f580aa Binary files /dev/null and b/Images/Community Plugins/RedactPII/RedactPIIPrompt.png differ diff --git a/Images/Community Plugins/SecurityCopilotLogins/LoginsAndAnomalies.png b/Images/Community Plugins/SecurityCopilotLogins/LoginsAndAnomalies.png new file mode 100644 index 00000000..9f4f2c02 Binary files /dev/null and b/Images/Community Plugins/SecurityCopilotLogins/LoginsAndAnomalies.png differ diff --git a/Images/Community Plugins/SentinelIncidentComments/SentinelIncidentComments.png b/Images/Community Plugins/SentinelIncidentComments/SentinelIncidentComments.png new file mode 100644 index 00000000..e3137be1 Binary files /dev/null and b/Images/Community Plugins/SentinelIncidentComments/SentinelIncidentComments.png differ diff --git a/Images/Community Plugins/WatchlistKQL/TrustedUserWatchlist.png b/Images/Community Plugins/WatchlistKQL/TrustedUserWatchlist.png new file mode 100644 index 00000000..5c63cc27 Binary files /dev/null and b/Images/Community Plugins/WatchlistKQL/TrustedUserWatchlist.png differ diff --git a/Logic Apps/CfS-SendPromptbookResultsByEmail/CfS-SendPromptbookResultsByEmail.json b/Logic Apps/CfS-SendPromptbookResultsByEmail/CfS-SendPromptbookResultsByEmail.json new file mode 100644 index 00000000..92d0cd62 --- /dev/null +++ b/Logic Apps/CfS-SendPromptbookResultsByEmail/CfS-SendPromptbookResultsByEmail.json @@ -0,0 +1,1257 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "title": "Send the results of Security Copilot's Promptbook by email", + "description": "This Logic App executes the specified Promptbook in Security Copilot (a.k.a. Copilot for Security). It then converts each prompt's response, written in the simplified markdown language of Security Copilot, into HTML. Using these HTML excerpts or plain text responses and starting from a specified HTML template, it constructs the HTML body of an email and finally sends that email to the specified recipients. It is possible to exclude one or more of the promptbook responses from the email by their position index (1, 2, 3, etc.)", + "prerequisites": "", + "postDeployment": [ + "1. Set the credentials for the OAuth API connection to Security Copilot and Office 365 (the connection to O365 is used to send the email).", + "2. Edit the workflow and set the promptbook name and related parameters in the run-prompt action (after the deployment, they are empty).", + "3. In the workflow editor, if needed, modify the trigger type and/or parameters (e.g., change the recurrence date and time or replace the trigger with the Microsoft Sentinel Incident trigger).", + "4. In the workflow editor, open the parameters and set the desired email title, subject, and recipients.", + "5. In the workflow editor, in the parameters list, if needed, specify the indexes of the prompts that should not be included in the email (use the SkipPromptsInOutput parameter).", + "6. In the workflow editor, in the parameters list, if needed, specify the prompts that should be replaced in the email (use the ReplacePromptsInOutput parameter).", + "7. In the workflow editor, if needed, further customize the email subject in the send email action (e.g., if you have changed the trigger to 'MS Sentinel Incident', you may want to dynamically include the incident ID or title at the end of the email subject; this cannot be done in the paramteres).", + "8. Enable the Logic App (the template deploys it in the disabled state)." + ], + "prerequisitesDeployTemplateFile": "", + "lastUpdateTime": "", + "entities": [ + ], + "tags": [ + ], + "support": { + "tier": "community", + "armtemplate": "Generated from https://github.com/Azure/Azure-Sentinel/tree/master/Tools/Playbook-ARM-Template-Generator" + }, + "author": { + "name": "Stefano Pescosolido (https://www.linkedin.com/in/stefanopescosolido/)" + } + }, + "parameters": { + "PlaybookName": { + "defaultValue": "CfS-SendPromptbookResultsByEmail", + "type": "string" + }, + "HtmlBodyHeader": { + "defaultValue": "
|
Name of CVE: @{items('For_each')?['cveID']}
CVE Date: @{items('For_each')?['dateAdded']}
Impacted Devices: @{body('Submit_a_Copilot_for_Security_prompt_2')?['EvaluationResultContent']}
Impacted Vendors: @{items('For_each')?['vendorProject']}
Details: @{body('Submit_a_Copilot_for_Security_prompt')?['EvaluationResultContent']}
Exploitation Status: @{items('For_each')?['knownRansomwareCampaignUse']}
Mediation Steps: @{items('For_each')?['requiredAction']}
@{outputs('Show_HTML_report_here')}
@{body('Generate_HTML_report_from_JSON')}
", + "path": "/html2text" + } + }, + "Alert_-_Get_incident_from_systemalertid": { + "runAfter": { + "If_empty_results_wait_15_minutes_for_logs_to_show_up": [ + "Succeeded" + ] + }, + "type": "ApiConnection", + "inputs": { + "host": { + "connection": { + "name": "@parameters('$connections')['azuresentinel']['connectionId']" + } + }, + "method": "get", + "path": "[concat('/Incidents/subscriptions/@{encodeURIComponent(''', parameters('SubscriptionId'), ''')}/resourceGroups/@{encodeURIComponent(''', parameters('LogAnalyticsResourceGroup'),''')}/workspaces/@{encodeURIComponent(''', parameters('LogAnalyticsWorkspId') ,''')}/alerts/@{encodeURIComponent(variables(''systemalertid_query_results'')[0][''SystemAlertId''])}')]" + } + }, + "Add_comment_to_incident_(V3)_armid": { + "runAfter": { + "Alert_-_Get_incident_from_systemalertid": [ + "Succeeded" + ] + }, + "type": "ApiConnection", + "inputs": { + "host": { + "connection": { + "name": "@parameters('$connections')['azuresentinel']['connectionId']" + } + }, + "method": "post", + "body": { + "incidentArmId": "@body('Alert_-_Get_incident_from_systemalertid')?['id']", + "message": "********** Phishing Analysis Generated by Security Copilot **********
@{body('Html_to_text')}
---
Report generated: @{utcNow()}
Generated with AI, check for accuracy.
@{body('Generate_HTML_report_from_JSON')}
***********
Incident URL:
@{body('Alert_-_Get_incident_from_systemalertid')?['properties']?['incidentUrl']}
Generated with AI, check for accuracy.
***********
", + "Importance": "Normal" + }, + "path": "/v2/SharedMailbox/Mail" + } + }, + "If_empty_results_wait_15_minutes_for_logs_to_show_up": { + "actions": { + "Delay_15_min": { + "type": "Wait", + "inputs": { + "interval": { + "count": 15, + "unit": "Minute" + } + } + }, + "Second_try_set_variable_systemalertid_query_results": { + "runAfter": { + "Query_to_get_systemalertid_second_try": [ + "Succeeded" + ] + }, + "type": "SetVariable", + "inputs": { + "name": "systemalertid_query_results", + "value": "@body('Query_to_get_systemalertid_second_try')?['value']" + } + }, + "Query_to_get_systemalertid_second_try": { + "runAfter": { + "Delay_15_min": [ + "Succeeded" + ] + }, + "type": "ApiConnection", + "inputs": { + "host": { + "connection": { + "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']" + } + }, + "method": "post", + "body": "SecurityAlert\n| where isnotempty(Entities)\n| extend MailEntities = parse_json(Entities)\n| mv-expand MailEntities\n| where MailEntities.Type == \"mailMessage\"\n| extend NetworkMessageId = tostring(MailEntities.NetworkMessageId)\n| where NetworkMessageId == \"@{variables('network_message_id')}\"\n| distinct SystemAlertId", + "path": "/queryData", + "queries": { + "subscriptions": "[parameters('SubscriptionId')]", + "resourcegroups": "[parameters('LogAnalyticsResourceGroup')]", + "resourcetype": "Log Analytics Workspace", + "resourcename": "[parameters('LogAnalyticsWorkspaceName')]", + "timerange": "14d" + } + } + } + }, + "runAfter": { + "Set_variable_systemalertid_query_results": [ + "Succeeded" + ] + }, + "else": { + "actions": {} + }, + "expression": { + "and": [ + { + "less": [ + "@length(body('Query_to_get_systemalertid')?['value'])", + 1 + ] + } + ] + }, + "type": "If" + }, + "Set_variable_systemalertid_query_results": { + "runAfter": { + "Query_to_get_systemalertid": [ + "Succeeded" + ] + }, + "type": "SetVariable", + "inputs": { + "name": "systemalertid_query_results", + "value": "@body('Query_to_get_systemalertid')?['value']" + } + }, + "Query_to_get_systemalertid": { + "runAfter": { + "Html_to_text": [ + "Succeeded" + ] + }, + "type": "ApiConnection", + "inputs": { + "host": { + "connection": { + "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']" + } + }, + "method": "post", + "body": "SecurityAlert\n| where isnotempty(Entities)\n| extend MailEntities = parse_json(Entities)\n| mv-expand MailEntities\n| where MailEntities.Type == \"mailMessage\"\n| extend NetworkMessageId = tostring(MailEntities.NetworkMessageId)\n| where NetworkMessageId == \"@{variables('network_message_id')}\"\n| distinct SystemAlertId", + "path": "/queryData", + "queries": { + "subscriptions": "[parameters('SubscriptionId')]", + "resourcegroups": "[parameters('LogAnalyticsResourceGroup')]", + "resourcetype": "Log Analytics Workspace", + "resourcename": "[parameters('LogAnalyticsWorkspaceName')]", + "timerange": "14d" + } + } + } + }, + "runAfter": { + "Initialize_systemalert_id_query_results": [ + "Succeeded" + ] + }, + "else": { + "actions": { + "Send_an_email_from_a_shared_mailbox_(V2)_without_incident_url": { + "type": "ApiConnection", + "inputs": { + "host": { + "connection": { + "name": "@parameters('$connections')['office365-1']['connectionId']" + } + }, + "method": "post", + "body": { + "MailboxAddress": "[parameters('SharedMailboxAddress')]", + "To": "[parameters('HTMLReportRecipient')]", + "Subject": "Phishing Email Analysis", + "Body": "
@{body('Generate_HTML_report_from_JSON')}
***********
Generated with AI, check for accuracy.
***********
", + "Attachments": [ + { + "Name": "original_email.eml", + "ContentBytes": "@base64(body('Export_email_(V2)'))" + } + ], + "Importance": "Normal" + }, + "path": "/v2/SharedMailbox/Mail" + } + } + } + }, + "expression": { + "and": [ + { + "equals": [ + "@variables('is_defender_incident')", + true + ] + } + ] + }, + "type": "If" + }, + "Parse_Email": { + "runAfter": { + "For_each_raw_email_attached_to_carrier_email": [ + "Succeeded" + ] + }, + "type": "Function", + "inputs": { + "body": "@variables('raw_email')", + "function": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/resourceGroups/', parameters('FunctionAppResourceGroup'), '/providers/Microsoft.Web/sites/', parameters('FunctionAppName'), '/functions/', variables('FunctionName01'))]" + } + } + }, + "Normalize_JSON": { + "runAfter": { + "Security_Copilot_Email_Analysis": [ + "Succeeded" + ] + }, + "type": "Function", + "inputs": { + "body": "@body('Security_Copilot_Email_Analysis')?['EvaluationResultContent']", + "function": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/resourceGroups/', parameters('FunctionAppResourceGroup'), '/providers/Microsoft.Web/sites/', parameters('FunctionAppName'), '/functions/', variables('FunctionName02'))]" + } + } + }, + "Generate_HTML_report_from_JSON": { + "runAfter": { + "Parse_normalized_JSON": [ + "Succeeded" + ] + }, + "type": "Function", + "inputs": { + "body": "@body('Parse_normalized_JSON')", + "function": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/resourceGroups/', parameters('FunctionAppResourceGroup'), '/providers/Microsoft.Web/sites/', parameters('FunctionAppName'), '/functions/', variables('FunctionName03'))]" + } + } + } + }, + "outputs": {} + }, + "parameters": { + "$connections": { + "value": { + "office365-1": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/office365')]", + "connectionId": "[resourceId('Microsoft.Web/connections', variables('Office365-ConnectionName'))]", + "connectionName": "[variables('Office365-ConnectionName')]" + }, + + "securitycopilot-1": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/securitycopilot')]", + "connectionId": "[resourceId('Microsoft.Web/connections', variables('Securitycopilot-ConnectionName'))]", + "connectionName": "[variables('Securitycopilot-ConnectionName')]" + }, + + "azuresentinel": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/azuresentinel')]", + "connectionId": "[resourceId('Microsoft.Web/connections', variables('AzureSentinel-ConnectionName'))]", + "connectionName": "[variables('AzureSentinel-ConnectionName')]", + "connectionProperties": { + "authentication": { + "type": "ManagedServiceIdentity" + } + } + }, + "azuremonitorlogs": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/azuremonitorlogs')]", + "connectionId": "[resourceId('Microsoft.Web/connections', variables('AzureMonitorLogs-ConnectionName'))]", + "connectionName": "[variables('AzureMonitorLogs-ConnectionName')]", + "connectionProperties": { + "authentication": { + "type": "ManagedServiceIdentity" + } + } + }, + "conversionservice-1": { + "id": "[concat('/subscriptions/', parameters('SubscriptionId'), '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/conversionservice')]", + "connectionId": "[resourceId('Microsoft.Web/connections', variables('ConversionService-ConnectionName'))]", + "connectionName": "[variables('ConversionService-ConnectionName')]" + } + } + } + } + } + } + ] +} \ No newline at end of file diff --git a/Logic Apps/SecCopilot-UserReportedPhishing/DefenderKqlPlugins_automation.yaml b/Logic Apps/SecCopilot-UserReportedPhishing/DefenderKqlPlugins_automation.yaml index 6446d4ea..d4d5ec68 100644 --- a/Logic Apps/SecCopilot-UserReportedPhishing/DefenderKqlPlugins_automation.yaml +++ b/Logic Apps/SecCopilot-UserReportedPhishing/DefenderKqlPlugins_automation.yaml @@ -13,8 +13,8 @@ SkillGroups: Description: The subject of the email Required: true Settings: - Target: Defender - Template: |- + Target: Defender + Template: |- EmailEvents | where Subject == '{{subject}}' - Name: GetUrlClicksBySubjectAndSenderEmail @@ -28,8 +28,8 @@ SkillGroups: Description: The sender of the email Required: true Settings: - Target: Defender - Template: |- + Target: Defender + Template: |- let email = EmailEvents | where Subject == '{{subject}}' and SenderFromAddress == '{{senderEmail}}' | project NetworkMessageId; diff --git a/Logic Apps/SecCopilot-UserReportedPhishing/readme.md b/Logic Apps/SecCopilot-UserReportedPhishing/readme.md index 90340b8d..aedd6e8b 100644 --- a/Logic Apps/SecCopilot-UserReportedPhishing/readme.md +++ b/Logic Apps/SecCopilot-UserReportedPhishing/readme.md @@ -39,7 +39,7 @@ To deploy the above logic app, you need to
+- Choose Client Certificate Auth or Oauth (using user account that can submit prompts) to create connection with Microsoft Security Copilot logic app connector.
+
+
+- Important: the account selected for the authentication to Security Copilot must have the Contributor role on Security Copilot and reader privileges on Defender, Sentinel, Entra and Intune.
+- Similarly, authenticate the API connection to Exchange Online (the correct setup of connection is needed even if the Logic App is configured to not send emails)
+- Assign the role of 'Microsoft Sentinel Responder' to the Managed Identity of the Logic App within the Resource Group that contains the Sentinel's Log Analytics workspace.
+- Set the values for the Logic App parameters
+
+- Automate Sentinel incident investigation by adding the Logic App to Microsoft Sentinel automation rule. Alternatively, this logic app can be called on-demand by right-clicking on a Sentinel incident, choose **Run Playbook** option.
+
+## Microsoft Security Copilot skills
+- Following built-in skills are being used to perform investigation on a given incident entity type
+
+| Incident entity | Security Copilot skill |
+| --------------- | -------------------------- |
+| Process name / commandline | ProcessAnalyzer |
+| Account name | GetEntraUserDetails |
+| Account names | GetEntraRiskyUsers |
+| Device name | GetIntuneDevices |
+| IP address | AbuseIPDB |
+| Indicator of Compromise (IoC) | GetReputationsForIndicators |
+
+
+## Incident Investigation Template
+- Automated incident investigation summary is structured in following order. Modify the prompt to re-order or change the investigation template.
+ - Incident Overview,
+ - Incident Description,
+ - IP Addresses Analysis,
+ - Account Analysis,
+ - Users Risk Analysis,
+ - Devices Analysis,
+ - Processes Analysis,
+ - Indicators Analysis from MDTI,
+ - Possible mitigation steps and Conclusion
+
+
diff --git a/Logic Apps/ThreatBulletinCopilot/readme.md b/Logic Apps/ThreatBulletinCopilot/readme.md
index 33a274f2..ccaf8929 100644
--- a/Logic Apps/ThreatBulletinCopilot/readme.md
+++ b/Logic Apps/ThreatBulletinCopilot/readme.md
@@ -1,4 +1,4 @@
-# Copilot-For-Security-ThreatBulletin
+# Security Copilot-ThreatBulletin
Author: Sean Wasonga
## Overview
This playbook serves as a cornerstone for Security Copilot, facilitating integration with Microsoft Defender Threat Intelligence (MDTI) to swiftly provide the latest threat bulletins for threat articles. By consolidating this connection, users can efficiently access comprehensive threat article information. Over time, this foundational playbook may expand to incorporate additional capabilities.
@@ -13,7 +13,7 @@ Prior to beginning the installation process, it's crucial to confirm that you ha
## Deployment
-
+
|
|
| SkillName | +Description | +Parameters | +
|---|---|---|
| SecurityCopilotLogins | +Fetches Security Copilot Standalone Portal logins in the last 3 days | +
+
|
+
+
\ No newline at end of file
+
diff --git a/Plugins/Community Based Plugins/IP Geolocation/Readme.md b/Plugins/Community Based Plugins/IP Geolocation/Readme.md
deleted file mode 100644
index db8dd68d..00000000
--- a/Plugins/Community Based Plugins/IP Geolocation/Readme.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copilot for Security Plugin: IP Geolocation
-
-### **This plugin will match IP Addresses to their geolocation based on the Sentinel SecurityEvents table and a publicly available database.**
-
-### Pre-requisites
-
-- [Copilot for Security Enabled](https://learn.microsoft.com/en-us/security-copilot/get-started-security-copilot#onboarding-to-microsoft-security-copilot)
-- [Access to upload custom plugins](https://learn.microsoft.com/en-us/security-copilot/manage-plugins?tabs=securitycopilotplugin#managing-custom-plugins)
-- [Microsoft Sentinel Workspace](https://learn.microsoft.com/en-us/azure/sentinel/quickstart-onboard) created.
-- Parameters for KQL Plugin - Microsoft Sentinel Workspace Name, Subscription ID, Resource Group Name and Entra Tenant ID
-
-### Instructions
-
-#### Upload the Custom Plugin
-
-1. Obtain the file KQL_Plugin_IP4toGEO.yaml from this directory.
-2. Modify the yaml file to specify your specific Entra TentantId, SubscriptionId, ResourceGroupName and WorkspaceName for your Sentinel instance.
-3. Upload the custom plugin
-
-For more information, see: [Copilot for Security Plugin: IP Geolocation](https://rodtrent.substack.com/p/copilot-for-security-plugin-ip-geolocation)
diff --git a/Plugins/Community Based Plugins/IPQualityScore/README.md b/Plugins/Community Based Plugins/IPQualityScore/README.md
index 67e15f68..d6ebbb58 100644
--- a/Plugins/Community Based Plugins/IPQualityScore/README.md
+++ b/Plugins/Community Based Plugins/IPQualityScore/README.md
@@ -1,10 +1,10 @@
-# Copilot for Security Custom Plugin - API - Get IP Information from IP Quality Score
+# Security Copilot Custom Plugin - API - Get IP Information from IP Quality Score
-#### Copilot for Security Plugin to gather type, location, reputation score, and abuse velocity for an IP Address using IP Quality Score
+#### Security Copilot Plugin to gather type, location, reputation score, and abuse velocity for an IP Address using IP Quality Score
### Pre-requisites
-* [Copilot for Security Enabled](https://learn.microsoft.com/en-us/security-copilot/get-started-security-copilot#onboarding-to-microsoft-security-copilot)
+* [Security Copilot Enabled](https://learn.microsoft.com/en-us/security-copilot/get-started-security-copilot#onboarding-to-microsoft-security-copilot)
* [Access to upload custom plugins](https://learn.microsoft.com/en-us/security-copilot/manage-plugins?tabs=securitycopilotplugin#managing-custom-plugins)
* [API Key](https://www.ipqualityscore.com/proxy-vpn-tor-detection-service) from IP Quality Score
@@ -27,4 +27,4 @@ Here's some sample queries you can utilize to trigger this plugin
\ No newline at end of file
+
diff --git a/Plugins/Community Based Plugins/Identity/readme.md b/Plugins/Community Based Plugins/Identity/readme.md
index 67e93c5f..83165902 100644
--- a/Plugins/Community Based Plugins/Identity/readme.md
+++ b/Plugins/Community Based Plugins/Identity/readme.md
@@ -1,4 +1,4 @@
-# Custom Identity Security Analyst plugin for Copilot for Security
+# Custom Identity Security Analyst plugin for Security Copilot
The custom Identity Security skills to query Identity events for detection and forensics hunting across User Risk Assessment, Sign-in Monitoring, Admin Activity Monitoring, Application Usage Monitoring, Privileged Identity Management, Access Review:
@@ -20,4 +20,4 @@ Fetches Application Usage Monitoring logs to keep an eye on the usage of applica
Fetches Privileged Identity Management logs to monitor the lifecycle of privileged identities within your organization. This includes the creation, modification, and deletion of privileged accounts.
### Access Review monitoring
-Fetches Access Review logs to regularly review user access to various resources within your organization. This can help ensure that users only have access to the resources they need for their job functions, reducing the risk of insider threats.
\ No newline at end of file
+Fetches Access Review logs to regularly review user access to various resources within your organization. This can help ensure that users only have access to the resources they need for their job functions, reducing the risk of insider threats.
diff --git a/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/KQL_DefenderDailyOperationsSample.yaml b/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/Manifest_DefenderDailyOperations.yaml
similarity index 97%
rename from Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/KQL_DefenderDailyOperationsSample.yaml
rename to Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/Manifest_DefenderDailyOperations.yaml
index cc99a3c8..9161810f 100644
--- a/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/KQL_DefenderDailyOperationsSample.yaml
+++ b/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/Manifest_DefenderDailyOperations.yaml
@@ -37,4 +37,4 @@ SkillGroups:
EmailEvents
| where RecipientEmailAddress =~ '{{email}}'
| project Timestamp, NetworkMessageId, SenderFromAddress, SenderDisplayName, Subject, DeliveryLocation
- | top 100 by Timestamp desc
+ | top 10 by Timestamp desc
diff --git a/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/readme.md b/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/readme.md
index 95a71a54..8173eccd 100644
--- a/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/readme.md
+++ b/Plugins/Community Based Plugins/Microsoft Defender XDR Custom Plugin Scenarios/DefenderDailyOperations/readme.md
@@ -1,19 +1,61 @@
-# Copilot for Security Custom Plugin - Defender Daily Operations
-
-This plugin aids in comprehending the recommended approach of integrating multiple related skills into a single plugin. The provided code sample demonstrates the combination of two skills to retrieve information from few defender tables. You can further expand upon this example to extract additional details from custom tables etc.
-
-### Pre-requisites
-
-* [Copilot for Security Enabled](https://learn.microsoft.com/en-us/security-copilot/get-started-security-copilot#onboarding-to-microsoft-security-copilot)
-* [Access to upload custom plugins](https://learn.microsoft.com/en-us/security-copilot/manage-plugins?tabs=securitycopilotplugin#managing-custom-plugins)
-* [Microsoft Sentinel Workspace](https://learn.microsoft.com/en-us/azure/sentinel/quickstart-onboard) created.
-* Skills and Parameters for KQL Plugin - GetDefenderDevices (devicehealthstate & exposurelevel), GetLatestEmailsByRecipient (email)
-
-### Instructions
-#### Upload the Custom Plugin
-
-1. Obtain the file [KQL_DefenderDailyOperationsSample.yaml](https://github.com/Azure/Copilot-For-Security/tree/main/Plugins/Community%20Based%20Plugins/DefenderDailyOperations) from this directory.
-2. Upload the custom plugin
-
-
-
+# Defender Daily Operations
+
+## DESCRIPTION
+This plugin aids in comprehending the recommended approach of integrating multiple related skills into a single plugin. The provided code sample demonstrates the combination of two skills to retrieve information from few defender tables. You can further expand upon this example to extract additional details from custom tables etc.
+
+---
+
+## TYPE AND REQUIREMENTS
+**TYPE**: KQL (Defender) | SkillName | +Description | +Parameters | +
|---|---|---|
| GetDefenderDevices | +Get the top 10 devices from defender based on device state, exposure for the last 8 hours | +
+
|
+
| GetLatestEmailsByRecipient | +Fetches the latest emails received by the user with the specified email address | +
+
|
+
+
+| SkillName | +Description | +Parameters | +
|---|---|---|
| SentinelIncidentComments | +Fetch Sentinel incident comments | +
+
|
+
+| SkillName | +Description | +Parameters | +
|---|---|---|
| GetTrustedUsers | +Fetches the list of trusted users that is being maintained as a Microsoft Sentinel watchlist | +
+
|
+
+Example Prompt: Create an eDiscovery case in Purview with the Case name "Test-123", response should be a bulleted list.
+Inputs: [Case name]
+Example Prompt: Add a custodian to the eDiscovery case in Purview, use the Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0" and add this email "test@test123.com".
+Inputs: [Email], [Case ID]
+Example Prompt: Apply hold on eDiscovery custodian using the Custodian ID "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6".
+Inputs: [Custodian ID]
+Example Prompt: Add new userSource object associated with Custodian ID "2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6", include custodian email "test@test123.com" and specify sources as Mailbox, Site.
+Inputs: [Custodian ID], [Email]
+Example Prompt: Add a new eDiscovery Search object with Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0" with the display name "Test-123-search", and add dataSourceScopes to allTenantMailboxes, allTenantSites, allCaseCustodians.
+Inputs: [Case ID], [Display Name]
+Example Prompt: Run an estimate of the number of emails and documents in eDiscovery with Search ID "2xxxxxxx-xxx4-xxxd-4xxx-5xxxxxxxxxxx".
+Inputs: [Search ID]
+Example Prompt: Create a new eDiscovery ReviewSet for Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0" with Display Name "Test-123-reviewset".
+Inputs: [Case ID]
+Example Prompt: Use Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0" and ReviewSet ID "dxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" to initiate an export.
+Inputs: [Case ID], [Review Set ID]
+Example Prompt: Initiate an export from the Search with Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0" and Search ID "dxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". Additional parameters: displayName="Export 1 - simple PST-V2", exportCriteria="searchHits", additionalOptions="none", exportFormat="pst".
+Inputs: [Case ID], [Search ID]
+Example Prompt: Use the Case ID from above or use this Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0", and update index on Custodian.
+Inputs: [Case ID]
+Example Prompt: Use the Case ID from above or use this Case ID "1xxxx234-XXXX-XXXX-a1cd-fxxxxxxxxxx0", get a list of the caseOperation objects and their properties.
+Inputs: [Case ID]
+| SkillName | +Description | +Parameters | +
|---|---|---|
| RedactPII | +Redacts Personally Identifiable Information (PII) from the provided text | +
+
|
+
+- GET /params/<data> - Will return a JSON contains <data> and few other fields passed in URL Params" - text += "
- GET /params_auth_header/<data> - Will return a JSON contains <data> and few other fields passed in URL Params, along with Authorization field passed in header" - text += "
- GET /params_auth_data/<data> - Will return a JSON contains <data> and few other fields passed in URL Params, along with Authorization field passed in data" - text += "
- POST /json/<data> - Will return a JSON contains <data> and few other fields passed in payload JSON"
- return text
-
-# ---------------- GET methods
-@app.route('/simple/', methods=['GET'])
-def get_simple(data):
- obj = ReflectorSimple(data,getIpAddr(request),request.user_agent.string)
- response = jsonify(obj.getDict())
- return response
-
-@app.route('/simple/multiple/', methods=['GET'])
-def get_simple_multiple(data):
- count = int(data)
- objs = []
- for i in range(0,count):
- obj = ReflectorSimple("Data_"+str(i),getIpAddr(request),request.user_agent.string)
- objs.append(obj.getDict())
- response = jsonify(objs)
- return response
-
-# This method accepts query parameters,passes them to create a ReflectorJson JSON object
-@app.route('/params/', methods=['GET'])
-def get_params_data(data):
- args = request.args
- jsonData = args
- obj = ReflectorJson(data,jsonData,request.remote_addr,request.user_agent.string)
- response = jsonify(obj.getDict())
- return response
-
-@app.route('/params_auth_header/', methods=['GET'])
-def get_params_auth_header(data):
- args = request.args
- jsonData = args
- # Extract the Authorization Value from the Header
- authToken = "via Header:" + request.headers["Authorization"]
- obj = ReflectorJsonAuth(data,authToken,jsonData,request.remote_addr,request.user_agent.string)
- response = jsonify(obj.getDict())
- return response
-
-@app.route('/params_auth_data/', methods=['GET'])
-def get_params_auth_data(data):
- args = request.args
- jsonData = args
- # Extract the Authorization Value from the Parameter
- authToken = args["Authorization"]
- obj = ReflectorJsonAuth(data,authToken,jsonData,request.remote_addr,request.user_agent.string)
- response = jsonify(obj.getDict())
- return response
-
-# ---------------- POST methods
-@app.route('/json/', methods=['POST'])
-def get_json(data):
- jsonData = ""
- if(request.is_json):
- try:
- # Handle Error
- jsonData = request.get_json(force=True) #request.json
- print("Received JSON:",jsonData)
- except Exception as e:
- print("Error",e)
- print("Request Content", str(jsonData))
- result = {'Error': "'" + str(e) + "'"}
- return result, 400 # Return error as HTTP 400
- obj = ReflectorJson(data,jsonData,request.remote_addr,request.user_agent.string)
- response = jsonify(obj.getDict())
- return response
-
-
-#---- OPTIONAL: Use this URL to return YAML files if you do not want to the host the files in FTP/Azure/Blob
-#---- NOTE: All files should be placed in the ./Files folder
-@app.route('/file/
-* Upload a Microsoft Copilot for Security custom plugin of the Logic App type.
-* Deploy an Azure Logic App capable of handling Microsoft Copilot for Security prompts.
-* Create a Microsoft Copilot for Security session that triggers this Logic App.
+* Upload a Microsoft Security Copilot custom plugin of the Logic App type.
+* Deploy an Azure Logic App capable of handling Microsoft Security Copilot prompts.
+* Create a Microsoft Security Copilot session that triggers this Logic App.
#### Scenario
-In this technical workshop, participants will learn how to upload a Microsoft Copilot for Security custom plugin of the Logic App type and deploy the corresponding Logic App. To successfully complete this task, you must meet the following prerequisites:
+In this technical workshop, participants will learn how to upload a Microsoft Security Copilot custom plugin of the Logic App type and deploy the corresponding Logic App. To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* You should have permission to upload a custom plugin.
* You should have permission to deploy a Logic App.
diff --git a/Technical Workshops/Custom Plugin Workshop/Task02_Defang_URL/readme.md b/Technical Workshops/Custom Plugin Workshop/Task02_Defang_URL/readme.md
index 2ce64958..32822e51 100644
--- a/Technical Workshops/Custom Plugin Workshop/Task02_Defang_URL/readme.md
+++ b/Technical Workshops/Custom Plugin Workshop/Task02_Defang_URL/readme.md
@@ -15,10 +15,10 @@ Upon completing this technical guide, you will gain the following abilities:
### Scenario
-In this technical workshop, participants will learn how to upload a Microsoft Copilot for Security custom plugin of the GPT type.
+In this technical workshop, participants will learn how to upload a Microsoft Security Copilot custom plugin of the GPT type.
To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* You should have permission to upload a custom plugin.
diff --git a/Technical Workshops/Custom Plugin Workshop/Task03_GEO_IP_report/readme.md b/Technical Workshops/Custom Plugin Workshop/Task03_GEO_IP_report/readme.md
index 828115e1..f9529d9a 100644
--- a/Technical Workshops/Custom Plugin Workshop/Task03_GEO_IP_report/readme.md
+++ b/Technical Workshops/Custom Plugin Workshop/Task03_GEO_IP_report/readme.md
@@ -14,7 +14,7 @@ Upon completing this technical guide, you will gain the following abilities:
### Scenario
-In this technical workshop, participants will learn how to upload a Microsoft Copilot for Security custom plugin of the API type.
+In this technical workshop, participants will learn how to upload a Microsoft Security Copilot custom plugin of the API type.
> ⭐ Notice:
**When utilizing a custom plugin from an API type, be aware that data is transferred out of your tenant and sent to a remote endpoint. In this lab, we are working with sample data. Please keep this in consideration when handling internal data.**
@@ -22,7 +22,7 @@ In this technical workshop, participants will learn how to upload a Microsoft Co
To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* You should have permission to upload a custom plugin.
diff --git a/Technical Workshops/Custom Plugin Workshop/Task04_GEO_IP_script/readme.md b/Technical Workshops/Custom Plugin Workshop/Task04_GEO_IP_script/readme.md
index 699e5cc4..d6dd4068 100644
--- a/Technical Workshops/Custom Plugin Workshop/Task04_GEO_IP_script/readme.md
+++ b/Technical Workshops/Custom Plugin Workshop/Task04_GEO_IP_script/readme.md
@@ -13,7 +13,7 @@ Upon completing this technical guide, you will gain the following abilities:
* Generete report that will levrage the custom plugin source.
### Scenario
-In this technical workshop, participants will learn how to upload a Microsoft Copilot for Security custom plugin of the API type.
+In this technical workshop, participants will learn how to upload a Microsoft Security Copilot custom plugin of the API type.
> ⭐ Notice:
**When utilizing a custom plugin from an API type, be aware that data is transferred out of your tenant and sent to a remote endpoint. In this lab, we are working with sample data. Please keep this in consideration when handling internal data.**
@@ -21,7 +21,7 @@ In this technical workshop, participants will learn how to upload a Microsoft Co
To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* You should have permission to upload a custom plugin.
diff --git a/Technical Workshops/Custom Plugin Workshop/Task05_KQL/readme.md b/Technical Workshops/Custom Plugin Workshop/Task05_KQL/readme.md
index 48035161..6f46699f 100644
--- a/Technical Workshops/Custom Plugin Workshop/Task05_KQL/readme.md
+++ b/Technical Workshops/Custom Plugin Workshop/Task05_KQL/readme.md
@@ -12,10 +12,10 @@ After finishing this technical guide, you will acquire the following skills:
* Proficiency in generating reports utilizing the custom plugin source.
### Scenario
-In this technical workshop, participants will learn how to upload a Microsoft Copilot for Security custom plugin of the API type.
+In this technical workshop, participants will learn how to upload a Microsoft Security Copilot custom plugin of the API type.
To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* You should have permission to upload a custom plugin.
diff --git a/Technical Workshops/Knowledge base Workshop/Module 1- Upload a file to Copilot for Security KB workshop/readme.md b/Technical Workshops/Knowledge base Workshop/Module 1- Upload a file to Copilot for Security KB workshop/readme.md
index 0d3dcb60..f71b6eb5 100644
--- a/Technical Workshops/Knowledge base Workshop/Module 1- Upload a file to Copilot for Security KB workshop/readme.md
+++ b/Technical Workshops/Knowledge base Workshop/Module 1- Upload a file to Copilot for Security KB workshop/readme.md
@@ -1,7 +1,7 @@
-# Welcome to Microsoft Copilot for Security Labs!
+# Welcome to Microsoft Security Copilot Labs!
# Introduction

-## Upload a File to Copilot for Security
+## Upload a File to Security Copilot
#### ⌛ Estimated time to complete this lab: 100 minutes
#### 🎓 Level: 100 (Beginner)
@@ -9,17 +9,17 @@
Upon completing this technical guide, you will gain the following abilities:
-* Add Sample files to Copilot For Security
+* Add Sample files to Security Copilot
#### Scenario
"In this technical workshop, participants will learn how to upload a file to Copilot for Secuirty .To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* Linked to the Sample files folder
-# Workshop Agenda: Upload a File to Copilot for Security
+# Workshop Agenda: Upload a File to Security Copilot
# Workshop Agenda: File Upload KB Workskshop
diff --git a/Technical Workshops/Knowledge base Workshop/Module 2- Prompting an uploaded file content Using Copilot For Security/readme.md b/Technical Workshops/Knowledge base Workshop/Module 2- Prompting an uploaded file content Using Copilot For Security/readme.md
index 0fd1d2d3..53f64b4e 100644
--- a/Technical Workshops/Knowledge base Workshop/Module 2- Prompting an uploaded file content Using Copilot For Security/readme.md
+++ b/Technical Workshops/Knowledge base Workshop/Module 2- Prompting an uploaded file content Using Copilot For Security/readme.md
@@ -1,7 +1,7 @@
-# Welcome to Microsoft Copilot for Security Labs!
+# Welcome to Microsoft Security Copilot Labs!
# Introduction

-## Prompting for an uploaded file in Copilot for Security
+## Prompting for an uploaded file in Security Copilot
#### ⌛ Estimated time to complete this lab: 20 minutes
#### 🎓 Level: 200 (Proficient)
@@ -9,26 +9,26 @@
Upon completing this technical guide, you will gain the following abilities:
-* Leverage the File upload capability plugin with prompts direclty from Copilot For Security.
+* Leverage the File upload capability plugin with prompts direclty from Security Copilot.
#### Scenario
"In this technical workshop, participants will learn how to search for documents and leverage the infromation in practical Scurity Operation scenarios .To successfully complete this task, you must meet the following prerequisites:
-* You need your own tenant and Microsoft Copilot for Security instance.
+* You need your own tenant and Microsoft Security Copilot instance.
* uplaoded files from the Previous Module .
-# Workshop Agenda: Prompting for an uploaded file in Copilot for Security
+# Workshop Agenda: Prompting for an uploaded file in Security Copilot
## 1. Access the SANS (" Hunt Evil Poster Document")
- Access the Document from the samples folder in the GitHub Here [Hunt Evil Poster PDF](https://github.com/Azure/Copilot-For-Security/blob/main/Technical%20Workshops/Knowledge%20base%20Workshop/Sample%20Files/Hunt%20Evil%20Poster.pdf) or access it from the Link here : https://www.sans.org/posters/hunt-evil/

-- Ensure the document is added on your file upload capability in Copilot For Security
+- Ensure the document is added on your file upload capability in Security Copilot
-## 2. Prompting Uploade files using Copilot for Security
+## 2. Prompting Uploade files using Security Copilot
- send out the first Prompt Querying the data in the document , we will focus on a couple of senarios , in the hunt evil document we will focus on pulling infromation associated with Lateral Movement ( key focus on how its achieed with Remote Access or Remote Execution)
diff --git a/Technical Workshops/Knowledge base Workshop/Readme.md b/Technical Workshops/Knowledge base Workshop/Readme.md
index 6f1d96ad..4eba034e 100644
--- a/Technical Workshops/Knowledge base Workshop/Readme.md
+++ b/Technical Workshops/Knowledge base Workshop/Readme.md
@@ -1,25 +1,25 @@
-# Welcome to Microsoft Copilot for Security Labs!
+# Welcome to Microsoft Security Copilot Labs!

## Introduction
-Our lab initiatives are tailored to expedite your acclimatization to Microsoft Copilot for Security. They provide immersive, hands-on experiences, empowering you to seamlessly connect with your knowledge base.
+Our lab initiatives are tailored to expedite your acclimatization to Microsoft Security Copilot. They provide immersive, hands-on experiences, empowering you to seamlessly connect with your knowledge base.
-## Connect your Org Knowledge Base to Microsoft Copilot For Security
+## Connect your Org Knowledge Base to Microsoft Security Copilot
-**Microsoft Copilot for Security** allows you to integrate your organization’s knowledge base as an additional source of information. The inclusion of knowledge bases gives **Copilot** more context, resulting in responses that are more relevant, specific, and customized to the user.
+**Microsoft Security Copilot** allows you to integrate your organization’s knowledge base as an additional source of information. The inclusion of knowledge bases gives **Copilot** more context, resulting in responses that are more relevant, specific, and customized to the user.
-## Options To integrate your Knowledge Base into Microsoft Copilot For Security
+## Options To integrate your Knowledge Base into Microsoft Security Copilot
-| Options to Integrate KBs into Copilot for Security | Ways to integrate KBs into Microsoft Copilot For Security |
+| Options to Integrate KBs into Security Copilot | Ways to integrate KBs into Microsoft Security Copilot |
|----------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|
| Azure AI Search plugin | Follow the steps in [Prompting for a KB connected using Azure AI Search](https://learn.microsoft.com/en-us/security-copilot/connect-org-kb#prompting-for-a-knowledge-base-connected-using-azure-ai-search). |
| File upload | Follow the steps in [Prompting for an uploaded file](https://learn.microsoft.com/en-us/security-copilot/upload-file). |
## Modules
-- [**Module 1 - Upload a file to Copilot for Security**](https://github.com/Azure/Copilot-For-Security/tree/main/Technical%20Workshops/Knowledge%20base%20Workshop/Module%201-%20Upload%20a%20file%20to%20Copilot%20for%20Security%20KB%20workshop)
+- [**Module 1 - Upload a file to Security Copilot**](https://github.com/Azure/Copilot-For-Security/tree/main/Technical%20Workshops/Knowledge%20base%20Workshop/Module%201-%20Upload%20a%20file%20to%20Copilot%20for%20Security%20KB%20workshop)
-- [**Module 2 - Prompting an uploaded file content Using Copilot For Security**](https://github.com/Azure/Copilot-For-Security/tree/main/Technical%20Workshops/Knowledge%20base%20Workshop/Module%202-%20Prompting%20an%20uploaded%20file%20content%20Using%20Copilot%20For%20Security)
+- [**Module 2 - Prompting an uploaded file content Using Security Copilot**](https://github.com/Azure/Copilot-For-Security/tree/main/Technical%20Workshops/Knowledge%20base%20Workshop/Module%202-%20Prompting%20an%20uploaded%20file%20content%20Using%20Copilot%20For%20Security)
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/001_prompt_no_Markdown.png b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/001_prompt_no_Markdown.png
new file mode 100644
index 00000000..13fbe812
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/001_prompt_no_Markdown.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/002_AskGPT_Markdown_formatting.png b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/002_AskGPT_Markdown_formatting.png
new file mode 100644
index 00000000..68684a4a
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/002_AskGPT_Markdown_formatting.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/003_AskGPT_formatting_as_a_table_prompt.png b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/003_AskGPT_formatting_as_a_table_prompt.png
new file mode 100644
index 00000000..229e53fb
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/003_AskGPT_formatting_as_a_table_prompt.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/004_AskGPT_formatting_as_a_list_prompt.png b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/004_AskGPT_formatting_as_a_list_prompt.png
new file mode 100644
index 00000000..d42d55b8
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/004_AskGPT_formatting_as_a_list_prompt.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/005_AskGPT_formatting_as_a_list_result.png b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/005_AskGPT_formatting_as_a_list_result.png
new file mode 100644
index 00000000..cd57f3e0
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/005_AskGPT_formatting_as_a_list_result.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/006_prompt_that_includes_AskGPT_formatting.png b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/006_prompt_that_includes_AskGPT_formatting.png
new file mode 100644
index 00000000..a5762129
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/images/006_prompt_that_includes_AskGPT_formatting.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/readme.md b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/readme.md
new file mode 100644
index 00000000..eee97186
--- /dev/null
+++ b/Technical Workshops/Markdown Workshop/Module 1 - Formatting with markdown/readme.md
@@ -0,0 +1,101 @@
+## Module 1 - Formatting with Markdown in Microsoft Security Copilot
+
+
+
+#### ⌛ Estimated time to complete this lab: 15 minutes
+#### 🎓 Level: 100 (Beginner)
+
+The following example prompts demonstrate how users can modify the output from a plugin skill using Markdown. Large Language Models (LLMs) interpret context and follow instructions more effectively when delimiters and Markdown are included in prompts. Although natural language can be used, it often requires more detailed explanations than most users are willing to provide. By offering clear instructions and utilizing Markdown, as covered in this module, you can reduce the likelihood of output variance.
+
+1. [Initial prompt](#initial-prompt)
+2. [Formatting as a table with AskGPT](#formatting-as-a-table-with-askgpt)
+3. [Formatting as a list with AskGPT](#formatting-as-a-list-with-askgpt)
+4. [Combining a prompt with Markdown formatting instructions](#combining-a-prompt-with-Markdown-formatting-instructions)
+5. [Available Markdown](#available-markdown)
+6. [Increasing efficiency](#increasing-efficiency)
+
+
+### Initial prompt
+
+Running a prompt without specifying output expectations can lead to inconsistent formatting, such as alternating between tables and bullet points. When users don't provide detailed instructions on the desired output format, the skill will return all available data. In this example, the output starts with "Incident ID," followed by "Display Name," "Severity," and so on.
+
+```
+List the last 3 incidents from Defender.
+```
+
+
+### Formatting as a table with AskGPT
+
+To modify the default output, we can use the /AskGPT skill and instruct the model to take no action other than reading the instructions. Then, specify that subsequent outputs should follow the provided Markdown format. Keep in mind that this will not reformat existing results; the instruction must be set **before** the prompt for which you want to change the output format.
+```
+/AskGPT No action is needed at this time, simply review the following instructions and respond with 'Ready!'. Instructions: All additional responses will be formatted to conform to the following Markdown example.
+## Markdown example
+| **Created Date** | **Incident ID** | **Status** | **Incident URL** | **Title** | **Severity** | **Assigned To** | **Classification** | **Determination** | **Last Updated** |
+|-------------------------|-----------------|------------|-------------------|----------------------|--------------|-----------------|--------------------|-------------------|------------------------------|
+| 2025-01-08T12:09:40.47Z | 1234 | Active | https://12.aka.ms | Multi-stage incident | High | John.Doe | Malware | True Positive | 2025-01-22T23:33:21.1733333Z |
+```
+
+
+Notice that re-running the [Initial prompt](#initial-prompt) now results with the first column of "Created Date," followed by "Incident ID," and then "Status," instead of "Incident ID," "Display Name," and "Severity." **Be sure to apply these instructions before formatting other prompts.** For better organization and easier access, consider saving this prompt in a promptbook.
+
+
+
+### Formatting as a list with AskGPT
+
+Another example of Markdown formatting is shown below, using bullets, indentations, and a horizontal bar after each incident. In this example, the "Assigned To," "Classification," and "Determination" fields have been excluded from the formatted output by removing them from the Markdown example.
+```
+/AskGPT No action is needed at this time, simply review the following instructions and respond with 'Ready!'. Instructions: All additional responses will be formatted to conform to the following Markdown example.
+- **Created Date**: `2025-01-08T12:09:40.47Z`
+ - **Incident ID**: `1234`
+ - **Status**: `Active`
+ - **Title**: `Multi-stage incident`
+ - **Severity**: `High`
+ - **Last Updated**: `2025-01-22T23:33:21.1733333Z`
+ - **Incident URL**: [Incident Details](https://12.aka.ms)
+---
+```
+
+
+
+
+
+
+
+---
+
+
+### Combining a prompt with Markdown formatting instructions
+
+Instead of separating the request, you can include the formatting within the prompt itself. Combining both prompt and formatting instructions can be useful when used with Logic Apps and helps reduce SCU utilization.
+
+ ```
+List the last 3 incidents from Defender. Ensure the output is formatted to conform to the following Markdown example.
+## Markdown example
+| **Incident ID** | **Status** | **Incident URL** | **Title** | **Severity** | **Assigned To** | **Classification** | **Determination** | **Created Date** | **Last Updated** |
+|-----------------|------------|-------------------|----------------------|--------------|-----------------|--------------------|-------------------|--------------------------|-----------------------------|
+| 1234 | Active | https://12.aka.ms | Multi-stage incident | High | John.Doe | Malware | True Positive | 2025-01-08T12:09:40.47Z | 2025-01-22T23:33:21.1733333Z |
+```
+
+
+
+---
+### Available Markdown
+
+Given the speed of change within Security Copilot, the best way to visualize which Markdown syntax elements are available to you is by using the following prompt.
+
+Please note that the standalone instance of Security Copilot currently does not support rendering all Markdown syntax elements (e.g., certain headings and images). While you can still include these elements in your prompts, the output will need to be processed and rendered by another service.
+
+```
+/AskGPT Assume the role of a Markdown syntax expert. Provide a comprehensive list of Markdown syntax elements, including tables, numbered lists, task lists, and horizontal rules. For each element, provide instructions on how I can replicate them myself and what it would look like when rendered.
+```
+For the official Markdown specification visit [CommonMark](https://commonmark.org/help/)
+
+### Increasing efficiency
+
+All the Markdown formatting methods above include extra characters to help users visualize the format. To increase efficiency, you can remove double spaces and extra hyphens. Here's an example of what this looks like:
+
+```
+| **Incident ID** | **Status** | **Incident URL** |
+| --- | --- | --- |
+| 1234 | Active | https://12.aka.ms |
+```
\ No newline at end of file
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/001_module2_prompt_no_Markdown.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/001_module2_prompt_no_Markdown.png
new file mode 100644
index 00000000..608d68b1
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/001_module2_prompt_no_Markdown.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/002_module2_summarize_reason_and_reccomend.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/002_module2_summarize_reason_and_reccomend.png
new file mode 100644
index 00000000..76cb8bb9
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/002_module2_summarize_reason_and_reccomend.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/003_module2_creating_links_from_alert_IDs.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/003_module2_creating_links_from_alert_IDs.png
new file mode 100644
index 00000000..ae978833
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/003_module2_creating_links_from_alert_IDs.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/004_module2_final_prompt_with_Markdown.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/004_module2_final_prompt_with_Markdown.png
new file mode 100644
index 00000000..303717b0
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/004_module2_final_prompt_with_Markdown.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_1.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_1.png
new file mode 100644
index 00000000..840a8ba7
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_1.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_2.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_2.png
new file mode 100644
index 00000000..fc4a4aa5
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_2.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_3.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_3.png
new file mode 100644
index 00000000..48aed057
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_3.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_4.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_4.png
new file mode 100644
index 00000000..f7b9eb0c
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_4.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_5.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_5.png
new file mode 100644
index 00000000..f1995898
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_5.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_6.png b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_6.png
new file mode 100644
index 00000000..93872118
Binary files /dev/null and b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/images/005_module2_promptbook_step_6.png differ
diff --git a/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/readme.md b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/readme.md
new file mode 100644
index 00000000..4ece09dc
--- /dev/null
+++ b/Technical Workshops/Markdown Workshop/Module 2 - Enhancing reasoning and formatting with markdown/readme.md
@@ -0,0 +1,172 @@
+
+
+
+## Module 2 - Enhancing reasoning and formatting with Markdown
+
+
+
+#### ⌛ Estimated time to complete this lab: 15 minutes
+#### 🎓 Level: 200 (Intermediate)
+
+The following example prompts demonstrate how users can enhance both the output and the reasoning behind that output by using Markdown. Large Language Models (LLMs) interpret context and follow instructions more effectively when prompts include delimiters and Markdown. While natural language can be used, it often requires more detailed explanations, which many users may not be willing to provide. By offering clear instructions and utilizing Markdown, as outlined in this module, users can reduce the likelihood of output inconsistencies.
+
+LLMs often aren't fine-tuned to fully understand the specific context of a user's query. While platforms like Security Copilot help improve prompting by including system prompts that emphasize Responsible AI (RAI) and the intended use of plugins or skills, these might not always meet the user's expectations. To bridge this gap, users should provide additional context and direction, aligning with both the [Security Copilot prompt engineering best practices](https://learn.microsoft.com/en-us/copilot/security/prompting-tips) and general LLM prompt engineering best practices.
+
+This module illustrates how users can combine the referenced Security Copilot prompt engineering best practices with general LLM prompt engineering best practices.
+
+1. [Large Language Model prompt engineering best practices](#large-language-model-prompt-engineering-best-practices)
+2. [Initial prompt](#initial-prompt)
+3. [Summarizing, reasoning, and recommendations](#summarizing-reasoning-and-recommendations)
+4. [Creating links from alert IDs](#creating-links-from-alert-ids)
+5. [Ensuring consistent formatting](#ensuring-consistent-formatting)
+6. [Leveraging Promptbooks](#leveraging-promptbooks)
+
+### Large Language Model prompt engineering best practices
+
+Effective prompting is key to obtaining accurate, relevant, and useful responses from language models. By following this set of best practices for effective prompting, users can ensure that the model's outputs align more closely with the desired results.
+
+1. **Assign a Persona** - Define a specific role to tailor responses appropriately. For example, instructing the model to act as a data analyst can lead to insights that focus on data interpretation.
+2. **Use Delimiters** - Employ delimiters, like triple quotes, to clearly indicate specific text segments for tasks such as translation or summarization. This ensures the model processes the correct portion of text. Markdown can simplify this process.
+3. **Provide Step-by-Step Instructions** - Break down complex tasks into sequential steps to guide the model through the reasoning process. This approach often results in more accurate outcomes.
+4. **Include Examples** - Provide one or more examples to show the desired pattern or style. This helps the model infer and replicate the expected response format.
+5. **Be Clear and Specific** - Craft precise, unambiguous prompts, supplying enough context to help the model understand and fulfill the request accurately.
+6. **Specify Tone** - If tone is important, specify it in the prompt. Review the model’s outputs iteratively and refine your prompts to improve the quality of responses.
+7. **Iterative Refinement** - Continuously review the model's outputs and adjust your prompts as needed to improve response quality.
+
+
+### Initial prompt
+
+Running a prompt without specifying output expectations can lead to inconsistent formatting, such as alternating between tables and bullet points. When users don't provide detailed instructions on the desired output format, the skill will return all available data.
+
+In this example, I prompt Security Copilot to use the Purview plugin and retrieve the 10 DLP alerts with a severity of high over the past 30 days:
+
+```
+Using the Purview plugin, get the last 10 DLP alerts with a severity of high over the past 30 days. Format the output in a table.
+```
+I can download the response output by selecting **"Export to Excel"** or simply view it from within the browser by selecting the icon to the right of the "Export to Excel" button.
+
+
+
+
+### Summarizing, reasoning, and recommendations
+
+Looking over these alerts, I can see that it includes a few of the same users. Rather than viewing each alert line-by-line in a table and having to mentally group alerts, I'll use the **/AskGPT** skill, as illustrated in [Module 1 - Formatting with markdown](https://github.com/Azure/Security-Copilot/tree/main/Technical%20Workshops/Markdown%20Workshop/Module%201%20-%20Formatting%20with%20markdown), to instruct Security Copilot to:
+
+- Summarize all data, grouped by users.
+- Highlight significant trends, behaviors, or issues observed.
+- Identify patterns, similarities, or contributing factors among the alerts.
+- Provide a summary with actionable recommendations to mitigate risk, prioritize incidents, and improve compliance.
+
+```
+/AskGPT For each user, write a concise, actionable summary addressed to their manager. Begin the summary with the user's User Principal Name (UPN). Highlight significant trends, behaviors, or issues observed in their DLP alerts using chain-of-thought reasoning to identify patterns, similarities, or contributing factors across the alerts. Provide clear, actionable recommendations to mitigate risk, prioritize incidents, and improve compliance.
+```
+
+### Creating links from alert IDs
+
+Being satisfied with the summarizing, reasoning, and recommendations output, I'd like to include clickable links that make it easier to view the actual alert. While the initial output does not include a clickable link, it does include the Alert ID.
+
+Given that Defender XDR, Sentinel, and Purview use standardized URL formats, I can use the alert ID to create an alert link. Purview specifically uses the following URL format, where `{my-Tenant-ID}` would be replaced with my Tenant ID and `{Purview-alert-ID}` would be replaced by the Purview Alert ID:
+`https://purview.microsoft.com/datalossprevention/alertspage/fullpage?tid={my-Tenant-ID}&alertsviewid=overview&id={Purview-alert-ID}`.
+
+The finished URL will look something like this:
+`https://purview.microsoft.com/datalossprevention/alertspage/fullpage?tid=0527ecb7-06fb-4769-b324-fd4a3bb865eb&alertsviewid=overview&id=da7618d0-35a6-71b8-3400-08dd5766cd5a`
+
+To create a link, I simply need to ensure that the data required to support a given URL format is present in the output or provided some other way. In this case, the output contains a list of DLP alerts along with their associated alert ID. Since my Tenant ID is missing, I'll need to get it. There are multiple methods for getting this, but the easiest is to simply view the [Tenant Properties within the Azure Portal](https://portal.azure.com/#view/Microsoft_AAD_IAM/TenantProperties.ReactView).
+
+Now that I have the Tenant ID, I can hardcode that part of the URL. From my experience working in Defender XDR and Purview, I know that alert IDs associated with Purview include a preceding 'dl' that I'll need to remove if I want to view these alerts from the Purview portal.
+
+To generate this URL, I will again use the **/AskGPT** skill and prompt Security Copilot to:
+- Create a link for the alerts.
+- Provide it with the root URL that contains my Tenant ID.
+- Ask it to remove the first two characters of the alert ID.
+
+⚠️ Please read next prompt before executing and don't forget to insert your Tenant ID in the URL before pasting.
+
+```
+/AskGPT For each user include a direct link to the alert in Microsoft Purview portal using the following URL format:
+Purview: [{Alert Title}](https://purview.microsoft.com/datalossprevention/alertspage/fullpage?tid={Replace-with-your-tenant-ID-and-remove-curly-brackets}&alertsviewid=overview&id={alertId with the first two 'dl' characters of the AlertID removed})
+```
+
+⚠️ If I'd prefer working out of Defender XDR instead of Purview, I can leave the preceding 'dl' characters in the Alert ID and use the Defender XDR URL `https://security.microsoft.com/alerts/{alert ID}`, modifying the prompt accordingly. To avoid confusing the LLM, I'll choose either Purview or Defender XDR before pasting the prompt.
+
+```
+/AskGPT For each user include a direct link to the alert in Defender XDR portal using the following URL format:
+[{Alert Title}](https://security.microsoft.com/alerts/{alert Id})
+```
+
+If the above prompt failed, verify that you updated the Tenant ID.
+
+
+
+
+### Ensuring consistent formatting
+
+While I value the friendly, conversational, and non-repetitive nature that Generative AI provides, I need the output to be consistently formatted each time. To achieve this, I'll provide clear instructions that integrate my previous prompts, URL modifications, and additional format guidelines.
+
+Since large language models (LLMs) work best when using specific delimiters, and Markdown is a well-established language for such delimiters, I will combine both the [Security Copilot prompt engineering best practices](https://learn.microsoft.com/en-us/copilot/security/prompting-tips) and the [general best practices for effective prompting of LLMs](#general-best-practices-for-effective-prompting-llms) outlined at the top of this page. By leveraging both of these resources, I’ve not only harnessed the power of Security Copilot, but I will also ensure that the reasoning output is consistently formatted each time I run this prompt.
+
+```
+Using the Purview plugin, get the last 10 DLP alerts with a severity of high. Assume the role of an expert **Data Loss Prevention (DLP) engineer** tasked with generating a **professional, manager-focused summary** of a DLP triage workflow for DLP alerts.
+
+- For **each user**, write a **concise, actionable summary** addressed to their manager.
+- Begin the summary with the user's **User Principal Name (UPN), Job Title, and Department** to establish context.
+- Highlight **significant trends, behaviors, or issues** observed in their **DLP alerts** using **chain-of-thought reasoning** to identify patterns, similarities, or contributing factors across the alerts.
+- Provide **clear, actionable recommendations** to mitigate risk, prioritize incidents, and improve compliance.
+- Include a direct **link to the alert in Microsoft Purview** using the following URL format: [{Alert Title}](https://purview.microsoft.com/datalossprevention/alertspage/fullpage?tid=0527ecb7-06fb-4769-b324-fd4a3bb865eb&alertsviewid=overview&id={alert Id}
+- Note that if the alert ID begins with 'dl' this portion of the alertId should be removed before creating the URL. Example: https://purview.microsoft.com/datalossprevention/alertspage/fullpage?tid=0527ecb7-06fb-4769-b324-fd4a3bb865eb&alertsviewid=overview&id=dlda7618d0-35a6-71b8-9200-08dd5767802a
+...becomes...
+https://purview.microsoft.com/datalossprevention/alertspage/fullpage?tid=0527ecb7-06fb-4769-b324-fd4a3bb865eb&alertsviewid=overview&id=da7618d0-35a6-71b8-9200-08dd5767802a
+
+**Tone and Style:** Write in clear, professional, and manager-focused language, emphasizing risk, mitigation strategies, and actionable insights.
+
+## Output format ##
+**User**: {User Principal Name (UPN)}
+
+**Summary:**
+{Concise, actionable summary of the DLP alerts for the user, highlighting significant trends, behaviors, or issues observed in their DLP alerts using chain-of-thought reasoning to identify patterns, similarities, or contributing factors across the alerts. Summary should be under 150 words.}
+
+**Recommendations:**
+1. **Recommendation category**: {Any recommendation that supports mitigate risk, prioritize incidents, and improve compliance}
+2. **Recommendation category**: {Any additional recommendations that supports mitigate risk, prioritize incidents, and improve compliance}
+3. etc...
+
+**Alert Links:**
+- [Alert Title](Alert Link)
+- [Alert Title](Alert Link)
+---
+```
+
+
+
+---
+
+### Leveraging Promptbooks
+
+To make repeating the execution of this prompt easier, I'll create a promptbook. Promptbooks can store multiple prompts and support workflows that allow users to easily rerun one or more prompts at a later time. For advanced prompts like this that include multiple lines of instructions and formatting requirements, using a promptbook reduces the likelihood that I'll incur errors from typing, saves me time from having to manually copy and paste prompts from an external library, and allows me to share it with others within my organization.
+
+To create a promptbook from within a session, I simply need to click the checkbox on the top left corner of the prompt, and select the "Create promptbook" icon at the top. However, it's important to note that promptbooks use angle brackets`< >` to denote variables. As such, the existence of them must only be used for variables without spaces.
+
+
+
+Next, I'll provide a name, relevant tags (hit ENTER after each tag), and a description. After this, I'll hover my mouse over the prompt box and click the pencil icon to edit the prompt.
+
+
+
+Since I don't always want "10" alerts exactly, I'll make this a variable by replacing the number "10" with `