@@ -18,9 +18,11 @@ package main
18
18
19
19
import (
20
20
"context"
21
+ "crypto/tls"
21
22
"flag"
22
23
"fmt"
23
24
"os"
25
+ "path/filepath"
24
26
"runtime"
25
27
26
28
"github.com/medik8s/common/pkg/lease"
@@ -43,6 +45,12 @@ import (
43
45
//+kubebuilder:scaffold:imports
44
46
)
45
47
48
+ const (
49
+ WebhookCertDir = "/apiserver.local.config/certificates"
50
+ WebhookCertName = "apiserver.crt"
51
+ WebhookKeyName = "apiserver.key"
52
+ )
53
+
46
54
var (
47
55
scheme = k8sruntime .NewScheme ()
48
56
setupLog = ctrl .Log .WithName ("setup" )
@@ -59,11 +67,14 @@ func main() {
59
67
var metricsAddr string
60
68
var enableLeaderElection bool
61
69
var probeAddr string
70
+ var enableHTTP2 bool
62
71
flag .StringVar (& metricsAddr , "metrics-bind-address" , ":8080" , "The address the metric endpoint binds to." )
63
72
flag .StringVar (& probeAddr , "health-probe-bind-address" , ":8081" , "The address the probe endpoint binds to." )
64
73
flag .BoolVar (& enableLeaderElection , "leader-elect" , false ,
65
74
"Enable leader election for controller manager. " +
66
75
"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
+
67
78
opts := zap.Options {
68
79
Development : true ,
69
80
}
@@ -75,7 +86,9 @@ func main() {
75
86
printVersion ()
76
87
77
88
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!
79
92
MetricsBindAddress : metricsAddr ,
80
93
Port : 9443 ,
81
94
HealthProbeBindAddress : probeAddr ,
@@ -87,6 +100,8 @@ func main() {
87
100
os .Exit (1 )
88
101
}
89
102
103
+ configureWebhookServer (mgr , enableHTTP2 )
104
+
90
105
cl := mgr .GetClient ()
91
106
leaseManagerInitializer := & leaseManagerInitializer {cl : cl }
92
107
if err := mgr .Add (leaseManagerInitializer ); err != nil {
@@ -142,3 +157,38 @@ func (ls *leaseManagerInitializer) Start(context.Context) error {
142
157
ls .Manager , err = lease .NewManager (ls .cl , controllers .LeaseHolderIdentity )
143
158
return err
144
159
}
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