diff --git a/api/client/client.go b/api/client/client.go index 751fe556248d2..62156689087a2 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -479,7 +479,7 @@ func (c *Client) dialGRPC(ctx context.Context, addr string) error { otelUnaryClientInterceptor(), metadata.UnaryClientInterceptor, interceptors.GRPCClientUnaryErrorInterceptor, - interceptors.WithMFAUnaryInterceptor(c.performMFACeremony), + interceptors.WithMFAUnaryInterceptor(c.performAdminActionMFACeremony), breaker.UnaryClientInterceptor(cb), ), grpc.WithChainStreamInterceptor( diff --git a/api/client/mfa.go b/api/client/mfa.go index cc81ca66405d6..fca1a1e9d2351 100644 --- a/api/client/mfa.go +++ b/api/client/mfa.go @@ -22,18 +22,22 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/client/proto" + mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/mfa" ) -// performMFACeremony retrieves an MFA challenge from the server, prompts the -// user to answer the challenge, and returns the resulting MFA response. -func (c *Client) performMFACeremony(ctx context.Context, promptOpts ...mfa.PromptOpt) (*proto.MFAAuthenticateResponse, error) { +// performAdminActionMFACeremony retrieves an MFA challenge from the server, +// prompts the user to answer the challenge, and returns the resulting MFA response. +func (c *Client) performAdminActionMFACeremony(ctx context.Context, promptOpts ...mfa.PromptOpt) (*proto.MFAAuthenticateResponse, error) { if c.c.MFAPromptConstructor == nil { return nil, trace.BadParameter("missing PromptAdminRequestMFA field, client cannot perform MFA ceremony") } chal, err := c.CreateAuthenticateChallenge(ctx, &proto.CreateAuthenticateChallengeRequest{ Request: &proto.CreateAuthenticateChallengeRequest_ContextUser{}, + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_ADMIN_ACTION, + }, }) if err != nil { return nil, trace.Wrap(err) diff --git a/api/client/mfa_test.go b/api/client/mfa_test.go index 22ae22d69cd40..9550c4f4b2d2c 100644 --- a/api/client/mfa_test.go +++ b/api/client/mfa_test.go @@ -70,7 +70,7 @@ func TestPerformMFACeremony(t *testing.T) { clt, err := New(ctx, cfg) require.NoError(t, err) - resp, err := clt.performMFACeremony(ctx) + resp, err := clt.performAdminActionMFACeremony(ctx) require.NoError(t, err) require.Equal(t, mfaTestResp.Response, resp.Response) } diff --git a/lib/client/api.go b/lib/client/api.go index f653074715cfb..4b66de37a5615 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -58,6 +58,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" kubeproto "github.com/gravitational/teleport/api/gen/proto/go/teleport/kube/v1" + mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/mfa" apitracing "github.com/gravitational/teleport/api/observability/tracing" tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh" @@ -5254,6 +5255,9 @@ func (tc *TeleportClient) HeadlessApprove(ctx context.Context, headlessAuthentic Request: &proto.CreateAuthenticateChallengeRequest_ContextUser{ ContextUser: &proto.ContextUser{}, }, + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_HEADLESS_LOGIN, + }, }) if err != nil { return trace.Wrap(err) diff --git a/lib/client/cluster_client.go b/lib/client/cluster_client.go index 63b61e47ba74b..aea3c3dcfabaf 100644 --- a/lib/client/cluster_client.go +++ b/lib/client/cluster_client.go @@ -30,6 +30,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" proxyclient "github.com/gravitational/teleport/api/client/proxy" + mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/resumption" @@ -345,6 +346,9 @@ func PerformMFACeremony(ctx context.Context, params PerformMFACeremonyParams) (* ContextUser: &proto.ContextUser{}, }, MFARequiredCheck: mfaRequiredReq, + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_USER_SESSION, + }, }) if err != nil { return nil, nil, trace.Wrap(err) diff --git a/lib/teleterm/clusters/cluster_headless.go b/lib/teleterm/clusters/cluster_headless.go index 8897f0aa95700..b23fa45ed56de 100644 --- a/lib/teleterm/clusters/cluster_headless.go +++ b/lib/teleterm/clusters/cluster_headless.go @@ -24,6 +24,7 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/client/proto" + mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/types" ) @@ -117,6 +118,9 @@ func (c *Cluster) UpdateHeadlessAuthenticationState(ctx context.Context, headles Request: &proto.CreateAuthenticateChallengeRequest_ContextUser{ ContextUser: &proto.ContextUser{}, }, + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_HEADLESS_LOGIN, + }, }) if err != nil { return trace.Wrap(err) diff --git a/tool/tsh/common/mfa.go b/tool/tsh/common/mfa.go index 572e958c1da87..6846d232e853b 100644 --- a/tool/tsh/common/mfa.go +++ b/tool/tsh/common/mfa.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" + mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/prompt" @@ -334,7 +335,11 @@ func (c *mfaAddCommand) addDeviceRPC(ctx context.Context, tc *client.TeleportCli // Issue the authn challenge. // Required for the registration challenge. - authChallenge, err := aci.CreateAuthenticateChallenge(ctx, &proto.CreateAuthenticateChallengeRequest{}) + authChallenge, err := aci.CreateAuthenticateChallenge(ctx, &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_MANAGE_DEVICES, + }, + }) if err != nil { return trace.Wrap(err) } @@ -596,6 +601,9 @@ func (c *mfaRemoveCommand) run(cf *CLIConf) error { Request: &proto.CreateAuthenticateChallengeRequest_ContextUser{ ContextUser: &proto.ContextUser{}, }, + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_MANAGE_DEVICES, + }, }) if err != nil { return trace.Wrap(err)