Skip to content

Commit 950dec5

Browse files
Merge pull request #13 from Ajay-sops/main
cloud watch log group encryption
2 parents 89ba1c8 + d632274 commit 950dec5

File tree

7 files changed

+65
-17
lines changed

7 files changed

+65
-17
lines changed

README.md

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ module "vpc" {
4040
vpn_server_instance_type = "t3a.small"
4141
flow_log_max_aggregation_interval = 60
4242
flow_log_cloudwatch_log_group_retention_in_days = 90
43+
flow_log_cloudwatch_log_group_kms_key_arn = "arn:aws:kms:us-east-2:222222222222:key/kms_key_arn" #Enter your kms key arn
4344
}
4445
```
4546
Refer [this](https://github.com/squareops/terraform-aws-vpc/tree/main/examples) for more examples.
@@ -50,6 +51,42 @@ To prevent destruction interruptions, any resources that have been created outsi
5051

5152
The private key generated by Keypair module will be stored in AWS Systems Manager Parameter Store. For more details refer [this](https://registry.terraform.io/modules/squareops/keypair/aws)
5253

54+
For encrypting vpc flow log cloudwatch log group please use this kms key policy. Change the account id and region.
55+
56+
```json
57+
{
58+
"Version": "2012-10-17",
59+
"Id": "allow-cloudwatch-logs-encryption",
60+
"Statement": [
61+
{
62+
"Sid": "AllowRootFullPermissions",
63+
"Effect": "Allow",
64+
"Principal": {
65+
"AWS": "arn:aws:iam::12345678:root"
66+
},
67+
"Action": "kms:*",
68+
"Resource": "*"
69+
},
70+
{
71+
"Sid": "AllowCloudWatchLogsEncryption",
72+
"Effect": "Allow",
73+
"Principal": {
74+
"Service": "logs.us-east-2.amazonaws.com"
75+
},
76+
"Action": [
77+
"kms:Encrypt*",
78+
"kms:Decrypt*",
79+
"kms:ReEncrypt*",
80+
"kms:GenerateDataKey*",
81+
"kms:Describe*"
82+
],
83+
"Resource": "*"
84+
}
85+
]
86+
}
87+
```
88+
89+
5390
## Network Scenarios
5491

5592
Users need to declare `vpc_cidr` and subnets are calculated with the help of in-built functions.
@@ -81,6 +118,7 @@ This module supports three scenarios to create Network resource on AWS. Each wil
81118
- `flow_log_enabled = true`
82119
- `flow_log_max_aggregation_interval = 60`
83120
- `flow_log_cloudwatch_log_group_retention_in_days = 90`
121+
- `flow_log_cloudwatch_log_group_kms_key_arn = "arn:aws:kms:us-east-2:222222222222:key/kms_key_arn"`
84122

85123
- **vpc-peering:** VPC peering support is available using submodule `vpc_peering`. Refer [Peering Docs](https://github.com/squareops/terraform-aws-vpc/tree/main/modules/vpc_peering) for more information
86124
- `accepter_name = ""`
@@ -175,12 +213,13 @@ In this module, we have implemented the following CIS Compliance checks for VPC:
175213
| Name | Description | Type | Default | Required |
176214
|------|-------------|------|---------|:--------:|
177215
| <a name="input_auto_assign_public_ip"></a> [auto\_assign\_public\_ip](#input\_auto\_assign\_public\_ip) | Specify true to indicate that instances launched into the subnet should be assigned a public IP address. | `bool` | `false` | no |
178-
| <a name="input_availability_zones"></a> [availability\_zones](#input\_availability\_zones) | Number of Availability Zone to be used by VPC Subnets | `number` | `2` | no |
216+
| <a name="input_availability_zones"></a> [availability\_zones](#input\_availability\_zones) | Number of Availability Zone to be used by VPC Subnets | `list(any)` | `[]` | no |
179217
| <a name="input_database_subnet_assign_ipv6_address_on_creation"></a> [database\_subnet\_assign\_ipv6\_address\_on\_creation](#input\_database\_subnet\_assign\_ipv6\_address\_on\_creation) | Assign IPv6 address on database subnet, must be disabled to change IPv6 CIDRs. This is the IPv6 equivalent of map\_public\_ip\_on\_launch | `bool` | `null` | no |
180218
| <a name="input_database_subnet_cidrs"></a> [database\_subnet\_cidrs](#input\_database\_subnet\_cidrs) | Database Tier subnet CIDRs to be created | `list(any)` | `[]` | no |
181219
| <a name="input_database_subnet_enabled"></a> [database\_subnet\_enabled](#input\_database\_subnet\_enabled) | Set true to enable database subnets | `bool` | `false` | no |
182220
| <a name="input_default_network_acl_ingress"></a> [default\_network\_acl\_ingress](#input\_default\_network\_acl\_ingress) | List of maps of ingress rules to set on the Default Network ACL | `list(map(string))` | <pre>[<br> {<br> "action": "deny",<br> "cidr_block": "0.0.0.0/0",<br> "from_port": 22,<br> "protocol": "tcp",<br> "rule_no": 98,<br> "to_port": 22<br> },<br> {<br> "action": "deny",<br> "cidr_block": "0.0.0.0/0",<br> "from_port": 3389,<br> "protocol": "tcp",<br> "rule_no": 99,<br> "to_port": 3389<br> },<br> {<br> "action": "allow",<br> "cidr_block": "0.0.0.0/0",<br> "from_port": 0,<br> "protocol": "-1",<br> "rule_no": 100,<br> "to_port": 0<br> },<br> {<br> "action": "allow",<br> "from_port": 0,<br> "ipv6_cidr_block": "::/0",<br> "protocol": "-1",<br> "rule_no": 101,<br> "to_port": 0<br> }<br>]</pre> | no |
183221
| <a name="input_environment"></a> [environment](#input\_environment) | Specify the environment indentifier for the VPC | `string` | `""` | no |
222+
| <a name="input_flow_log_cloudwatch_log_group_kms_key_arn"></a> [flow\_log\_cloudwatch\_log\_group\_kms\_key\_arn](#input\_flow\_log\_cloudwatch\_log\_group\_kms\_key\_arn) | The ARN of the KMS Key to use when encrypting log data for VPC flow logs | `string` | `null` | no |
184223
| <a name="input_flow_log_cloudwatch_log_group_retention_in_days"></a> [flow\_log\_cloudwatch\_log\_group\_retention\_in\_days](#input\_flow\_log\_cloudwatch\_log\_group\_retention\_in\_days) | Specifies the number of days you want to retain log events in the specified log group for VPC flow logs. | `number` | `null` | no |
185224
| <a name="input_flow_log_enabled"></a> [flow\_log\_enabled](#input\_flow\_log\_enabled) | Whether or not to enable VPC Flow Logs | `bool` | `false` | no |
186225
| <a name="input_flow_log_max_aggregation_interval"></a> [flow\_log\_max\_aggregation\_interval](#input\_flow\_log\_max\_aggregation\_interval) | The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. Valid Values: `60` seconds or `600` seconds. | `number` | `60` | no |

examples/complete-vpc-with-vpn/main.tf

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ module "vpc" {
2222
name = local.name
2323
vpc_cidr = local.vpc_cidr
2424
environment = local.environment
25-
flow_log_enabled = true
25+
flow_log_enabled = false
2626
vpn_key_pair_name = module.key_pair_vpn.key_pair_name
27-
availability_zones = 2
27+
availability_zones = ["us-east-1a", "us-east-1b"]
2828
vpn_server_enabled = false
2929
intra_subnet_enabled = true
3030
public_subnet_enabled = true
@@ -35,4 +35,5 @@ module "vpc" {
3535
vpn_server_instance_type = "t3a.small"
3636
flow_log_max_aggregation_interval = 60
3737
flow_log_cloudwatch_log_group_retention_in_days = 90
38+
flow_log_cloudwatch_log_group_kms_key_arn = "arn:aws:kms:us-east-2:222222222222:key/kms_key_arn" #Enter your kms key arn
3839
}

examples/simple-vpc/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module "vpc" {
1515
name = local.name
1616
vpc_cidr = local.vpc_cidr
1717
environment = local.environment
18-
availability_zones = 2
18+
availability_zones = ["us-east-1a", "us-east-1b"]
1919
public_subnet_enabled = true
2020
auto_assign_public_ip = true
2121
}

examples/vpc-with-ipv6/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module "vpc" {
1616
name = local.name
1717
vpc_cidr = local.vpc_cidr
1818
environment = local.environment
19-
availability_zones = 2
19+
availability_zones = ["us-east-1a", "us-east-1b"]
2020
public_subnet_enabled = true
2121
private_subnet_enabled = true
2222
intra_subnet_enabled = false

examples/vpc-with-private-subnet/main.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module "vpc" {
1515
name = local.name
1616
vpc_cidr = local.vpc_cidr
1717
environment = local.environment
18-
availability_zones = 2
18+
availability_zones = ["us-east-1a", "us-east-1b"]
1919
public_subnet_enabled = true
2020
private_subnet_enabled = true
2121
auto_assign_public_ip = true

main.tf

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
locals {
2-
intra_subnets = var.intra_subnet_enabled ? length(var.intra_subnet_cidrs) > 0 ? var.intra_subnet_cidrs : [for netnum in range(var.availability_zones * 3, var.availability_zones * 4) : cidrsubnet(var.vpc_cidr, 8, netnum)] : []
3-
public_subnets = var.public_subnet_enabled ? length(var.public_subnet_cidrs) > 0 ? var.public_subnet_cidrs : [for netnum in range(0, var.availability_zones) : cidrsubnet(var.vpc_cidr, 8, netnum)] : []
4-
private_subnets = var.private_subnet_enabled ? length(var.private_subnet_cidrs) > 0 ? var.private_subnet_cidrs : [for netnum in range(var.availability_zones, var.availability_zones * 2) : cidrsubnet(var.vpc_cidr, 4, netnum)] : []
5-
database_subnets = var.database_subnet_enabled ? length(var.database_subnet_cidrs) > 0 ? var.database_subnet_cidrs : [for netnum in range(var.availability_zones * 2, var.availability_zones * 3) : cidrsubnet(var.vpc_cidr, 8, netnum)] : []
2+
azs = length(var.availability_zones)
3+
intra_subnets = var.intra_subnet_enabled ? length(var.intra_subnet_cidrs) > 0 ? var.intra_subnet_cidrs : [for netnum in range(local.azs * 3, local.azs * 4) : cidrsubnet(var.vpc_cidr, 8, netnum)] : []
4+
public_subnets = var.public_subnet_enabled ? length(var.public_subnet_cidrs) > 0 ? var.public_subnet_cidrs : [for netnum in range(0, local.azs) : cidrsubnet(var.vpc_cidr, 8, netnum)] : []
5+
private_subnets = var.private_subnet_enabled ? length(var.private_subnet_cidrs) > 0 ? var.private_subnet_cidrs : [for netnum in range(local.azs, local.azs * 2) : cidrsubnet(var.vpc_cidr, 4, netnum)] : []
6+
database_subnets = var.database_subnet_enabled ? length(var.database_subnet_cidrs) > 0 ? var.database_subnet_cidrs : [for netnum in range(local.azs * 2, local.azs * 3) : cidrsubnet(var.vpc_cidr, 8, netnum)] : []
67
single_nat_gateway = var.one_nat_gateway_per_az == true ? false : true
78
create_database_subnet_route_table = var.database_subnet_enabled
89
create_flow_log_cloudwatch_log_group = var.flow_log_enabled == true ? true : false
@@ -23,10 +24,10 @@ locals {
2324
database_subnet_assign_ipv6_address_on_creation = var.database_subnet_assign_ipv6_address_on_creation == true && var.ipv6_enabled == true ? true : false
2425
intra_subnet_assign_ipv6_address_on_creation = var.intra_subnet_assign_ipv6_address_on_creation == true && var.ipv6_enabled == true ? true : false
2526

26-
public_subnet_ipv6_prefixes = var.public_subnet_enabled ? [for i in range(var.availability_zones) : i] : []
27-
private_subnet_ipv6_prefixes = var.private_subnet_enabled ? [for i in range(var.availability_zones) : i + length(data.aws_availability_zones.available.names)] : []
28-
database_subnet_ipv6_prefixes = var.database_subnet_enabled ? [for i in range(var.availability_zones) : i + 2 * length(data.aws_availability_zones.available.names)] : []
29-
intra_subnet_ipv6_prefixes = var.intra_subnet_enabled ? [for i in range(var.availability_zones) : i + 3 * length(data.aws_availability_zones.available.names)] : []
27+
public_subnet_ipv6_prefixes = var.public_subnet_enabled ? [for i in range(local.azs) : i] : []
28+
private_subnet_ipv6_prefixes = var.private_subnet_enabled ? [for i in range(local.azs) : i + length(data.aws_availability_zones.available.names)] : []
29+
database_subnet_ipv6_prefixes = var.database_subnet_enabled ? [for i in range(local.azs) : i + 2 * length(data.aws_availability_zones.available.names)] : []
30+
intra_subnet_ipv6_prefixes = var.intra_subnet_enabled ? [for i in range(local.azs) : i + 3 * length(data.aws_availability_zones.available.names)] : []
3031
}
3132
data "aws_availability_zones" "available" {}
3233
data "aws_ec2_instance_type" "arch" {
@@ -38,7 +39,7 @@ module "vpc" {
3839
version = "5.1.1"
3940
name = format("%s-%s-vpc", var.environment, var.name)
4041
cidr = var.vpc_cidr # CIDR FOR VPC
41-
azs = [for n in range(0, var.availability_zones) : data.aws_availability_zones.available.names[n]]
42+
azs = [for n in range(0, local.azs) : data.aws_availability_zones.available.names[n]]
4243
intra_subnets = local.intra_subnets
4344
public_subnets = local.public_subnets
4445
private_subnets = local.private_subnets
@@ -63,6 +64,7 @@ module "vpc" {
6364
create_flow_log_cloudwatch_log_group = local.create_flow_log_cloudwatch_log_group
6465
flow_log_max_aggregation_interval = var.flow_log_max_aggregation_interval
6566
flow_log_cloudwatch_log_group_retention_in_days = var.flow_log_cloudwatch_log_group_retention_in_days
67+
flow_log_cloudwatch_log_group_kms_key_id = var.flow_log_cloudwatch_log_group_kms_key_arn
6668
enable_ipv6 = local.enable_ipv6
6769
#assign_ipv6_address_on_creation = local.assign_ipv6_address_on_creation
6870
public_subnet_assign_ipv6_address_on_creation = local.public_subnet_assign_ipv6_address_on_creation

variables.tf

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ variable "vpc_cidr" {
1919

2020
variable "availability_zones" {
2121
description = "Number of Availability Zone to be used by VPC Subnets"
22-
default = 2
23-
type = number
22+
default = []
23+
type = list(any)
2424
}
2525

2626
variable "public_subnet_enabled" {
@@ -191,3 +191,9 @@ variable "intra_subnet_assign_ipv6_address_on_creation" {
191191
type = bool
192192
default = null
193193
}
194+
195+
variable "flow_log_cloudwatch_log_group_kms_key_arn" {
196+
description = "The ARN of the KMS Key to use when encrypting log data for VPC flow logs"
197+
type = string
198+
default = null
199+
}

0 commit comments

Comments
 (0)