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

Implement verification of API keys #35318

Merged
merged 9 commits into from
Nov 14, 2018

Conversation

jaymode
Copy link
Member

@jaymode jaymode commented Nov 6, 2018

This change implements the verification of api keys in the
ApiKeyService. There is no integration into the AuthenticationService
as part of this change; this will be done in a future change.

Verification of an API key involves validating the provided key with
the hash stored in the document and then ensuring that the token is not
expired. A conscious decision has been made to always validate the hash
and then check expiration. This is done to prevent leaking that a given
key has expired.

This change implements the verification of api keys in the
ApiKeyService. There is no integration into the AuthenticationService
as part of this change; this will be done in a future change.

Verification of an API key involves validating the provided key with
the hash stored in the document and then ensuring that the token is not
expired. A conscious decision has been made to always validate the hash
and then check expiration. This is done to prevent leaking that a given
key has expired.
@jaymode jaymode added >non-issue :Security/Authentication Logging in, Usernames/passwords, Realms (Native/LDAP/AD/SAML/PKI/etc) labels Nov 6, 2018
@jaymode jaymode requested review from tvernum and jkakavas November 6, 2018 21:38
@elasticmachine
Copy link
Collaborator

Pinging @elastic/es-security

Copy link
Contributor

@tvernum tvernum left a comment

Choose a reason for hiding this comment

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

I have one question/concern, but otherwise LGTM.

final User apiKeyUser = new User(principal, roleNames, null, null, metadata, true);
listener.onResponse(AuthenticationResult.success(apiKeyUser));
} else {
listener.onResponse(AuthenticationResult.unsuccessful("api key is expired", null));
Copy link
Member

Choose a reason for hiding this comment

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

. A conscious decision has been made to always validate the hash
and then check expiration. This is done to prevent leaking that a given
key has expired.

Can you please elaborate on your reasoning behind this? I don't necessarily see a value in masking whether the key is invalid or expired.

Also wouldn't the AuthenticationResult message leak that to the requester anyhow?

Copy link
Member Author

Choose a reason for hiding this comment

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

Can you please elaborate on your reasoning behind this?

My reasoning is that an attacker can currently differentiate between a non-existent api key and an existing one based on timing, which allows the attacker to obtain the ID of a key that exists and then begin a brute force attack on a single ID. If they can also differentiate between one that exists and is expired, this helps them as well. Smart guesses/a vulnerability in our key generation process could wind up making the ability to find a non-expired ID useful to an attacker.

That said, if you still feel there is not much value in this I am happy to reconsider.

Copy link
Member Author

Choose a reason for hiding this comment

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

Sorry, I missed the second question.

Also wouldn't the AuthenticationResult message leak that to the requester anyhow?

No, the authentication result message is used for logging and is not returned to the user.

Copy link
Member

Choose a reason for hiding this comment

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

Can you please elaborate on your reasoning behind this?

That said, if you still feel there is not much value in this I am happy to reconsider.

Thanks for the clarification! No, I agree with you that this is a valuable protection layer, let's keep it !

Copy link
Contributor

@bizybot bizybot left a comment

Choose a reason for hiding this comment

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

LGTM, Thank you.

@jaymode jaymode merged commit 39477a2 into elastic:security_api_keys Nov 14, 2018
@jaymode jaymode deleted the api_key_verification branch November 14, 2018 14:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
>non-issue :Security/Authentication Logging in, Usernames/passwords, Realms (Native/LDAP/AD/SAML/PKI/etc)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants