-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Add BeyondTrust Privilege Management Cloud solution for Microsoft Sentinel #13074
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
…tinel This commit introduces a new Microsoft Sentinel solution for BeyondTrust Privilege Management Cloud, providing comprehensive visibility into privilege management activities and endpoint security events. Solution Components: - Data connector using Azure Functions with DCR-based Logs Ingestion API - Two custom Log Analytics tables with comprehensive schemas - Interactive workbook for activity audits and client events visualization Data Collection: - Activity Audits (BeyondTrustPM_ActivityAudits_CL): ~40 columns capturing administrative changes, policy modifications, configuration updates, and SIEM integration activities - Client Events (BeyondTrustPM_ClientEvents_CL): 50+ ECS-aligned columns capturing endpoint security events including application control, process execution, file hashes, and user activities Architecture: - DCR-based Logs Ingestion API (Azure Monitor recommended approach) - Managed identity with RBAC (no shared keys) - Automated table creation with inline ARM template schemas - One-click deployment via "Deploy to Azure" button - .NET 8 Isolated runtime with Azure.Monitor.Ingestion SDK - Support for Consumption, Flex Consumption, and Elastic Premium plans Testing: - ARM-TTK validation: 48/49 tests passing - JSON validation: All files valid - End-to-end deployment verified - Data ingestion confirmed for both tables - Workbook tested with live data Files Added: - Solutions/BeyondTrustPMCloud/Data Connectors/azuredeploy_BeyondTrustPMCloud_API_FunctionApp.json - Solutions/BeyondTrustPMCloud/Data Connectors/BeyondTrustPMCloud_API_FunctionApp.json - Solutions/BeyondTrustPMCloud/Data Connectors/AzureFunctionBeyondTrustPMCloud/ (complete function code) - Solutions/BeyondTrustPMCloud/Workbooks/BeyondTrustPMCloud.json - Solutions/BeyondTrustPMCloud/Data/Solution_BeyondTrustPMCloud.json - Solutions/BeyondTrustPMCloud/Package/ (complete solution package) - Solutions/BeyondTrustPMCloud/README.md - Solutions/BeyondTrustPMCloud/ReleaseNotes.md - Solutions/BeyondTrustPMCloud/SolutionMetadata.json - Logos/BeyondTrustLogo.svg Content Hub ready for Azure Marketplace publication. Version: 3.0.0
|
Hi @jamos-bt Kindly accept the CLA and review the validation check that is failing. Thanks! |
|
@microsoft-github-policy-service agree [company="BeyondTrust"] |
|
@microsoft-github-policy-service agree company="BeyondTrust" |
|
Hi @v-maheshbh, The KQL validation seems to be failing because ... "The name 'BeyondTrustPM_ActivityAudits_CL' does not refer to any known table, tabular variable or function." This is a custom table that is created as part of the ARM template deployment in Solutions/BeyondTrustPMCloud/Data Connectors/azuredeploy_BeyondTrustPMCloud_API_FunctionApp.json Is there something else I need to add so the test is aware of the two tables used by the connector? |
|
Hi @v-maheshbh just following up on the question above. I understand that the KQL validation is failing, but I'm not sure how to address it since it's not really an issue with the KQL statements in our package but rather just due to the fact that those statement reference custom tables that are created by the app. Your input would be greatly appreciated! |
|
Hi @jamos-bt Thanks! |
Hi @v-maheshbh - I checked the repository and found that the tables are declared / created as BeyondTrustPM_ActivityAudits_CL and BeyondTrustPM_ClientEvents_CL. The ONLY place in the entire repository that those tables are referenced and it is NOT with those EXACT names (matching case) is on line 102 in LogAnalyticsService.cs ... where it is intentionally doing a .ToLowerInvariant() comparison in C#. The actual KQL queries in BeyondTrustPMCloud_API_FunctionApp.json, mainTemplate.json, and BeyondTrustPMCloud.json all have the table names matching exactly to the declarations. Do you see somewhere I'm missing? |
|
@v-maheshbh Ping on the above. ;) |
|
Hi @jamos-bt Kindly review the snippet below.
thanks! |
Right. As mentioned above "The ONLY place in the entire repository that those tables are referenced and it is NOT with those EXACT names (matching case) is on line 102 in LogAnalyticsService.cs ... where it is intentionally doing a .ToLowerInvariant() comparison in C#." The line you highlighted is just a string literal in the C# code and it is being compared to the output of logType.ToLowerInvariant() ... meaning the value, no matter what the casing of the value in logType, will always be lowercase here, hence the lowercase literal. This should have absolutely nothing to do with KQL validation is this isn't KQL ... it's C# function app code. *** Also, to avoid any confusion as to what that code is doing, it takes the logType as a parameter. This parameter should be either "BeyondTrustPM_ActivityAudits_CL" or "BeyondTrustPM_ClientEvents_CL". It converts that value to lowercase and puts THAT value into a switch statement. The cases of the switch ultimately returns a tuple (multiple values) comprised of the DCR's immutable ID and the stream name. So, yes, the code does convert the logType (custom table name) to lowercase. BUT that value is ONLY used as the input to that switch statement. It is NOT used in a KQL query and it isn't even returned out of that method. |
|
Hi @jamos-bt Thanks! |
|
hi @jamos-bt We are putting your PR on hold because your solution uses Azure Function and not Sentinel Codeless Connector Framework (CCF). We would be happy to work with you to migrate your solution to CCF. Please contact the Microsoft Sentinel Partners at [email protected] to discuss available options. Thanks! |
|
We have reformatted the ReleaseNotes.md as requested. That said we cannot rewrite the connect using the CCF. We actually went down that path originally, but we found that due to incompatibilities between the way the BeyondTrust PM Cloud APIs we needed to use were implemented and current CCF capabilities, it was not an option. Therefore, we proceeded with the Microsoft recommendation for custom connectors where CCF cannot be used. https://learn.microsoft.com/en-us/azure/sentinel/create-custom-connector Given the following facts, it seems there is no reason to put this PR on hold:
So that brings us back to the failing KQL validation check. Is there someone who might be able to look into this and provide guidance as to why it's failing? Is there an issue with the test / validation itself? Do we have an issue in our solution that simply isn't being clearly indicated by the provided error and that neither you nor I have been able to identify? We do have multiple customers asking about this solution, and we have tested the solution and shown it to work. Anything you can do to escalate this so we can fix anything that needs to be fixed then get it merged, we would greatly appreciate it! Thanks again, |
|
Hi @jamos-bt Thanks! |
|
Hi @jamos-bt Thanks! |
… path for the KQL validation tests to pick them up
|
@v-maheshbh Done! Hopefully that was the only thing preventing the validation check from passing. |
|
Hi @jamos-bt kindly Update the offerId to follow the correct format: and attached testing screenshot for reference. Thanks! |
|
Hi @v-maheshbh - I've updated the offer ID to match the suggested format. I also redeployed the solution in our environment and let it gather a bit of data to show it working:
|
|
Hi @jamos-bt Thanks! |
…[skip ci]" This reverts commit 37f7de9.
Co-authored-by: jamos-bt <[email protected]>
)" This reverts commit a553ecc.
…hould now match current upstream master
|
@v-maheshbh Sorry, I didn't realize I needed to disable the Actions on my fork to keep it from automatically updating things I didn't change myself. I've now reverted all the changes to files that were not part of our solution and synced with the upstream repo. |
|
Hi @jamos-bt and also include the images at the path mentioned below as well. Thanks! |
|
Hi @jamos-bt Thanks! |
|
Hi @v-maheshbh - Preview screenshots have been added as requested. Sorry for the delay, but I was out for two weeks on holiday. :) |
|
Hi @jamos-bt and Thanks! |
|
Hi @v-maheshbh did you check this pull request for the preview images? They are present in the path you specified:
I also added my workbook to the main metadata file as requested. |
|
Hi @jamos-bt
Thanks! |
|
Hi @v-maheshbh - Yes, that is our corporate website where users can go to get product information as well as support. I have verified that is is up and running. |







Change(s):
Solutions/BeyondTrustPMCloud/Data Connectors/azuredeploy_BeyondTrustPMCloud_API_FunctionApp.jsonSolutions/BeyondTrustPMCloud/Data Connectors/BeyondTrustPMCloud_API_FunctionApp.jsonSolutions/BeyondTrustPMCloud/Data Connectors/AzureFunctionBeyondTrustPMCloud/(complete function app code)Solutions/BeyondTrustPMCloud/Workbooks/BeyondTrustPMCloud.jsonSolutions/BeyondTrustPMCloud/Data/Solution_BeyondTrustPMCloud.jsonSolutions/BeyondTrustPMCloud/Package/(complete solution package)Solutions/BeyondTrustPMCloud/README.mdSolutions/BeyondTrustPMCloud/ReleaseNotes.mdSolutions/BeyondTrustPMCloud/SolutionMetadata.jsonReason for Change(s):
Version Updated:
Testing Completed:
Checked that the validations are passing and have addressed any issues that are present:
createUiDefinition.json✓mainTemplate.json✓testParameters.json✓Additional Context: