UNPKG

@csermet/multiprovider

Version:

cloud-graph provider plugin for AWS used to fetch AWS cloud data.

146 lines (145 loc) 5.57 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.listIamPolicies = void 0; const sdk_1 = __importDefault(require("@cloudgraph/sdk")); const groupBy_1 = __importDefault(require("lodash/groupBy")); const isEmpty_1 = __importDefault(require("lodash/isEmpty")); const unionBy_1 = __importDefault(require("lodash/unionBy")); const iam_1 = __importDefault(require("aws-sdk/clients/iam")); const logger_1 = __importDefault(require("../../properties/logger")); const utils_1 = require("../../utils"); const errorLog_1 = __importDefault(require("../../utils/errorLog")); const regions_1 = require("../../enums/regions"); const format_1 = require("../../utils/format"); const constants_1 = require("../../config/constants"); const messageInterval_1 = __importDefault(require("../../utils/messageInterval")); const MAX_ITEMS = 1000; const lt = { ...logger_1.default }; const { logger } = sdk_1.default; const serviceName = 'IAM Policy'; const errorLog = new errorLog_1.default(serviceName); const endpoint = utils_1.initTestEndpoint(serviceName); const customRetrySettings = utils_1.setAwsRetryOptions({ maxRetries: constants_1.MAX_FAILED_AWS_REQUEST_RETRIES, baseDelay: constants_1.IAM_CUSTOM_DELAY, }); const tagsByPolicyArn = async (iam, { Arn }) => new Promise(resolve => { iam.listPolicyTags({ PolicyArn: Arn }, (err, data) => { if (err) { errorLog.generateAwsErrorLog({ functionName: 'iam:listPolicyTags', err, }); } if (!isEmpty_1.default(data)) { const { Tags: tags = [] } = data; resolve({ Arn, Tags: format_1.convertAwsTagsToTagMap(tags), }); } resolve(null); }); }); const policyVersionByPolicyArn = async (iam, { Arn, DefaultVersionId }) => new Promise(resolve => { iam.getPolicyVersion({ PolicyArn: Arn, VersionId: DefaultVersionId }, (err, data) => { if (err) { errorLog.generateAwsErrorLog({ functionName: 'iam:getPolicyVersion', err, }); } if (!isEmpty_1.default(data)) { const { PolicyVersion = { Document: '' } } = data; resolve({ Arn, Content: decodeURIComponent(PolicyVersion.Document), }); } resolve(null); }); }); const listIamPolicies = async ({ iam, marker, intervalMessage, scope, }) => new Promise(resolve => { const result = []; const tagsByArnPromises = []; const policyDetailByArnePromises = []; iam.listPolicies({ Marker: marker, MaxItems: MAX_ITEMS, OnlyAttached: scope === 'All', Scope: scope, }, async (err, data) => { if (err) { errorLog.generateAwsErrorLog({ functionName: 'iam:listPolicies', err, }); } if (!isEmpty_1.default(data)) { const { Policies: policies = [], IsTruncated, Marker } = data; policies.map(policy => { tagsByArnPromises.push(tagsByPolicyArn(iam, policy)); policyDetailByArnePromises.push(policyVersionByPolicyArn(iam, policy)); }); const tags = await Promise.all(tagsByArnPromises); const policiesDetails = await Promise.all(policyDetailByArnePromises); result.push(...policies.map(({ Arn, Tags, ...policy }) => { return { Arn, ...policy, region: regions_1.globalRegionName, Document: policiesDetails.find(p => p?.Arn === Arn)?.Content || '', Tags: tags.find(p => p?.Arn === Arn)?.Tags || {}, }; })); intervalMessage.updateFetchedCounter(result.length); if (IsTruncated) { result.push(...(await exports.listIamPolicies({ iam, marker: Marker, intervalMessage, scope, }))); } resolve(result); } resolve([]); }); }); exports.listIamPolicies = listIamPolicies; /** * IAM Policy */ exports.default = async ({ config, }) => new Promise(async (resolve) => { let policiesData = []; const intervalMessage = new messageInterval_1.default('IAM Policies'); const client = new iam_1.default({ ...config, region: regions_1.globalRegionName, endpoint, ...customRetrySettings, }); logger.debug(lt.lookingForIamPolicies); logger.warn('Please be patient, IAM policies can take a long time to fetch if you have a large account'); intervalMessage.start(); // Fetch IAM Policies (scope: All, Attached: true) const allAttachedPolicies = await exports.listIamPolicies({ iam: client, intervalMessage, scope: 'All', }); // Fetch IAM Policies (scope: Local, Attached: false) const localPolicies = await exports.listIamPolicies({ iam: client, intervalMessage, scope: 'Local', }); intervalMessage.stop(); policiesData = unionBy_1.default(allAttachedPolicies, localPolicies, 'Arn'); errorLog.reset(); logger.debug(lt.foundPolicies(policiesData.length)); resolve(groupBy_1.default(policiesData, 'region')); });