Skip to content

Commit bbc1fb5

Browse files
antojacobAlexFenlonpre-commit-ci[bot]
authored
Add the ability to disable X-forwarded headers via ConfigMap (#10539)
* xforwardedheader config * changes related to x forwarded headers * changes related to xforwarded header * fix snaps * changes in virtual server related to xforwaded header * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fixed lint issues * changes related to pr feedback * update the name of the functionality based on the feedback * fix linting issues * add behind eanble snippets file * variable name changes --------- Co-authored-by: Alex Fenlon <a.fenlon@f5.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 738713a commit bbc1fb5

19 files changed

Lines changed: 326 additions & 33 deletions

cmd/nginx-ingress/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ func processConfigMaps(kubeClient *kubernetes.Clientset, cfgParams *configs.Conf
10401040
if err != nil {
10411041
nl.Fatalf(l, "Error when getting %v: %v", *nginxConfigMaps, err)
10421042
}
1043-
cfgParams, _ = configs.ParseConfigMap(cfgParams.Context, cfm, *nginxPlus, *appProtect, *appProtectDos, *enableTLSPassthrough, *enableDirectiveAutoadjust, eventLog)
1043+
cfgParams, _ = configs.ParseConfigMap(cfgParams.Context, cfm, *nginxPlus, *appProtect, *appProtectDos, *enableTLSPassthrough, *enableDirectiveAutoadjust, *enableSnippets, eventLog)
10441044
if cfgParams.MainServerSSLDHParamFileContent != nil {
10451045
fileName, err := nginxManager.CreateDHParam(*cfgParams.MainServerSSLDHParamFileContent)
10461046
if err != nil {

internal/configs/config_params.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type ConfigParams struct {
3131
LocationSnippets []string
3232
MainAccessLog string
3333
MainAddHeaders []version2.AddHeader
34+
DisableForwardedHeaders bool
3435
MainErrorLogLevel string
3536
MainHTTPSnippets []string
3637
MainKeepaliveRequests int64
@@ -283,6 +284,7 @@ func NewDefaultConfigParams(ctx context.Context, isPlus bool) *ConfigParams {
283284
MainKeepaliveRequests: 1000,
284285
VariablesHashBucketSize: 256,
285286
VariablesHashMaxSize: 1024,
287+
DisableForwardedHeaders: false,
286288
LimitReqKey: "${binary_remote_addr}",
287289
LimitReqZoneSize: "10m",
288290
LimitReqLogLevel: "error",

internal/configs/configmaps.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const (
3131
// ParseConfigMap parses ConfigMap into ConfigParams.
3232
//
3333
//nolint:gocyclo
34-
func ParseConfigMap(ctx context.Context, cfgm *v1.ConfigMap, nginxPlus bool, hasAppProtect bool, hasAppProtectDos bool, hasTLSPassthrough bool, enableDirectiveAutoadjust bool, eventLog record.EventRecorder) (*ConfigParams, bool) {
34+
func ParseConfigMap(ctx context.Context, cfgm *v1.ConfigMap, nginxPlus bool, hasAppProtect bool, hasAppProtectDos bool, hasTLSPassthrough bool, enableDirectiveAutoadjust bool, enableSnippets bool, eventLog record.EventRecorder) (*ConfigParams, bool) {
3535
l := nl.LoggerFromContext(ctx)
3636
cfgParams := NewDefaultConfigParams(ctx, nginxPlus)
3737
configOk := true
@@ -113,6 +113,21 @@ func ParseConfigMap(ctx context.Context, cfgm *v1.ConfigMap, nginxPlus bool, has
113113
}
114114
}
115115

116+
if disableForwardedHeaders, exists, err := GetMapKeyAsBool(cfgm.Data, "disable-forwarded-headers", cfgm); exists {
117+
if !enableSnippets {
118+
errorText := fmt.Sprintf("ConfigMap %s/%s: 'disable-forwarded-headers' requires -enable-snippets, ignoring", cfgm.GetNamespace(), cfgm.GetName())
119+
nl.Error(l, errorText)
120+
eventLog.Event(cfgm, v1.EventTypeWarning, nl.EventReasonInvalidValue, errorText)
121+
configOk = false
122+
} else if err != nil {
123+
nl.Error(l, err)
124+
eventLog.Event(cfgm, v1.EventTypeWarning, nl.EventReasonInvalidValue, err.Error())
125+
configOk = false
126+
} else {
127+
cfgParams.DisableForwardedHeaders = disableForwardedHeaders
128+
}
129+
}
130+
116131
if clientMaxBodySize, exists := cfgm.Data["client-max-body-size"]; exists {
117132
cfgParams.ClientMaxBodySize = clientMaxBodySize
118133
}

internal/configs/configmaps_test.go

Lines changed: 88 additions & 25 deletions
Large diffs are not rendered by default.

internal/configs/ingress.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,7 @@ func createLocation(path string, upstream version1.Upstream, cfg *ConfigParams,
10691069
ProxyBufferSize: cfg.ProxyBufferSize,
10701070
ProxyBusyBuffersSize: cfg.ProxyBusyBuffersSize,
10711071
ProxyMaxTempFileSize: cfg.ProxyMaxTempFileSize,
1072+
DisableForwardedHeaders: cfg.DisableForwardedHeaders,
10721073
ProxySSLName: proxySSLName,
10731074
ProxyNextUpstream: cfg.ProxyNextUpstream,
10741075
ProxyNextUpstreamTimeout: cfg.ProxyNextUpstreamTimeout,

internal/configs/ingress_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2993,9 +2993,10 @@ func createExpectedConfigForCafeIngressWithUseClusterIPNamedPorts() version1.Ing
29932993
ProxyReadTimeout: "60s",
29942994
ProxySendTimeout: "60s",
29952995
ClientMaxBodySize: "1m",
2996-
ProxyBuffering: true,
2997-
ProxySSLName: "coffee-svc.default.svc",
2998-
ProxyPass: "http://default-cafe-ingress-cafe.example.com-coffee-svc-custom-port-name",
2996+
2997+
ProxyBuffering: true,
2998+
ProxySSLName: "coffee-svc.default.svc",
2999+
ProxyPass: "http://default-cafe-ingress-cafe.example.com-coffee-svc-custom-port-name",
29993000
},
30003001
{
30013002
Path: "/tea",

internal/configs/version1/__snapshots__/template_test.snap

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5428,6 +5428,53 @@ server {
54285428
54295429
---
54305430
5431+
[TestExecuteTemplate_ForIngressWithDisableForwardedHeaders - 1]
5432+
# configuration for default/cafe-ingress
5433+
upstream test {
5434+
zone test 256k;
5435+
server 127.0.0.1:8181 max_fails=0 fail_timeout=1s max_conns=0;
5436+
keepalive 16;
5437+
}
5438+
5439+
5440+
5441+
server {
5442+
listen 443 ssl;listen [::]:443 ssl;
5443+
ssl_certificate secret.pem;
5444+
ssl_certificate_key secret.pem;
5445+
5446+
server_tokens off;
5447+
5448+
server_name test.example.com;
5449+
set $resource_type "ingress";
5450+
set $resource_name "cafe-ingress";
5451+
set $resource_namespace "default";
5452+
set $service "-";
5453+
if ($scheme = http) {
5454+
return 301 https://$host:443$request_uri;
5455+
}
5456+
location /tea {
5457+
set $service "";
5458+
# location for minion default/tea-minion
5459+
set $resource_name "tea-minion";
5460+
set $resource_namespace "default";
5461+
proxy_http_version 1.1;
5462+
proxy_set_header Connection "";
5463+
proxy_connect_timeout 10s;
5464+
proxy_read_timeout 10s;
5465+
proxy_send_timeout 10s;
5466+
client_max_body_size 2m;
5467+
proxy_set_header Host $host;
5468+
proxy_set_header X-Real-IP $remote_addr;
5469+
proxy_buffering off;
5470+
proxy_pass http://test;
5471+
5472+
}
5473+
5474+
}
5475+
5476+
---
5477+
54315478
[TestExecuteTemplate_ForIngressWithEmptyHostForNGINX - 1]
54325479
# configuration for default/cafe-ingress
54335480
upstream test {

internal/configs/version1/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ type Location struct {
229229
BasicAuth *BasicAuth
230230
ServiceName string
231231
LimitReq *LimitReq
232+
DisableForwardedHeaders bool
232233
CORSEnabled bool
233234

234235
AuthRequestOff bool

internal/configs/version1/nginx-plus.ingress.tmpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,10 +424,12 @@ server {
424424
grpc_send_timeout {{$location.ProxySendTimeout}};
425425
grpc_set_header Host $host;
426426
grpc_set_header X-Real-IP $remote_addr;
427+
{{- if not $location.DisableForwardedHeaders }}
427428
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
428429
grpc_set_header X-Forwarded-Host $host;
429430
grpc_set_header X-Forwarded-Port $server_port;
430431
grpc_set_header X-Forwarded-Proto $scheme;
432+
{{- end}}
431433

432434
{{- if $location.ProxyBufferSize}}
433435
grpc_buffer_size {{$location.ProxyBufferSize}};
@@ -482,10 +484,12 @@ server {
482484
{{- end}}
483485
proxy_set_header Host $host;
484486
proxy_set_header X-Real-IP $remote_addr;
487+
{{- if not $location.DisableForwardedHeaders }}
485488
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
486489
proxy_set_header X-Forwarded-Host $host;
487490
proxy_set_header X-Forwarded-Port $server_port;
488491
proxy_set_header X-Forwarded-Proto {{if $server.RedirectToHTTPS}}https{{else}}$scheme{{end}};
492+
{{- end}}
489493
proxy_buffering {{if $location.ProxyBuffering}}on{{else}}off{{end}};
490494
{{- if $location.ProxyBuffers}}
491495
proxy_buffers {{$location.ProxyBuffers}};

internal/configs/version1/nginx.ingress.tmpl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,11 +326,12 @@ server {
326326
grpc_send_timeout {{$location.ProxySendTimeout}};
327327
grpc_set_header Host $host;
328328
grpc_set_header X-Real-IP $remote_addr;
329+
{{- if not $location.DisableForwardedHeaders }}
329330
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
330331
grpc_set_header X-Forwarded-Host $host;
331332
grpc_set_header X-Forwarded-Port $server_port;
332333
grpc_set_header X-Forwarded-Proto {{if $server.RedirectToHTTPS}}https{{else}}$scheme{{end}};
333-
334+
{{- end}}
334335
{{- if $location.ProxyBufferSize}}
335336
grpc_buffer_size {{$location.ProxyBufferSize}};
336337
{{- end}}
@@ -374,10 +375,12 @@ server {
374375
{{- end}}
375376
proxy_set_header Host $host;
376377
proxy_set_header X-Real-IP $remote_addr;
378+
{{- if not $location.DisableForwardedHeaders }}
377379
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
378380
proxy_set_header X-Forwarded-Host $host;
379381
proxy_set_header X-Forwarded-Port $server_port;
380382
proxy_set_header X-Forwarded-Proto {{if $server.RedirectToHTTPS}}https{{else}}$scheme{{end}};
383+
{{- end}}
381384
proxy_buffering {{if $location.ProxyBuffering}}on{{else}}off{{end}};
382385
{{- if $location.ProxyBuffers}}
383386
proxy_buffers {{$location.ProxyBuffers}};

0 commit comments

Comments
 (0)