UNPKG

raindancers-network

Version:
92 lines 13.8 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsManagedDNSFirewallRuleGroup = exports.DNSFirewallBlockResponse = exports.DNSFirewallActions = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const path = require("path"); const cdk = require("aws-cdk-lib"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs = require("constructs"); var DNSFirewallActions; (function (DNSFirewallActions) { DNSFirewallActions["ALLOW"] = "ALLOW"; DNSFirewallActions["BLOCK"] = "BLOCK"; DNSFirewallActions["ALERT"] = "ALERT"; })(DNSFirewallActions = exports.DNSFirewallActions || (exports.DNSFirewallActions = {})); var DNSFirewallBlockResponse; (function (DNSFirewallBlockResponse) { DNSFirewallBlockResponse["NODATA"] = "NODATA"; DNSFirewallBlockResponse["NXDOMAIN"] = "NXDOMAIN"; DNSFirewallBlockResponse["OVERRIDE"] = "OVERRIDE"; })(DNSFirewallBlockResponse = exports.DNSFirewallBlockResponse || (exports.DNSFirewallBlockResponse = {})); class AwsManagedDNSFirewallRuleGroup extends constructs.Construct { constructor(scope, id) { super(scope, id); // this lambda will make a api-call to find the ids of the managed aws dns firewalls // aws route53resolver list-firewall-domain-lists // because this api call does not have a filter parameter and needs sorting it // is not a good candidate for a awscustomresource/sdk call. // the ids for the rule groups are different in every region. const lookupFunction = new aws_cdk_lib_1.aws_lambda.Function(this, 'FindRules', { runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_9, logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_MONTH, handler: 'managedAWSRules.on_event', code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, '../../lambda/dns')), timeout: cdk.Duration.seconds(300), }); // give the lambda's role addtional permissions so it can make the required calls. // the addToRolePolicy method will add this as inline policy to the lambdas role. lookupFunction.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({ actions: ['route53resolver:ListFirewallDomainLists'], effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW, resources: ['*'], })); // create a lambda backed cloudformation custom resource. // the lambda function will interact with cloudformaton events ( create, delete, update ) // this provides a way to plug coverage gaps in cloudformation, or perform logic that woudl // be difficult or impossible to do otherwise. const awsManagedRules = [ 'AWSManagedDomainsMalwareDomainList', 'AWSManagedDomainsAggregateThreatList', 'AWSManagedDomainsBotnetCommandandControl', ]; const lookupCr = new cdk.CustomResource(this, 'lookupCr', { resourceType: 'Custom::Lookup', properties: { // propertys are sent to the lambda as part of the event information // in this case a list of rule names that we want to find. awsManagedRules: awsManagedRules, }, //the service token, and provider are the mechamism of how the lambda is connected //to the custom resource serviceToken: new aws_cdk_lib_1.custom_resources.Provider(this, 'associateProvider', { onEventHandler: lookupFunction, }).serviceToken, }); //aws route53resolver list-firewall-domain-lists --profile network // the .getAtt() method, provides a way to get the result of the function that was called back. // in this case we are expecting a list, so, we the Token.asList method to convert that as a list. const firewallDomainListsIds = cdk.Token.asList(lookupCr.getAtt('ManagedRuleIds')); // interate over the list of Ids that where returned. We will get one id, for each item that we requested // from the lookup. we can not directly iterate over the list, as the list does not exisit until deployment. const firewallRules = []; for (let index = 0; index < awsManagedRules.length; index++) { firewallRules.push({ action: DNSFirewallActions.BLOCK, firewallDomainListId: cdk.Fn.select(index, firewallDomainListsIds), priority: 100 + index, blockResponse: DNSFirewallBlockResponse.NODATA, }); } ; const FirewallRuleGroup = new aws_cdk_lib_1.aws_route53resolver.CfnFirewallRuleGroup(this, 'AwsManagedDNSFirewallRules', { firewallRules: firewallRules, name: 'AWS Managed Rules', }); this.resolverRuleId = FirewallRuleGroup.attrId; } } exports.AwsManagedDNSFirewallRuleGroup = AwsManagedDNSFirewallRuleGroup; _a = JSII_RTTI_SYMBOL_1; AwsManagedDNSFirewallRuleGroup[_a] = { fqn: "raindancers-network.dns.AwsManagedDNSFirewallRuleGroup", version: "1.29.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zZmlyZXdhbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG5zL2Ruc2ZpcmV3YWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBRTdCLG1DQUFtQztBQUVuQyw2Q0FNcUI7QUFFckIseUNBQXlDO0FBRXpDLElBQVksa0JBSVg7QUFKRCxXQUFZLGtCQUFrQjtJQUM1QixxQ0FBZSxDQUFBO0lBQ2YscUNBQWUsQ0FBQTtJQUNmLHFDQUFlLENBQUE7QUFDakIsQ0FBQyxFQUpXLGtCQUFrQixHQUFsQiwwQkFBa0IsS0FBbEIsMEJBQWtCLFFBSTdCO0FBRUQsSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2xDLDZDQUFpQixDQUFBO0lBQ2pCLGlEQUFxQixDQUFBO0lBQ3JCLGlEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFKVyx3QkFBd0IsR0FBeEIsZ0NBQXdCLEtBQXhCLGdDQUF3QixRQUluQztBQUVELE1BQWEsOEJBQStCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFJdEUsWUFBWSxLQUEyQixFQUFFLEVBQVU7UUFDakQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixvRkFBb0Y7UUFDcEYsaURBQWlEO1FBQ2pELDhFQUE4RTtRQUM5RSw0REFBNEQ7UUFDNUQsNkRBQTZEO1FBRTdELE1BQU0sY0FBYyxHQUFHLElBQUksd0JBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRSxPQUFPLEVBQUUsd0JBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUN0QyxZQUFZLEVBQUUsc0JBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUMxQyxPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLElBQUksRUFBRSx3QkFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUN6RSxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1NBQ25DLENBQUMsQ0FBQztRQUVILGtGQUFrRjtRQUNsRixpRkFBaUY7UUFDakYsY0FBYyxDQUFDLGVBQWUsQ0FDNUIsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQztZQUNwRCxNQUFNLEVBQUUscUJBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUNILENBQUM7UUFFRix5REFBeUQ7UUFDekQseUZBQXlGO1FBQ3pGLDJGQUEyRjtRQUMzRiw4Q0FBOEM7UUFFOUMsTUFBTSxlQUFlLEdBQUc7WUFDdEIsb0NBQW9DO1lBQ3BDLHNDQUFzQztZQUN0QywwQ0FBMEM7U0FDM0MsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hELFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsVUFBVSxFQUFFO2dCQUNWLG9FQUFvRTtnQkFDcEUsMERBQTBEO2dCQUMxRCxlQUFlLEVBQUUsZUFBZTthQUNqQztZQUNELGtGQUFrRjtZQUNsRix3QkFBd0I7WUFDeEIsWUFBWSxFQUFFLElBQUksOEJBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO2dCQUN2RCxjQUFjLEVBQUUsY0FBYzthQUMvQixDQUFDLENBQUMsWUFBWTtTQUNoQixDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFFbEUsK0ZBQStGO1FBQy9GLGtHQUFrRztRQUVsRyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBRW5GLHlHQUF5RztRQUN6Ryw0R0FBNEc7UUFHNUcsTUFBTSxhQUFhLEdBQXFELEVBQUUsQ0FBQztRQUMzRSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMzRCxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUNqQixNQUFNLEVBQUUsa0JBQWtCLENBQUMsS0FBSztnQkFDaEMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDO2dCQUNsRSxRQUFRLEVBQUUsR0FBRyxHQUFHLEtBQUs7Z0JBQ3JCLGFBQWEsRUFBRSx3QkFBd0IsQ0FBQyxNQUFNO2FBQy9DLENBQUMsQ0FBQztTQUNKO1FBQUEsQ0FBQztRQUVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxpQ0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRTtZQUMxRixhQUFhLEVBQUUsYUFBYTtZQUM1QixJQUFJLEVBQUUsbUJBQW1CO1NBQzFCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0lBRWpELENBQUM7O0FBcEZILHdFQXFGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmltcG9ydCB7XG4gIGF3c19yb3V0ZTUzcmVzb2x2ZXIgYXMgcjUzcixcbiAgY3VzdG9tX3Jlc291cmNlcyBhcyBjcixcbiAgYXdzX2xvZ3MgYXMgbG9ncyxcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19sYW1iZGEsXG59IGZyb20gJ2F3cy1jZGstbGliJztcblxuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGVudW0gRE5TRmlyZXdhbGxBY3Rpb25zIHtcbiAgQUxMT1cgPSAnQUxMT1cnLFxuICBCTE9DSyA9ICdCTE9DSycsXG4gIEFMRVJUID0gJ0FMRVJUJ1xufVxuXG5leHBvcnQgZW51bSBETlNGaXJld2FsbEJsb2NrUmVzcG9uc2Uge1xuICBOT0RBVEEgPSAnTk9EQVRBJyxcbiAgTlhET01BSU4gPSAnTlhET01BSU4nLFxuICBPVkVSUklERSA9ICdPVkVSUklERSdcbn1cblxuZXhwb3J0IGNsYXNzIEF3c01hbmFnZWRETlNGaXJld2FsbFJ1bGVHcm91cCBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcblxuICByZXNvbHZlclJ1bGVJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyB0aGlzIGxhbWJkYSB3aWxsIG1ha2UgYSBhcGktY2FsbCB0byBmaW5kIHRoZSBpZHMgb2YgdGhlIG1hbmFnZWQgYXdzIGRucyBmaXJld2FsbHNcbiAgICAvLyBhd3Mgcm91dGU1M3Jlc29sdmVyIGxpc3QtZmlyZXdhbGwtZG9tYWluLWxpc3RzXG4gICAgLy8gYmVjYXVzZSB0aGlzIGFwaSBjYWxsIGRvZXMgbm90IGhhdmUgYSBmaWx0ZXIgcGFyYW1ldGVyIGFuZCBuZWVkcyBzb3J0aW5nIGl0XG4gICAgLy8gaXMgbm90IGEgZ29vZCBjYW5kaWRhdGUgZm9yIGEgYXdzY3VzdG9tcmVzb3VyY2Uvc2RrIGNhbGwuXG4gICAgLy8gdGhlIGlkcyBmb3IgdGhlIHJ1bGUgZ3JvdXBzIGFyZSBkaWZmZXJlbnQgaW4gZXZlcnkgcmVnaW9uLlxuXG4gICAgY29uc3QgbG9va3VwRnVuY3Rpb24gPSBuZXcgYXdzX2xhbWJkYS5GdW5jdGlvbih0aGlzLCAnRmluZFJ1bGVzJywge1xuICAgICAgcnVudGltZTogYXdzX2xhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzksXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBoYW5kbGVyOiAnbWFuYWdlZEFXU1J1bGVzLm9uX2V2ZW50JyxcbiAgICAgIGNvZGU6IGF3c19sYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2xhbWJkYS9kbnMnKSksXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgIH0pO1xuXG4gICAgLy8gZ2l2ZSB0aGUgbGFtYmRhJ3Mgcm9sZSBhZGR0aW9uYWwgcGVybWlzc2lvbnMgc28gaXQgY2FuIG1ha2UgdGhlIHJlcXVpcmVkIGNhbGxzLlxuICAgIC8vIHRoZSBhZGRUb1JvbGVQb2xpY3kgbWV0aG9kIHdpbGwgYWRkIHRoaXMgYXMgaW5saW5lIHBvbGljeSB0byB0aGUgbGFtYmRhcyByb2xlLlxuICAgIGxvb2t1cEZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydyb3V0ZTUzcmVzb2x2ZXI6TGlzdEZpcmV3YWxsRG9tYWluTGlzdHMnXSxcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIGNyZWF0ZSBhIGxhbWJkYSBiYWNrZWQgY2xvdWRmb3JtYXRpb24gY3VzdG9tIHJlc291cmNlLlxuICAgIC8vIHRoZSBsYW1iZGEgZnVuY3Rpb24gd2lsbCBpbnRlcmFjdCB3aXRoIGNsb3VkZm9ybWF0b24gZXZlbnRzICggY3JlYXRlLCBkZWxldGUsIHVwZGF0ZSApXG4gICAgLy8gdGhpcyBwcm92aWRlcyBhIHdheSB0byBwbHVnIGNvdmVyYWdlIGdhcHMgaW4gY2xvdWRmb3JtYXRpb24sIG9yIHBlcmZvcm0gbG9naWMgdGhhdCB3b3VkbFxuICAgIC8vIGJlIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIGRvIG90aGVyd2lzZS5cblxuICAgIGNvbnN0IGF3c01hbmFnZWRSdWxlcyA9IFtcbiAgICAgICdBV1NNYW5hZ2VkRG9tYWluc01hbHdhcmVEb21haW5MaXN0JyxcbiAgICAgICdBV1NNYW5hZ2VkRG9tYWluc0FnZ3JlZ2F0ZVRocmVhdExpc3QnLFxuICAgICAgJ0FXU01hbmFnZWREb21haW5zQm90bmV0Q29tbWFuZGFuZENvbnRyb2wnLFxuICAgIF07XG5cbiAgICBjb25zdCBsb29rdXBDciA9IG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UodGhpcywgJ2xvb2t1cENyJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpMb29rdXAnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAvLyBwcm9wZXJ0eXMgYXJlIHNlbnQgdG8gdGhlIGxhbWJkYSBhcyBwYXJ0IG9mIHRoZSBldmVudCBpbmZvcm1hdGlvblxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgYSBsaXN0IG9mIHJ1bGUgbmFtZXMgdGhhdCB3ZSB3YW50IHRvIGZpbmQuXG4gICAgICAgIGF3c01hbmFnZWRSdWxlczogYXdzTWFuYWdlZFJ1bGVzLFxuICAgICAgfSxcbiAgICAgIC8vdGhlIHNlcnZpY2UgdG9rZW4sIGFuZCBwcm92aWRlciBhcmUgdGhlIG1lY2hhbWlzbSBvZiBob3cgdGhlIGxhbWJkYSBpcyBjb25uZWN0ZWRcbiAgICAgIC8vdG8gdGhlIGN1c3RvbSByZXNvdXJjZVxuICAgICAgc2VydmljZVRva2VuOiBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ2Fzc29jaWF0ZVByb3ZpZGVyJywge1xuICAgICAgICBvbkV2ZW50SGFuZGxlcjogbG9va3VwRnVuY3Rpb24sXG4gICAgICB9KS5zZXJ2aWNlVG9rZW4sXG4gICAgfSk7XG5cbiAgICAvL2F3cyByb3V0ZTUzcmVzb2x2ZXIgbGlzdC1maXJld2FsbC1kb21haW4tbGlzdHMgLS1wcm9maWxlIG5ldHdvcmtcblxuICAgIC8vIHRoZSAuZ2V0QXR0KCkgbWV0aG9kLCBwcm92aWRlcyBhIHdheSB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgY2FsbGVkIGJhY2suXG4gICAgLy8gaW4gdGhpcyBjYXNlIHdlIGFyZSBleHBlY3RpbmcgYSBsaXN0LCBzbywgd2UgdGhlIFRva2VuLmFzTGlzdCBtZXRob2QgdG8gY29udmVydCB0aGF0IGFzIGEgbGlzdC5cblxuICAgIGNvbnN0IGZpcmV3YWxsRG9tYWluTGlzdHNJZHMgPSBjZGsuVG9rZW4uYXNMaXN0KGxvb2t1cENyLmdldEF0dCgnTWFuYWdlZFJ1bGVJZHMnKSk7XG5cbiAgICAvLyBpbnRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIElkcyB0aGF0IHdoZXJlIHJldHVybmVkLiBXZSB3aWxsIGdldCBvbmUgaWQsIGZvciBlYWNoIGl0ZW0gdGhhdCB3ZSByZXF1ZXN0ZWRcbiAgICAvLyBmcm9tIHRoZSBsb29rdXAuIHdlIGNhbiBub3QgZGlyZWN0bHkgaXRlcmF0ZSBvdmVyIHRoZSBsaXN0LCBhcyB0aGUgbGlzdCBkb2VzIG5vdCBleGlzaXQgdW50aWwgZGVwbG95bWVudC5cblxuXG4gICAgY29uc3QgZmlyZXdhbGxSdWxlczogcjUzci5DZm5GaXJld2FsbFJ1bGVHcm91cC5GaXJld2FsbFJ1bGVQcm9wZXJ0eVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGF3c01hbmFnZWRSdWxlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGZpcmV3YWxsUnVsZXMucHVzaCh7XG4gICAgICAgIGFjdGlvbjogRE5TRmlyZXdhbGxBY3Rpb25zLkJMT0NLLFxuICAgICAgICBmaXJld2FsbERvbWFpbkxpc3RJZDogY2RrLkZuLnNlbGVjdChpbmRleCwgZmlyZXdhbGxEb21haW5MaXN0c0lkcyksXG4gICAgICAgIHByaW9yaXR5OiAxMDAgKyBpbmRleCxcbiAgICAgICAgYmxvY2tSZXNwb25zZTogRE5TRmlyZXdhbGxCbG9ja1Jlc3BvbnNlLk5PREFUQSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBGaXJld2FsbFJ1bGVHcm91cCA9IG5ldyByNTNyLkNmbkZpcmV3YWxsUnVsZUdyb3VwKHRoaXMsICdBd3NNYW5hZ2VkRE5TRmlyZXdhbGxSdWxlcycsIHtcbiAgICAgIGZpcmV3YWxsUnVsZXM6IGZpcmV3YWxsUnVsZXMsXG4gICAgICBuYW1lOiAnQVdTIE1hbmFnZWQgUnVsZXMnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvbHZlclJ1bGVJZCA9IEZpcmV3YWxsUnVsZUdyb3VwLmF0dHJJZDtcblxuICB9XG59Il19