@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
146 lines (145 loc) • 5.57 kB
JavaScript
"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'));
});