Skip to content

Commit e762fe7

Browse files
committed
IAM | Refactor src/endpoint/s3/s3_bucket_policy_utils.js (Used in Bucket Policy and IAM User Inline Policy)
Signed-off-by: shirady <57721533+shirady@users.noreply.github.com>
1 parent c74f48a commit e762fe7

File tree

8 files changed

+50
-51
lines changed

8 files changed

+50
-51
lines changed

src/endpoint/s3/s3_rest.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const net = require('net');
77
const dbg = require('../../util/debug_module')(__filename);
88
const s3_ops = require('./ops');
99
const S3Error = require('./s3_errors').S3Error;
10-
const s3_bucket_policy_utils = require('./s3_bucket_policy_utils');
10+
const access_policy_utils = require('../../util/access_policy_utils');
1111
const s3_logging = require('./s3_bucket_logging');
1212
const time_utils = require('../../util/time_utils');
1313
const http_utils = require('../../util/http_utils');
@@ -254,8 +254,8 @@ async function authorize_request_policy(req) {
254254
const account_identifier_name = is_nc_deployment ? account.name.unwrap() : account.email.unwrap();
255255
// Both NSFS NC and containerized will validate bucket policy against acccount id
256256
// but in containerized deplyment not against IAM user ID.
257-
const account_identifier_id = s3_bucket_policy_utils.get_account_identifier_id(is_nc_deployment, account);
258-
const account_identifier_arn = s3_bucket_policy_utils.get_bucket_policy_principal_arn(account);
257+
const account_identifier_id = access_policy_utils.get_account_identifier_id(is_nc_deployment, account);
258+
const account_identifier_arn = access_policy_utils.get_bucket_policy_principal_arn(account);
259259
// deny delete_bucket permissions from bucket_claim_owner accounts (accounts that were created by OBC from openshift\k8s)
260260
// the OBC bucket can still be delete by normal accounts according to the access policy which is checked below
261261
if (req.op_name === 'delete_bucket' && account.bucket_claim_owner) {
@@ -304,7 +304,7 @@ async function authorize_request_policy(req) {
304304
// 2. account id
305305
// we start the permission check on account identifier intentionally
306306
if (account_identifier_id) {
307-
permission_by_id = await s3_bucket_policy_utils.has_bucket_policy_permission(
307+
permission_by_id = await access_policy_utils.has_access_policy_permission(
308308
s3_policy, account_identifier_id, method, arn_path, req,
309309
{ disallow_public_access: public_access_block?.restrict_public_buckets }
310310
);
@@ -313,7 +313,7 @@ async function authorize_request_policy(req) {
313313
if (permission_by_id === "DENY") throw new S3Error(S3Error.AccessDenied);
314314
// Check bucket policy permission against account name only for NSFS NC
315315
if (is_nc_deployment && permission_by_id !== "DENY" && account.owner === undefined) {
316-
permission_by_name = await s3_bucket_policy_utils.has_bucket_policy_permission(
316+
permission_by_name = await access_policy_utils.has_access_policy_permission(
317317
s3_policy, account_identifier_name, method, arn_path, req,
318318
{ disallow_public_access: public_access_block?.restrict_public_buckets }
319319
);
@@ -323,7 +323,7 @@ async function authorize_request_policy(req) {
323323
// Check bucket policy permission against ARN only for containerized deployments.
324324
// Policy permission is validated by account arn
325325
if (!is_nc_deployment && permission_by_id !== "DENY") {
326-
permission_by_arn = await s3_bucket_policy_utils.has_bucket_policy_permission(
326+
permission_by_arn = await access_policy_utils.has_access_policy_permission(
327327
s3_policy, account_identifier_arn, method, arn_path, req,
328328
{ disallow_public_access: public_access_block?.restrict_public_buckets }
329329
);
@@ -335,8 +335,8 @@ async function authorize_request_policy(req) {
335335
// ARN check is not implemented in NC yet
336336
if (!is_nc_deployment && account.owner !== undefined) {
337337
const owner_account_id = get_owner_account_id(account);
338-
const owner_account_identifier_arn = s3_bucket_policy_utils.create_arn_for_root(owner_account_id);
339-
permission_by_owner = await s3_bucket_policy_utils.has_bucket_policy_permission(
338+
const owner_account_identifier_arn = access_policy_utils.create_arn_for_root(owner_account_id);
339+
permission_by_owner = await access_policy_utils.has_access_policy_permission(
340340
s3_policy, [owner_account_identifier_arn, owner_account_id], method, arn_path, req,
341341
{ disallow_public_access: public_access_block?.restrict_public_buckets }
342342
);
@@ -371,8 +371,7 @@ async function authorize_request_iam_policy(req) {
371371
// parallel policy check
372372
const promises = [];
373373
for (const iam_policy of iam_policies) {
374-
// We are reusing the bucket policy util function as it checks the policy document
375-
const promise = s3_bucket_policy_utils.has_bucket_policy_permission(
374+
const promise = access_policy_utils.has_access_policy_permission(
376375
iam_policy.policy_document, undefined, method, resource_arn, req,
377376
{ should_pass_principal: false }
378377
);
@@ -403,7 +402,7 @@ function _throw_iam_access_denied_error_for_s3_operation(requesting_account, met
403402
async function authorize_anonymous_access(s3_policy, method, arn_path, req, public_access_block) {
404403
if (!s3_policy) throw new S3Error(S3Error.AccessDenied);
405404

406-
const permission = await s3_bucket_policy_utils.has_bucket_policy_permission(
405+
const permission = await access_policy_utils.has_access_policy_permission(
407406
s3_policy, undefined, method, arn_path, req,
408407
{ disallow_public_access: public_access_block?.restrict_public_buckets }
409408
);
@@ -418,7 +417,7 @@ async function authorize_anonymous_access(s3_policy, method, arn_path, req, publ
418417
* @returns {string|string[]}
419418
*/
420419
function _get_method_from_req(req) {
421-
const s3_op = s3_bucket_policy_utils.OP_NAME_TO_ACTION[req.op_name];
420+
const s3_op = access_policy_utils.OP_NAME_TO_ACTION[req.op_name];
422421
if (!s3_op) {
423422
dbg.error(`Got a not supported S3 op ${req.op_name} - doesn't suppose to happen`);
424423
throw new S3Error(S3Error.InternalError);

src/manage_nsfs/manage_nsfs_validations.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const P = require('../util/promise');
99
const string_utils = require('../util/string_utils');
1010
const native_fs_utils = require('../util/native_fs_utils');
1111
const ManageCLIError = require('../manage_nsfs/manage_nsfs_cli_errors').ManageCLIError;
12-
const bucket_policy_utils = require('../endpoint/s3/s3_bucket_policy_utils');
12+
const access_policy_utils = require('../util/access_policy_utils');
1313
const { throw_cli_error, get_options_from_file, get_boolean_or_string_value, get_bucket_owner_account_by_id,
1414
is_name_update, is_access_key_update } = require('../manage_nsfs/manage_nsfs_cli_utils');
1515
const { TYPES, ACTIONS, VALID_OPTIONS, OPTION_TYPE, FROM_FILE, BOOLEAN_STRING_VALUES, BOOLEAN_STRING_OPTIONS,
@@ -487,7 +487,7 @@ async function validate_bucket_args(config_fs, data, action) {
487487
}
488488
if (data.s3_policy) {
489489
try {
490-
await bucket_policy_utils.validate_s3_policy(data.s3_policy, data.name,
490+
await access_policy_utils.validate_bucket_policy(data.s3_policy, data.name,
491491
async principal => config_fs.is_account_exists_by_principal(principal, { silent_if_missing: true })
492492
);
493493
} catch (err) {

src/sdk/bucketspace_fs.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const SensitiveString = require('../util/sensitive_string');
2929
const BucketSpaceSimpleFS = require('./bucketspace_simple_fs');
3030
const { account_id_cache } = require('../sdk/accountspace_fs');
3131
const nsfs_schema_utils = require('../manage_nsfs/nsfs_schema_utils');
32-
const bucket_policy_utils = require('../endpoint/s3/s3_bucket_policy_utils');
32+
const access_policy_utils = require('../util/access_policy_utils');
3333
const nc_mkm = require('../manage_nsfs/nc_master_key_manager').get_instance();
3434
const NoobaaEvent = require('../manage_nsfs/manage_nsfs_events_utils').NoobaaEvent;
3535
const native_fs_utils = require('../util/native_fs_utils');
@@ -766,15 +766,15 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
766766

767767
if (
768768
bucket.public_access_block?.block_public_policy &&
769-
bucket_policy_utils.allows_public_access(policy)
769+
access_policy_utils.allows_public_access(policy)
770770
) {
771771
throw new S3Error(S3Error.AccessDenied);
772772
}
773773

774774
bucket.s3_policy = policy;
775775
// We need to validate bucket schema here as well for checking the policy schema
776776
nsfs_schema_utils.validate_bucket_schema(_.omitBy(bucket, _.isUndefined));
777-
await bucket_policy_utils.validate_s3_policy(bucket.s3_policy, bucket.name, async principal =>
777+
await access_policy_utils.validate_bucket_policy(bucket.s3_policy, bucket.name, async principal =>
778778
this.config_fs.is_account_exists_by_principal(principal, { silent_if_missing: true }));
779779
await this.config_fs.update_bucket_config_file(bucket);
780780
} catch (err) {
@@ -1109,7 +1109,7 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
11091109
}
11101110

11111111
let permission_by_name;
1112-
const permission_by_id = await bucket_policy_utils.has_bucket_policy_permission(
1112+
const permission_by_id = await access_policy_utils.has_access_policy_permission(
11131113
bucket_policy,
11141114
account._id,
11151115
action,
@@ -1121,7 +1121,7 @@ class BucketSpaceFS extends BucketSpaceSimpleFS {
11211121
// we (currently) allow account identified to be both id and name,
11221122
// so if by-id failed, try also name
11231123
if (account.owner === undefined) {
1124-
permission_by_name = await bucket_policy_utils.has_bucket_policy_permission(
1124+
permission_by_name = await access_policy_utils.has_access_policy_permission(
11251125
bucket_policy,
11261126
account.name.unwrap(),
11271127
action,

src/server/common_services/auth_server.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const kube_utils = require('../../util/kube_utils');
1616
const jwt_utils = require('../../util/jwt_utils');
1717
const config = require('../../../config');
1818
const iam_utils = require('../../endpoint/iam/iam_utils');
19-
const s3_bucket_policy_utils = require('../../endpoint/s3/s3_bucket_policy_utils');
19+
const access_policy_utils = require('../../util/access_policy_utils');
2020

2121

2222
/**
@@ -638,7 +638,7 @@ async function has_bucket_action_permission(bucket, account, action, req_query,
638638
}
639639
const arn = account.owner ? iam_utils.create_arn_for_user(account.owner._id.toString(), account.name.unwrap().split(':')[0], account.iam_path) :
640640
iam_utils.create_arn_for_root(account._id.toString());
641-
const result = await s3_bucket_policy_utils.has_bucket_policy_permission(
641+
const result = await access_policy_utils.has_access_policy_permission(
642642
bucket_policy,
643643
[arn, account._id.toString()],
644644
action,
@@ -653,10 +653,10 @@ async function has_bucket_action_permission(bucket, account, action, req_query,
653653
// If yes, IAM user also should get access
654654
if (account.owner) {
655655
const owner_account_id = iam_utils.get_owner_account_id(account);
656-
const owner_account_identifier_arn = s3_bucket_policy_utils.create_arn_for_root(owner_account_id);
656+
const owner_account_identifier_arn = access_policy_utils.create_arn_for_root(owner_account_id);
657657
// We support both ARN and account/user ID in bucket policy Principal, So if the bucket policy have only ARN
658658
// sharing array of ARN and ID can fix the issue that misses the access just because of bucket policy have ID as principal
659-
permission_by_arn_owner = await s3_bucket_policy_utils.has_bucket_policy_permission(
659+
permission_by_arn_owner = await access_policy_utils.has_access_policy_permission(
660660
bucket_policy,
661661
[owner_account_identifier_arn, owner_account_id],
662662
action,
@@ -680,7 +680,7 @@ async function has_bucket_anonymous_permission(bucket, action, bucket_path, req_
680680
bucket_path = bucket_path ?? "";
681681
const bucket_policy = bucket.s3_policy;
682682
if (!bucket_policy) return false;
683-
return await s3_bucket_policy_utils.has_bucket_policy_permission(
683+
return await access_policy_utils.has_access_policy_permission(
684684
bucket_policy,
685685
// Account is anonymous
686686
undefined,

src/server/system_services/bucket_server.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const azure_storage = require('../../util/azure_storage_wrap');
3333
const usage_aggregator = require('../bg_services/usage_aggregator');
3434
const chunk_config_utils = require('../utils/chunk_config_utils');
3535
const NetStorage = require('../../util/NetStorageKit-Node-master/lib/netstorage');
36-
const bucket_policy_utils = require('../../endpoint/s3/s3_bucket_policy_utils');
36+
const access_policy_utils = require('../../util/access_policy_utils');
3737
const path = require('path');
3838
const KeysSemaphore = require('../../util/keys_semaphore');
3939
const bucket_semaphore = new KeysSemaphore(1);
@@ -573,12 +573,12 @@ async function get_account_by_principal(principal) {
573573
async function put_bucket_policy(req) {
574574
dbg.log0('put_bucket_policy:', req.rpc_params);
575575
const bucket = find_bucket(req, req.rpc_params.name);
576-
await bucket_policy_utils.validate_s3_policy(req.rpc_params.policy, bucket.name,
576+
await access_policy_utils.validate_bucket_policy(req.rpc_params.policy, bucket.name,
577577
principal => get_account_by_principal(principal));
578578

579579
if (
580580
bucket.public_access_block?.block_public_policy &&
581-
bucket_policy_utils.allows_public_access(req.rpc_params.policy)
581+
access_policy_utils.allows_public_access(req.rpc_params.policy)
582582
) {
583583
// Should result in AccessDenied error
584584
throw new RpcError('UNAUTHORIZED');

src/test/integration_tests/api/s3/test_s3_bucket_policy.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ coretest.setup({ pools_to_create: process.env.NC_CORETEST ? undefined : [POOL_LI
1212
const path = require('path');
1313
const _ = require('lodash');
1414
const fs_utils = require('../../../../util/fs_utils');
15-
const s3_bucket_policy_utils = require('../../../../endpoint/s3/s3_bucket_policy_utils');
15+
const access_policy_utils = require('../../../../util/access_policy_utils');
1616

1717
const { S3 } = require('@aws-sdk/client-s3');
1818
const { NodeHttpHandler } = require("@smithy/node-http-handler");
@@ -152,9 +152,9 @@ async function setup() {
152152
For coretest nc, principal will have account name and
153153
for containerized deployment principal is ARN
154154
*/
155-
admin_principal = is_nc_coretest ? EMAIL : s3_bucket_policy_utils.create_arn_for_root(admin_info._id.toString());
156-
a_principal = is_nc_coretest ? user_a : s3_bucket_policy_utils.create_arn_for_root(user_a_account_details.id.toString());
157-
b_principal = is_nc_coretest ? user_b : s3_bucket_policy_utils.create_arn_for_root(user_b_account_details.id.toString());
155+
admin_principal = is_nc_coretest ? EMAIL : access_policy_utils.create_arn_for_root(admin_info._id.toString());
156+
a_principal = is_nc_coretest ? user_a : access_policy_utils.create_arn_for_root(user_a_account_details.id.toString());
157+
b_principal = is_nc_coretest ? user_b : access_policy_utils.create_arn_for_root(user_b_account_details.id.toString());
158158

159159
s3_owner = new S3(s3_creds);
160160
await s3_owner.createBucket({ Bucket: BKT });
@@ -394,7 +394,7 @@ mocha.describe('s3_bucket_policy', function() {
394394
};
395395
}
396396
// Losing this value in-between, assigning it again
397-
a_principal = is_nc_coretest ? user_a : s3_bucket_policy_utils.create_arn_for_root(user_a_account_id.toString());
397+
a_principal = is_nc_coretest ? user_a : access_policy_utils.create_arn_for_root(user_a_account_id.toString());
398398
const deny_account_by_name_all_s3_actions_statement = {
399399
Sid: `Do not allow user ${user_a} any s3 action`,
400400
Effect: 'Deny',
@@ -2221,7 +2221,7 @@ mocha.describe('s3_bucket_policy', function() {
22212221
mocha.it('should fail : Bucket policy with valid principal account ARN, try to putObject with different account', async function() {
22222222
if (is_nc_coretest) this.skip(); // eslint-disable-line no-invalid-this
22232223
this.timeout(5000); // eslint-disable-line no-invalid-this
2224-
const valid_arn_b = s3_bucket_policy_utils.create_arn_for_root(user_b_account_id);
2224+
const valid_arn_b = access_policy_utils.create_arn_for_root(user_b_account_id);
22252225
const s3_policy = {
22262226
Version: '2012-10-17',
22272227
Statement: [
@@ -2251,7 +2251,7 @@ mocha.describe('s3_bucket_policy', function() {
22512251
mocha.it('Bucket policy with valid principal account ARN', async function() {
22522252
if (is_nc_coretest) this.skip(); // eslint-disable-line no-invalid-this
22532253
this.timeout(5000); // eslint-disable-line no-invalid-this
2254-
const valid_arn = s3_bucket_policy_utils.create_arn_for_root(user_b_account_id);
2254+
const valid_arn = access_policy_utils.create_arn_for_root(user_b_account_id);
22552255
const s3_policy = {
22562256
Version: '2012-10-17',
22572257
Statement: [
@@ -2276,7 +2276,7 @@ mocha.describe('s3_bucket_policy', function() {
22762276
mocha.it('Bucket policy with valid principal ARN, and PutObject', async function() {
22772277
if (is_nc_coretest) this.skip(); // eslint-disable-line no-invalid-this
22782278
this.timeout(5000); // eslint-disable-line no-invalid-this
2279-
const valid_arn = s3_bucket_policy_utils.create_arn_for_root(user_b_account_id);
2279+
const valid_arn = access_policy_utils.create_arn_for_root(user_b_account_id);
22802280
const s3_policy = {
22812281
Version: '2012-10-17',
22822282
Statement: [

src/upgrade/upgrade_scripts/5.15.6/upgrade_bucket_policy.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"use strict";
33

44
const util = require('util');
5-
const { OP_NAME_TO_ACTION } = require('../../../endpoint/s3/s3_bucket_policy_utils');
5+
const { OP_NAME_TO_ACTION } = require('../../../util/access_policy_utils');
66
const _ = require('lodash');
77

88

0 commit comments

Comments
 (0)