Skip to content

Commit ebb38a1

Browse files
authored
Merge pull request #101 from openshift-cherrypick-robot/cherry-pick-100-to-release-0.16
[release-0.16] Disable HTTP/s on webhook server
2 parents 4a73234 + 4d0afb1 commit ebb38a1

File tree

2 files changed

+51
-27
lines changed

2 files changed

+51
-27
lines changed

api/v1beta1/nodemaintenance_webhook.go

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ package v1beta1
1919
import (
2020
"context"
2121
"fmt"
22-
"os"
23-
"path/filepath"
2422

2523
"github.com/medik8s/common/pkg/nodes"
2624

@@ -48,12 +46,6 @@ const (
4846
EtcdQuorumPDBNamespace = "openshift-etcd"
4947
)
5048

51-
const (
52-
WebhookCertDir = "/apiserver.local.config/certificates"
53-
WebhookCertName = "apiserver.crt"
54-
WebhookKeyName = "apiserver.key"
55-
)
56-
5749
// log is for logging in this package.
5850
var nodemaintenancelog = logf.Log.WithName("nodemaintenance-resource")
5951

@@ -73,24 +65,6 @@ func (r *NodeMaintenance) SetupWebhookWithManager(mgr ctrl.Manager) error {
7365
client: mgr.GetClient(),
7466
}
7567

76-
// check if OLM injected certs
77-
certs := []string{filepath.Join(WebhookCertDir, WebhookCertName), filepath.Join(WebhookCertDir, WebhookKeyName)}
78-
certsInjected := true
79-
for _, fname := range certs {
80-
if _, err := os.Stat(fname); err != nil {
81-
certsInjected = false
82-
break
83-
}
84-
}
85-
if certsInjected {
86-
server := mgr.GetWebhookServer()
87-
server.CertDir = WebhookCertDir
88-
server.CertName = WebhookCertName
89-
server.KeyName = WebhookKeyName
90-
} else {
91-
nodemaintenancelog.Info("OLM injected certs for webhooks not found")
92-
}
93-
9468
return ctrl.NewWebhookManagedBy(mgr).
9569
For(r).
9670
Complete()

main.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ package main
1818

1919
import (
2020
"context"
21+
"crypto/tls"
2122
"flag"
2223
"fmt"
2324
"os"
25+
"path/filepath"
2426
"runtime"
2527

2628
"github.com/medik8s/common/pkg/lease"
@@ -43,6 +45,12 @@ import (
4345
//+kubebuilder:scaffold:imports
4446
)
4547

48+
const (
49+
WebhookCertDir = "/apiserver.local.config/certificates"
50+
WebhookCertName = "apiserver.crt"
51+
WebhookKeyName = "apiserver.key"
52+
)
53+
4654
var (
4755
scheme = k8sruntime.NewScheme()
4856
setupLog = ctrl.Log.WithName("setup")
@@ -59,11 +67,14 @@ func main() {
5967
var metricsAddr string
6068
var enableLeaderElection bool
6169
var probeAddr string
70+
var enableHTTP2 bool
6271
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
6372
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
6473
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
6574
"Enable leader election for controller manager. "+
6675
"Enabling this will ensure there is only one active controller manager.")
76+
flag.BoolVar(&enableHTTP2, "enable-http2", false, "If HTTP/2 should be enabled for the metrics and webhook servers.")
77+
6778
opts := zap.Options{
6879
Development: true,
6980
}
@@ -75,7 +86,9 @@ func main() {
7586
printVersion()
7687

7788
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
78-
Scheme: scheme,
89+
Scheme: scheme,
90+
// HEADS UP: once controller runtime is updated and this changes to metrics.Options{},
91+
// and in case you configure TLS / SecureServing, disable HTTP/2 in it for mitigating related CVEs!
7992
MetricsBindAddress: metricsAddr,
8093
Port: 9443,
8194
HealthProbeBindAddress: probeAddr,
@@ -87,6 +100,8 @@ func main() {
87100
os.Exit(1)
88101
}
89102

103+
configureWebhookServer(mgr, enableHTTP2)
104+
90105
cl := mgr.GetClient()
91106
leaseManagerInitializer := &leaseManagerInitializer{cl: cl}
92107
if err := mgr.Add(leaseManagerInitializer); err != nil {
@@ -142,3 +157,38 @@ func (ls *leaseManagerInitializer) Start(context.Context) error {
142157
ls.Manager, err = lease.NewManager(ls.cl, controllers.LeaseHolderIdentity)
143158
return err
144159
}
160+
161+
func configureWebhookServer(mgr ctrl.Manager, enableHTTP2 bool) {
162+
163+
server := mgr.GetWebhookServer()
164+
165+
// check for OLM injected certs
166+
certs := []string{filepath.Join(WebhookCertDir, WebhookCertName), filepath.Join(WebhookCertDir, WebhookKeyName)}
167+
certsInjected := true
168+
for _, fname := range certs {
169+
if _, err := os.Stat(fname); err != nil {
170+
certsInjected = false
171+
break
172+
}
173+
}
174+
if certsInjected {
175+
server.CertDir = WebhookCertDir
176+
server.CertName = WebhookCertName
177+
server.KeyName = WebhookKeyName
178+
} else {
179+
setupLog.Info("OLM injected certs for webhooks not found")
180+
}
181+
182+
// disable http/2 for mitigating relevant CVEs
183+
if !enableHTTP2 {
184+
server.TLSOpts = append(server.TLSOpts,
185+
func(c *tls.Config) {
186+
c.NextProtos = []string{"http/1.1"}
187+
},
188+
)
189+
setupLog.Info("HTTP/2 for webhooks disabled")
190+
} else {
191+
setupLog.Info("HTTP/2 for webhooks enabled")
192+
}
193+
194+
}

0 commit comments

Comments
 (0)