Skip to content

Commit 13874a4

Browse files
committed
updates reflecting #14585 merge
1 parent a4e21b9 commit 13874a4

12 files changed

Lines changed: 913 additions & 293 deletions

.script/tests/KqlvalidationsTests/CustomTables/BV_ClaudeCompliance_ComplianceActivities_CL.json

Lines changed: 582 additions & 14 deletions
Large diffs are not rendered by default.

Parsers/ASimAgentEvent/ARM/ASimAgentEventAnthropicClaudeCompliance/ASimAgentEventAnthropicClaudeCompliance.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"displayName": "Agent Event ASIM parser for Anthropic Claude Compliance",
2828
"category": "ASIM",
2929
"FunctionAlias": "ASimAgentEventAnthropicClaudeCompliance",
30-
"query": "let Parser = (\n disabled: bool=false,\n pack: bool=false\n)\n{\n BV_ClaudeCompliance_ComplianceActivities_CL\n | where not(disabled)\n | where type_CF != 'compliance_api_accessed' //filter out API requests for logs\n | project-rename\n EventStartTime = created_at,\n EventUid = _ItemId,\n EventOriginalUid = id_CF,\n EventType = type_CF\n | extend\n EventSchema = 'AgentEvent',\n EventSchemaVersion = '0.1.0',\n EventCount = toint(1),\n EventVendor = 'Anthropic',\n EventProduct = 'Claude Enterprise',\n TargetAgentId = coalesce(claude_project_id, claude_chat_id, claude_file_id),\n EventEndTime = TimeGenerated\n | evaluate bag_unpack(actor)\n | project-rename\n ActorUserId = user_id,\n SrcIpAddr = ip_address\n | extend\n ActorUsername = coalesce(email_address, unauthenticated_email_address),\n ActorUsernameType = iff(isnotempty(coalesce(email_address, unauthenticated_email_address)), 'UPN', '')\n | extend AdditionalFields = iff (\n pack,\n bag_pack(\n 'request_id', request_id,\n 'request_method', request_method,\n 'status_code', status_code,\n 'url', url,\n 'claude_chat_id', claude_chat_id,\n 'claude_file_id', claude_file_id,\n 'claude_project_id', claude_project_id,\n 'user_agent', user_agent,\n 'status_code', status_code\n ),\n dynamic({})\n )\n | project\n TimeGenerated,\n Type,\n EventStartTime,\n EventEndTime,\n EventUid,\n EventOriginalUid,\n EventType,\n EventSchema,\n EventSchemaVersion,\n EventCount,\n EventVendor,\n EventProduct,\n TargetAgentId,\n ActorUserId,\n SrcIpAddr,\n ActorUsername,\n ActorUsernameType,\n AdditionalFields,\n EventResult = case(\n status_code >= 200 and status_code < 300, 'Success',\n status_code >= 400 and status_code < 500, 'Failure',\n status_code >= 500, 'Failure',\n isempty(status_code), '',\n ''\n ),\n Dvc = SrcIpAddr\n};\nParser\n(\n disabled = disabled,\n pack = pack\n) ",
30+
"query": "let Parser = (\n disabled: bool=false,\n pack: bool=false\n)\n{\n BV_ClaudeCompliance_ComplianceActivities_CL\n | where not(disabled)\n | where type_CF != 'compliance_api_accessed' //filter out API requests for logs\n | project-rename\n EventStartTime = created_at,\n EventUid = _ItemId,\n EventOriginalUid = id_CF,\n EventType = type_CF\n | extend\n EventSchema = 'AgentEvent',\n EventSchemaVersion = '0.1.0',\n EventCount = toint(1),\n EventVendor = 'Anthropic',\n EventProduct = 'Claude Enterprise',\n TargetAgentId = coalesce(claude_project_id, claude_chat_id, claude_file_id, claude_artifact_id),\n EventEndTime = TimeGenerated,\n ActorIpAddr = tostring(actor.ip_address),\n ActorType = tostring(actor.type),\n ActorUserAgent = tostring(actor.user_agent),\n ActorApiKeyId = tostring(actor.api_key_id),\n ActorUserIdFromActor = tostring(actor.user_id),\n ActorEmail = tostring(actor.email_address),\n ActorUnauthEmail = tostring(actor.unauthenticated_email_address),\n ActorServiceAccountId = tostring(actor.service_account_id),\n TargetAgentName = coalesce(mcp_server_name, plugin_name, skill_name, group_name, service_name, extract(@'/v1/compliance/([^/]+)', 1, url), '')\n | extend\n ActorUserId = coalesce(ActorUserIdFromActor, user_id),\n SrcIpAddr = ActorIpAddr,\n HttpUserAgent = ActorUserAgent,\n ActorUsername = coalesce(ActorEmail, ActorUnauthEmail),\n ActorUsernameType = iff(isnotempty(coalesce(ActorEmail, ActorUnauthEmail)), 'UPN', ''),\n ActorScopeId = coalesce(ActorApiKeyId, ActorServiceAccountId)\n | extend \n EventResult = case(\n isnotempty(status_code) and status_code >= 200 and status_code < 300, 'Success',\n isnotempty(status_code) and status_code >= 400, 'Failure',\n ''\n ),\n EventResultDetails = tostring(status_code)\n | extend AdditionalFields = iff(\n pack,\n bag_pack(\n 'request_id', request_id,\n 'request_method', request_method,\n 'status_code', status_code,\n 'url', url,\n 'claude_chat_id', claude_chat_id,\n 'claude_file_id', claude_file_id,\n 'claude_project_id', claude_project_id,\n 'claude_artifact_id', claude_artifact_id,\n 'user_agent', ActorUserAgent,\n 'actor_type', ActorType,\n 'api_key_id', ActorApiKeyId,\n 'service_account_id', ActorServiceAccountId,\n 'organization_id', organization_id,\n 'organization_uuid', organization_uuid,\n 'workspace_id', workspace_id,\n 'group_id', group_id,\n 'role_id', role_id,\n 'session_id', session_id,\n 'action', action,\n 'decision', decision,\n 'reason', reason\n ),\n dynamic({})\n )\n | project\n TimeGenerated,\n Type,\n EventStartTime,\n EventEndTime,\n EventUid,\n EventOriginalUid,\n EventType,\n EventSchema,\n EventSchemaVersion,\n EventCount,\n EventVendor,\n EventProduct,\n EventResult,\n EventResultDetails,\n TargetAgentId,\n ActorUserId,\n ActorUsername,\n ActorUsernameType,\n ActorScopeId,\n SrcIpAddr,\n HttpUserAgent,\n Dvc = SrcIpAddr,\n AdditionalFields\n};\nParser(\n disabled = disabled,\n pack = pack\n) ",
3131
"version": 1,
3232
"functionParameters": "disabled:bool=False,pack:bool=False"
3333
}

