@@ -22,23 +22,13 @@ import (
2222 "time"
2323
2424 "github.com/google/go-cmp/cmp"
25- "github.com/google/go-cmp/cmp/cmpopts"
26- "github.com/google/uuid"
27- "github.com/gravitational/trace"
28- "github.com/jonboulle/clockwork"
2925 "github.com/stretchr/testify/assert"
3026 "github.com/stretchr/testify/require"
3127
32- "github.com/gravitational/teleport/api/client/proto"
33- "github.com/gravitational/teleport/api/constants"
3428 devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1"
3529 "github.com/gravitational/teleport/api/types"
36- apievents "github.com/gravitational/teleport/api/types/events"
3730 "github.com/gravitational/teleport/lib/auth"
3831 "github.com/gravitational/teleport/lib/auth/authtest"
39- "github.com/gravitational/teleport/lib/events"
40- "github.com/gravitational/teleport/lib/services"
41- "github.com/gravitational/teleport/lib/tlsca"
4232)
4333
4434func TestServer_CreateWebSessionFromReq_deviceWebToken (t * testing.T ) {
@@ -95,218 +85,3 @@ func TestServer_CreateWebSessionFromReq_deviceWebToken(t *testing.T) {
9585 }
9686 })
9787}
98-
99- func TestCreateAppSession_DeviceTrust (t * testing.T ) {
100- t .Parallel ()
101-
102- fakeClock := clockwork .NewFakeClock ()
103-
104- testAuthServer , err := authtest .NewAuthServer (authtest.AuthServerConfig {
105- Clock : fakeClock ,
106- Dir : t .TempDir (),
107- })
108- require .NoError (t , err )
109- t .Cleanup (func () { testAuthServer .Close () })
110-
111- authServer := testAuthServer .AuthServer
112-
113- tests := []struct {
114- name string
115- trustMode string
116- botName string
117- deviceExtensions auth.DeviceExtensions
118- wantErr string
119- }{
120- {
121- name : "Access Denied - Trusted Device Required but Missing" ,
122- trustMode : constants .DeviceTrustModeRequired ,
123- deviceExtensions : auth.DeviceExtensions {},
124- wantErr : "requires a trusted device" ,
125- },
126- {
127- name : "Success - Trust Optional and Device Missing" ,
128- trustMode : constants .DeviceTrustModeOptional ,
129- deviceExtensions : auth.DeviceExtensions {},
130- },
131- {
132- name : "Success - Trust Mode Not Set" ,
133- trustMode : "" ,
134- deviceExtensions : auth.DeviceExtensions {},
135- },
136- {
137- name : "Success - Trusted Device Required and Provided" ,
138- trustMode : constants .DeviceTrustModeRequired ,
139- deviceExtensions : auth.DeviceExtensions {
140- DeviceID : "macbook-id-123" ,
141- AssetTag : "asset-tag-123" ,
142- CredentialID : "cred-id-123" ,
143- },
144- },
145- {
146- name : "Success - Bot Access with RequiredForHumans and Missing Device" ,
147- trustMode : constants .DeviceTrustModeRequiredForHumans ,
148- botName : "example-bot" ,
149- deviceExtensions : auth.DeviceExtensions {},
150- },
151- {
152- name : "Access Denied - Bot Access with Device Trust Required" ,
153- trustMode : constants .DeviceTrustModeRequired ,
154- botName : "example-bot" ,
155- deviceExtensions : auth.DeviceExtensions {},
156- wantErr : "requires a trusted device" ,
157- },
158- {
159- name : "Access Denied - Human Access with RequiredForHumans but Missing Device" ,
160- trustMode : constants .DeviceTrustModeRequiredForHumans ,
161- botName : "" ,
162- deviceExtensions : auth.DeviceExtensions {},
163- wantErr : "requires a trusted device" ,
164- },
165- }
166-
167- for _ , tt := range tests {
168- t .Run (tt .name , func (t * testing.T ) {
169- t .Parallel ()
170- ctx := t .Context ()
171- suffix := uuid .NewString ()
172- username := "user-" + suffix
173- roleName := "role-" + suffix
174- publicAddr := "www-" + suffix + ".example.com"
175-
176- role , err := types .NewRole (roleName , types.RoleSpecV6 {
177- Options : types.RoleOptions {
178- DeviceTrustMode : tt .trustMode ,
179- },
180- Allow : types.RoleConditions {
181- AppLabels : types.Labels {"*" : []string {"*" }},
182- },
183- })
184- require .NoError (t , err )
185- _ , err = authServer .CreateRole (ctx , role )
186- require .NoError (t , err )
187-
188- traits := map [string ][]string {
189- "groups" : {"admins" , "devs" },
190- "email" : {"alice@example.com" },
191- }
192- user , err := types .NewUser (username )
193- require .NoError (t , err )
194- user .SetTraits (traits )
195- user .AddRole (roleName )
196- _ , err = authServer .CreateUser (ctx , user )
197- require .NoError (t , err )
198-
199- identity := tlsca.Identity {
200- Username : username ,
201- BotName : tt .botName ,
202- DeviceExtensions : tlsca .DeviceExtensions (tt .deviceExtensions ),
203- }
204-
205- cName , err := authServer .GetClusterName ()
206- require .NoError (t , err )
207- clusterName := cName .GetClusterName ()
208-
209- checker , err := services .NewAccessChecker (& services.AccessInfo {
210- Username : username ,
211- Roles : user .GetRoles (),
212- }, clusterName , authServer )
213- require .NoError (t , err )
214-
215- req := & proto.CreateAppSessionRequest {
216- Username : username ,
217- AppName : "example-app" ,
218- URI : "http://example.com" ,
219- ClusterName : clusterName ,
220- PublicAddr : publicAddr ,
221- }
222-
223- startTime := fakeClock .Now ()
224- _ , err = authServer .CreateAppSession (ctx , req , identity , checker )
225- endTime := fakeClock .Now ()
226-
227- if tt .wantErr != "" {
228- require .ErrorContains (t , err , tt .wantErr )
229- assert .True (t , trace .IsAccessDenied (err ), "Expected AccessDenied, got %v" , err )
230- } else {
231- require .NoError (t , err )
232- }
233-
234- logEntries , _ , err := testAuthServer .AuditLog .SearchEvents (ctx , events.SearchEventsRequest {
235- From : startTime .Add (- time .Second ),
236- To : endTime .Add (time .Second ),
237- Limit : 100 , // arbitrary, enough to allow for events from concurrent tests
238- })
239- require .NoError (t , err )
240-
241- expectedKind := apievents .UserKind_USER_KIND_HUMAN
242- if tt .botName != "" {
243- expectedKind = apievents .UserKind_USER_KIND_BOT
244- }
245-
246- expectedEvent := & apievents.AppSessionStart {
247- Metadata : apievents.Metadata {
248- Type : events .AppSessionStartEvent ,
249- ClusterName : clusterName ,
250- },
251- UserMetadata : apievents.UserMetadata {
252- User : username ,
253- BotName : tt .botName ,
254- UserKind : expectedKind ,
255- },
256- AppMetadata : apievents.AppMetadata {
257- AppName : "example-app" ,
258- AppURI : "http://example.com" ,
259- AppPublicAddr : publicAddr ,
260- },
261- }
262-
263- if tt .wantErr == "" {
264- expectedEvent .Metadata .Code = events .AppSessionStartCode
265- expectedEvent .SessionMetadata .PrivateKeyPolicy = "none"
266- } else {
267- expectedEvent .Metadata .Code = events .AppSessionStartFailureCode
268- expectedEvent .UserMessage = "requires a trusted device"
269- expectedEvent .Error = "access to resource requires a trusted device"
270- }
271-
272- if tt .deviceExtensions .DeviceID != "" {
273- expectedEvent .UserMetadata .TrustedDevice = & apievents.DeviceMetadata {
274- DeviceId : tt .deviceExtensions .DeviceID ,
275- AssetTag : tt .deviceExtensions .AssetTag ,
276- CredentialId : tt .deviceExtensions .CredentialID ,
277- }
278- }
279-
280- var eventFound bool
281- for _ , event := range logEntries {
282- appStart , ok := event .(* apievents.AppSessionStart )
283- if ! ok || appStart .UserMetadata .User != username {
284- continue
285- }
286-
287- eventFound = true
288-
289- diff := cmp .Diff (expectedEvent , appStart ,
290- cmpopts .IgnoreUnexported (
291- apievents.AppSessionStart {},
292- apievents.Metadata {},
293- apievents.UserMetadata {},
294- apievents.AppMetadata {},
295- apievents.SessionMetadata {},
296- apievents.ConnectionMetadata {},
297- apievents.ServerMetadata {},
298- apievents.DeviceMetadata {},
299- ),
300- cmpopts .IgnoreFields (apievents.Metadata {}, "ID" , "Time" , "Index" ),
301- cmpopts .IgnoreFields (apievents.ServerMetadata {}, "ServerID" , "ServerVersion" , "ServerNamespace" ),
302- cmpopts .IgnoreFields (apievents.ConnectionMetadata {}, "RemoteAddr" , "Protocol" ),
303- cmpopts .IgnoreFields (apievents.SessionMetadata {}, "SessionID" ),
304- cmpopts .IgnoreFields (apievents.AppSessionStart {}, "PublicAddr" ), // deprecated field
305- )
306-
307- require .Empty (t , diff , "Audit event mismatch for case: %s\n %s" , tt .name , diff )
308- }
309- require .True (t , eventFound , "Expected AppSessionStart event was not found in audit log" )
310- })
311- }
312- }
0 commit comments