Skip to content

Commit fa958db

Browse files
[release-4.18] OCPBUGS-86715: Add configuration override for X-SSL strip (#1477)
* OCPBUGS-86715: Add configuration override for X-SSL strip Router strips X-SSL headers from HTTP listeners. In some cases a Load Balancer may be doing TLS termination and sending traffic to rotuer with these headers. While this topology is not supported, there is a need for a knob to allow these users to rollback this validation assuming the risks of allowing the router to accept the X-SSL headers on the HTTP listener * Fix test to match release-4.18 desiredRouterDeployment signature --------- Co-authored-by: Ricardo Pchevuzinske Katz <katz@redhat.com>
1 parent 7ec6093 commit fa958db

2 files changed

Lines changed: 73 additions & 4 deletions

File tree

pkg/operator/controller/ingress/deployment.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ const (
9696

9797
WorkloadPartitioningManagement = "target.workload.openshift.io/management"
9898

99-
RouterClientAuthPolicy = "ROUTER_MUTUAL_TLS_AUTH"
100-
RouterClientAuthCA = "ROUTER_MUTUAL_TLS_AUTH_CA"
101-
RouterClientAuthFilter = "ROUTER_MUTUAL_TLS_AUTH_FILTER"
99+
RouterClientAuthPolicy = "ROUTER_MUTUAL_TLS_AUTH"
100+
RouterClientAuthCA = "ROUTER_MUTUAL_TLS_AUTH_CA"
101+
RouterClientAuthFilter = "ROUTER_MUTUAL_TLS_AUTH_FILTER"
102+
RouterMutualTLSHeaderFilter = "ROUTER_MUTUAL_TLS_HEADER_FILTER"
102103

103104
RouterEnableCompression = "ROUTER_ENABLE_COMPRESSION"
104105
RouterCompressionMIMETypes = "ROUTER_COMPRESSION_MIME"
@@ -536,7 +537,8 @@ func desiredRouterDeployment(ci *operatorv1.IngressController, ingressController
536537
// Note, however, that dynamic servers consume memory even when not enabled.
537538
// Use this analysis of the memory usage to assess the impact of different numbers of servers:
538539
// https://gist.github.com/frobware/2b527ce3f040797909eff482a4776e0b
539-
MaxDynamicServers string `json:"maxDynamicServers"`
540+
MaxDynamicServers string `json:"maxDynamicServers"`
541+
MutualTLSHeaderFilter string `json:"mutualTLSHeaderFilter"`
540542
}
541543
if len(ci.Spec.UnsupportedConfigOverrides.Raw) > 0 {
542544
if err := json.Unmarshal(ci.Spec.UnsupportedConfigOverrides.Raw, &unsupportedConfigOverrides); err != nil {
@@ -619,6 +621,13 @@ func desiredRouterDeployment(ci *operatorv1.IngressController, ingressController
619621
})
620622
}
621623

624+
if v, err := strconv.ParseBool(unsupportedConfigOverrides.MutualTLSHeaderFilter); err == nil && !v {
625+
env = append(env, corev1.EnvVar{
626+
Name: RouterMutualTLSHeaderFilter,
627+
Value: "false",
628+
})
629+
}
630+
622631
if len(ci.Status.Domain) > 0 {
623632
cName := "router-" + ci.Name + "." + ci.Status.Domain
624633
env = append(env,

pkg/operator/controller/ingress/deployment_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,6 +1227,66 @@ func TestDesiredRouterDeploymentDynamicConfigManager(t *testing.T) {
12271227
}
12281228
}
12291229

1230+
func TestDesiredRouterDeploymentMutualTLSHeaderFilter(t *testing.T) {
1231+
testCases := []struct {
1232+
name string
1233+
unsupportedConfigOverrides string
1234+
expectedEnv []envData
1235+
}{
1236+
{
1237+
name: "not-set",
1238+
unsupportedConfigOverrides: `{}`,
1239+
expectedEnv: []envData{
1240+
{"ROUTER_MUTUAL_TLS_HEADER_FILTER", false, ""},
1241+
},
1242+
},
1243+
{
1244+
name: "set-to-false",
1245+
unsupportedConfigOverrides: `{"mutualTLSHeaderFilter":"false"}`,
1246+
expectedEnv: []envData{
1247+
{"ROUTER_MUTUAL_TLS_HEADER_FILTER", true, "false"},
1248+
},
1249+
},
1250+
{
1251+
name: "set-to-true",
1252+
unsupportedConfigOverrides: `{"mutualTLSHeaderFilter":"true"}`,
1253+
expectedEnv: []envData{
1254+
{"ROUTER_MUTUAL_TLS_HEADER_FILTER", false, ""},
1255+
},
1256+
},
1257+
{
1258+
name: "set-to-invalid-value",
1259+
unsupportedConfigOverrides: `{"mutualTLSHeaderFilter":"banana"}`,
1260+
expectedEnv: []envData{
1261+
{"ROUTER_MUTUAL_TLS_HEADER_FILTER", false, ""},
1262+
},
1263+
},
1264+
}
1265+
for _, tc := range testCases {
1266+
t.Run(tc.name, func(t *testing.T) {
1267+
ic := &operatorv1.IngressController{
1268+
ObjectMeta: metav1.ObjectMeta{
1269+
Name: "default",
1270+
},
1271+
Spec: operatorv1.IngressControllerSpec{
1272+
UnsupportedConfigOverrides: runtime.RawExtension{
1273+
Raw: []byte(tc.unsupportedConfigOverrides),
1274+
},
1275+
},
1276+
Status: operatorv1.IngressControllerStatus{
1277+
EndpointPublishingStrategy: &operatorv1.EndpointPublishingStrategy{
1278+
Type: operatorv1.PrivateStrategyType,
1279+
},
1280+
},
1281+
}
1282+
1283+
deployment, err := desiredRouterDeployment(ic, ingressControllerImage, &configv1.Ingress{}, &configv1.Infrastructure{}, &configv1.APIServer{}, &configv1.Network{}, false, false, nil, &configv1.Proxy{}, false, false)
1284+
assert.NoError(t, err)
1285+
assert.NoError(t, checkDeploymentEnvironment(t, deployment, tc.expectedEnv))
1286+
})
1287+
}
1288+
}
1289+
12301290
func checkContainerPort(t *testing.T, d *appsv1.Deployment, portName string, port int32) {
12311291
t.Helper()
12321292
for _, p := range d.Spec.Template.Spec.Containers[0].Ports {

0 commit comments

Comments
 (0)