11import CloudGraph from '@cloudgraph/sdk'
22import groupBy from 'lodash/groupBy'
33import isEmpty from 'lodash/isEmpty'
4+ import AWS from 'aws-sdk'
45
56import { AWSError } from 'aws-sdk/lib/error'
67import { Config } from 'aws-sdk/lib/config'
78import S3 , {
9+ AccountId ,
810 Bucket ,
911 BucketAccelerateStatus ,
1012 BucketLocationConstraint ,
@@ -61,6 +63,30 @@ export const awsBucketItemsLimit = 1000
6163export 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+
6490const 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
501531export 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 } )
0 commit comments