X Tutup
Skip to content

Commit 1d98b69

Browse files
Strip certs and keys in log before sending to Bugsnag
Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
1 parent 5dadfe0 commit 1d98b69

File tree

2 files changed

+115
-3
lines changed

2 files changed

+115
-3
lines changed

libmachine/log/log.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,34 @@
11
package log
22

3-
import "io"
3+
import (
4+
"io"
5+
"regexp"
6+
)
47

5-
var Logger MachineLogger
8+
const redactedText = "<REDACTED>"
9+
10+
var (
11+
Logger MachineLogger
12+
13+
// (?s) enables '.' to match '\n' -- see https://golang.org/pkg/regexp/syntax/
14+
certRegex = regexp.MustCompile("(?s)-----BEGIN CERTIFICATE-----.*-----END CERTIFICATE-----")
15+
keyRegex = regexp.MustCompile("(?s)-----BEGIN RSA PRIVATE KEY-----.*-----END RSA PRIVATE KEY-----")
16+
)
617

718
func init() {
819
Logger = NewFmtMachineLogger()
920
}
1021

22+
func stripSecrets(original []string) []string {
23+
stripped := []string{}
24+
for _, line := range original {
25+
line = certRegex.ReplaceAllString(line, redactedText)
26+
line = keyRegex.ReplaceAllString(line, redactedText)
27+
stripped = append(stripped, line)
28+
}
29+
return stripped
30+
}
31+
1132
// RedirectStdOutToStdErr prevents any log from corrupting the output
1233
func RedirectStdOutToStdErr() {
1334
Logger.RedirectStdOutToStdErr()
@@ -62,5 +83,5 @@ func SetOutput(out io.Writer) {
6283
}
6384

6485
func History() []string {
65-
return Logger.History()
86+
return stripSecrets(Logger.History())
6687
}

libmachine/log/log_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package log
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestStripSecrets(t *testing.T) {
10+
testCases := []struct {
11+
description string
12+
input []string
13+
expected []string
14+
}{
15+
{
16+
description: "Log that does contain certs should have them stripped",
17+
input: []string{
18+
"Some mundane log lines",
19+
"IP is foo.bar",
20+
`Secret here: printf '%s' '-----BEGIN CERTIFICATE-----
21+
MIIC4DCCAcigAwIBAgIRAMMHbb4WFRVYsCOIrfM3dqkwDQYJKoZIhvcNAQELBQAw
22+
GTEXMBUGA1UEChMObmF0aGFubGVjbGFpcmUwHhcNMTUxMDEwMDE1MDAwWhcNMTgw
23+
OTI0MDE1MDAwWjAZMRcwFQYDVQQKEw5uYXRoYW5sZWNsYWlyZTCCASIwDQYJKoZI
24+
hvcNAQEBBQADggEPADCCAQoCggEBANLMyaAZPThE6lXtXYfUMZeF0pEfO4BQ7Rv8
25+
Q9/aIKwm8SlKNm+g+6+RoexsiaPXmAkqk04kg+f9WRgtUKC3nhaiUwTqx2HtxowY
26+
Kp7VVW9QyzwCP1r04WTNTdICzhwM5GfaCMKLmibVUfh9GqIYg4Z6eFly7t0PaN1P
27+
uaLClow1e4sWgAgkpIx7ko9ZtW+73knAnp9PPoH4KPBLS+sIPNGh62WsDlvQrOnq
28+
KDiBPIAAMxu2UefIPeGe6xxFuCG89RoJYYsB627IaR8R8iGJMwjJsiAiObGu6z8M
29+
lcWxT4dC+cEIDRu+XQmavJlAydBeHY6/gtJXzsyRExHTyDwi8xkCAwEAAaMjMCEw
30+
DgYDVR0PAQH/BAQDAgKsMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
31+
ggEBAA5CBXPgjvxfY5bR+f6YfcDcKBWxOQ5zN+OH6jWpVzJMEUWp/ZvTQ1GcV1CT
32+
J4HDMRUOL6lQigZDKR6OJ0g/pD4cDGEQlCuPDXx0O8eenxj9TQ+X+qdtxQNkgjId
33+
QWj3k3JDHCh4BQ7h1ZJIg4SnGCUsrQQ+M8TS4Z0YZ/bZ6ZTktJgQgWMn9Uum1GN9
34+
hXJ/fa/E9OJuRxTXou7J0WwrV9aX9sEM9syOANR88PcA1fSE7+wNSdj5ZCfY6mQn
35+
II9e8NZEf5ktPXCNi0LKI6R1berejwQI3KKHEFbdZ8SKn93HgDh/Ip/dFctj+zBt
36+
CAlTWS3abehlCERn6Ze9IfZBtpI=
37+
-----END CERTIFICATE-----' | sudo tee /etc/docker/ca.pem`,
38+
},
39+
expected: []string{
40+
"Some mundane log lines",
41+
"IP is foo.bar",
42+
`Secret here: printf '%s' '<REDACTED>' | sudo tee /etc/docker/ca.pem`,
43+
},
44+
},
45+
{
46+
description: "Log that does contain private keys should have them stripped",
47+
input: []string{
48+
"Some mundane log lines",
49+
"IP is foo.bar",
50+
`Secret here: printf '%s' '-----BEGIN RSA PRIVATE KEY-----
51+
MIIC4DCCAcigAwIBAgIRAMMHbb4WFRVYsCOIrfM3dqkwDQYJKoZIhvcNAQELBQAw
52+
GTEXMBUGA1UEChMObmF0aGFubGVjbGFpcmUwHhcNMTUxMDEwMDE1MDAwWhcNMTgw
53+
OTI0MDE1MDAwWjAZMRcwFQYDVQQKEw5uYXRoYW5sZWNsYWlyZTCCASIwDQYJKoZI
54+
hvcNAQEBBQADggEPADCCAQoCggEBANLMyaAZPThE6lXtXYfUMZeF0pEfO4BQ7Rv8
55+
Q9/aIKwm8SlKNm+g+6+RoexsiaPXmAkqk04kg+f9WRgtUKC3nhaiUwTqx2HtxowY
56+
Kp7VVW9QyzwCP1r04WTNTdICzhwM5GfaCMKLmibVUfh9GqIYg4Z6eFly7t0PaN1P
57+
uaLClow1e4sWgAgkpIx7ko9ZtW+73knAnp9PPoH4KPBLS+sIPNGh62WsDlvQrOnq
58+
KDiBPIAAMxu2UefIPeGe6xxFuCG89RoJYYsB627IaR8R8iGJMwjJsiAiObGu6z8M
59+
lcWxT4dC+cEIDRu+XQmavJlAydBeHY6/gtJXzsyRExHTyDwi8xkCAwEAAaMjMCEw
60+
DgYDVR0PAQH/BAQDAgKsMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
61+
ggEBAA5CBXPgjvxfY5bR+f6YfcDcKBWxOQ5zN+OH6jWpVzJMEUWp/ZvTQ1GcV1CT
62+
J4HDMRUOL6lQigZDKR6OJ0g/pD4cDGEQlCuPDXx0O8eenxj9TQ+X+qdtxQNkgjId
63+
QWj3k3JDHCh4BQ7h1ZJIg4SnGCUsrQQ+M8TS4Z0YZ/bZ6ZTktJgQgWMn9Uum1GN9
64+
hXJ/fa/E9OJuRxTXou7J0WwrV9aX9sEM9syOANR88PcA1fSE7+wNSdj5ZCfY6mQn
65+
II9e8NZEf5ktPXCNi0LKI6R1berejwQI3KKHEFbdZ8SKn93HgDh/Ip/dFctj+zBt
66+
CAlTWS3abehlCERn6Ze9IfZBtpI=
67+
-----END RSA PRIVATE KEY-----' | sudo tee /etc/docker/server-key.pem`,
68+
},
69+
expected: []string{
70+
"Some mundane log lines",
71+
"IP is foo.bar",
72+
`Secret here: printf '%s' '<REDACTED>' | sudo tee /etc/docker/server-key.pem`,
73+
},
74+
},
75+
{
76+
description: "Log that does not contain secrets should not change",
77+
input: []string{
78+
"Some mundane log lines",
79+
"IP is foo.bar",
80+
},
81+
expected: []string{
82+
"Some mundane log lines",
83+
"IP is foo.bar",
84+
},
85+
},
86+
}
87+
88+
for _, tc := range testCases {
89+
assert.Equal(t, tc.expected, stripSecrets(tc.input))
90+
}
91+
}

0 commit comments

Comments
 (0)
X Tutup