Skip to content
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

[Security Solution] add defend insights elastic assistant tool #198676

Merged
merged 1 commit into from
Nov 19, 2024

Conversation

joeypoon
Copy link
Member

@joeypoon joeypoon commented Nov 1, 2024

Summary

Adds the new Defend Insights Elastic Assistant tool. This assistant tool provides Elastic Defend configuration insights. For this initial PR, only incompatible antivirus detection is supported. Telemetry is collected for success and error events.

For incompatible antivirus detection, Defend Insights will review the last 200 file events for the given endpoint and output suspected antiviruses. Improvements such as customizable event count and date range will come in the future.

This PR does not include any UI, that will come in a separate PR. 3 internal APIs for interacting with Defend Insights are provided here:

  • POST /defend_insights for creating a new Defend Insight
  • GET /defend_insights/{id} for getting a Defend Insight
  • GET /defend_insights for getting multiple Defend Insights
    • available optional query params:
      • size - default 10
      • ids
      • connector_id
      • type - incompatible_antivirus
      • status - running, completed, failed, canceled
      • endpoint_ids

This initial implementation does not include the LangGraph/output chunking upgrades seen in Attack Discovery due to time constraints. We'll look to make this upgrade in a future PR.

Checklist

For maintainers

@joeypoon joeypoon added release_note:skip Skip the PR/issue when compiling release notes Team:Defend Workflows “EDR Workflows” sub-team of Security Solution labels Nov 1, 2024
@joeypoon joeypoon changed the title [Security Solution] add defend insights ai assistant tool [Security Solution] add defend insights elastic assistant tool Nov 1, 2024
@joeypoon joeypoon force-pushed the feature/endpoint-ai-insights branch 3 times, most recently from 1b32df0 to e29f793 Compare November 4, 2024 10:18
@joeypoon joeypoon marked this pull request as ready for review November 4, 2024 15:41
@joeypoon joeypoon requested review from a team as code owners November 4, 2024 15:41
@elasticmachine
Copy link
Contributor

Pinging @elastic/security-defend-workflows (Team:Defend Workflows)

Copy link
Contributor

@paul-tavares paul-tavares left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some feedback that I would I would like to hear back on. Note that I focused only on files under security solution.

Also - why is there no feature flag for this code? With out one it just be available in serverless with the next release after it is merged to main - is that ok?

@joeypoon
Copy link
Member Author

Left some feedback that I would I would like to hear back on. Note that I focused only on files under security solution.

Thanks for the review @paul-tavares. Responded directly on each one. Will update code for all of the ones I reacted with 👍.

Also - why is there no feature flag for this code? With out one it just be available in serverless with the next release after it is merged to main - is that ok?

That's an oversight by me. It's technically an internal API but we should still add a feature flag. Will update.

Copy link
Contributor

@andrew-goldstein andrew-goldstein left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @joeypoon!
LGTM 🚀

@joeypoon joeypoon added the backport:all-open Backport to all branches that could still receive a release label Nov 13, 2024
@joeypoon joeypoon force-pushed the feature/endpoint-ai-insights branch 2 times, most recently from 105700e to c789fa3 Compare November 13, 2024 10:13
@joeypoon joeypoon force-pushed the feature/endpoint-ai-insights branch 2 times, most recently from e3bceca to 86812fa Compare November 13, 2024 13:59
@tomsonpl
Copy link
Contributor

tomsonpl commented Nov 18, 2024

Hey @joeypoon 👋 so exciting to see the cool stuff here!

However, given this PR has +++4.5k lines, it's very difficult to actually get a solid understanding and therefore do a review.
Do you think it's possible to merge this functionality in smaller chunks?
edit:
Or maybe not this particular PR since it's been open for a while (sorry for a delay in reviewing), but at least for the future ones?

@joeypoon
Copy link
Member Author

Hey @joeypoon 👋 so exciting to see the cool stuff here!

However, given this PR has +++4.5k lines, it's very difficult to actually get a solid understanding and therefore do a review. Do you think it's possible to merge this functionality in smaller chunks? edit: Or maybe not this particular PR since it's been open for a while (sorry for a delay in reviewing), but at least for the future ones?

