-
Notifications
You must be signed in to change notification settings - Fork 881
feat: audit login #5925
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
feat: audit login #5925
Conversation
coderd/users.go
Outdated
var loginWithPassword codersdk.LoginWithPasswordRequest | ||
if !httpapi.Read(ctx, rw, r, &loginWithPassword) { | ||
// We pass a disposable user ID just to force an audit diff | ||
// and generate a log for a failed login | ||
aReq.New = database.APIKey{UserID: uuid.New()} |
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.
Down for another approach here. The auditor will skip audit log generation if there's not a valid diff. We don't have a proper UUID on APIKey
and anyways, we bail before we actually create the model. I figured generating a garbage UUID was the fastest path forward but admittedly it's kinda gross.
coderd/users.go
Outdated
@@ -995,9 +995,25 @@ func (api *API) organizationByUserAndName(rw http.ResponseWriter, r *http.Reques | |||
// @Success 201 {object} codersdk.LoginWithPasswordResponse | |||
// @Router /users/login [post] | |||
func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { | |||
ctx := r.Context() | |||
var ( |
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.
Does this handler handle all authentication paths? What if a user isn't logging with a password?
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.
There's a file called userauth.go
with all of the other ways to login. This endpoint should probably be in there anyways.
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.
Alright, added auditing for OAuth and OIDC. I am not sure how best to smoke-test locally, but I made sure to update all the auth tests.
return xerrors.Errorf("find linked user: %w", err) | ||
} | ||
user = params.User | ||
link = params.Link |
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.
I thought it was safe to lift finding the user outside of the transaction and into the callers so we can access User.ID
in those places. If, in the callers, we don't find a user, we bail early, never entering oauthLogin
.
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.
I think we can make things a bit nicer and not repeat aReq.New = database.APIKey{}
all the time when we return an error. Feels like a bug waiting to happen since we have to always rememeber to put 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.
Minor nits on comments, LG!
Co-authored-by: Steven Masley <Emyrk@users.noreply.github.com>
Part of #4538

Logout coming next