Skip to content

Commit 3772e20

Browse files
authored
Merge pull request #115 from cloudgraphdev/fix/CG-1328-for-aws-cis-rule-215
fix(CG-1328): add account level s3 public access block for the rule c…
2 parents 46a41e7 + 0ab5f21 commit 3772e20

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

src/services/s3/data.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import CloudGraph from '@cloudgraph/sdk'
22
import groupBy from 'lodash/groupBy'
33
import isEmpty from 'lodash/isEmpty'
4+
import AWS from 'aws-sdk'
45

56
import { AWSError } from 'aws-sdk/lib/error'
67
import { Config } from 'aws-sdk/lib/config'
78
import S3, {
9+
AccountId,
810
Bucket,
911
BucketAccelerateStatus,
1012
BucketLocationConstraint,
@@ -61,6 +63,30 @@ export const awsBucketItemsLimit = 1000
6163
export const publicBucketGrant =
6264
'http://acs.amazonaws.com/groups/global/AllUsers'
6365

66+
const getAccountPublicAccessBlock = async ({
67+
region,
68+
accountId,
69+
}: {
70+
region: string,
71+
accountId: AccountId,
72+
}) =>
73+
new Promise<PublicAccessBlockConfiguration | any>(resolve => {
74+
const s3Control = new AWS.S3Control({
75+
region: region,
76+
})
77+
s3Control.getPublicAccessBlock(
78+
{
79+
AccountId: accountId,
80+
},
81+
(err: AWSError, data: GetPublicAccessBlockOutput) => {
82+
if (!isEmpty(data)) {
83+
resolve(data.PublicAccessBlockConfiguration)
84+
}
85+
resolve({})
86+
}
87+
)
88+
})
89+
6490
const getBucketAcl = async (s3: S3, name: BucketName) =>
6591
new Promise<GetBucketAclOutput>(resolve => {
6692
s3.getBucketAcl(
@@ -496,14 +522,20 @@ export interface RawAwsS3 {
496522
Id: string
497523
Name: string
498524
region: string
525+
AccountLevelBlockPublicAcls?: boolean
526+
AccountLevelIgnorePublicAcls?: boolean
527+
AccountLevelBlockPublicPolicy?: boolean
528+
AccountLevelRestrictPublicBuckets?: boolean
499529
}
500530

501531
export default async ({
502532
regions,
503533
config,
534+
account,
504535
}: {
505536
regions: string
506537
config: Config
538+
account: string
507539
}): Promise<{
508540
[region: string]: RawAwsS3[]
509541
}> =>
@@ -514,7 +546,19 @@ export default async ({
514546
const additionalInfoPromises = []
515547

516548
regions.split(',').map((region: BucketLocationConstraint) => {
549+
// TODO: temp implementation to add account level public access block to bucket level
550+
// need to find a better place/way to put the data
517551
const regionPromise = new Promise<void>(async resolveRegion => {
552+
const {
553+
BlockPublicAcls,
554+
IgnorePublicAcls,
555+
BlockPublicPolicy,
556+
RestrictPublicBuckets,
557+
} = await getAccountPublicAccessBlock({
558+
region,
559+
accountId: account,
560+
});
561+
518562
const s3 = new S3({
519563
...config,
520564
region,
@@ -538,6 +582,10 @@ export default async ({
538582
region,
539583
CreationDate: bucket.CreationDate,
540584
Tags: {},
585+
AccountLevelBlockPublicAcls: BlockPublicAcls,
586+
AccountLevelIgnorePublicAcls: IgnorePublicAcls,
587+
AccountLevelBlockPublicPolicy: BlockPublicPolicy,
588+
AccountLevelRestrictPublicBuckets: RestrictPublicBuckets,
541589
})
542590
}
543591
})

src/services/s3/format.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ export default ({
3333
Name: name,
3434
Contents: bucketContents = [],
3535
Tags: tags = {},
36+
AccountLevelBlockPublicAcls: accountLevelBlockPublicAcls,
37+
AccountLevelIgnorePublicAcls: accountLevelIgnorePublicAcls,
38+
AccountLevelBlockPublicPolicy: accountLevelBlockPublicPolicy,
39+
AccountLevelRestrictPublicBuckets: accountLevelRestrictPublicBuckets,
3640
AdditionalInfo: {
3741
AccelerationConfig: accelerationStatus,
3842
BucketOwnerData: { DisplayName: bucketOwnerName },
@@ -279,6 +283,10 @@ export default ({
279283
requesterPays: reqPaymentConfig === 'Requester' ? t.enabled : t.disabled,
280284
size,
281285
tags: s3Tags,
286+
accountLevelBlockPublicAcls: accountLevelBlockPublicAcls ? t.yes : t.no,
287+
accountLevelIgnorePublicAcls: accountLevelIgnorePublicAcls ? t.yes : t.no,
288+
accountLevelBlockPublicPolicy: accountLevelBlockPublicPolicy ? t.yes : t.no,
289+
accountLevelRestrictPublicBuckets: accountLevelRestrictPublicBuckets ? t.yes : t.no,
282290
totalNumberOfObjectsInBucket: greaterThanTotalLimit
283291
? `${awsBucketItemsLimit}+`
284292
: `${total}`,

src/services/s3/schema.graphql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ type awsS3 implements awsBaseService @key(fields: "arn") {
8181
bucketOwnerName: String @search(by: [hash, regexp])
8282
requesterPays: String @search(by: [hash, regexp])
8383
size: String @search(by: [hash, regexp])
84+
accountLevelBlockPublicAcls: String @search(by: [hash, regexp])
85+
accountLevelIgnorePublicAcls: String @search(by: [hash, regexp])
86+
accountLevelBlockPublicPolicy: String @search(by: [hash, regexp])
87+
accountLevelRestrictPublicBuckets: String @search(by: [hash, regexp])
8488
totalNumberOfObjectsInBucket: String @search(by: [hash, regexp])
8589
transferAcceleration: String @search(by: [hash, regexp])
8690
corsConfiguration: String @search(by: [hash, regexp])

src/types/generated.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3871,6 +3871,10 @@ export type AwsRouteTable = AwsBaseService & {
38713871

38723872
export type AwsS3 = AwsBaseService & {
38733873
access?: Maybe<Scalars['String']>;
3874+
accountLevelBlockPublicAcls?: Maybe<Scalars['String']>;
3875+
accountLevelBlockPublicPolicy?: Maybe<Scalars['String']>;
3876+
accountLevelIgnorePublicAcls?: Maybe<Scalars['String']>;
3877+
accountLevelRestrictPublicBuckets?: Maybe<Scalars['String']>;
38743878
aclGrants?: Maybe<Array<Maybe<AwsS3AclGrant>>>;
38753879
blockPublicAcls?: Maybe<Scalars['String']>;
38763880
blockPublicPolicy?: Maybe<Scalars['String']>;

0 commit comments

Comments
 (0)