Skip to content

Commit 3ec956b

Browse files
committed
fixup for Add wsARN for SNS Config
1 parent 168554e commit 3ec956b

5 files changed

Lines changed: 142 additions & 0 deletions

File tree

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/KimMachineGun/automemlimit v0.7.5
77
github.com/alecthomas/kingpin/v2 v2.4.0
88
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b
9+
github.com/aws/aws-sdk-go v1.55.8
910
github.com/aws/aws-sdk-go-v2 v1.41.1
1011
github.com/aws/aws-sdk-go-v2/config v1.32.7
1112
github.com/aws/aws-sdk-go-v2/credentials v1.19.7

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ
7777
github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
7878
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
7979
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
80+
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
81+
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
8082
github.com/aws/aws-sdk-go-v2 v1.41.1 h1:ABlyEARCDLN034NhxlRUSZr4l71mh+T5KAeGh6cerhU=
8183
github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
8284
github.com/aws/aws-sdk-go-v2/config v1.32.7 h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY=

notify/sns/aws_round_tripper.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package sns
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
7+
"github.com/aws/aws-sdk-go/aws/arn"
8+
"github.com/prometheus/alertmanager/config"
9+
)
10+
11+
type confusedDeputyRoundTripper struct {
12+
workspaceArn arn.ARN
13+
rt http.RoundTripper
14+
}
15+
16+
func (rt *confusedDeputyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
17+
req.Header.Set("x-amz-delegation-source-account", rt.workspaceArn.AccountID)
18+
req.Header.Set("x-amz-delegation-source-arn", rt.workspaceArn.String())
19+
return rt.rt.RoundTrip(req)
20+
}
21+
22+
// newConfusedDeputyRoundTripper adds confused deputy headers
23+
func newConfusedDeputyRoundTripper(c *config.SNSConfig, rt http.RoundTripper) (http.RoundTripper, error) {
24+
if c.WorkspaceArn == "" {
25+
return rt, nil
26+
}
27+
28+
arn, err := arn.Parse(c.WorkspaceArn)
29+
30+
if err != nil {
31+
return nil, fmt.Errorf("%s is not a valid arn", c.WorkspaceArn)
32+
}
33+
return &confusedDeputyRoundTripper{arn, rt}, nil
34+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package sns
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/prometheus/alertmanager/config"
9+
commoncfg "github.com/prometheus/common/config"
10+
)
11+
12+
func TestRoundTripperWithArnNotConfigured(t *testing.T) {
13+
var testCases = []struct {
14+
name string
15+
snsConfig config.SNSConfig
16+
expectedHeaders map[string]string
17+
deniedHeaders []string
18+
expectedErrorMessage string
19+
}{
20+
{
21+
name: "Workspace invalid Arn configured",
22+
snsConfig: config.SNSConfig{
23+
WorkspaceArn: "arn:--Invalid",
24+
},
25+
expectedHeaders: map[string]string{},
26+
deniedHeaders: []string{},
27+
expectedErrorMessage: "arn:--Invalid is not a valid arn",
28+
},
29+
{
30+
name: "Workspace Arn not configured",
31+
snsConfig: config.SNSConfig{},
32+
expectedHeaders: map[string]string{},
33+
deniedHeaders: []string{
34+
"x-amz-source-account",
35+
"x-amz-source-arn",
36+
"x-amz-delegation-source-arn",
37+
"x-amz-delegation-source-account",
38+
},
39+
},
40+
{
41+
name: "Workspace Arn configured",
42+
snsConfig: config.SNSConfig{
43+
WorkspaceArn: "arn:aws:aps:us-west-2:948363459592:workspace/ws-de4908b6-950e-4c4c-9e49-ec68169bc4c7",
44+
},
45+
expectedHeaders: map[string]string{
46+
"x-amz-delegation-source-account": "948363459592",
47+
"x-amz-delegation-source-arn": "arn:aws:aps:us-west-2:948363459592:workspace/ws-de4908b6-950e-4c4c-9e49-ec68169bc4c7",
48+
},
49+
deniedHeaders: []string{},
50+
},
51+
}
52+
53+
for _, tc := range testCases {
54+
t.Run(tc.name, func(t *testing.T) {
55+
testServer := newTestServer(func(w http.ResponseWriter, r *http.Request) {
56+
for _, name := range tc.deniedHeaders {
57+
if _, ok := r.Header[name]; ok {
58+
t.Fatalf("Header %s should not be set", name)
59+
}
60+
}
61+
62+
for key, value := range tc.expectedHeaders {
63+
if r.Header.Get(key) != value {
64+
t.Fatalf("The received Headers (%s) does not contain all expected headers (%s).", r.Header, tc.expectedHeaders)
65+
return
66+
}
67+
}
68+
})
69+
70+
defer testServer.Close()
71+
72+
client, err := commoncfg.NewClientFromConfig(commoncfg.HTTPClientConfig{}, "test")
73+
74+
if err != nil && err.Error() != tc.expectedErrorMessage {
75+
t.Fatal(err.Error())
76+
}
77+
78+
client.Transport, err = newConfusedDeputyRoundTripper(&tc.snsConfig, client.Transport)
79+
80+
if err != nil && err.Error() != tc.expectedErrorMessage {
81+
t.Fatal(err.Error())
82+
}
83+
84+
_, err = client.Get(testServer.URL)
85+
86+
if err != nil && err.Error() != tc.expectedErrorMessage {
87+
t.Fatal(err.Error())
88+
}
89+
})
90+
}
91+
}
92+
93+
func newTestServer(handler func(w http.ResponseWriter, r *http.Request)) *httptest.Server {
94+
testServer := httptest.NewUnstartedServer(http.HandlerFunc(handler))
95+
testServer.Start()
96+
return testServer
97+
}

notify/sns/sns.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ func New(c *config.SNSConfig, t *template.Template, l *slog.Logger, httpOpts ...
5555
if err != nil {
5656
return nil, err
5757
}
58+
59+
// Custom AWS Round Tripper
60+
client.Transport, err = newConfusedDeputyRoundTripper(c, client.Transport)
61+
62+
if err != nil {
63+
return nil, err
64+
}
65+
5866
return &Notifier{
5967
conf: c,
6068
tmpl: t,

0 commit comments

Comments
 (0)