Skip to content

Commit 1e6b66f

Browse files
authored
Support FIPS for S3 Accesspoint & Object Lambda (#3964)
1 parent a4291e2 commit 1e6b66f

File tree

4 files changed

+58
-35
lines changed

4 files changed

+58
-35
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type": "bugfix",
3+
"category": "S3",
4+
"description": "Support FIPS for S3 Accesspoint & Object Lambda"
5+
}

lib/services/s3.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,12 @@ AWS.util.update(AWS.S3.prototype, {
150150
if (request._parsedArn.service === 's3') {
151151
request.addListener('validate', s3util.validateS3AccessPointArn);
152152
request.addListener('validate', this.validateArnResourceType);
153+
request.addListener('validate', this.validateArnRegion);
153154
} else if (request._parsedArn.service === 's3-outposts') {
154155
request.addListener('validate', s3util.validateOutpostsAccessPointArn);
155156
request.addListener('validate', s3util.validateOutpostsArn);
157+
request.addListener('validate', s3util.validateArnRegion);
156158
}
157-
request.addListener('validate', s3util.validateArnRegion);
158159
request.addListener('validate', s3util.validateArnAccount);
159160
request.addListener('validate', s3util.validateArnService);
160161
request.addListener('build', this.populateUriFromAccessPointArn);
@@ -196,6 +197,13 @@ AWS.util.update(AWS.S3.prototype, {
196197
}
197198
},
198199

200+
/**
201+
* @api private
202+
*/
203+
validateArnRegion: function validateArnRegion(req) {
204+
s3util.validateArnRegion(req, { allowFipsEndpoint: true });
205+
},
206+
199207
/**
200208
* Validate resource-type supplied in S3 ARN
201209
*/
@@ -351,6 +359,7 @@ AWS.util.update(AWS.S3.prototype, {
351359

352360
var outpostsSuffix = isOutpostArn ? '.' + accessPointArn.outpostId: '';
353361
var serviceName = isOutpostArn ? 's3-outposts': 's3-accesspoint';
362+
var fipsSuffix = !isOutpostArn && req.service.config.useFipsEndpoint ? '-fips': '';
354363
var dualStackSuffix = !isOutpostArn && req.service.config.useDualstack ? '.dualstack' : '';
355364

356365
var endpoint = req.httpRequest.endpoint;
@@ -359,7 +368,7 @@ AWS.util.update(AWS.S3.prototype, {
359368

360369
endpoint.hostname = [
361370
accessPointArn.accessPoint + '-' + accessPointArn.accountId + outpostsSuffix,
362-
serviceName + dualStackSuffix,
371+
serviceName + fipsSuffix + dualStackSuffix,
363372
useArnRegion ? accessPointArn.region : req.service.config.region,
364373
dnsSuffix
365374
].join('.');
@@ -368,9 +377,10 @@ AWS.util.update(AWS.S3.prototype, {
368377
// should be in the format: "accesspoint/${accesspointName}"
369378
var serviceName = 's3-object-lambda';
370379
var accesspointName = accessPointArn.resource.split('/')[1];
380+
var fipsSuffix = req.service.config.useFipsEndpoint ? '-fips': '';
371381
endpoint.hostname = [
372382
accesspointName + '-' + accessPointArn.accountId,
373-
serviceName,
383+
serviceName + fipsSuffix,
374384
useArnRegion ? accessPointArn.region : req.service.config.region,
375385
dnsSuffix
376386
].join('.');

scripts/region-checker/allowlist.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@ var allowlist = {
3737
'/services/s3.js': [
3838
87,
3939
88,
40-
252,
41-
254,
42-
267,
43-
273,
44-
629,
45-
631,
46-
750,
47-
761,
48-
762,
49-
763,
50-
768
40+
260,
41+
262,
42+
275,
43+
281,
44+
639,
45+
641,
46+
760,
47+
771,
48+
772,
49+
773,
50+
778
5151
]
5252
};
5353

test/services/s3.spec.js

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3461,34 +3461,42 @@ describe('AWS.S3', function() {
34613461
});
34623462
});
34633463

3464-
it('should correctly generate access point endpoint for pseudo regions', function() {
3465-
s3 = new AWS.S3({region: 'us-east-1'});
3464+
it('should correctly generate access point endpoint for s3-external-1', function() {
3465+
var client = new AWS.S3({region: 'us-east-1'});
34663466
helpers.mockHttpResponse(200, {}, '');
3467-
var request = s3.getObject({
3468-
Bucket: 'arn:aws:s3:s3-external-1:123456789012:accesspoint/myendpoint',
3469-
Key: 'key'
3467+
var request = client.listObjects({
3468+
Bucket: 'arn:aws:s3:s3-external-1:123456789012:accesspoint/myendpoint'
34703469
});
34713470
var built = request.build(function() {});
34723471
expect(
34733472
built.httpRequest.endpoint.hostname
34743473
).to.equal('myendpoint-123456789012.s3-accesspoint.s3-external-1.amazonaws.com');
3474+
});
34753475

3476-
var testFipsError = (s3) => {
3477-
helpers.mockHttpResponse(200, {}, '');
3478-
request = s3.getObject({
3479-
Bucket: 'arn:aws:s3:us-east-1:123456789012:accesspoint/myendpoint',
3480-
Key: 'key'
3481-
});
3482-
var error;
3483-
request.build(function(err) {
3484-
error = err;
3485-
});
3486-
expect(error.name).to.equal('InvalidConfiguration');
3487-
expect(error.message).to.equal('ARN endpoint is not compatible with FIPS region');
3488-
};
3489-
testFipsError(new AWS.S3({region: 'fips-us-east-1'}));
3490-
testFipsError(new AWS.S3({region: 'us-east-1-fips'}));
3491-
testFipsError(new AWS.S3({region: 'us-east-1', useFipsEndpoint: true}));
3476+
it('should correctly generate access point endpoint when useFipsEndpoint=true', function() {
3477+
var client = new AWS.S3({region: 'us-west-2', useFipsEndpoint: true});
3478+
helpers.mockHttpResponse(200, {}, '');
3479+
var request = client.listObjects({
3480+
Bucket: 'arn:aws:s3:us-west-2:123456789012:accesspoint/myendpoint'
3481+
});
3482+
var built = request.build(function() {});
3483+
expect(
3484+
built.httpRequest.endpoint.hostname
3485+
).to.equal('myendpoint-123456789012.s3-accesspoint-fips.us-west-2.amazonaws.com');
3486+
});
3487+
3488+
it('should throw when fips region is passed in ARN', function() {
3489+
var client = new AWS.S3({region: 'us-west-2', useFipsEndpoint: true});
3490+
helpers.mockHttpResponse(200, {}, '');
3491+
var request = client.listObjects({
3492+
Bucket: 'arn:aws:s3:fips-us-west-2:123456789012:accesspoint/myendpoint'
3493+
});
3494+
var error;
3495+
request.build(function(err) {
3496+
error = err;
3497+
});
3498+
expect(error.name).to.equal('InvalidConfiguration');
3499+
expect(error.message).to.equal('FIPS region not allowed in ARN');
34923500
});
34933501

34943502
it('should use regions from ARN if s3UseArnRegion config is set to false', function(done) {

0 commit comments

Comments
 (0)