Parsers/ASimAgentEvent/ARM/vimAgentEventAnthropicClaudeCompliance/vimAgentEventAnthropicClaudeCompliance.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"displayName": "Agent Event ASIM parser for Anthropic Claude Compliance",
2828
"category": "ASIM",
2929
"FunctionAlias": "vimAgentEventAnthropicClaudeCompliance",
30-
"query": "let Parser = (\n starttime: datetime=datetime(null),\n endtime: datetime=datetime(null),\n agentid_has_any: dynamic=dynamic([]),\n agentname_has_any: dynamic=dynamic([]),\n username_has_any: dynamic=dynamic([]),\n disabled: bool=false,\n pack: bool=false\n)\n{\n BV_ClaudeCompliance_ComplianceActivities_CL\n | where not(disabled)\n | where (\n (isnull(starttime) or TimeGenerated >= starttime)\n and (isnull(endtime) or TimeGenerated <= endtime)\n // AgentID filtering done later in the parser\n // AgentName detail not available in this parser.\n // Username filtering done later in the parser\n )\n | where type_CF != 'compliance_api_accessed' //filter out API requests for logs\n | project-rename\n EventStartTime = created_at,\n EventUid = _ItemId,\n EventOriginalUid = id_CF,\n EventType = type_CF\n | extend\n EventSchema = 'AgentEvent',\n EventSchemaVersion = '0.1.0',\n EventCount = toint(1),\n EventVendor = 'Anthropic',\n EventProduct = 'Claude Enterprise',\n TargetAgentId = coalesce(claude_project_id, claude_chat_id, claude_file_id),\n EventEndTime = TimeGenerated\n | where ((array_length(agentid_has_any) == 0) or (TargetAgentId has_any (agentid_has_any)))\n | evaluate bag_unpack(actor)\n | project-rename\n ActorUserId = user_id,\n SrcIpAddr = ip_address\n | extend\n ActorUsername = coalesce(email_address, unauthenticated_email_address),\n ActorUsernameType = iff(isnotempty(coalesce(email_address, unauthenticated_email_address)), 'UPN', '')\n | where ((array_length(username_has_any) == 0) or (ActorUsername has_any (username_has_any)))\n | extend AdditionalFields = iff (\n pack,\n bag_pack(\n 'request_id', request_id,\n 'request_method', request_method,\n 'status_code', status_code,\n 'url', url,\n 'claude_chat_id', claude_chat_id,\n 'claude_file_id', claude_file_id,\n 'claude_project_id', claude_project_id,\n 'user_agent', user_agent,\n 'status_code', status_code\n ),\n dynamic({})\n )\n | project\n TimeGenerated,\n Type,\n EventStartTime,\n EventEndTime,\n EventUid,\n EventOriginalUid,\n EventType,\n EventSchema,\n EventSchemaVersion,\n EventCount,\n EventVendor,\n EventProduct,\n TargetAgentId,\n ActorUserId,\n SrcIpAddr,\n ActorUsername,\n ActorUsernameType,\n AdditionalFields,\n EventResult = case(\n status_code >= 200 and status_code < 300, 'Success',\n status_code >= 400 and status_code < 500, 'Failure',\n status_code >= 500, 'Failure',\n isempty(status_code), '',\n ''\n ),\n Dvc = SrcIpAddr\n};\nParser(\n starttime = starttime,\n endtime = endtime,\n agentid_has_any = agentid_has_any,\n agentname_has_any = agentname_has_any,\n username_has_any = username_has_any,\n disabled = disabled,\n pack = pack\n)",
30+
"query": "let Parser = (\n starttime: datetime=datetime(null),\n endtime: datetime=datetime(null),\n agentid_has_any: dynamic=dynamic([]),\n agentname_has_any: dynamic=dynamic([]),\n username_has_any: dynamic=dynamic([]),\n disabled: bool=false,\n pack: bool=false\n)\n{\n BV_ClaudeCompliance_ComplianceActivities_CL\n | where not(disabled)\n | where (\n (isnull(starttime) or TimeGenerated >= starttime)\n and (isnull(endtime) or TimeGenerated <= endtime)\n )\n // AgentID filtering done later in the parser\n // AgentName filtering done later in the parser\n // Username filtering done later in the parser\n | where type_CF != 'compliance_api_accessed' //filter out API requests for logs\n | project-rename\n EventStartTime = created_at,\n EventUid = _ItemId,\n EventOriginalUid = id_CF,\n EventType = type_CF\n | extend\n EventSchema = 'AgentEvent',\n EventSchemaVersion = '0.1.0',\n EventCount = toint(1),\n EventVendor = 'Anthropic',\n EventProduct = 'Claude Enterprise',\n TargetAgentId = coalesce(claude_project_id, claude_chat_id, claude_file_id, claude_artifact_id),\n EventEndTime = TimeGenerated,\n ActorIpAddr = tostring(actor.ip_address),\n ActorType = tostring(actor.type),\n ActorUserAgent = tostring(actor.user_agent),\n ActorApiKeyId = tostring(actor.api_key_id),\n ActorUserIdFromActor = tostring(actor.user_id),\n ActorEmail = tostring(actor.email_address),\n ActorUnauthEmail = tostring(actor.unauthenticated_email_address),\n ActorServiceAccountId = tostring(actor.service_account_id),\n TargetAgentName = coalesce(mcp_server_name, plugin_name, skill_name, group_name, service_name, extract(@'/v1/compliance/([^/]+)', 1, url), '')\n | where (\n ((array_length(agentid_has_any) == 0) or (TargetAgentId has_any (agentid_has_any)))\n and ((array_length(agentname_has_any) == 0) or (TargetAgentName has_any (agentname_has_any)))\n )\n | extend\n ActorUserId = coalesce(ActorUserIdFromActor, user_id),\n SrcIpAddr = ActorIpAddr,\n HttpUserAgent = ActorUserAgent,\n ActorUsername = coalesce(ActorEmail, ActorUnauthEmail),\n ActorUsernameType = iff(isnotempty(coalesce(ActorEmail, ActorUnauthEmail)), 'UPN', ''),\n ActorScopeId = coalesce(ActorApiKeyId, ActorServiceAccountId)\n | where ((array_length(username_has_any) == 0) or (ActorUsername has_any (username_has_any)))\n | extend \n EventResult = case(\n isnotempty(status_code) and status_code >= 200 and status_code < 300, 'Success',\n isnotempty(status_code) and status_code >= 400, 'Failure',\n ''\n ),\n EventResultDetails = tostring(status_code)\n | extend AdditionalFields = iff(\n pack,\n bag_pack(\n 'request_id', request_id,\n 'request_method', request_method,\n 'status_code', status_code,\n 'url', url,\n 'claude_chat_id', claude_chat_id,\n 'claude_file_id', claude_file_id,\n 'claude_project_id', claude_project_id,\n 'claude_artifact_id', claude_artifact_id,\n 'user_agent', ActorUserAgent,\n 'actor_type', ActorType,\n 'api_key_id', ActorApiKeyId,\n 'service_account_id', ActorServiceAccountId,\n 'organization_id', organization_id,\n 'organization_uuid', organization_uuid,\n 'workspace_id', workspace_id,\n 'group_id', group_id,\n 'role_id', role_id,\n 'session_id', session_id,\n 'action', action,\n 'decision', decision,\n 'reason', reason\n ),\n dynamic({})\n )\n | project\n TimeGenerated,\n Type,\n EventStartTime,\n EventEndTime,\n EventUid,\n EventOriginalUid,\n EventType,\n EventSchema,\n EventSchemaVersion,\n EventCount,\n EventVendor,\n EventProduct,\n EventResult,\n EventResultDetails,\n TargetAgentId,\n ActorUserId,\n ActorUsername,\n ActorUsernameType,\n ActorScopeId,\n SrcIpAddr,\n HttpUserAgent,\n Dvc = SrcIpAddr,\n AdditionalFields\n};\nParser(\n starttime = starttime,\n endtime = endtime,\n agentid_has_any = agentid_has_any,\n agentname_has_any = agentname_has_any,\n username_has_any = username_has_any,\n disabled = disabled,\n pack = pack\n)",
3131
"version": 1,
3232
"functionParameters": "starttime:datetime=datetime(null),endtime:datetime=datetime(null),agentid_has_any:dynamic=dynamic([]),agentname_has_any:dynamic=dynamic([]),username_has_any:dynamic=dynamic([]),disabled:bool=False,pack:bool=False"
3333
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Changelog for ASimAgentEvent.yaml
22

