Skip to content

Commit 4dc3dcd

Browse files
committed
metrics: use TLS profile in listener
1 parent 182039b commit 4dc3dcd

File tree

5 files changed

+20
-50
lines changed

5 files changed

+20
-50
lines changed

cmd/machine-config-controller/start.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ var (
4040
templates string
4141
promMetricsListenAddress string
4242
resourceLockNamespace string
43+
tlsCipherSuites []string
44+
tlsMinVersion string
4345
}
4446
)
4547

@@ -48,6 +50,8 @@ func init() {
4850
startCmd.PersistentFlags().StringVar(&startOpts.kubeconfig, "kubeconfig", "", "Kubeconfig file to access a remote cluster (testing only)")
4951
startCmd.PersistentFlags().StringVar(&startOpts.resourceLockNamespace, "resourcelock-namespace", metav1.NamespaceSystem, "Path to the template files used for creating MachineConfig objects")
5052
startCmd.PersistentFlags().StringVar(&startOpts.promMetricsListenAddress, "metrics-listen-address", "127.0.0.1:8797", "Listen address for prometheus metrics listener")
53+
startCmd.PersistentFlags().StringSliceVar(&startOpts.tlsCipherSuites, "tls-cipher-suites", nil, "Comma-separated list of cipher suites for the metrics server")
54+
startCmd.PersistentFlags().StringVar(&startOpts.tlsMinVersion, "tls-min-version", "VersionTLS12", "Minimum TLS version supported for the metrics server")
5155
}
5256

