Skip to content

Commit 2cf8fad

Browse files
authored
Deprecate using environment variables for auth settings in sessions (#121)
1 parent 5d21de2 commit 2cf8fad

File tree

5 files changed

+227
-130
lines changed

5 files changed

+227
-130
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## v0.23.0
6+
7+
- Deprecate using environment variables for auth settings in sessions [#121](https://github.com/grafana/grafana-aws-sdk/pull/121)
8+
59
## v0.22.0
610

711
- Add ReadAuthSettings to get config settings from context [#118](https://github.com/grafana/grafana-aws-sdk/pull/118)

pkg/awsds/authSettings.go

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const (
2525
// GrafanaAssumeRoleExternalIdKeyName is the string literal for the grafana assume role external id environment variable key name
2626
GrafanaAssumeRoleExternalIdKeyName = "AWS_AUTH_EXTERNAL_ID"
2727

28-
// GrafanaListMetricsPageLimit is the string literal for the cloudwatch list metrics page limit key name
29-
GrafanaListMetricsPageLimit = "AWS_CW_LIST_METRICS_PAGE_LIMIT"
28+
// ListMetricsPageLimitKeyName is the string literal for the cloudwatch list metrics page limit key name
29+
ListMetricsPageLimitKeyName = "AWS_CW_LIST_METRICS_PAGE_LIMIT"
3030

3131
defaultAssumeRoleEnabled = true
3232
defaultListMetricsPageLimit = 500
@@ -91,12 +91,21 @@ func ReadAuthSettingsFromContext(ctx context.Context) (*AuthSettings, bool) {
9191
hasSettings = true
9292
}
9393

94-
if v := cfg.Get(GrafanaListMetricsPageLimit); v != "" {
94+
if v := cfg.Get(SessionDurationEnvVarKeyName); v != "" {
95+
sessionDuration, err := gtime.ParseDuration(v)
96+
if err == nil {
97+
settings.SessionDuration = &sessionDuration
98+
} else {
99+
backend.Logger.Error("could not parse env variable", "var", SessionDurationEnvVarKeyName)
100+
}
101+
}
102+
103+
if v := cfg.Get(ListMetricsPageLimitKeyName); v != "" {
95104
listMetricsPageLimit, err := strconv.Atoi(v)
96105
if err == nil {
97106
settings.ListMetricsPageLimit = listMetricsPageLimit
98107
} else {
99-
backend.Logger.Error("could not parse context variable", "var", GrafanaListMetricsPageLimit)
108+
backend.Logger.Error("could not parse context variable", "var", ListMetricsPageLimitKeyName)
100109
}
101110
hasSettings = true
102111
}
@@ -111,17 +120,6 @@ func ReadAuthSettingsFromContext(ctx context.Context) (*AuthSettings, bool) {
111120
hasSettings = true
112121
}
113122

114-
// Users set session duration directly as an environment variable
115-
sessionDurationString := os.Getenv(SessionDurationEnvVarKeyName)
116-
if sessionDurationString != "" {
117-
sessionDuration, err := gtime.ParseDuration(sessionDurationString)
118-
if err == nil {
119-
settings.SessionDuration = &sessionDuration
120-
} else {
121-
backend.Logger.Error("could not parse env variable", "var", SessionDurationEnvVarKeyName)
122-
}
123-
}
124-
125123
return settings, hasSettings
126124
}
127125

@@ -159,15 +157,15 @@ func ReadAuthSettingsFromEnvironmentVariables() *AuthSettings {
159157

160158
authSettings.ExternalID = os.Getenv(GrafanaAssumeRoleExternalIdKeyName)
161159

162-
listMetricsPageLimitString := os.Getenv(GrafanaListMetricsPageLimit)
160+
listMetricsPageLimitString := os.Getenv(ListMetricsPageLimitKeyName)
163161
if len(listMetricsPageLimitString) == 0 {
164-
backend.Logger.Warn("environment variable missing. falling back to default page limit", "var", GrafanaListMetricsPageLimit)
162+
backend.Logger.Warn("environment variable missing. falling back to default page limit", "var", ListMetricsPageLimitKeyName)
165163
listMetricsPageLimitString = "500"
166164
}
167165

168166
authSettings.ListMetricsPageLimit, err = strconv.Atoi(listMetricsPageLimitString)
169167
if err != nil {
170-
backend.Logger.Error("could not parse env variable", "var", GrafanaListMetricsPageLimit)
168+
backend.Logger.Error("could not parse env variable", "var", ListMetricsPageLimitKeyName)
171169
authSettings.ListMetricsPageLimit = defaultListMetricsPageLimit
172170
}
173171

pkg/awsds/authSettings_test.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestReadAuthSettingsFromContext(t *testing.T) {
4949
AllowedAuthProvidersEnvVarKeyName: "foo , bar,baz",
5050
AssumeRoleEnabledEnvVarKeyName: "false",
5151
GrafanaAssumeRoleExternalIdKeyName: "mock_id",
52-
GrafanaListMetricsPageLimit: "50",
52+
ListMetricsPageLimitKeyName: "50",
5353
proxy.PluginSecureSocksProxyEnabled: "true",
5454
}),
5555
expectedSettings: &AuthSettings{
@@ -81,29 +81,27 @@ func TestReadAuthSettings(t *testing.T) {
8181
os.Setenv(GrafanaAssumeRoleExternalIdKeyName, originalExternalId)
8282
}()
8383

84-
expectedDuration, err := time.ParseDuration("20m")
85-
require.NoError(t, err)
84+
ctxDuration := 10 * time.Minute
85+
envDuration := 20 * time.Minute
8686
expectedSessionContextSettings := &AuthSettings{
8787
AllowedAuthProviders: []string{"foo", "bar", "baz"},
8888
AssumeRoleEnabled: false,
89-
SessionDuration: &expectedDuration, //20 minutes in nanoseconds count,
89+
SessionDuration: &ctxDuration,
9090
ExternalID: "mock_id",
9191
ListMetricsPageLimit: 50,
9292
SecureSocksDSProxyEnabled: true,
9393
}
9494

9595
expectedSessionEnvSettings := &AuthSettings{
96-
AllowedAuthProviders: []string{"env1", "env2"},
96+
AllowedAuthProviders: []string{"default", "keys", "credentials"},
9797
AssumeRoleEnabled: true,
98-
SessionDuration: &expectedDuration,
98+
SessionDuration: &envDuration,
9999
ExternalID: "env_id",
100100
ListMetricsPageLimit: 30,
101101
SecureSocksDSProxyEnabled: false,
102102
}
103103

104-
require.NoError(t, os.Setenv(AllowedAuthProvidersEnvVarKeyName, "env1,env2"))
105-
require.NoError(t, os.Setenv(AssumeRoleEnabledEnvVarKeyName, "true"))
106-
require.NoError(t, os.Setenv(GrafanaListMetricsPageLimit, "30"))
104+
require.NoError(t, os.Setenv(ListMetricsPageLimitKeyName, "30"))
107105
require.NoError(t, os.Setenv(SessionDurationEnvVarKeyName, "20m"))
108106
require.NoError(t, os.Setenv(proxy.PluginSecureSocksProxyEnabled, "false"))
109107
defer unsetEnvironmentVariables()
@@ -138,8 +136,9 @@ func TestReadAuthSettings(t *testing.T) {
138136
cfg: backend.NewGrafanaCfg(map[string]string{
139137
AllowedAuthProvidersEnvVarKeyName: "foo , bar,baz",
140138
AssumeRoleEnabledEnvVarKeyName: "false",
139+
SessionDurationEnvVarKeyName: "10m",
141140
GrafanaAssumeRoleExternalIdKeyName: "mock_id",
142-
GrafanaListMetricsPageLimit: "50",
141+
ListMetricsPageLimitKeyName: "50",
143142
proxy.PluginSecureSocksProxyEnabled: "true",
144143
}),
145144
expectedSettings: expectedSessionContextSettings,
@@ -155,3 +154,10 @@ func TestReadAuthSettings(t *testing.T) {
155154
})
156155
}
157156
}
157+
158+
func unsetEnvironmentVariables() {
159+
os.Unsetenv(AllowedAuthProvidersEnvVarKeyName)
160+
os.Unsetenv(AssumeRoleEnabledEnvVarKeyName)
161+
os.Unsetenv(SessionDurationEnvVarKeyName)
162+
os.Unsetenv(ListMetricsPageLimitKeyName)
163+
}

pkg/awsds/sessions.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@ type envelope struct {
2828
type SessionCache struct {
2929
sessCache map[string]envelope
3030
sessCacheLock sync.RWMutex
31-
authSettings *AuthSettings
3231
}
3332

3433
// NewSessionCache creates a new session cache using the default settings loaded from environment variables
3534
func NewSessionCache() *SessionCache {
3635
return &SessionCache{
37-
sessCache: map[string]envelope{},
38-
authSettings: ReadAuthSettingsFromEnvironmentVariables(),
36+
sessCache: map[string]envelope{},
3937
}
4038
}
4139

@@ -78,6 +76,7 @@ type SessionConfig struct {
7876
Settings AWSDatasourceSettings
7977
HTTPClient *http.Client
8078
UserAgentName *string
79+
AuthSettings *AuthSettings
8180
}
8281

8382
func isOptInRegion(region string) bool {
@@ -106,8 +105,15 @@ func (sc *SessionCache) GetSession(c SessionConfig) (*session.Session, error) {
106105
// DefaultRegion is deprecated, Region should be used instead
107106
c.Settings.Region = c.Settings.DefaultRegion
108107
}
108+
109+
// If the datasource calling GetSession is getting the settings from the contexts, they'll pass
110+
// the values through AuthSettings. Otherwise, we need to get them from the env variables.
111+
if c.AuthSettings == nil {
112+
c.AuthSettings = ReadAuthSettingsFromEnvironmentVariables()
113+
}
114+
109115
authTypeAllowed := false
110-
for _, provider := range sc.authSettings.AllowedAuthProviders {
116+
for _, provider := range c.AuthSettings.AllowedAuthProviders {
111117
if provider == c.Settings.AuthType.String() {
112118
authTypeAllowed = true
113119
break
@@ -118,7 +124,7 @@ func (sc *SessionCache) GetSession(c SessionConfig) (*session.Session, error) {
118124
return nil, fmt.Errorf("attempting to use an auth type that is not allowed: %q", c.Settings.AuthType.String())
119125
}
120126

121-
if c.Settings.AssumeRoleARN != "" && !sc.authSettings.AssumeRoleEnabled {
127+
if c.Settings.AssumeRoleARN != "" && !c.AuthSettings.AssumeRoleEnabled {
122128
return nil, fmt.Errorf("attempting to use assume role (ARN) which is disabled in grafana.ini")
123129
}
124130

@@ -159,7 +165,7 @@ func (sc *SessionCache) GetSession(c SessionConfig) (*session.Session, error) {
159165
c.Settings.Region = ""
160166
}
161167
if c.Settings.Region != "" {
162-
if c.Settings.AssumeRoleARN != "" && sc.authSettings.AssumeRoleEnabled && isOptInRegion(c.Settings.Region) {
168+
if c.Settings.AssumeRoleARN != "" && c.AuthSettings.AssumeRoleEnabled && isOptInRegion(c.Settings.Region) {
163169
// When assuming a role, the real region is set later in a new session
164170
// so we use a well-known region here (not opt-in) to obtain valid credentials
165171
regionCfg = &aws.Config{Region: aws.String("us-east-1")}
@@ -201,11 +207,11 @@ func (sc *SessionCache) GetSession(c SessionConfig) (*session.Session, error) {
201207
}
202208

203209
duration := stscreds.DefaultDuration
204-
if sc.authSettings.SessionDuration != nil {
205-
duration = *sc.authSettings.SessionDuration
210+
if c.AuthSettings.SessionDuration != nil {
211+
duration = *c.AuthSettings.SessionDuration
206212
}
207213
expiration := time.Now().UTC().Add(duration)
208-
if c.Settings.AssumeRoleARN != "" && sc.authSettings.AssumeRoleEnabled {
214+
if c.Settings.AssumeRoleARN != "" && c.AuthSettings.AssumeRoleEnabled {
209215
// We should assume a role in AWS
210216
backend.Logger.Debug("Trying to assume role in AWS", "arn", c.Settings.AssumeRoleARN)
211217

@@ -229,7 +235,7 @@ func (sc *SessionCache) GetSession(c SessionConfig) (*session.Session, error) {
229235
p.Expiry.SetExpiration(expiration, 0)
230236
p.Duration = duration
231237
if c.Settings.AuthType == AuthTypeGrafanaAssumeRole {
232-
p.ExternalID = aws.String(sc.authSettings.ExternalID)
238+
p.ExternalID = aws.String(c.AuthSettings.ExternalID)
233239
} else if c.Settings.ExternalID != "" {
234240
p.ExternalID = aws.String(c.Settings.ExternalID)
235241
}

0 commit comments

Comments
 (0)