Skip to content

Commit 2d7fcb9

Browse files
author
Michael Strache
authored
feat: Add support for XFF/TLS headers (#284)
1 parent f801a2d commit 2d7fcb9

File tree

4 files changed

+79
-52
lines changed

4 files changed

+79
-52
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,9 @@ No modules.
335335
| <a name="input_enable_cross_zone_load_balancing"></a> [enable\_cross\_zone\_load\_balancing](#input\_enable\_cross\_zone\_load\_balancing) | Indicates whether cross zone load balancing should be enabled in application load balancers. | `bool` | `false` | no |
336336
| <a name="input_enable_deletion_protection"></a> [enable\_deletion\_protection](#input\_enable\_deletion\_protection) | If true, deletion of the load balancer will be disabled via the AWS API. This will prevent Terraform from deleting the load balancer. Defaults to false. | `bool` | `false` | no |
337337
| <a name="input_enable_http2"></a> [enable\_http2](#input\_enable\_http2) | Indicates whether HTTP/2 is enabled in application load balancers. | `bool` | `true` | no |
338+
| <a name="input_enable_tls_version_and_cipher_suite_headers"></a> [enable\_tls\_version\_and\_cipher\_suite\_headers](#input\_enable\_tls\_version\_and\_cipher\_suite\_headers) | Indicates whether the two headers (x-amzn-tls-version and x-amzn-tls-cipher-suite), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. | `bool` | `false` | no |
338339
| <a name="input_enable_waf_fail_open"></a> [enable\_waf\_fail\_open](#input\_enable\_waf\_fail\_open) | Indicates whether to route requests to targets if lb fails to forward the request to AWS WAF | `bool` | `false` | no |
340+
| <a name="input_enable_xff_client_port"></a> [enable\_xff\_client\_port](#input\_enable\_xff\_client\_port) | Indicates whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer in application load balancers. | `bool` | `true` | no |
339341
| <a name="input_extra_ssl_certs"></a> [extra\_ssl\_certs](#input\_extra\_ssl\_certs) | A list of maps describing any extra SSL certificates to apply to the HTTPS listeners. Required key/values: certificate\_arn, https\_listener\_index (the index of the listener within https\_listeners which the cert applies toward). | `list(map(string))` | `[]` | no |
340342
| <a name="input_http_tcp_listener_rules"></a> [http\_tcp\_listener\_rules](#input\_http\_tcp\_listener\_rules) | A list of maps describing the Listener Rules for this ALB. Required key/values: actions, conditions. Optional key/values: priority, http\_tcp\_listener\_index (default to http\_tcp\_listeners[count.index]) | `any` | `[]` | no |
341343
| <a name="input_http_tcp_listener_rules_tags"></a> [http\_tcp\_listener\_rules\_tags](#input\_http\_tcp\_listener\_rules\_tags) | A map of tags to add to all http listener rules | `map(string)` | `{}` | no |
@@ -370,6 +372,7 @@ No modules.
370372
| <a name="input_target_group_tags"></a> [target\_group\_tags](#input\_target\_group\_tags) | A map of tags to add to all target groups | `map(string)` | `{}` | no |
371373
| <a name="input_target_groups"></a> [target\_groups](#input\_target\_groups) | A list of maps containing key/value pairs that define the target groups to be created. Order of these maps is important and the index of these are to be referenced in listener definitions. Required key/values: name, backend\_protocol, backend\_port | `any` | `[]` | no |
372374
| <a name="input_vpc_id"></a> [vpc\_id](#input\_vpc\_id) | VPC id where the load balancer and other resources will be deployed. | `string` | `null` | no |
375+
| <a name="input_xff_header_processing_mode"></a> [xff\_header\_processing\_mode](#input\_xff\_header\_processing\_mode) | Determines how the load balancer modifies the X-Forwarded-For header in the HTTP request before sending the request to the target. | `string` | `"append"` | no |
373376

374377
## Outputs
375378

main.tf

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@ resource "aws_lb" "this" {
1313
security_groups = var.create_security_group && var.load_balancer_type == "application" ? concat([aws_security_group.this[0].id], var.security_groups) : var.security_groups
1414
subnets = var.subnets
1515

16-
idle_timeout = var.idle_timeout
17-
enable_cross_zone_load_balancing = var.enable_cross_zone_load_balancing
18-
enable_deletion_protection = var.enable_deletion_protection
19-
enable_http2 = var.enable_http2
20-
ip_address_type = var.ip_address_type
21-
drop_invalid_header_fields = var.drop_invalid_header_fields
22-
preserve_host_header = var.preserve_host_header
23-
enable_waf_fail_open = var.enable_waf_fail_open
24-
desync_mitigation_mode = var.desync_mitigation_mode
16+
idle_timeout = var.idle_timeout
17+
enable_cross_zone_load_balancing = var.enable_cross_zone_load_balancing
18+
enable_deletion_protection = var.enable_deletion_protection
19+
enable_http2 = var.enable_http2
20+
enable_tls_version_and_cipher_suite_headers = var.enable_tls_version_and_cipher_suite_headers
21+
enable_xff_client_port = var.enable_xff_client_port
22+
ip_address_type = var.ip_address_type
23+
drop_invalid_header_fields = var.drop_invalid_header_fields
24+
preserve_host_header = var.preserve_host_header
25+
enable_waf_fail_open = var.enable_waf_fail_open
26+
desync_mitigation_mode = var.desync_mitigation_mode
27+
xff_header_processing_mode = var.xff_header_processing_mode
2528

2629
dynamic "access_logs" {
2730
for_each = length(var.access_logs) > 0 ? [var.access_logs] : []

variables.tf

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ variable "enable_cross_zone_load_balancing" {
3434
default = false
3535
}
3636

37+
variable "enable_tls_version_and_cipher_suite_headers" {
38+
description = "Indicates whether the two headers (x-amzn-tls-version and x-amzn-tls-cipher-suite), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target."
39+
type = bool
40+
default = false
41+
}
42+
43+
variable "enable_xff_client_port" {
44+
description = "Indicates whether the X-Forwarded-For header should preserve the source port that the client used to connect to the load balancer in application load balancers."
45+
type = bool
46+
default = true
47+
}
48+
3749
variable "extra_ssl_certs" {
3850
description = "A list of maps describing any extra SSL certificates to apply to the HTTPS listeners. Required key/values: certificate_arn, https_listener_index (the index of the listener within https_listeners which the cert applies toward)."
3951
type = list(map(string))
@@ -214,6 +226,12 @@ variable "desync_mitigation_mode" {
214226
default = "defensive"
215227
}
216228

229+
variable "xff_header_processing_mode" {
230+
description = "Determines how the load balancer modifies the X-Forwarded-For header in the HTTP request before sending the request to the target."
231+
type = string
232+
default = "append"
233+
}
234+
217235
variable "putin_khuylo" {
218236
description = "Do you agree that Putin doesn't respect Ukrainian sovereignty and territorial integrity? More info: https://en.wikipedia.org/wiki/Putin_khuylo!"
219237
type = bool

wrappers/main.tf

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,50 @@ module "wrapper" {
33

44
for_each = var.items
55

6-
create_lb = try(each.value.create_lb, var.defaults.create_lb, true)
7-
drop_invalid_header_fields = try(each.value.drop_invalid_header_fields, var.defaults.drop_invalid_header_fields, false)
8-
preserve_host_header = try(each.value.preserve_host_header, var.defaults.preserve_host_header, false)
9-
enable_deletion_protection = try(each.value.enable_deletion_protection, var.defaults.enable_deletion_protection, false)
10-
enable_http2 = try(each.value.enable_http2, var.defaults.enable_http2, true)
11-
enable_cross_zone_load_balancing = try(each.value.enable_cross_zone_load_balancing, var.defaults.enable_cross_zone_load_balancing, false)
12-
extra_ssl_certs = try(each.value.extra_ssl_certs, var.defaults.extra_ssl_certs, [])
13-
https_listeners = try(each.value.https_listeners, var.defaults.https_listeners, [])
14-
http_tcp_listeners = try(each.value.http_tcp_listeners, var.defaults.http_tcp_listeners, [])
15-
https_listener_rules = try(each.value.https_listener_rules, var.defaults.https_listener_rules, [])
16-
http_tcp_listener_rules = try(each.value.http_tcp_listener_rules, var.defaults.http_tcp_listener_rules, [])
17-
idle_timeout = try(each.value.idle_timeout, var.defaults.idle_timeout, 60)
18-
ip_address_type = try(each.value.ip_address_type, var.defaults.ip_address_type, "ipv4")
19-
listener_ssl_policy_default = try(each.value.listener_ssl_policy_default, var.defaults.listener_ssl_policy_default, "ELBSecurityPolicy-2016-08")
20-
internal = try(each.value.internal, var.defaults.internal, false)
21-
load_balancer_create_timeout = try(each.value.load_balancer_create_timeout, var.defaults.load_balancer_create_timeout, "10m")
22-
load_balancer_delete_timeout = try(each.value.load_balancer_delete_timeout, var.defaults.load_balancer_delete_timeout, "10m")
23-
name = try(each.value.name, var.defaults.name, null)
24-
name_prefix = try(each.value.name_prefix, var.defaults.name_prefix, null)
25-
load_balancer_type = try(each.value.load_balancer_type, var.defaults.load_balancer_type, "application")
26-
load_balancer_update_timeout = try(each.value.load_balancer_update_timeout, var.defaults.load_balancer_update_timeout, "10m")
27-
access_logs = try(each.value.access_logs, var.defaults.access_logs, {})
28-
subnets = try(each.value.subnets, var.defaults.subnets, null)
29-
subnet_mapping = try(each.value.subnet_mapping, var.defaults.subnet_mapping, [])
30-
tags = try(each.value.tags, var.defaults.tags, {})
31-
lb_tags = try(each.value.lb_tags, var.defaults.lb_tags, {})
32-
target_group_tags = try(each.value.target_group_tags, var.defaults.target_group_tags, {})
33-
https_listener_rules_tags = try(each.value.https_listener_rules_tags, var.defaults.https_listener_rules_tags, {})
34-
http_tcp_listener_rules_tags = try(each.value.http_tcp_listener_rules_tags, var.defaults.http_tcp_listener_rules_tags, {})
35-
https_listeners_tags = try(each.value.https_listeners_tags, var.defaults.https_listeners_tags, {})
36-
http_tcp_listeners_tags = try(each.value.http_tcp_listeners_tags, var.defaults.http_tcp_listeners_tags, {})
37-
security_groups = try(each.value.security_groups, var.defaults.security_groups, [])
38-
target_groups = try(each.value.target_groups, var.defaults.target_groups, [])
39-
vpc_id = try(each.value.vpc_id, var.defaults.vpc_id, null)
40-
enable_waf_fail_open = try(each.value.enable_waf_fail_open, var.defaults.enable_waf_fail_open, false)
41-
desync_mitigation_mode = try(each.value.desync_mitigation_mode, var.defaults.desync_mitigation_mode, "defensive")
42-
putin_khuylo = try(each.value.putin_khuylo, var.defaults.putin_khuylo, true)
43-
create_security_group = try(each.value.create_security_group, var.defaults.create_security_group, true)
44-
security_group_name = try(each.value.security_group_name, var.defaults.security_group_name, null)
45-
security_group_use_name_prefix = try(each.value.security_group_use_name_prefix, var.defaults.security_group_use_name_prefix, true)
46-
security_group_description = try(each.value.security_group_description, var.defaults.security_group_description, null)
47-
security_group_rules = try(each.value.security_group_rules, var.defaults.security_group_rules, {})
48-
security_group_tags = try(each.value.security_group_tags, var.defaults.security_group_tags, {})
6+
create_lb = try(each.value.create_lb, var.defaults.create_lb, true)
7+
drop_invalid_header_fields = try(each.value.drop_invalid_header_fields, var.defaults.drop_invalid_header_fields, false)
8+
preserve_host_header = try(each.value.preserve_host_header, var.defaults.preserve_host_header, false)
9+
enable_deletion_protection = try(each.value.enable_deletion_protection, var.defaults.enable_deletion_protection, false)
10+
enable_http2 = try(each.value.enable_http2, var.defaults.enable_http2, true)
11+
enable_cross_zone_load_balancing = try(each.value.enable_cross_zone_load_balancing, var.defaults.enable_cross_zone_load_balancing, false)
12+
enable_tls_version_and_cipher_suite_headers = try(each.value.enable_tls_version_and_cipher_suite_headers, var.defaults.enable_tls_version_and_cipher_suite_headers, false)
13+
enable_xff_client_port = try(each.value.enable_xff_client_port, var.defaults.enable_xff_client_port, true)
14+
extra_ssl_certs = try(each.value.extra_ssl_certs, var.defaults.extra_ssl_certs, [])
15+
https_listeners = try(each.value.https_listeners, var.defaults.https_listeners, [])
16+
http_tcp_listeners = try(each.value.http_tcp_listeners, var.defaults.http_tcp_listeners, [])
17+
https_listener_rules = try(each.value.https_listener_rules, var.defaults.https_listener_rules, [])
18+
http_tcp_listener_rules = try(each.value.http_tcp_listener_rules, var.defaults.http_tcp_listener_rules, [])
19+
idle_timeout = try(each.value.idle_timeout, var.defaults.idle_timeout, 60)
20+
ip_address_type = try(each.value.ip_address_type, var.defaults.ip_address_type, "ipv4")
21+
listener_ssl_policy_default = try(each.value.listener_ssl_policy_default, var.defaults.listener_ssl_policy_default, "ELBSecurityPolicy-2016-08")
22+
internal = try(each.value.internal, var.defaults.internal, false)
23+
load_balancer_create_timeout = try(each.value.load_balancer_create_timeout, var.defaults.load_balancer_create_timeout, "10m")
24+
load_balancer_delete_timeout = try(each.value.load_balancer_delete_timeout, var.defaults.load_balancer_delete_timeout, "10m")
25+
name = try(each.value.name, var.defaults.name, null)
26+
name_prefix = try(each.value.name_prefix, var.defaults.name_prefix, null)
27+
load_balancer_type = try(each.value.load_balancer_type, var.defaults.load_balancer_type, "application")
28+
load_balancer_update_timeout = try(each.value.load_balancer_update_timeout, var.defaults.load_balancer_update_timeout, "10m")
29+
access_logs = try(each.value.access_logs, var.defaults.access_logs, {})
30+
subnets = try(each.value.subnets, var.defaults.subnets, null)
31+
subnet_mapping = try(each.value.subnet_mapping, var.defaults.subnet_mapping, [])
32+
tags = try(each.value.tags, var.defaults.tags, {})
33+
lb_tags = try(each.value.lb_tags, var.defaults.lb_tags, {})
34+
target_group_tags = try(each.value.target_group_tags, var.defaults.target_group_tags, {})
35+
https_listener_rules_tags = try(each.value.https_listener_rules_tags, var.defaults.https_listener_rules_tags, {})
36+
http_tcp_listener_rules_tags = try(each.value.http_tcp_listener_rules_tags, var.defaults.http_tcp_listener_rules_tags, {})
37+
https_listeners_tags = try(each.value.https_listeners_tags, var.defaults.https_listeners_tags, {})
38+
http_tcp_listeners_tags = try(each.value.http_tcp_listeners_tags, var.defaults.http_tcp_listeners_tags, {})
39+
security_groups = try(each.value.security_groups, var.defaults.security_groups, [])
40+
target_groups = try(each.value.target_groups, var.defaults.target_groups, [])
41+
vpc_id = try(each.value.vpc_id, var.defaults.vpc_id, null)
42+
enable_waf_fail_open = try(each.value.enable_waf_fail_open, var.defaults.enable_waf_fail_open, false)
43+
desync_mitigation_mode = try(each.value.desync_mitigation_mode, var.defaults.desync_mitigation_mode, "defensive")
44+
xff_header_processing_mode = try(each.value.xff_header_processing_mode, var.defaults.xff_header_processing_mode, "append")
45+
putin_khuylo = try(each.value.putin_khuylo, var.defaults.putin_khuylo, true)
46+
create_security_group = try(each.value.create_security_group, var.defaults.create_security_group, true)
47+
security_group_name = try(each.value.security_group_name, var.defaults.security_group_name, null)
48+
security_group_use_name_prefix = try(each.value.security_group_use_name_prefix, var.defaults.security_group_use_name_prefix, true)
49+
security_group_description = try(each.value.security_group_description, var.defaults.security_group_description, null)
50+
security_group_rules = try(each.value.security_group_rules, var.defaults.security_group_rules, {})
51+
security_group_tags = try(each.value.security_group_tags, var.defaults.security_group_tags, {})
4952
}

0 commit comments

Comments
 (0)