33
## Version 0.1.1
4-
- (2026-06-29) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
4+
- (2026-07-08) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
55

66
## Version 0.1.0
77
- (2026-04-16) Added new schema Agent Event

Parsers/ASimAgentEvent/CHANGELOG/ASimAgentEventAnthropicClaudeCompliance.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
## Version 0.1.0
44

5-
- (2026-06-29) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
5+
- (2026-07-08) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Changelog for imAgentEvent.yaml
22

33
## Version 0.1.1
4-
- (2026-06-29) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
4+
- (2026-07-08) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
55

66
## Version 0.1.0
77
- (2026-04-16) Added new schema Agent Event

Parsers/ASimAgentEvent/CHANGELOG/vimAgentEventAnthropicClaudeCompliance.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
## Version 0.1.0
44

5-
- (2026-06-29) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)
5+
- (2026-07-08) Anthropic Claude Compliance - AgentEvent ASIM Parser - [PR #14578](https://github.com/Azure/Azure-Sentinel/pull/14578)

Parsers/ASimAgentEvent/Parsers/ASimAgentEvent.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Parser:
22
Title: Agent Event ASIM parser
33
Version: "0.1.1"
4-
LastUpdated: Jun 29, 2026
4+
LastUpdated: Jul 08, 2026
55
Product:
66
Name: Source agnostic
77
Normalization:

0 commit comments

Comments
 (0)