Add DentiSystems Sentinel Solution - #14965
Open
MD Sadman Shovik (Sadman-TheDentian) wants to merge 20 commits into
Open
Add DentiSystems Sentinel Solution#14965MD Sadman Shovik (Sadman-TheDentian) wants to merge 20 commits into
MD Sadman Shovik (Sadman-TheDentian) wants to merge 20 commits into
Conversation
MD Sadman Shovik (Sadman-TheDentian)
requested review from
a team
as code owners
August 23, 2026 20:32
Author
|
@microsoft-github-policy-service agree company="DentiSystems" |
Contributor
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds the initial DentiSystems Microsoft Sentinel solution package (v1.0.0) including an ARM deployment template, UI definition, solution metadata, and packaged security content for DentiGrid & GATE telemetry.
Changes:
- Added ARM
mainTemplate.json(and packaged copy) deploying the CCP REST API poller data connector, 4 scheduled analytics rules, a workbook, and saved searches for hunting/ASIM normalization. - Added solution documentation and artifacts (workbook JSON, analytic rule JSONs, hunting queries JSON, parser KQL, connector metadata).
- Added a Python helper script to generate/emit the solution template and content files.
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| Solutions/DentiSystems/mainTemplate.json | Primary ARM template for deploying solution resources into a Sentinel-enabled workspace. |
| Solutions/DentiSystems/generate_templates.py | Local generator script intended to emit templates/content files for the solution package. |
| Solutions/DentiSystems/createUiDefinition.json | Azure Portal wizard UI definition for collecting workspace and API parameters. |
| Solutions/DentiSystems/Workbooks/DentiSystems_ThreatOverview.json | Workbook definition used by the solution for visualization. |
| Solutions/DentiSystems/SolutionMetadata.json | Solution manifest metadata (publisher, categories, version, package counts). |
| Solutions/DentiSystems/README.md | Solution documentation (architecture, contents, deployment steps, schema). |
| Solutions/DentiSystems/Parsers/DentiSystems_ASIM_Parser.kql | ASIM normalization parser KQL content (intended function body). |
| Solutions/DentiSystems/Package/mainTemplate.json | Packaged copy of the primary ARM template (for Content Hub packaging). |
| Solutions/DentiSystems/Package/createUiDefinition.json | Packaged copy of the Azure Portal wizard UI definition. |
| Solutions/DentiSystems/Package/README.md | Packaged copy of the solution documentation. |
| Solutions/DentiSystems/HuntingQueries/DentiSystems_HuntingQueries.json | Two hunting queries shipped with the solution. |
| Solutions/DentiSystems/DataConnectors/DentiSystems_CCP.json | Data connector metadata artifact for the package. |
| Solutions/DentiSystems/AnalyticRules/DentiSystems_VolumetricRecon.json | Scheduled analytic rule for volumetric recon detection. |
| Solutions/DentiSystems/AnalyticRules/DentiSystems_SCADA_Tamper.json | Scheduled analytic rule for ICS/BMS protocol tampering detection. |
| Solutions/DentiSystems/AnalyticRules/DentiSystems_HighSeverityBreach.json | Scheduled analytic rule for high-severity honeypot breach detection. |
| Solutions/DentiSystems/AnalyticRules/DentiSystems_GATE_ThreatIntercept.json | Scheduled analytic rule for GATE injection/threat interception detection. |
Suppressed comments (1)
Solutions/DentiSystems/Package/createUiDefinition.json:1
- Same issue as the non-packaged
createUiDefinition.json:steps('basics')is invalid because"basics"isn’t a step. Update to usebasics('workspace')for workspace name/location so the packaged UI definition deploys successfully.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+137
to
+147
| "outputs": { | ||
| "workspace": "[steps('basics').workspace.name]", | ||
| "workspaceLocation": "[steps('basics').workspace.location]", | ||
| "location": "[steps('basics').workspace.location]", | ||
| "dentiSystemsApiEndpoint": "[steps('dentiSystemsConfig').apiEndpoint]", | ||
| "dentiSystemsApiKey": "[steps('dentiSystemsConfig').apiKey]", | ||
| "enableDataConnector": "[steps('dentiSystemsConfig').enableDataConnector]", | ||
| "enableAnalyticRules": "[steps('securityContent').enableAnalyticRules]", | ||
| "enableWorkbooks": "[steps('securityContent').enableWorkbooks]", | ||
| "enableHuntingQueries": "[steps('securityContent').enableHuntingQueries]" | ||
| } |
Comment on lines
+5
to
+14
| azure_sentinel_dir = "/home/sadmanthedentian/Documents/DENTISYSTEMS/Azure-Sentinel" | ||
| package_dir = os.path.join(azure_sentinel_dir, "Package") | ||
| connectors_dir = os.path.join(azure_sentinel_dir, "DataConnectors") | ||
| rules_dir = os.path.join(azure_sentinel_dir, "AnalyticRules") | ||
| workbooks_dir = os.path.join(azure_sentinel_dir, "Workbooks") | ||
| hunting_dir = os.path.join(azure_sentinel_dir, "HuntingQueries") | ||
| parsers_dir = os.path.join(azure_sentinel_dir, "Parsers") | ||
|
|
||
| for d in [azure_sentinel_dir, package_dir, connectors_dir, rules_dir, workbooks_dir, hunting_dir, parsers_dir]: | ||
| os.makedirs(d, exist_ok=True) |
Comment on lines
+1008
to
+1011
| for filepath, content in files_to_write.items(): | ||
| with open(filepath, "w", encoding="utf-8") as f: | ||
| json.dump(content, f, indent=2) | ||
| print(f"Wrote {filepath} ({os.path.getsize(filepath)} bytes)") |
Comment on lines
+3
to
+4
| DENTIGRIDThreats_CL | ||
| | extend EventVendor = 'DentiSystems', EventProduct = 'DentiGrid', EventProductVersion = '1.0' |
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
…tputs, wrap ASIM KQL parser view, and refine generate_templates
| @@ -0,0 +1,36 @@ | |||
| import json | |||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Required items, please complete