UNPKG

@aws/pdk

Version:

All documentation is located at: https://aws.github.io/aws-pdk

110 lines 14.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OpenApiGatewayWebAcl = void 0; /*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const pdk_nag_1 = require("../../../pdk-nag"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_wafv2_1 = require("aws-cdk-lib/aws-wafv2"); const constructs_1 = require("constructs"); /** * Associate an AWS WAF v2 Web ACL with the given api */ class OpenApiGatewayWebAcl extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); const aclName = `${pdk_nag_1.PDKNag.getStackPrefix(aws_cdk_lib_1.Stack.of(this)) .split("/") .join("-")}${id}-${this.node.addr.slice(-8)}`; const ipSetName = `${aclName}-IPSet`; // Create the IP Set if requested this.ipSet = props.cidrAllowList ? new aws_wafv2_1.CfnIPSet(this, "ApiIPSet", { name: ipSetName, addresses: props.cidrAllowList.cidrRanges, ipAddressVersion: props.cidrAllowList.cidrType, scope: "REGIONAL", }) : undefined; // TODO: vendor property is deprecated, to be removed in the future iterations // and vendorName will be required const anyMissingVendor = props.managedRules?.some((q) => !q.vendorName && !q.vendor); if (anyMissingVendor) { throw new Error("The provided managed rules need to define either the vendor or vendorName (preferred) property"); } const managedRules = props.managedRules ?? [ { vendorName: "AWS", name: "AWSManagedRulesCommonRuleSet" }, ]; const rules = [ // Add a rule for the IP Set if specified ...(this.ipSet ? [ { name: ipSetName, priority: 1, visibilityConfig: { metricName: ipSetName, cloudWatchMetricsEnabled: true, sampledRequestsEnabled: true, }, action: { block: {}, }, statement: { notStatement: { statement: { ipSetReferenceStatement: { arn: this.ipSet.attrArn, }, }, }, }, }, ] : []), // Add the managed rules ...managedRules.map(({ vendor, vendorName, name, ...others }, i) => { // TODO: the usage of `vendor` it's for backward compatibility // it will be removed in the next PDK versions const vendorNameToUser = (vendor || vendorName); return { name: `${vendorNameToUser}-${name}`, priority: i + 2, statement: { managedRuleGroupStatement: { ...others, vendorName: vendorNameToUser, name, }, }, overrideAction: { none: {} }, visibilityConfig: { metricName: `${aclName}-${vendorNameToUser}-${name}`, cloudWatchMetricsEnabled: true, sampledRequestsEnabled: true, }, }; }), ]; this.webAcl = new aws_wafv2_1.CfnWebACL(this, "ApiWebACL", { name: aclName, defaultAction: { // Allow by default, and use rules to deny unwanted requests allow: {}, }, scope: "REGIONAL", visibilityConfig: { cloudWatchMetricsEnabled: true, sampledRequestsEnabled: true, metricName: aclName, }, rules, }); this.webAclAssociation = new aws_wafv2_1.CfnWebACLAssociation(this, "WebACLAssociation", { resourceArn: props.apiDeploymentStageArn, webAclArn: this.webAcl.attrArn, }); } } exports.OpenApiGatewayWebAcl = OpenApiGatewayWebAcl; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1hcGktZ2F0ZXdheS13ZWItYWNsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3Blbi1hcGktZ2F0ZXdheS13ZWItYWNsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBO3NDQUNzQztBQUN0QywwQ0FBc0M7QUFDdEMsNkNBQW9DO0FBQ3BDLHFEQUkrQjtBQUMvQiwyQ0FBdUM7QUFhdkM7O0dBRUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBS2pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7UUFDeEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLE9BQU8sR0FBRyxHQUFHLGdCQUFNLENBQUMsY0FBYyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JELEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsR0FBRyxPQUFPLFFBQVEsQ0FBQztRQUVyQyxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsYUFBYTtZQUM5QixDQUFDLENBQUMsSUFBSSxvQkFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVU7Z0JBQ3pDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUTtnQkFDOUMsS0FBSyxFQUFFLFVBQVU7YUFDbEIsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCw4RUFBOEU7UUFDOUUsa0NBQWtDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFD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LyohIENvcHlyaWdodCBbQW1hem9uLmNvbV0oaHR0cDovL2FtYXpvbi5jb20vKSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5pbXBvcnQgeyBQREtOYWcgfSBmcm9tIFwiQGF3cy9wZGstbmFnXCI7XG5pbXBvcnQgeyBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ2ZuSVBTZXQsXG4gIENmbldlYkFDTCxcbiAgQ2ZuV2ViQUNMQXNzb2NpYXRpb24sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtd2FmdjJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBUeXBlU2FmZUFwaVdlYkFjbE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBXZWIgQUNMIGZvciB0aGUgQVBJXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFwaUdhdGV3YXlXZWJBY2xQcm9wcyBleHRlbmRzIFR5cGVTYWZlQXBpV2ViQWNsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYXJuIG9mIHRoZSBkZXBsb3ltZW50IHN0YWdlIG9mIHRoZSBBUEkgd2l0aCB3aGljaCB0aGUgV2ViIEFDTCB3aWxsIGJlIGFzc29jaWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGFwaURlcGxveW1lbnRTdGFnZUFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFzc29jaWF0ZSBhbiBBV1MgV0FGIHYyIFdlYiBBQ0wgd2l0aCB0aGUgZ2l2ZW4gYXBpXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuQXBpR2F0ZXdheVdlYkFjbCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHJlYWRvbmx5IHdlYkFjbD86IENmbldlYkFDTDtcbiAgcmVhZG9ubHkgaXBTZXQ/OiBDZm5JUFNldDtcbiAgcmVhZG9ubHkgd2ViQWNsQXNzb2NpYXRpb24/OiBDZm5XZWJBQ0xBc3NvY2lhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT3BlbkFwaUdhdGV3YXlXZWJBY2xQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBhY2xOYW1lID0gYCR7UERLTmFnLmdldFN0YWNrUHJlZml4KFN0YWNrLm9mKHRoaXMpKVxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmpvaW4oXCItXCIpfSR7aWR9LSR7dGhpcy5ub2RlLmFkZHIuc2xpY2UoLTgpfWA7XG4gICAgY29uc3QgaXBTZXROYW1lID0gYCR7YWNsTmFtZX0tSVBTZXRgO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBJUCBTZXQgaWYgcmVxdWVzdGVkXG4gICAgdGhpcy5pcFNldCA9IHByb3BzLmNpZHJBbGxvd0xpc3RcbiAgICAgID8gbmV3IENmbklQU2V0KHRoaXMsIFwiQXBpSVBTZXRcIiwge1xuICAgICAgICAgIG5hbWU6IGlwU2V0TmFtZSxcbiAgICAgICAgICBhZGRyZXNzZXM6IHByb3BzLmNpZHJBbGxvd0xpc3QuY2lkclJhbmdlcyxcbiAgICAgICAgICBpcEFkZHJlc3NWZXJzaW9uOiBwcm9wcy5jaWRyQWxsb3dMaXN0LmNpZHJUeXBlLFxuICAgICAgICAgIHNjb3BlOiBcIlJFR0lPTkFMXCIsXG4gICAgICAgIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFRPRE86IHZlbmRvciBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUgaXRlcmF0aW9uc1xuICAgIC8vIGFuZCB2ZW5kb3JOYW1lIHdpbGwgYmUgcmVxdWlyZWRcbiAgICBjb25zdCBhbnlNaXNzaW5nVmVuZG9yID0gcHJvcHMubWFuYWdlZFJ1bGVzPy5zb21lKFxuICAgICAgKHEpID0+ICFxLnZlbmRvck5hbWUgJiYgIXEudmVuZG9yXG4gICAgKTtcblxuICAgIGlmIChhbnlNaXNzaW5nVmVuZG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlIHByb3ZpZGVkIG1hbmFnZWQgcnVsZXMgbmVlZCB0byBkZWZpbmUgZWl0aGVyIHRoZSB2ZW5kb3Igb3IgdmVuZG9yTmFtZSAocHJlZmVycmVkKSBwcm9wZXJ0eVwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1hbmFnZWRSdWxlcyA9IHByb3BzLm1hbmFnZWRSdWxlcyA/PyBbXG4gICAgICB7IHZlbmRvck5hbWU6IFwiQVdTXCIsIG5hbWU6IFwiQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldFwiIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHJ1bGVzOiBDZm5XZWJBQ0wuUnVsZVByb3BlcnR5W10gPSBbXG4gICAgICAvLyBBZGQgYSBydWxlIGZvciB0aGUgSVAgU2V0IGlmIHNwZWNpZmllZFxuICAgICAgLi4uKHRoaXMuaXBTZXRcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IGlwU2V0TmFtZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IDEsXG4gICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBpcFNldE5hbWUsXG4gICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJsb2NrOiB7fSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgbm90U3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaXBTZXRSZWZlcmVuY2VTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICBhcm46IHRoaXMuaXBTZXQuYXR0ckFybixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC8vIEFkZCB0aGUgbWFuYWdlZCBydWxlc1xuICAgICAgLi4ubWFuYWdlZFJ1bGVzLm1hcChcbiAgICAgICAgKFxuICAgICAgICAgIHsgdmVuZG9yLCB2ZW5kb3JOYW1lLCBuYW1lLCAuLi5vdGhlcnMgfSxcbiAgICAgICAgICBpXG4gICAgICAgICk6IENmbldlYkFDTC5SdWxlUHJvcGVydHkgPT4ge1xuICAgICAgICAgIC8vIFRPRE86IHRoZSB1c2FnZSBvZiBgdmVuZG9yYCBpdCdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IFBESyB2ZXJzaW9uc1xuICAgICAgICAgIGNvbnN0IHZlbmRvck5hbWVUb1VzZXIgPSAodmVuZG9yIHx8IHZlbmRvck5hbWUpITtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBgJHt2ZW5kb3JOYW1lVG9Vc2VyfS0ke25hbWV9YCxcbiAgICAgICAgICAgIHByaW9yaXR5OiBpICsgMixcbiAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgLi4ub3RoZXJzLFxuICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6IHZlbmRvck5hbWVUb1VzZXIsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVycmlkZUFjdGlvbjogeyBub25lOiB7fSB9LFxuICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHthY2xOYW1lfS0ke3ZlbmRvck5hbWVUb1VzZXJ9LSR7bmFtZX1gLFxuICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgXTtcblxuICAgIHRoaXMud2ViQWNsID0gbmV3IENmbldlYkFDTCh0aGlzLCBcIkFwaVdlYkFDTFwiLCB7XG4gICAgICBuYW1lOiBhY2xOYW1lLFxuICAgICAgZGVmYXVsdEFjdGlvbjoge1xuICAgICAgICAvLyBBbGxvdyBieSBkZWZhdWx0LCBhbmQgdXNlIHJ1bGVzIHRvIGRlbnkgdW53YW50ZWQgcmVxdWVzdHNcbiAgICAgICAgYWxsb3c6IHt9LFxuICAgICAgfSxcbiAgICAgIHNjb3BlOiBcIlJFR0lPTkFMXCIsXG4gICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbWV0cmljTmFtZTogYWNsTmFtZSxcbiAgICAgIH0sXG4gICAgICBydWxlcyxcbiAgICB9KTtcblxuICAgIHRoaXMud2ViQWNsQXNzb2NpYXRpb24gPSBuZXcgQ2ZuV2ViQUNMQXNzb2NpYXRpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJXZWJBQ0xBc3NvY2lhdGlvblwiLFxuICAgICAge1xuICAgICAgICByZXNvdXJjZUFybjogcHJvcHMuYXBpRGVwbG95bWVudFN0YWdlQXJuLFxuICAgICAgICB3ZWJBY2xBcm46IHRoaXMud2ViQWNsLmF0dHJBcm4sXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIl19