UNPKG

cloud-report

Version:

Collects and analyzes cloud resources

98 lines (97 loc) 4.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const types_1 = require("../../../types"); const utils_1 = require("../../../utils"); const base_1 = require("../../base"); class RolesWithoutExternalIDAnalyzer extends base_1.BaseAnalyzer { analyze(params, fullReport) { const allRolesPolicies = this.getAssumeRolePolicyDocument(params.roles); const mainAccountID = this.getAccountIDs(params.roles[0].Arn)[0]; const permittedAccounts = this.getPermittedAccounts(allRolesPolicies); const cross_accounts_without_external_id = { type: types_1.CheckAnalysisType.Security }; cross_accounts_without_external_id.what = "Are there cross account roles without ExternalId?"; cross_accounts_without_external_id.why = `It is important to associate ExternalId for cross account role access`; cross_accounts_without_external_id.recommendation = `Recommended to use ExternalId for roles which give access to third party accounts`; cross_accounts_without_external_id.benchmark = ['all', 'cis']; const analysis = []; permittedAccounts.forEach((roleAccountsObject) => { roleAccountsObject.Accounts.forEach((account) => { account.accountIDs = this.removeAccountIDFromList(account.accountIDs, mainAccountID); if (!account.accountIDs || !account.accountIDs.length) { return; } const crossAccountAnalysis = { resourceSummary: { name: "Roles", value: roleAccountsObject.Role, }, }; if (account.ExternalID) { crossAccountAnalysis.severity = types_1.SeverityStatus.Good; crossAccountAnalysis.message = `Accounts ${account.accountIDs} has ExternalId`; } else { crossAccountAnalysis.severity = types_1.SeverityStatus.Failure; crossAccountAnalysis.action = "Add an ExternalId"; crossAccountAnalysis.message = `Accounts ${account.accountIDs} does not have ExternalId`; } analysis.push(crossAccountAnalysis); }); }); cross_accounts_without_external_id.regions = { global: analysis }; return { cross_accounts_without_external_id }; } getAssumeRolePolicyDocument(roles) { if (!roles) { return []; } return roles.map((role) => { const rolePolicies = {}; rolePolicies.Role = role.RoleName; rolePolicies.AssumeRolePolicyDocument = role.AssumeRolePolicyDocument; return rolePolicies; }); } getPermittedAccounts(allPolicies) { if (!allPolicies) { return []; } return allPolicies.map((eachPolicy) => { return this.getRoleAccountsObject(eachPolicy.Role, eachPolicy.AssumeRolePolicyDocument.Statement); }); } getRoleAccountsObject(role, Statements) { const roleAccountsObject = {}; roleAccountsObject.Role = role; roleAccountsObject.Accounts = Statements.filter((statement) => { return statement.Principal.AWS; }).map((statement) => { const accountDetails = {}; accountDetails.accountIDs = this.getAccountIDs(statement.Principal.AWS); if (statement.Condition && statement.Condition.StringEquals) { accountDetails.ExternalID = statement.Condition.StringEquals["sts:ExternalId"]; } return accountDetails; }); return roleAccountsObject; } getAccountIDs(arns) { const arnsArray = utils_1.CommonUtil.toArray(arns); return arnsArray.map((arn) => { return arn.split(":")[4]; }); } removeAccountIDFromList(accountIds, accountIdToBeRemoved) { if (!accountIds || !accountIds.length) { return []; } else { return accountIds.filter((accountId) => { return accountId !== accountIdToBeRemoved; }); } } } exports.RolesWithoutExternalIDAnalyzer = RolesWithoutExternalIDAnalyzer;