@@ -16,6 +16,8 @@ const jwt_utils = require('../../util/jwt_utils');
16
16
const config = require ( '../../../config' ) ;
17
17
const { S3Error } = require ( '../../endpoint/s3/s3_errors' ) ;
18
18
19
+ const defualt_expiry_seconds = Math . ceil ( config . STS_DEFAULT_SESSION_TOKEN_EXPIRY_MS / 1000 ) ;
20
+
19
21
const errors = {
20
22
expired_token_s3 : {
21
23
code : S3Error . ExpiredToken . code ,
@@ -53,6 +55,10 @@ const errors = {
53
55
code : stsErr . InvalidAction . code ,
54
56
message : stsErr . InvalidAction . message
55
57
} ,
58
+ validation_error : {
59
+ code : stsErr . ValidationError . code ,
60
+ message : stsErr . ValidationError . message
61
+ } ,
56
62
invalid_schema_params : {
57
63
code : 'INVALID_SCHEMA_PARAMS' ,
58
64
message : 'INVALID_SCHEMA_PARAMS CLIENT account_api#/methods/create_account'
@@ -177,7 +183,7 @@ mocha.describe('STS tests', function() {
177
183
} ;
178
184
const json = await assume_role_and_parse_xml ( sts_admin , params ) ;
179
185
validate_assume_role_response ( json , `arn:aws:sts::${ user_b_key } :assumed-role/${ role_b } /${ params . RoleSessionName } ` ,
180
- `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key ) ;
186
+ `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key , defualt_expiry_seconds ) ;
181
187
} ) ;
182
188
183
189
mocha . it ( 'admin assume non existing role of user b - should be rejected' , async function ( ) {
@@ -208,10 +214,10 @@ mocha.describe('STS tests', function() {
208
214
} ;
209
215
const json = await assume_role_and_parse_xml ( sts_c , params ) ;
210
216
validate_assume_role_response ( json , `arn:aws:sts::${ user_b_key } :assumed-role/${ role_b } /${ params . RoleSessionName } ` ,
211
- `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key ) ;
217
+ `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key , defualt_expiry_seconds ) ;
212
218
213
219
const temp_creds = validate_assume_role_response ( json , `arn:aws:sts::${ user_b_key } :assumed-role/${ role_b } /${ params . RoleSessionName } ` ,
214
- `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key ) ;
220
+ `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key , defualt_expiry_seconds ) ;
215
221
const s3 = new AWS . S3 ( {
216
222
...sts_creds ,
217
223
accessKeyId : temp_creds . access_key ,
@@ -255,7 +261,7 @@ mocha.describe('STS tests', function() {
255
261
} ;
256
262
const json = await assume_role_and_parse_xml ( sts , params ) ;
257
263
validate_assume_role_response ( json , `arn:aws:sts::${ user_b_key } :assumed-role/${ role_b } /${ params . RoleSessionName } ` ,
258
- `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key ) ;
264
+ `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key , defualt_expiry_seconds ) ;
259
265
} ) ;
260
266
261
267
mocha . it ( 'update assume role policy of user b to allow user a' , async function ( ) {
@@ -296,7 +302,7 @@ mocha.describe('STS tests', function() {
296
302
} ;
297
303
const json = await assume_role_and_parse_xml ( sts_c , params ) ;
298
304
validate_assume_role_response ( json , `arn:aws:sts::${ user_b_key } :assumed-role/${ role_b } /${ params . RoleSessionName } ` ,
299
- `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key ) ;
305
+ `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key , defualt_expiry_seconds ) ;
300
306
} ) ;
301
307
302
308
mocha . it ( 'update assume role policy of user b to allow user a sts:*' , async function ( ) {
@@ -337,7 +343,7 @@ mocha.describe('STS tests', function() {
337
343
} ;
338
344
const json = await assume_role_and_parse_xml ( sts_c , params ) ;
339
345
validate_assume_role_response ( json , `arn:aws:sts::${ user_b_key } :assumed-role/${ role_b } /${ params . RoleSessionName } ` ,
340
- `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key ) ;
346
+ `${ user_b_key } :${ params . RoleSessionName } ` , user_b_key , defualt_expiry_seconds ) ;
341
347
} ) ;
342
348
343
349
mocha . it ( 'update assume role policy of user b to allow user a *' , async function ( ) {
@@ -383,7 +389,7 @@ async function assume_role_and_parse_xml(sts, params) {
383
389
return json ;
384
390
}
385
391
386
- function validate_assume_role_response ( json , expected_arn , expected_role_id , assumed_access_key ) {
392
+ function validate_assume_role_response ( json , expected_arn , expected_role_id , assumed_access_key , duration_seconds ) {
387
393
dbg . log0 ( 'test.sts.validate_assume_role_response: ' , json ) ;
388
394
assert . ok ( json && json . AssumeRoleResponse && json . AssumeRoleResponse . AssumeRoleResult ) ;
389
395
const result = json . AssumeRoleResponse . AssumeRoleResult [ 0 ] ;
@@ -392,7 +398,9 @@ function validate_assume_role_response(json, expected_arn, expected_role_id, ass
392
398
// validate credentials
393
399
const credentials = result . Credentials [ 0 ] ;
394
400
assert . ok ( credentials && credentials . AccessKeyId [ 0 ] && credentials . SecretAccessKey [ 0 ] ) ;
395
- assert . equal ( credentials . Expiration [ 0 ] , config . STS_DEFAULT_SESSION_TOKEN_EXPIRY_MS ) ;
401
+ const duration_ms = duration_seconds ? duration_seconds * 1000 : config . STS_DEFAULT_SESSION_TOKEN_EXPIRY_MS ;
402
+ const creds_generation_time_ms = new Date ( credentials . Expiration [ 0 ] ) . getTime ( ) - duration_ms ;
403
+ assert ( creds_generation_time_ms < Date . now ( ) ) ;
396
404
if ( config . STS_DEFAULT_SESSION_TOKEN_EXPIRY_MS !== 0 ) {
397
405
verify_session_token ( credentials . SessionToken [ 0 ] , credentials . AccessKeyId [ 0 ] ,
398
406
credentials . SecretAccessKey [ 0 ] , assumed_access_key ) ;
@@ -533,7 +541,7 @@ mocha.describe('Session token tests', function() {
533
541
534
542
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
535
543
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
536
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
544
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
537
545
538
546
const temp_s3_with_session_token = new AWS . S3 ( {
539
547
...sts_creds ,
@@ -547,6 +555,48 @@ mocha.describe('Session token tests', function() {
547
555
assert . ok ( buckets1 . Buckets . length > 0 ) ;
548
556
} ) ;
549
557
558
+ mocha . it ( 'user b assume role of user a - valid expiry via durationSeconds - list s3 - should be allowed' , async function ( ) {
559
+ const user_a_key = accounts [ 0 ] . access_keys [ 0 ] . access_key . unwrap ( ) ;
560
+ const duration_seconds = 25000 ;
561
+ const params = {
562
+ DurationSeconds : duration_seconds ,
563
+ RoleArn : `arn:aws:sts::${ user_a_key } :role/${ role_alice } ` ,
564
+ RoleSessionName : 'just_a_dummy_session_name'
565
+ } ;
566
+
567
+ const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
568
+ const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
569
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , duration_seconds ) ;
570
+
571
+ const temp_s3_with_session_token = new AWS . S3 ( {
572
+ ...sts_creds ,
573
+ endpoint : coretest . get_https_address ( ) ,
574
+ accessKeyId : result_obj . access_key ,
575
+ secretAccessKey : result_obj . secret_key ,
576
+ sessionToken : result_obj . session_token
577
+ } ) ;
578
+
579
+ const buckets1 = await temp_s3_with_session_token . listBuckets ( ) . promise ( ) ;
580
+ assert . ok ( buckets1 . Buckets . length > 0 ) ;
581
+ } ) ;
582
+
583
+ mocha . it ( 'user b assume role of user a - invalid expiry via durationSeconds - should be rejected' , async function ( ) {
584
+ const user_a_key = accounts [ 0 ] . access_keys [ 0 ] . access_key . unwrap ( ) ;
585
+ const params = {
586
+ DurationSeconds : 43201 ,
587
+ RoleArn : `arn:aws:sts::${ user_a_key } :role/${ role_alice } ` ,
588
+ RoleSessionName : 'just_a_dummy_session_name'
589
+ } ;
590
+
591
+ const expected_error_message = `Value 43201 for durationSeconds failed to satisfy constraint:
592
+ Member must have value less than or equal to 43200` ;
593
+ assert_throws_async (
594
+ assume_role_and_parse_xml ( accounts [ 0 ] . sts , params ) ,
595
+ errors . validation_error . code ,
596
+ expected_error_message
597
+ ) ;
598
+ } ) ;
599
+
550
600
mocha . it ( 'user b assume role of user a - default expiry - list s3 without session token - should be rejected' , async function ( ) {
551
601
const user_a_key = accounts [ 0 ] . access_keys [ 0 ] . access_key . unwrap ( ) ;
552
602
const params = {
@@ -556,7 +606,7 @@ mocha.describe('Session token tests', function() {
556
606
557
607
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
558
608
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
559
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
609
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
560
610
561
611
const temp_s3 = new AWS . S3 ( {
562
612
...sts_creds ,
@@ -578,11 +628,11 @@ mocha.describe('Session token tests', function() {
578
628
579
629
const json1 = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
580
630
const result_obj1 = validate_assume_role_response ( json1 , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
581
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
631
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
582
632
583
633
const json2 = await assume_role_and_parse_xml ( accounts [ 2 ] . sts , params ) ;
584
634
const result_obj2 = validate_assume_role_response ( json2 , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
585
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
635
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
586
636
587
637
const temp_s3 = new AWS . S3 ( {
588
638
...sts_creds ,
@@ -606,7 +656,7 @@ mocha.describe('Session token tests', function() {
606
656
607
657
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
608
658
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
609
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
659
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
610
660
611
661
const temp_s3_with_session_token = new AWS . S3 ( {
612
662
...sts_creds ,
@@ -629,7 +679,7 @@ mocha.describe('Session token tests', function() {
629
679
630
680
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
631
681
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
632
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
682
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
633
683
634
684
const temp_s3_with_session_token = new AWS . S3 ( {
635
685
...sts_creds ,
@@ -653,7 +703,7 @@ mocha.describe('Session token tests', function() {
653
703
654
704
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
655
705
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
656
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
706
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
657
707
658
708
const temp_sts_with_session_token = new AWS . STS ( {
659
709
...sts_creds ,
@@ -676,7 +726,7 @@ mocha.describe('Session token tests', function() {
676
726
677
727
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
678
728
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
679
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
729
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
680
730
681
731
const temp_sts_with_session_token = new AWS . STS ( {
682
732
...sts_creds ,
@@ -700,7 +750,7 @@ mocha.describe('Session token tests', function() {
700
750
701
751
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
702
752
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
703
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
753
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
704
754
705
755
const temp_s3_with_session_token = new AWS . S3 ( {
706
756
...sts_creds ,
@@ -725,7 +775,7 @@ mocha.describe('Session token tests', function() {
725
775
726
776
const json = await assume_role_and_parse_xml ( accounts [ 1 ] . sts , params ) ;
727
777
const result_obj = validate_assume_role_response ( json , `arn:aws:sts::${ user_a_key } :assumed-role/${ role_alice } /${ params . RoleSessionName } ` ,
728
- `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key ) ;
778
+ `${ user_a_key } :${ params . RoleSessionName } ` , user_a_key , defualt_expiry_seconds ) ;
729
779
730
780
const temp_sts_with_session_token = new AWS . STS ( {
731
781
...sts_creds ,
0 commit comments