@@ -17,9 +17,11 @@ limitations under the License.
17
17
package main
18
18
19
19
import (
20
+ "crypto/tls"
20
21
"flag"
21
22
"fmt"
22
23
"os"
24
+ "path/filepath"
23
25
"runtime"
24
26
25
27
// +kubebuilder:scaffold:imports
@@ -51,6 +53,12 @@ import (
51
53
"github.com/medik8s/node-healthcheck-operator/version"
52
54
)
53
55
56
+ const (
57
+ WebhookCertDir = "/apiserver.local.config/certificates"
58
+ WebhookCertName = "apiserver.crt"
59
+ WebhookKeyName = "apiserver.key"
60
+ )
61
+
54
62
var (
55
63
scheme = pkgruntime .NewScheme ()
56
64
setupLog = ctrl .Log .WithName ("setup" )
@@ -72,11 +80,13 @@ func main() {
72
80
var metricsAddr string
73
81
var enableLeaderElection bool
74
82
var probeAddr string
83
+ var enableHTTP2 bool
75
84
flag .StringVar (& metricsAddr , "metrics-bind-address" , ":8080" , "The address the metric endpoint binds to." )
76
85
flag .StringVar (& probeAddr , "health-probe-bind-address" , ":8081" , "The address the probe endpoint binds to." )
77
86
flag .BoolVar (& enableLeaderElection , "leader-elect" , true ,
78
87
"Enable leader election for controller manager. " +
79
88
"Enabling this will ensure there is only one active controller manager." )
89
+ flag .BoolVar (& enableHTTP2 , "enable-http2" , false , "If HTTP/2 should be enabled for the metrics and webhook servers." )
80
90
81
91
opts := zap.Options {
82
92
Development : true ,
@@ -90,7 +100,9 @@ func main() {
90
100
printVersion ()
91
101
92
102
mgr , err := ctrl .NewManager (ctrl .GetConfigOrDie (), ctrl.Options {
93
- Scheme : scheme ,
103
+ Scheme : scheme ,
104
+ // HEADS UP: once controller runtime is updated and this changes to metrics.Options{},
105
+ // and in case you configure TLS / SecureServing, disable HTTP/2 in it for mitigating related CVEs!
94
106
MetricsBindAddress : metricsAddr ,
95
107
Port : 9443 ,
96
108
HealthProbeBindAddress : probeAddr ,
@@ -102,6 +114,8 @@ func main() {
102
114
os .Exit (1 )
103
115
}
104
116
117
+ configureWebhookServer (mgr , enableHTTP2 )
118
+
105
119
upgradeChecker , err := cluster .NewClusterUpgradeStatusChecker (mgr )
106
120
if err != nil {
107
121
setupLog .Error (err , "unable initialize cluster upgrade checker" )
@@ -194,3 +208,38 @@ func printVersion() {
194
208
setupLog .Info (fmt .Sprintf ("Git Commit: %s" , version .GitCommit ))
195
209
setupLog .Info (fmt .Sprintf ("Build Date: %s" , version .BuildDate ))
196
210
}
211
+
212
+ func configureWebhookServer (mgr ctrl.Manager , enableHTTP2 bool ) {
213
+
214
+ server := mgr .GetWebhookServer ()
215
+
216
+ // check for OLM injected certs
217
+ certs := []string {filepath .Join (WebhookCertDir , WebhookCertName ), filepath .Join (WebhookCertDir , WebhookKeyName )}
218
+ certsInjected := true
219
+ for _ , fname := range certs {
220
+ if _ , err := os .Stat (fname ); err != nil {
221
+ certsInjected = false
222
+ break
223
+ }
224
+ }
225
+ if certsInjected {
226
+ server .CertDir = WebhookCertDir
227
+ server .CertName = WebhookCertName
228
+ server .KeyName = WebhookKeyName
229
+ } else {
230
+ setupLog .Info ("OLM injected certs for webhooks not found" )
231
+ }
232
+
233
+ // disable http/2 for mitigating relevant CVEs
234
+ if ! enableHTTP2 {
235
+ server .TLSOpts = append (server .TLSOpts ,
236
+ func (c * tls.Config ) {
237
+ c .NextProtos = []string {"http/1.1" }
238
+ },
239
+ )
240
+ setupLog .Info ("HTTP/2 for webhooks disabled" )
241
+ } else {
242
+ setupLog .Info ("HTTP/2 for webhooks enabled" )
243
+ }
244
+
245
+ }
0 commit comments