elastic / kibana

Your window into the Elastic Stack
https://www.elastic.co/products/kibana
Other
19.61k stars 8.22k forks source link

[Security Solution] Return user-customized fields from the `POST /prebuilt_rules/upgrade/_review` API endpoint even if they haven't been updated by Elastic in the target version #180154

Closed jpdjere closed 4 months ago

jpdjere commented 7 months ago

Epics: https://github.com/elastic/security-team/issues/1974 (internal), https://github.com/elastic/kibana/issues/174168

Summary

Background

elasticmachine commented 7 months ago

Pinging @elastic/security-detections-response (Team:Detections and Resp)

elasticmachine commented 7 months ago

Pinging @elastic/security-solution (Team: SecuritySolution)

elasticmachine commented 7 months ago

Pinging @elastic/security-detection-rule-management (Team:Detection Rule Management)

dplumlee commented 4 months ago

I've added this in https://github.com/elastic/kibana/pull/184889 for future diffing logic to adhere to when full prebuilt rule customization is implemented. In the meantime, this is the way the current per-field diff UI handles returning the CustomizedValueNoUpdate and CustomizedValueSameUpdate(are we adding this in too @banderror?) scenarios:

CustomizedValueNoUpdate('BASE=A, CURRENT=B, TARGET=A')

Screenshot 2024-06-10 at 3 34 57 PM

Here we have a rule diff with a max_signals field that has a

I would argue with the current UI, it is not clear at all to the user that the current version is being retained. If anything, it looks like we're replacing it with the target version

CustomizedValueSameUpdate('BASE=A, CURRENT=B, TARGET=B')

Screenshot 2024-06-10 at 3 41 01 PM

Here we have a rule diff with a setup field that has a

In this scenario, since we're using a package that calculates diffs based on current and target versions, and they are the same, we return nothing, but still have the accordion object. This is obviously also confusing UI and should be fixed alongside these changes.

Summary

In summary, I don't think we can use the current UI workflows with this either of this ticket's mentioned return logic, we need to either add in something alongside the change to display both of the scenarios in a more informative way, or skip displaying them at all.

Currently we have the entire diff object to work with which includes a lot of information from the backend about the scenario and diff and we could filter these diff situations (CustomizedValueNoUpdate and CustomizedValueSameUpdate) out of the front end UI as we don't return them from the API now anyways - effectively nothing to the user would change.

Since it's still a relatively rare use case for users to PATCH the prebuilt rules via the API, my vote would be to just skip displaying these scenarios for now (keeping the UI view the same) and just return them in the API so that the new diff algorithms and related tests can make use of them, as well as be present for the interactive UI we'll be building for three way diffs later on down the road.

Any thoughts? cc: @approksiu @banderror

banderror commented 4 months ago

@dplumlee Great update and questions, thank you. I agree that the best way to proceed would be:

As far as I understand, we already have the same issue in the JSON diff UI. Since we don't use the diff object there, and instead text-diffing the current and target rule versions, in case of CustomizedValueNoUpdate the JSON diff would show a confusing diff too. We could try to fix this issue for the JSON diff component as well, but I feel it would require a more complex code to write, so I'm not suggesting this due to a low value/effort ratio.

banderror commented 4 months ago

@dplumlee @jpdjere @nikitaindik @xcrzx

As a follow-up to our chat yesterday, I'm posting an update and closing this ticket. The issue was addressed in https://github.com/elastic/kibana/pull/184889:

Also changes logic in the upgrade/_review API endpoint to return user customized fields in the diffs even if there was not an update for that field. This new logic is described in https://github.com/elastic/kibana/issues/180154. We filter out the fields that fall under this new logic so that they are only returned from the API but not displayed in the per-field rule diff flyout as the current UI cannot support them. They are utilized in testing logic and will be implemented in the UI at a later date

We now return all the diffs from the API except ThreeWayDiffOutcome.StockValueNoUpdate:

https://github.com/elastic/kibana/blob/74c4d3a85ef1ef1edf22d15e6925ae1c88e2da6e/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts#L123-L127

And CustomizedValueNoUpdate and CustomizedValueSameUpdate diffs are filtered out (hidden) in the UI:

https://github.com/elastic/kibana/blob/74c4d3a85ef1ef1edf22d15e6925ae1c88e2da6e/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/helpers.ts#L42-L58

NOTE: in the Upgrade Workflow UI, these fields will appear auto-accepted and collapsed, with the accepted version of the field being the current value of the rule.

We will address this in https://github.com/elastic/kibana/issues/171520.