-
Notifications
You must be signed in to change notification settings - Fork 8.3k
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
[Fleet] Managed Agent Policy #88688
[Fleet] Managed Agent Policy #88688
Conversation
This comment has been minimized.
This comment has been minimized.
@elasticmachine merge upstream |
@elasticmachine merge upstream |
merge conflict between base and head |
@elasticmachine merge upstream |
… into 76843-managed-agent-policy
@elasticmachine merge upstream |
Exclude<AgentPolicy, 'is_managed'>, | ||
AgentPolicy | ||
> = (agentPolicyDoc) => { | ||
const isV12 = 'is_managed' in agentPolicyDoc.attributes; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need the isV12
here? the migration will only run when it's migrated one time right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right. It's left over from when I was debug logging; it also felt like a long if
. I guess it also be hasManagedAttr
or not a problem to inline it.
Pinging @elastic/fleet (Team:Fleet) |
@@ -62,7 +88,15 @@ export async function reassignAgents( | |||
showInactive: false, | |||
}) | |||
).agents; | |||
const agentsToUpdate = agents.filter((agent) => agent.policy_id !== newAgentPolicyId); | |||
// And which are allowed to unenroll |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Curious to have your thought on how this will scale, I am wondering if should do this in multiple phase:
- collect the policy ids we need
- create a map of <policy_id,is_managed>
- than filtering the agents
if we have 1000 agents selected here otherwise it's 1000 concurrent request to ES
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for 👀 . 🎯 about the many requests. I think I'll change it to do a bulkGet
for the agent policies and use that for the map like you said.
I've put off changing the *isAllowed
function to accept either a string or object, but this is a good reason to change that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@nchaulet I'd like to do this in a follow up PR if that's ok. I'd like to get the existing features merged in so others can use them. I'll come back to this as part of the changes to bulk operations (having them error instead of filter out invalid values)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, maybe add a TODO in the code so we know about that limitation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@elasticmachine merge upstream |
During testing this I check the box to "immediately" unenroll the Agent and it seems this removes the Elastic Agent but that should also be blocked. |
@ruflin Do you mean the Force unenroll agent here? That fails/rejects if the box is unchecked As you said, it unenrolls if checked Which is because We can add the same "is managed policy" prevention here, but that means we'll need a new/different param to signal "let me do it" or "ignore the managed policy check" cc @mostlyjason |
💚 Build SucceededMetrics [docs]Page load bundle
Saved Objects .kibana field count
History
To update your PR or re-run it, just comment with: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 👍 , CI should fail if anything's wrong
* master: (244 commits) [maps] Top hits per entity--change to title to use recent, minor edits (elastic#89254) [DOCS] Update installation details (elastic#90354) RFC for automatically generated typescript API documentation for every plugins public services, types, and functionality (elastic#86704) Elastic Maps Server config is `host` not `hostname` (elastic#90234) Use doc link services in index pattern management (elastic#89937) [Fleet] Managed Agent Policy (elastic#88688) [Workplace Search] Fix Source Settings bug (elastic#90242) [Enterprise Search] Refactor MockRouter test helper to not store payload (elastic#90206) Use doc link service in more Stack Monitoring pages (elastic#89050) [App Search] Relevance Tuning logic - actions and selectors only, no listeners (elastic#89313) Remove UI filters from UI (elastic#89793) Use newfeed.service config for all newsfeeds (elastic#90252) skip flaky suite (elastic#85086) Add readme to geo containment alert covering test alert setup (elastic#89625) [APM] Enabling yesterday option when 24 hours is selected (elastic#90017) Test user for maps tests under import geoJSON tests (elastic#86015) [Lens] Hide column in table (elastic#88680) [Security Solution][Detections] Reduce detection engine reliance on _source (elastic#89371) [Discover] Minor cleanup (elastic#90260) [Search Session][Management] Rename "cancel" button and delete "Reload" button (elastic#90015) ...
## Summary Introduces the concept of a managed agent policy. Resolves most of the acceptance criteria from #76843. Remaining to be done in follow up PRs - [x] Define hosted Agent Policy concept in Fleet. - [x] Flag in policy? **_yes, added `is_managed: boolean`_ in agent policy SO** - [x] Should not built only for cloud, an admin should be able to set theses restrictions. - [x] We should have an API to configure it _**Can `POST` and `PUT` to `/api/fleet/agent_policies/{policy_id}`**_ - [x] Integration should be editable, we expect integration author to do the right thing and limit what can be edited. - [x] Research if we can ensure the right behavior of Hosted Agent policy and restrict the super user. - [ ] Capabilities restrictions - [ ] An Agent enrolled in an Hosted Agent policy should not be able to be upgraded. - [x] An Agent enrolled in an Hosted Agent policy should not be able to be unenrolled. - [ ] No Agents cannot be enrolled into this policy by the user. - Hide the enrollment key? - Need to figure out the workflow. - [x] An Agent enrolled in an Hosted Agent policy should not be able to be reassigned to a different configuration. - [x] As a user I should be prevented to do theses action. _**No user-level checks. Only Agent Policy. No UI changes, but API errors are shown for failed actions like reassigning**_ - [x] As an API user I should receive error messages. - [x] If making a single "flag" is easier/faster let's do it. _**Currently single `is_managed` property on agent policy SO.**_ Checks are implemented in service layer (is agent enrolled in a managed policy?) No UI-specific changes added but UI is affected because HTTP requests (like `api/fleet/agents/{agentId}/reassign`) can fail. See screenshots below. Tests at service (`yarn test:jest`) and http (`yarn test ftr`) layers for each of create policy, update policy, unenroll agent, and reassign agent Bulk actions currently filter out restricted items. A follow-up PR will change them to throw an error and cause the request to fail. ## Managed Policy Can create (`POST`) and update (`PUT`) an agent policy with an `is_managed` property. Each new saved object will have an `is_managed` property (default `false`) <details><summary>HTTP commands</summary> #### Create (`is_managed: false` by default) ``` curl --user elastic:changeme -X POST localhost:5601/api/fleet/agent_policies -H 'Content-Type: application/json' -d'{ "name": "User created policy", "namespace": "default"}' -H 'kbn-xsrf: true' {"item":{"id":"edc236a0-5cbb-11eb-ab2c-0134aecb4ce8","name":"User created policy","namespace":"default","is_managed":false,"revision":1,"updated_at":"2021-01-22T14:12:58.250Z","updated_by":"elastic"}} ``` #### Create with `is_managed: true` ``` curl --user elastic:changeme -X POST localhost:5601/api/fleet/agent_policies -H 'Content-Type: application/json' -d'{ "name": "User created policy", "namespace": "default"}' -H 'kbn-xsrf: true' {"item":{"id":"67c785b0-662e-11eb-bf6b-4790dc0178c0","name":"User created policy","namespace":"default","is_managed":false,"revision":1,"updated_at":"2021-02-03T14:45:06.059Z","updated_by":"elastic"}} ``` #### Update with `is_managed: true` ``` curl --user elastic:changeme -X PUT -H 'Content-Type: application/json' -H 'kbn-xsrf: 1234' localhost:5601/api/fleet/agent_policies/67c785b0-662e-11eb-bf6b-4790dc0178c0 -d '{ "name":"User created policy","namespace":"default","is_managed":true }' {"item":{"id":"67c785b0-662e-11eb-bf6b-4790dc0178c0","name":"User created policy","namespace":"default","is_managed":true,"revision":2,"updated_at":"2021-02-03T14:47:28.471Z","updated_by":"elastic","package_policies":[]}} ``` </details> ## Enroll behavior is not changed/addressed in this PR. Agents can still be enrolled in managed policies ## Unenroll Agent from managed policy behavior #### Enrolled in managed agent policy, cannot be unenrolled ``` curl --user elastic:changeme -X POST http://localhost:5601/api/fleet/agents/441d4a40-6710-11eb-8f57-db14e8e41cff/unenroll -H 'kbn-xsrf: 1234' | jq { "statusCode": 400, "error": "Bad Request", "message": "Cannot unenroll 441d4a40-6710-11eb-8f57-db14e8e41cff from a managed agent policy af9b4970-6701-11eb-b55a-899b78cb64da" } ``` <details><summary>Screenshots for managed & unmanaged policies</summary> #### Enrolled in managed agent policy, cannot be unenrolled <img width="1931" alt="Screen Shot 2021-01-19 at 1 22 53 PM" src="https://user-images.githubusercontent.com/57655/105081614-67d05980-5a60-11eb-8faa-07e4e722a5b5.png"> <img width="1199" alt="Screen Shot 2021-01-19 at 1 30 26 PM" src="https://user-images.githubusercontent.com/57655/105081617-67d05980-5a60-11eb-9099-832dc6e04eca.png"> <img width="1971" alt="Screen Shot 2021-01-19 at 1 30 42 PM" src="https://user-images.githubusercontent.com/57655/105081618-67d05980-5a60-11eb-9a84-b80b6295ba19.png"> #### Enrolled agent policy is not managed, agent can be unenrolled<img width="1917" alt="Screen Shot 2021-01-19 at 1 44 12 PM" src="https://user-images.githubusercontent.com/57655/105081951-e3caa180-5a60-11eb-9308-7741b8986e8e.png"> <img width="2183" alt="Screen Shot 2021-01-19 at 1 44 19 PM" src="https://user-images.githubusercontent.com/57655/105081952-e3caa180-5a60-11eb-9833-1c721be0a107.png"> </details> ## Reassign agent #### No agent can be reassigned to a managed policy ``` curl --user elastic:changeme -X 'PUT' 'http://localhost:5601/api/fleet/agents/482760d0-6710-11eb-8f57-db14e8e41cff/reassign' -H 'kbn-xsrf: xxx' -H 'Content-Type: application/json' -d '{"policy_id":"af9b4970-6701-11eb-b55a-899b78cb64da"}' { "statusCode": 400, "error": "Bad Request", "message": "Cannot reassign an agent to managed agent policy 94129590-6707-11eb-b55a-899b78cb64da" } ``` <details><summary>Screenshots</summary> <img width="1350" alt="Screen Shot 2021-02-04 at 2 14 51 PM" src="https://user-images.githubusercontent.com/57655/106943490-8044a300-66f3-11eb-9d2c-4b1ceef2e783.png"> </details> #### Enrolled in managed agent policy, cannot be reassigned ``` curl --user elastic:changeme -X 'PUT' 'http://localhost:5601/api/fleet/agents/482760d0-6710-11eb-8f57-db14e8e41cff/reassign' -H 'kbn-xsrf: xxx' -H 'Content-Type: application/json' -d '{"policy_id":"af9b4970-6701-11eb-b55a-899b78cb64da"}' { "statusCode": 400, "error": "Bad Request", "message": "Cannot reassign an agent from managed agent policy 94129590-6707-11eb-b55a-899b78cb64da" } ``` <details><summary>Screenshots</summary> <img width="1364" alt="Screen Shot 2021-01-19 at 2 58 38 PM" src="https://user-images.githubusercontent.com/57655/105086737-72dab800-5a67-11eb-8f5e-93cd7768b914.png"> <img width="1367" alt="Screen Shot 2021-01-19 at 2 58 44 PM" src="https://user-images.githubusercontent.com/57655/105086740-73734e80-5a67-11eb-8ef9-9c7005a0a4ea.png"> <img width="623" alt="Screen Shot 2021-01-19 at 2 59 27 PM" src="https://user-images.githubusercontent.com/57655/105086741-740be500-5a67-11eb-8fc2-721f8b5d178a.png"> </details> #### Enrolled agent policy is unmanaged, agent can be reassigned to another unmanaged policy <details><summary>Screenshots</summary> <img width="1368" alt="Screen Shot 2021-01-19 at 3 00 01 PM" src="https://user-images.githubusercontent.com/57655/105086754-78d09900-5a67-11eb-86a5-9e3ac02d6e1f.png"> <img width="1363" alt="Screen Shot 2021-01-19 at 3 00 08 PM" src="https://user-images.githubusercontent.com/57655/105086761-7a01c600-5a67-11eb-991d-acf994e2a393.png"> <img width="625" alt="Screen Shot 2021-01-19 at 3 00 46 PM" src="https://user-images.githubusercontent.com/57655/105086764-7a9a5c80-5a67-11eb-8290-e79648d01579.png"> </details> ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [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 Co-authored-by: Kibana Machine <[email protected]>
Hi @EricDavisX , We have performed some exploratory around managed hosts and policies on 7.13 and 8.0 snapshot Builds. Here, code for it is marked as merged. However, on verifying the changes, it seems code is still not available. Observations on managed policy is as follows for now:
So could you please confirm us, when the code will be available for feature so that we can test it and proceed with testcase creation task. QUERY: Further, we have observed that when we installed an agent using Fleet server policy, Metricbeat service is not started. Logs: Later, when we added an integration[say elastic-apm] to it, we observed metricbeat service resumed its state to running. Could you please have a look on this behavior and confirm us its expected behavior. Further logs generated: Conclusion, as per our understanding, it is behaving like a normal user created policy. 7.13 Kibana Cloud build details:
8.0 snapshot build details:
Please let us know if we our missing anything. Thanks |
I don't know the feature specifics / requirements for testing yet, so we're totally in the Fleet Team's hands. John can guide it. |
Hi @jfsiii Today, we have attempted to create a managed policy using above mentioned curl examples on 8.0 snapshot environment.
Build details: Thank you for the help. cc @EricDavisX We are in progress of validating above merges and report back if found anything else. Thanks |
@dikshachauhan-qasource hi - these 2 pr's were merged that have the relating UI work:
|
Summary
Introduces the concept of a managed agent policy. Resolves most of the acceptance criteria from #76843. Remaining to be done in follow up PRs
is_managed: boolean
in agent policy SOPOST
andPUT
to/api/fleet/agent_policies/{policy_id}
is_managed
property on agent policy SO.Checks are implemented in service layer (is agent enrolled in a managed policy?)
No UI-specific changes added but UI is affected because HTTP requests (like
api/fleet/agents/{agentId}/reassign
) can fail. See screenshots below.Tests at service (
yarn test:jest
) and http (yarn test ftr
) layers for each of create policy, update policy, unenroll agent, and reassign agentBulk actions currently filter out restricted items. A follow-up PR will change them to throw an error and cause the request to fail.
Managed Policy
Can create (
POST
) and update (PUT
) an agent policy with anis_managed
property. Each new saved object will have anis_managed
property (defaultfalse
)HTTP commands
Create (
is_managed: false
by default)Create with
is_managed: true
Update with
is_managed: true
Enroll behavior
is not changed/addressed in this PR. Agents can still be enrolled in managed policies
Unenroll Agent from managed policy behavior
Enrolled in managed agent policy, cannot be unenrolled
Screenshots for managed & unmanaged policies
Enrolled in managed agent policy, cannot be unenrolled
Enrolled agent policy is not managed, agent can be unenrolled
Reassign agent
No agent can be reassigned to a managed policy
Screenshots
Enrolled in managed agent policy, cannot be reassigned
Screenshots
Enrolled agent policy is unmanaged, agent can be reassigned to another unmanaged policy
Screenshots
Checklist
Delete any items that are not applicable to this PR.