I agree with you in concept but unfortunately this one is really hard to split up. In fact, this is already split up and there will be quite a few more PRs following this 😅. Happy to walk through it with you if it helps but breaking this one up any smaller was unfortunately not feasible.

/**
* Enables the Defend Insights feature
*/
defendInsights: false,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding this. I searched around and I don't actually see it being used... Where is it checked?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Each of the 3 API handlers check for it like this. We don't actually use it in security_solution plugin yet but will for following PRs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@joeypoon - Thats strange (to me). So somehow this elastic_assistant plugin has access to our internal features? The code you pointed to is a bit hard to follow. Do you know how where it is actually is checking the feature flag is enabled/disabled?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're checking for it at the beginning of all 3 new API handlers (in elastic_assistant) and that definition for those is actually here. The definition in x-pack/plugins/security_solution/common/experimental_features.ts isn't actually being used right now and is just prep for next PRs to have less conflicts.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah. ok. I'm just a bit confused how the FF from security solution will be used in another plugin.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah. ok. I'm just a bit confused how the FF from security solution will be used in another plugin.

It's not, it will be used within the security solution plugin. It's only introduced here since it's the first PR being merged for the overall feature.

Copy link
Contributor

@paul-tavares paul-tavares left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the changes. I left a question regarding the feature flag, but am approving and you can just answer it when you can

* Adds a new elastic AI assistant tool, Defend Insights
  * this tool provides Elastic Defend configuration insights
    * initially it will only support incompatible antivirus detection
      * additional Defend Insight types can be added by simply registering a type, prompt, and context query
    * this is to be internally used to provide actionable Endpoint Insights such as suggesting Trusted App entries for detected incompatible antiviruses
@joeypoon joeypoon force-pushed the feature/endpoint-ai-insights branch from eb9ab83 to 0059617 Compare November 19, 2024 08:21
@joeypoon joeypoon enabled auto-merge (squash) November 19, 2024 08:21
Copy link
Contributor

@tomsonpl tomsonpl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍 Left a few questions, but just out of curiosity. Thanks!

