@@ -18,9 +18,11 @@ package main
1818
1919import (
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+
4654var (
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