UNPKG

cdk-nag

Version:

Check CDK v2 applications for best practices using a combination on available rule packs.

80 lines 10.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const path_1 = require("path"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const nag_rules_1 = require("../../nag-rules"); /** * IAM Groups have at least one IAM User * @param node the CfnResource to check */ exports.default = Object.defineProperty((node) => { if (node instanceof aws_iam_1.CfnGroup) { const groupLogicalId = nag_rules_1.NagRules.resolveResourceFromInstrinsic(node, node.ref); const groupName = aws_cdk_lib_1.Stack.of(node).resolve(node.groupName); let found = false; for (const child of aws_cdk_lib_1.Stack.of(node).node.findAll()) { if (child instanceof aws_iam_1.CfnUser) { if (isMatchingUser(child, groupLogicalId, groupName)) { found = true; break; } } else if (child instanceof aws_iam_1.CfnUserToGroupAddition) { if (isMatchingGroupAddition(child, groupLogicalId, groupName)) { found = true; break; } } } if (!found) { return nag_rules_1.NagRuleCompliance.NON_COMPLIANT; } return nag_rules_1.NagRuleCompliance.COMPLIANT; } else { return nag_rules_1.NagRuleCompliance.NOT_APPLICABLE; } }, 'name', { value: path_1.parse(__filename).name }); /** * Helper function to check whether the IAM User belongs to the IAM Group * @param node the CfnUser to check * @param groupLogicalId the Cfn Logical ID of the group * @param groupName the name of the group * returns whether the CfnUser is in the given group */ function isMatchingUser(node, groupLogicalId, groupName) { const groups = aws_cdk_lib_1.Stack.of(node).resolve(node.groups); if (Array.isArray(groups)) { for (const group of groups) { const resolvedGroup = JSON.stringify(aws_cdk_lib_1.Stack.of(node).resolve(group)); if (new RegExp(`${groupLogicalId}(?![\\w])`).test(resolvedGroup) || (groupName != undefined && new RegExp(`${groupName}(?![\\w\\-_\\.])`).test(resolvedGroup))) { return true; } } } return false; } /** * Helper function to check whether the User to Group Addition mentions the specified Group * @param node the CfnUserToGroupAddition to check * @param groupLogicalId the Cfn Logical ID of the group * @param groupName the name of the group * returns whether the CfnUserToGroupAddition references the given group */ function isMatchingGroupAddition(node, groupLogicalId, groupName) { const resolvedGroup = JSON.stringify(aws_cdk_lib_1.Stack.of(node).resolve(node.groupName)); if (new RegExp(`${groupLogicalId}(?![\\w])`).test(resolvedGroup) || (groupName != undefined && new RegExp(`${groupName}(?![\\w\\-_\\.])`).test(resolvedGroup))) { return true; } return false; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUFNR3JvdXBIYXNVc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy9pYW0vSUFNR3JvdXBIYXNVc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOzs7RUFHRTtBQUNGLCtCQUE2QjtBQUM3Qiw2Q0FBaUQ7QUFDakQsaURBQWdGO0FBQ2hGLCtDQUE4RDtBQUU5RDs7O0dBR0c7QUFFSCxrQkFBZSxNQUFNLENBQUMsY0FBYyxDQUNsQyxDQUFDLElBQWlCLEVBQXFCLEVBQUU7SUFDdkMsSUFBSSxJQUFJLFlBQVksa0JBQVEsRUFBRTtRQUM1QixNQUFNLGNBQWMsR0FBRyxvQkFBUSxDQUFDLDZCQUE2QixDQUMzRCxJQUFJLEVBQ0osSUFBSSxDQUFDLEdBQUcsQ0FDVCxDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEIsS0FBSyxNQUFNLEtBQUssSUFBSSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDakQsSUFBSSxLQUFLLFlBQVksaUJBQU8sRUFBRTtnQkFDNUIsSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsRUFBRTtvQkFDcEQsS0FBSyxHQUFHLElBQUksQ0FBQztvQkFDYixNQUFNO2lCQUNQO2FBQ0Y7aUJBQU0sSUFBSSxLQUFLLFlBQVksZ0NBQXNCLEVBQUU7Z0JBQ2xELElBQUksdUJBQXVCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsRUFBRTtvQkFDN0QsS0FBSyxHQUFHLElBQUksQ0FBQztvQkFDYixNQUFNO2lCQUNQO2FBQ0Y7U0FDRjtRQUNELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLDZCQUFpQixDQUFDLGFBQWEsQ0FBQztTQUN4QztRQUNELE9BQU8sNkJBQWlCLENBQUMsU0FBUyxDQUFDO0tBQ3BDO1NBQU07UUFDTCxPQUFPLDZCQUFpQixDQUFDLGNBQWMsQ0FBQztLQUN6QztBQUNILENBQUMsRUFDRCxNQUFNLEVBQ04sRUFBRSxLQUFLLEVBQUUsWUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUNsQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBUyxjQUFjLENBQ3JCLElBQWEsRUFDYixjQUFzQixFQUN0QixTQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQ0UsSUFBSSxNQUFNLENBQUMsR0FBRyxjQUFjLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzVELENBQUMsU0FBUyxJQUFJLFNBQVM7b0JBQ3JCLElBQUksTUFBTSxDQUFDLEdBQUcsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUNqRTtnQkFDQSxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsdUJBQXVCLENBQzlCLElBQTRCLEVBQzVCLGNBQXNCLEVBQ3RCLFNBQTZCO0lBRTdCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQ0UsSUFBSSxNQUFNLENBQUMsR0FBRyxjQUFjLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDNUQsQ0FBQyxTQUFTLElBQUksU0FBUztZQUNyQixJQUFJLE1BQU0sQ0FBQyxHQUFHLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDakU7UUFDQSxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiovXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ2ZuUmVzb3VyY2UsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ2ZuR3JvdXAsIENmblVzZXIsIENmblVzZXJUb0dyb3VwQWRkaXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IE5hZ1J1bGVDb21wbGlhbmNlLCBOYWdSdWxlcyB9IGZyb20gJy4uLy4uL25hZy1ydWxlcyc7XG5cbi8qKlxuICogSUFNIEdyb3VwcyBoYXZlIGF0IGxlYXN0IG9uZSBJQU0gVXNlclxuICogQHBhcmFtIG5vZGUgdGhlIENmblJlc291cmNlIHRvIGNoZWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAobm9kZTogQ2ZuUmVzb3VyY2UpOiBOYWdSdWxlQ29tcGxpYW5jZSA9PiB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5Hcm91cCkge1xuICAgICAgY29uc3QgZ3JvdXBMb2dpY2FsSWQgPSBOYWdSdWxlcy5yZXNvbHZlUmVzb3VyY2VGcm9tSW5zdHJpbnNpYyhcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbm9kZS5yZWZcbiAgICAgICk7XG4gICAgICBjb25zdCBncm91cE5hbWUgPSBTdGFjay5vZihub2RlKS5yZXNvbHZlKG5vZGUuZ3JvdXBOYW1lKTtcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBTdGFjay5vZihub2RlKS5ub2RlLmZpbmRBbGwoKSkge1xuICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDZm5Vc2VyKSB7XG4gICAgICAgICAgaWYgKGlzTWF0Y2hpbmdVc2VyKGNoaWxkLCBncm91cExvZ2ljYWxJZCwgZ3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2ZuVXNlclRvR3JvdXBBZGRpdGlvbikge1xuICAgICAgICAgIGlmIChpc01hdGNoaW5nR3JvdXBBZGRpdGlvbihjaGlsZCwgZ3JvdXBMb2dpY2FsSWQsIGdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICByZXR1cm4gTmFnUnVsZUNvbXBsaWFuY2UuTk9OX0NPTVBMSUFOVDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOYWdSdWxlQ29tcGxpYW5jZS5DT01QTElBTlQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBOYWdSdWxlQ29tcGxpYW5jZS5OT1RfQVBQTElDQUJMRTtcbiAgICB9XG4gIH0sXG4gICduYW1lJyxcbiAgeyB2YWx1ZTogcGFyc2UoX19maWxlbmFtZSkubmFtZSB9XG4pO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBJQU0gVXNlciBiZWxvbmdzIHRvIHRoZSBJQU0gR3JvdXBcbiAqIEBwYXJhbSBub2RlIHRoZSBDZm5Vc2VyIHRvIGNoZWNrXG4gKiBAcGFyYW0gZ3JvdXBMb2dpY2FsSWQgdGhlIENmbiBMb2dpY2FsIElEIG9mIHRoZSBncm91cFxuICogQHBhcmFtIGdyb3VwTmFtZSB0aGUgbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIHJldHVybnMgd2hldGhlciB0aGUgQ2ZuVXNlciBpcyBpbiB0aGUgZ2l2ZW4gZ3JvdXBcbiAqL1xuZnVuY3Rpb24gaXNNYXRjaGluZ1VzZXIoXG4gIG5vZGU6IENmblVzZXIsXG4gIGdyb3VwTG9naWNhbElkOiBzdHJpbmcsXG4gIGdyb3VwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZ3JvdXBzID0gU3RhY2sub2Yobm9kZSkucmVzb2x2ZShub2RlLmdyb3Vwcyk7XG4gIGlmIChBcnJheS5pc0FycmF5KGdyb3VwcykpIHtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgICAgY29uc3QgcmVzb2x2ZWRHcm91cCA9IEpTT04uc3RyaW5naWZ5KFN0YWNrLm9mKG5vZGUpLnJlc29sdmUoZ3JvdXApKTtcbiAgICAgIGlmIChcbiAgICAgICAgbmV3IFJlZ0V4cChgJHtncm91cExvZ2ljYWxJZH0oPyFbXFxcXHddKWApLnRlc3QocmVzb2x2ZWRHcm91cCkgfHxcbiAgICAgICAgKGdyb3VwTmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBuZXcgUmVnRXhwKGAke2dyb3VwTmFtZX0oPyFbXFxcXHdcXFxcLV9cXFxcLl0pYCkudGVzdChyZXNvbHZlZEdyb3VwKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBVc2VyIHRvIEdyb3VwIEFkZGl0aW9uIG1lbnRpb25zIHRoZSBzcGVjaWZpZWQgR3JvdXBcbiAqIEBwYXJhbSBub2RlIHRoZSBDZm5Vc2VyVG9Hcm91cEFkZGl0aW9uIHRvIGNoZWNrXG4gKiBAcGFyYW0gZ3JvdXBMb2dpY2FsSWQgdGhlIENmbiBMb2dpY2FsIElEIG9mIHRoZSBncm91cFxuICogQHBhcmFtIGdyb3VwTmFtZSB0aGUgbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIHJldHVybnMgd2hldGhlciB0aGUgQ2ZuVXNlclRvR3JvdXBBZGRpdGlvbiByZWZlcmVuY2VzIHRoZSBnaXZlbiBncm91cFxuICovXG5mdW5jdGlvbiBpc01hdGNoaW5nR3JvdXBBZGRpdGlvbihcbiAgbm9kZTogQ2ZuVXNlclRvR3JvdXBBZGRpdGlvbixcbiAgZ3JvdXBMb2dpY2FsSWQ6IHN0cmluZyxcbiAgZ3JvdXBOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZEdyb3VwID0gSlNPTi5zdHJpbmdpZnkoU3RhY2sub2Yobm9kZSkucmVzb2x2ZShub2RlLmdyb3VwTmFtZSkpO1xuICBpZiAoXG4gICAgbmV3IFJlZ0V4cChgJHtncm91cExvZ2ljYWxJZH0oPyFbXFxcXHddKWApLnRlc3QocmVzb2x2ZWRHcm91cCkgfHxcbiAgICAoZ3JvdXBOYW1lICE9IHVuZGVmaW5lZCAmJlxuICAgICAgbmV3IFJlZ0V4cChgJHtncm91cE5hbWV9KD8hW1xcXFx3XFxcXC1fXFxcXC5dKWApLnRlc3QocmVzb2x2ZWRHcm91cCkpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==