response: estypes.SearchResponse<EsDefendInsightSchema>
): DefendInsightsResponse[] => {
return response.hits.hits
.filter((hit) => hit._source !== undefined)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a thought:
Since _source: true is included in the request, wouldn’t every document already have a _source field?
I’m wondering if this filter is still necessary in that case.

.filter((hit) => hit._source !== undefined)
.map((hit) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const insightSchema = hit._source!;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, now I see - you’re ensuring _source is always present. Just to clarify, does it actually go missing sometimes, or is this primarily to satisfy TypeScript?

const defendInsight: DefendInsightsResponse = {
timestamp: insightSchema['@timestamp'],
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
id: hit._id!,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’m not sure if using the bang (!) operator in these places is the best approach. Wouldn’t it be clearer and safer to define the response type more explicitly instead?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SearchResponse is defined at ES level and both _id and _source are defined as optional. To your point though, we can do a null check instead.

createdAt: insightSchema.created_at,
updatedAt: insightSchema.updated_at,
lastViewedAt: insightSchema.last_viewed_at,
users:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not just:

users: insightSchema.users ?? [];

?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Honestly, I copied this over from attack discovery and just changed the necessary keys 😅. My impression though is that we want to ensure we don't potentially leak additional fields? and maybe also just because new objects.

@joeypoon joeypoon merged commit efc0568 into elastic:main Nov 19, 2024
44 checks passed
@kibanamachine
Copy link
Contributor

Starting backport for target branches: 7.17, 8.15, 8.16, 8.18, 8.x

https://github.com/elastic/kibana/actions/runs/11910742167

@elasticmachine
Copy link
Contributor

💚 Build Succeeded

Metrics [docs]

Module Count

Fewer modules leads to a faster build time

id before after diff
integrationAssistant 466 471 +5
securitySolution 6213 6218 +5
total +10

Public APIs missing comments

Total count of every public API that lacks a comment. Target amount is 0. Run node scripts/build_api_docs --plugin [yourplugin] --stats comments for more detailed information.

id before after diff
@kbn/elastic-assistant-common 369 405 +36

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
securitySolution 13.4MB 13.4MB +97.0B

Page load bundle

Size of the bundles that are downloaded on every page load. Target size is below 100kb

id before after diff
securitySolution 86.1KB 86.1KB +18.0B
Unknown metric groups

API count

id before after diff
@kbn/elastic-assistant-common 400 442 +42

ESLint disabled in files

id before after diff
elasticAssistant 0 5 +5

ESLint disabled line counts

id before after diff
elasticAssistant 32 34 +2

Total ESLint disabled count

id before after diff
elasticAssistant 32 39 +7

History

@kibanamachine
Copy link
Contributor

💔 All backports failed

Status Branch Result
7.17 Backport failed because of merge conflicts
8.15 Backport failed because of merge conflicts
8.16 Backport failed because of merge conflicts
8.18 The branch "8.18" does not exist
8.x Backport failed because of merge conflicts

You might need to backport the following PRs to 8.x:
- [Cloud Security] Fixed an issue with Host.name Alerts contextual flyout (#200626)
- Surface Kibana security route deprecations in Upgrade Assistant (#199656)
- [Infra] Use callback for logger.trace calls (#199805)
- [Security Solution][Bidirectional Integrations Banner][Crowdstrike][SentinelOne] Banner for bidirectional integrations (#200625)
- [Fleet] Use metering API in serverless (#200063)
- Migrate /test/apm_api_integration/tests/suggestions to be deployment agnostic api tests (#200556)
- [Inventory] Remove open in Discover button (#200574)
- [Entity Analytics] API changes for right placement of deleting the old component template (#199734)

Manual backport

To create the backport manually run:

node scripts/backport --pr 198676

Questions ?

Please refer to the Backport tool documentation

@joeypoon
Copy link
Member Author

💚 All backports created successfully

Status Branch Result
8.x

Note: Successful backport PRs will be merged automatically after passing CI.

Questions ?

Please refer to the Backport tool documentation

joeypoon added a commit to joeypoon/kibana that referenced this pull request Nov 21, 2024
…ic#198676)

### Summary
Adds the new Defend Insights Elastic Assistant tool. This assistant tool
provides Elastic Defend configuration insights. For this initial PR,
only incompatible antivirus detection is supported. Telemetry is
collected for success and error events.

For incompatible antivirus detection, Defend Insights will review the
last 200 file events for the given endpoint and output suspected
antiviruses. Improvements such as customizable event count and date
range will come in the future.

This PR does not include any UI, that will come in a separate PR. 3
internal APIs for interacting with Defend Insights are provided here:
- `POST /defend_insights` for creating a new Defend Insight
- `GET /defend_insights/{id}` for getting a Defend Insight
- `GET /defend_insights` for getting multiple Defend Insights
	- available optional query params:
		- `size` - default 10
		- `ids`
		- `connector_id`
		- `type` - `incompatible_antivirus`
		- `status` - `running`, `completed`, `failed`, `canceled`
		- `endpoint_ids`

This initial implementation does not include the LangGraph/output
chunking upgrades seen in Attack Discovery due to time constraints.
We'll look to make this upgrade in a future PR.

### Checklist

- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios

### For maintainers

- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels)

(cherry picked from commit efc0568)

# Conflicts:
#	.github/CODEOWNERS
@kibanamachine
Copy link
Contributor

Looks like this PR has a backport PR but it still hasn't been merged. Please merge it ASAP to keep the branches relatively in sync.

@kibanamachine kibanamachine added the backport missing Added to PRs automatically when the are determined to be missing a backport. label Nov 21, 2024
joeypoon added a commit that referenced this pull request Nov 21, 2024
…198676) (#201104)

# Backport

This will backport the following commits from `main` to `8.x`:
- [[Security Solution] add defend insights elastic assistant tool
(#198676)](#198676)

<!--- Backport version: 8.9.8 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Joey F.
Poon","email":"[email protected]"},"sourceCommit":{"committedDate":"2024-11-19T10:07:42Z","message":"[Security
Solution] add defend insights elastic assistant tool (#198676)\n\n###
Summary\r\nAdds the new Defend Insights Elastic Assistant tool. This
assistant tool\r\nprovides Elastic Defend configuration insights. For
this initial PR,\r\nonly incompatible antivirus detection is supported.
Telemetry is\r\ncollected for success and error events.\r\n\r\nFor
incompatible antivirus detection, Defend Insights will review
the\r\nlast 200 file events for the given endpoint and output
suspected\r\nantiviruses. Improvements such as customizable event count
and date\r\nrange will come in the future.\r\n\r\nThis PR does not
include any UI, that will come in a separate PR. 3\r\ninternal APIs for
interacting with Defend Insights are provided here:\r\n- `POST
/defend_insights` for creating a new Defend Insight\r\n- `GET
/defend_insights/{id}` for getting a Defend Insight\r\n- `GET
/defend_insights` for getting multiple Defend Insights\r\n\t- available
optional query params:\r\n\t\t- `size` - default 10\r\n\t\t-
`ids`\r\n\t\t- `connector_id`\r\n\t\t- `type` -
`incompatible_antivirus`\r\n\t\t- `status` - `running`, `completed`,
`failed`, `canceled`\r\n\t\t- `endpoint_ids`\r\n\r\nThis initial
implementation does not include the LangGraph/output\r\nchunking
upgrades seen in Attack Discovery due to time constraints.\r\nWe'll look
to make this upgrade in a future PR.\r\n\r\n### Checklist\r\n\r\n- [x]
[Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n\r\n### For
maintainers\r\n\r\n- [x] This was checked for breaking API changes and
was
[labeled\r\nappropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels)","sha":"efc0568e014105637332533e37491f074ec8fe2b","branchLabelMapping":{"^v9.0.0$":"main","^v8.17.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","Team:Defend
Workflows","backport:all-open","v8.18.0"],"number":198676,"url":"https://github.com/elastic/kibana/pull/198676","mergeCommit":{"message":"[Security
Solution] add defend insights elastic assistant tool (#198676)\n\n###
Summary\r\nAdds the new Defend Insights Elastic Assistant tool. This
assistant tool\r\nprovides Elastic Defend configuration insights. For
this initial PR,\r\nonly incompatible antivirus detection is supported.
Telemetry is\r\ncollected for success and error events.\r\n\r\nFor
incompatible antivirus detection, Defend Insights will review
the\r\nlast 200 file events for the given endpoint and output
suspected\r\nantiviruses. Improvements such as customizable event count
and date\r\nrange will come in the future.\r\n\r\nThis PR does not
include any UI, that will come in a separate PR. 3\r\ninternal APIs for
interacting with Defend Insights are provided here:\r\n- `POST
/defend_insights` for creating a new Defend Insight\r\n- `GET
/defend_insights/{id}` for getting a Defend Insight\r\n- `GET
/defend_insights` for getting multiple Defend Insights\r\n\t- available
optional query params:\r\n\t\t- `size` - default 10\r\n\t\t-
`ids`\r\n\t\t- `connector_id`\r\n\t\t- `type` -
`incompatible_antivirus`\r\n\t\t- `status` - `running`, `completed`,
`failed`, `canceled`\r\n\t\t- `endpoint_ids`\r\n\r\nThis initial
implementation does not include the LangGraph/output\r\nchunking
upgrades seen in Attack Discovery due to time constraints.\r\nWe'll look
to make this upgrade in a future PR.\r\n\r\n### Checklist\r\n\r\n- [x]
[Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n\r\n### For
maintainers\r\n\r\n- [x] This was checked for breaking API changes and
was
[labeled\r\nappropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels)","sha":"efc0568e014105637332533e37491f074ec8fe2b"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/198676","number":198676,"mergeCommit":{"message":"[Security
Solution] add defend insights elastic assistant tool (#198676)\n\n###
Summary\r\nAdds the new Defend Insights Elastic Assistant tool. This
assistant tool\r\nprovides Elastic Defend configuration insights. For
this initial PR,\r\nonly incompatible antivirus detection is supported.
Telemetry is\r\ncollected for success and error events.\r\n\r\nFor
incompatible antivirus detection, Defend Insights will review
the\r\nlast 200 file events for the given endpoint and output
suspected\r\nantiviruses. Improvements such as customizable event count
and date\r\nrange will come in the future.\r\n\r\nThis PR does not
include any UI, that will come in a separate PR. 3\r\ninternal APIs for
interacting with Defend Insights are provided here:\r\n- `POST
/defend_insights` for creating a new Defend Insight\r\n- `GET
/defend_insights/{id}` for getting a Defend Insight\r\n- `GET
/defend_insights` for getting multiple Defend Insights\r\n\t- available
optional query params:\r\n\t\t- `size` - default 10\r\n\t\t-
`ids`\r\n\t\t- `connector_id`\r\n\t\t- `type` -
`incompatible_antivirus`\r\n\t\t- `status` - `running`, `completed`,
`failed`, `canceled`\r\n\t\t- `endpoint_ids`\r\n\r\nThis initial
implementation does not include the LangGraph/output\r\nchunking
upgrades seen in Attack Discovery due to time constraints.\r\nWe'll look
to make this upgrade in a future PR.\r\n\r\n### Checklist\r\n\r\n- [x]
[Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n\r\n### For
maintainers\r\n\r\n- [x] This was checked for breaking API changes and
was
[labeled\r\nappropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels)","sha":"efc0568e014105637332533e37491f074ec8fe2b"}},{"branch":"8.18","label":"v8.18.0","labelRegex":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->
@kibanamachine kibanamachine removed the backport missing Added to PRs automatically when the are determined to be missing a backport. label Nov 21, 2024
paulinashakirova pushed a commit to paulinashakirova/kibana that referenced this pull request Nov 26, 2024
…ic#198676)

### Summary
Adds the new Defend Insights Elastic Assistant tool. This assistant tool
provides Elastic Defend configuration insights. For this initial PR,
only incompatible antivirus detection is supported. Telemetry is
collected for success and error events.

For incompatible antivirus detection, Defend Insights will review the
last 200 file events for the given endpoint and output suspected
antiviruses. Improvements such as customizable event count and date
range will come in the future.

This PR does not include any UI, that will come in a separate PR. 3
internal APIs for interacting with Defend Insights are provided here:
- `POST /defend_insights` for creating a new Defend Insight
- `GET /defend_insights/{id}` for getting a Defend Insight
- `GET /defend_insights` for getting multiple Defend Insights
	- available optional query params:
		- `size` - default 10
		- `ids`
		- `connector_id`
		- `type` - `incompatible_antivirus`
		- `status` - `running`, `completed`, `failed`, `canceled`
		- `endpoint_ids`

This initial implementation does not include the LangGraph/output
chunking upgrades seen in Attack Discovery due to time constraints.
We'll look to make this upgrade in a future PR.

### Checklist

- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios


### For maintainers

- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels)
CAWilson94 pushed a commit to CAWilson94/kibana that referenced this pull request Dec 12, 2024
…ic#198676)

### Summary
Adds the new Defend Insights Elastic Assistant tool. This assistant tool
provides Elastic Defend configuration insights. For this initial PR,
only incompatible antivirus detection is supported. Telemetry is
collected for success and error events.

For incompatible antivirus detection, Defend Insights will review the
last 200 file events for the given endpoint and output suspected
antiviruses. Improvements such as customizable event count and date
range will come in the future.

This PR does not include any UI, that will come in a separate PR. 3
internal APIs for interacting with Defend Insights are provided here:
- `POST /defend_insights` for creating a new Defend Insight
- `GET /defend_insights/{id}` for getting a Defend Insight
- `GET /defend_insights` for getting multiple Defend Insights
	- available optional query params:
		- `size` - default 10
		- `ids`
		- `connector_id`
		- `type` - `incompatible_antivirus`
		- `status` - `running`, `completed`, `failed`, `canceled`
		- `endpoint_ids`

This initial implementation does not include the LangGraph/output
chunking upgrades seen in Attack Discovery due to time constraints.
We'll look to make this upgrade in a future PR.

### Checklist

- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios


### For maintainers

- [x] This was checked for breaking API changes and was [labeled
appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport:all-open Backport to all branches that could still receive a release release_note:skip Skip the PR/issue when compiling release notes Team:Defend Workflows “EDR Workflows” sub-team of Security Solution v8.18.0 v9.0.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants