Skip to content

Commit f5a460e

Browse files
Merge pull request #29377 from openshift-cherrypick-robot/cherry-pick-29176-to-release-4.18
OCPBUGS-48474: Replace RunHostCmd with Exec function to censor bearer token being exposed
2 parents f89d72e + 459e9f4 commit f5a460e

File tree

4 files changed

+33
-30
lines changed

4 files changed

+33
-30
lines changed

test/extended/prometheus/prometheus.go

+3-14
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
kapi "k8s.io/kubernetes/pkg/apis/core"
2828
"k8s.io/kubernetes/test/e2e/framework"
2929
e2e "k8s.io/kubernetes/test/e2e/framework"
30-
e2eoutput "k8s.io/kubernetes/test/e2e/framework/pod/output"
3130
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
3231
admissionapi "k8s.io/pod-security-admission/api"
3332
"sigs.k8s.io/yaml"
@@ -454,8 +453,7 @@ var _ = g.Describe("[sig-instrumentation] Prometheus [apigroup:image.openshift.i
454453
defer g.GinkgoRecover()
455454
ctx := context.TODO()
456455
var (
457-
oc = exutil.NewCLIWithPodSecurityLevel("prometheus", admissionapi.LevelBaseline)
458-
456+
oc = exutil.NewCLIWithPodSecurityLevel("prometheus", admissionapi.LevelBaseline)
459457
queryURL, prometheusURL, querySvcURL, prometheusSvcURL, bearerToken string
460458
)
461459

@@ -505,7 +503,7 @@ var _ = g.Describe("[sig-instrumentation] Prometheus [apigroup:image.openshift.i
505503
err := helper.RunQueries(context.TODO(), oc.NewPrometheusClient(context.TODO()), tests, oc)
506504
o.Expect(err).NotTo(o.HaveOccurred())
507505

508-
e2e.Logf("Telemetry is enabled: %s", bearerToken)
506+
e2e.Logf("Telemetry is enabled")
509507

510508
if err != nil {
511509
// Making the test flaky until monitoring team fixes the rate limit issue.
@@ -523,7 +521,7 @@ var _ = g.Describe("[sig-instrumentation] Prometheus [apigroup:image.openshift.i
523521
g.By("checking the prometheus metrics path")
524522
var metrics map[string]*dto.MetricFamily
525523
o.Expect(wait.PollUntilContextTimeout(context.Background(), 10*time.Second, 2*time.Minute, true, func(context.Context) (bool, error) {
526-
results, err := getBearerTokenURLViaPod(ns, execPod.Name, fmt.Sprintf("%s/metrics", prometheusSvcURL), bearerToken)
524+
results, err := helper.GetBearerTokenURLViaPod(oc, execPod.Name, fmt.Sprintf("%s/metrics", prometheusSvcURL), bearerToken)
527525
if err != nil {
528526
e2e.Logf("unable to get metrics: %v", err)
529527
return false, nil
@@ -939,15 +937,6 @@ func findMetricLabels(f *dto.MetricFamily, labels map[string]string, match strin
939937
return result
940938
}
941939

942-
func getBearerTokenURLViaPod(ns, execPodName, url, bearer string) (string, error) {
943-
cmd := fmt.Sprintf("curl -s -k -H 'Authorization: Bearer %s' %q", bearer, url)
944-
output, err := e2eoutput.RunHostCmd(ns, execPodName, cmd)
945-
if err != nil {
946-
return "", fmt.Errorf("host command failed: %v\n%s", err, output)
947-
}
948-
return output, nil
949-
}
950-
951940
// telemetryIsEnabled returns (nil, nil) if Telemetry is enabled,
952941
// (error, nil) if Telemetry is not enabled, and (_, error) if it fails
953942
// to determine whether or not Telemetry is enabled.

test/extended/router/metrics.go

+4-15
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ import (
3434
var _ = g.Describe("[sig-network][Feature:Router]", func() {
3535
defer g.GinkgoRecover()
3636
var (
37-
oc = exutil.NewCLIWithPodSecurityLevel("router-metrics", admissionapi.LevelBaseline)
38-
37+
oc = exutil.NewCLIWithPodSecurityLevel("router-metrics", admissionapi.LevelBaseline)
3938
username, password, bearerToken string
4039
metricsPort int32
4140
execPodName, ns, host string
@@ -153,9 +152,8 @@ var _ = g.Describe("[sig-network][Feature:Router]", func() {
153152
p := expfmt.TextParser{}
154153

155154
err = wait.PollImmediate(2*time.Second, 240*time.Second, func() (bool, error) {
156-
results, err = getBearerTokenURLViaPod(ns, execPodName, fmt.Sprintf("http://%s/metrics", net.JoinHostPort(host, strconv.Itoa(int(metricsPort)))), bearerToken)
155+
results, err = prometheus.GetBearerTokenURLViaPod(oc, execPodName, fmt.Sprintf("http://%s/metrics", net.JoinHostPort(host, strconv.Itoa(int(metricsPort)))), bearerToken)
157156
o.Expect(err).NotTo(o.HaveOccurred())
158-
159157
metrics, err = p.TextToMetricFamilies(bytes.NewBufferString(results))
160158
o.Expect(err).NotTo(o.HaveOccurred())
161159

@@ -234,7 +232,7 @@ var _ = g.Describe("[sig-network][Feature:Router]", func() {
234232
time.Sleep(15 * time.Second)
235233

236234
g.By("checking that some metrics are not reset to 0 after router restart")
237-
updatedResults, err := getBearerTokenURLViaPod(ns, execPodName, fmt.Sprintf("http://%s/metrics", net.JoinHostPort(host, strconv.Itoa(int(metricsPort)))), bearerToken)
235+
updatedResults, err := prometheus.GetBearerTokenURLViaPod(oc, execPodName, fmt.Sprintf("http://%s/metrics", net.JoinHostPort(host, strconv.Itoa(int(metricsPort)))), bearerToken)
238236
o.Expect(err).NotTo(o.HaveOccurred())
239237
defer func() { e2e.Logf("final metrics:\n%s", updatedResults) }()
240238

@@ -278,7 +276,7 @@ var _ = g.Describe("[sig-network][Feature:Router]", func() {
278276
}()
279277

280278
o.Expect(wait.PollImmediate(10*time.Second, 5*time.Minute, func() (bool, error) {
281-
contents, err := getBearerTokenURLViaPod(ns, execPod.Name, fmt.Sprintf("%s/api/v1/targets?state=active", url), token)
279+
contents, err := prometheus.GetBearerTokenURLViaPod(oc, execPod.Name, fmt.Sprintf("%s/api/v1/targets?state=active", url), token)
282280
o.Expect(err).NotTo(o.HaveOccurred())
283281

284282
targets := &promTargets{}
@@ -440,15 +438,6 @@ func getAuthenticatedURLViaPod(ns, execPodName, url, user, pass string) (string,
440438
return output, nil
441439
}
442440

443-
func getBearerTokenURLViaPod(ns, execPodName, url, bearer string) (string, error) {
444-
cmd := fmt.Sprintf("curl -s -k -H 'Authorization: Bearer %s' %q", bearer, url)
445-
output, err := e2eoutput.RunHostCmd(ns, execPodName, cmd)
446-
if err != nil {
447-
return "", fmt.Errorf("host command failed: %v\n%s", err, output)
448-
}
449-
return output, nil
450-
}
451-
452441
func waitForAdmittedRoute(maxInterval time.Duration, client routev1client.RouteV1Interface, ns, name, ingressName string, errorOnRejection bool) (string, error) {
453442
var routeHost string
454443
err := wait.PollImmediate(time.Second, maxInterval, func() (bool, error) {

test/extended/util/client.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"os"
1717
"os/exec"
1818
"path/filepath"
19+
"regexp"
1920
"runtime/debug"
2021
"strings"
2122
"time"
@@ -931,7 +932,8 @@ func (c *CLI) start(stdOutBuff, stdErrBuff *bytes.Buffer) (*exec.Cmd, error) {
931932
}
932933
cmd := exec.Command(c.execPath, c.finalArgs...)
933934
cmd.Stdin = c.stdin
934-
framework.Logf("Running '%s %s'", c.execPath, strings.Join(c.finalArgs, " "))
935+
// Redact any bearer token information from the log.
936+
framework.Logf("Running '%s %s'", c.execPath, redactBearerToken(c.finalArgs))
935937

936938
cmd.Stdout = stdOutBuff
937939
cmd.Stderr = stdErrBuff
@@ -940,6 +942,16 @@ func (c *CLI) start(stdOutBuff, stdErrBuff *bytes.Buffer) (*exec.Cmd, error) {
940942
return cmd, err
941943
}
942944

945+
func redactBearerToken(finalArgs []string) string {
946+
args := strings.Join(finalArgs, " ")
947+
if strings.Contains(args, "Authorization: Bearer") {
948+
// redact bearer token
949+
re := regexp.MustCompile(`Authorization:\s+Bearer.*\s+`)
950+
args = re.ReplaceAllString(args, "Authorization: Bearer <redacted> ")
951+
}
952+
return args
953+
}
954+
943955
// getStartingIndexForLastN calculates a byte offset in a byte slice such that when using
944956
// that offset, we get the last N (size) bytes.
945957
func getStartingIndexForLastN(byteString []byte, size int) int {

test/extended/util/prometheus/helpers.go

+13
Original file line numberDiff line numberDiff line change
@@ -435,3 +435,16 @@ func MustJoinUrlPath(base string, paths ...string) string {
435435
}
436436
return path
437437
}
438+
439+
func GetBearerTokenURLViaPod(oc *exutil.CLI, execPodName, url, bearer string) (string, error) {
440+
auth := fmt.Sprintf("Authorization: Bearer %s", bearer)
441+
stdout, stderr, err := oc.AsAdmin().Run("exec").Args(execPodName, "--", "curl", "-s", "-k", "-H", auth, url).Outputs()
442+
if err != nil {
443+
return "", fmt.Errorf("command failed: %v\nstderr: %s\nstdout:%s", err, stderr, stdout)
444+
}
445+
// Terminate stdout with a newline to avoid an unexpected end of stream error.
446+
if len(stdout) > 0 {
447+
stdout = stdout + "\n"
448+
}
449+
return stdout, err
450+
}

0 commit comments

Comments
 (0)