5357
func runStartCmd(_ *cobra.Command, _ []string) {
@@ -73,7 +77,7 @@ func runStartCmd(_ *cobra.Command, _ []string) {
7377

7478
ctrlctx := ctrlcommon.CreateControllerContext(ctx, cb)
7579

76-
go ctrlcommon.StartMetricsListener(startOpts.promMetricsListenAddress, ctrlctx.Stop, ctrlcommon.RegisterMCCMetrics)
80+
go ctrlcommon.StartMetricsListener(startOpts.promMetricsListenAddress, ctrlctx.Stop, ctrlcommon.RegisterMCCMetrics, startOpts.tlsMinVersion, startOpts.tlsCipherSuites)
7781

7882
controllers := createControllers(ctrlctx)
7983
draincontroller := drain.New(

cmd/machine-config-daemon/start.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ var (
4343
kubeletHealthzEnabled bool
4444
kubeletHealthzEndpoint string
4545
promMetricsURL string
46+
tlsCipherSuites []string
47+
tlsMinVersion string
4648
}
4749
)
4850

@@ -57,6 +59,8 @@ func init() {
5759
startCmd.PersistentFlags().BoolVar(&startOpts.kubeletHealthzEnabled, "kubelet-healthz-enabled", true, "kubelet healthz endpoint monitoring")
5860
startCmd.PersistentFlags().StringVar(&startOpts.kubeletHealthzEndpoint, "kubelet-healthz-endpoint", "http://localhost:10248/healthz", "healthz endpoint to check health")
5961
startCmd.PersistentFlags().StringVar(&startOpts.promMetricsURL, "metrics-url", "127.0.0.1:8797", "URL for prometheus metrics listener")
62+
startCmd.PersistentFlags().StringSliceVar(&startOpts.tlsCipherSuites, "tls-cipher-suites", nil, "Comma-separated list of cipher suites for the metrics server")
63+
startCmd.PersistentFlags().StringVar(&startOpts.tlsMinVersion, "tls-min-version", "VersionTLS12", "Minimum TLS version supported for the metrics server")
6064
}
6165

6266
//nolint:gocritic
@@ -177,7 +181,7 @@ func runStartCmd(_ *cobra.Command, _ []string) {
177181
}
178182

179183
// Start local metrics listener
180-
go ctrlcommon.StartMetricsListener(startOpts.promMetricsURL, stopCh, daemon.RegisterMCDMetrics)
184+
go ctrlcommon.StartMetricsListener(startOpts.promMetricsURL, stopCh, daemon.RegisterMCDMetrics, startOpts.tlsMinVersion, startOpts.tlsCipherSuites)
181185

182186
ctrlctx := ctrlcommon.CreateControllerContext(ctx, cb)
183187

manifests/machineconfigcontroller/deployment.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ spec:
2424
- "--resourcelock-namespace={{.TargetNamespace}}"
2525
- "--v={{.LogLevel}}"
2626
- "--payload-version={{.ReleaseVersion}}"
27+
- "--tls-cipher-suites={{join .TLSCipherSuites ","}}"
28+
- "--tls-min-version={{.TLSMinVersion}}"
2729
resources:
2830
requests:
2931
cpu: 20m

manifests/machineconfigdaemon/daemonset.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ spec:
3232
- "start"
3333
- "--payload-version={{.ReleaseVersion}}"
3434
- "--v={{.LogLevel}}"
35+
- "--tls-cipher-suites={{join .TLSCipherSuites ","}}"
36+
- "--tls-min-version={{.TLSMinVersion}}"
3537
resources:
3638
requests:
3739
cpu: 20m

pkg/controller/common/metrics.go

Lines changed: 6 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"crypto/tls"
66
"fmt"
77
"net/http"
8-
"strings"
98

109
"github.com/prometheus/client_golang/prometheus"
1110
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -127,7 +126,7 @@ func RegisterMetrics(metrics []prometheus.Collector) error {
127126
}
128127

129128
// StartMetricsListener is metrics listener via http on localhost
130-
func StartMetricsListener(addr string, stopCh <-chan struct{}, registerFunc func() error) {
129+
func StartMetricsListener(addr string, stopCh <-chan struct{}, registerFunc func() error, tlsMinVersion string, tlsCipherSuites []string) {
131130
if addr == "" {
132131
addr = DefaultBindAddress
133132
}
@@ -139,15 +138,14 @@ func StartMetricsListener(addr string, stopCh <-chan struct{}, registerFunc func
139138
return
140139
}
141140

142-
klog.Infof("Starting metrics listener on %s", addr)
141+
// Get TLS config from provided settings, or use defaults
142+
tlsConfig := GetGoTLSConfig(tlsMinVersion, tlsCipherSuites)
143+
144+
klog.Infof("Starting metrics listener on %s with TLS min version: %s", addr, tlsMinVersion)
143145
mux := http.NewServeMux()
144146
mux.Handle("/metrics", promhttp.Handler())
145147
s := http.Server{
146-
TLSConfig: &tls.Config{
147-
MinVersion: tls.VersionTLS12,
148-
NextProtos: []string{"http/1.1"},
149-
CipherSuites: cipherOrder(),
150-
},
148+
TLSConfig: tlsConfig,
151149
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),
152150
Addr: addr,
153151
Handler: mux}
@@ -166,43 +164,3 @@ func StartMetricsListener(addr string, stopCh <-chan struct{}, registerFunc func
166164
klog.Infof("Metrics listener successfully stopped")
167165
}
168166
}
169-
170-
func cipherOrder() []uint16 {
171-
var first []uint16
172-
var second []uint16
173-
174-
allowable := func(c *tls.CipherSuite) bool {
175-
// Disallow block ciphers using straight SHA1
176-
// See: https://tools.ietf.org/html/rfc7540#appendix-A
177-
if strings.HasSuffix(c.Name, "CBC_SHA") {
178-
return false
179-
}
180-
// 3DES is considered insecure
181-
if strings.Contains(c.Name, "3DES") {
182-
return false
183-
}
184-
return true
185-
}
186-
187-
for _, c := range tls.CipherSuites() {
188-
for _, v := range c.SupportedVersions {
189-
if v == tls.VersionTLS13 {
190-
first = append(first, c.ID)
191-
}
192-
if v == tls.VersionTLS12 && allowable(c) {
193-
inFirst := false
194-
for _, id := range first {
195-
if c.ID == id {
196-
inFirst = true
197-
break
198-
}
199-
}
200-
if !inFirst {
201-
second = append(second, c.ID)
202-
}
203-
}
204-
}
205-
}
206-
207-
return append(first, second...)
208-
}

0 commit comments

Comments
 (0)