Skip to content

Commit

Permalink
[v17] Apply the _DISABLE_AWS_FIPS setting to iam and stscreds (#52127)
Browse files Browse the repository at this point in the history
* Add the iamutils package

* Add stsutils.NewCredentialsV1()

* Use iamutils.NewFromConfig()

* Use stsutils.NewCredentialsV1()

* Add forbidigo rules

* Move IsFIPSDisabledByEnv to lib/utils/aws/awsfips

* Use stsutils.NewCredentialsV1() (no import cycle)

* Add iamutils.NewV1()

* Use iamutils.NewV1()

* Add more forbidigo rules
  • Loading branch information
codingllama authored Feb 14, 2025
1 parent 4a279ac commit 1315482
Show file tree
Hide file tree
Showing 23 changed files with 320 additions and 31 deletions.
18 changes: 15 additions & 3 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,21 @@ issues:
path-except: ^e/
text: "non-constant format string in call to github.com/gravitational/trace."
# lib/utils/aws/ subpackages are allowed to use AWS SDK constructors.
- path: lib/utils/aws/iamutils/iam.go
linters: [forbidigo]
text: 'iam.NewFromConfig'
- path: lib/utils/aws/iamutils/iam_v1.go
linters: [forbidigo]
text: 'iam.New'
- path: lib/utils/aws/stsutils/sts.go
linters: [forbidigo]
text: 'sts.NewFromConfig'
- path: lib/utils/aws/stsutils/sts_v1.go
linters: [forbidigo]
text: 'sts.New'
# TODO(codingllama): Remove once e/ is updated.
- path: e/lib/cloud/aws/aws.go
- path: lib/utils/aws/stsutils/stscreds_v1.go
linters: [forbidigo]
text: 'sts.NewFromConfig'
text: 'stscreds.NewCredentials'
exclude-use-default: true
max-same-issues: 0
max-issues-per-linter: 0
Expand Down Expand Up @@ -281,10 +286,17 @@ linters-settings:
forbid:
- p: '^rsa\.GenerateKey$'
msg: 'generating RSA keys is slow, use lib/cryptosuites to generate an appropriate key type'
# AWS SDK wrapped constructors.
- p: '^iam\.NewFromConfig$'
msg: 'Use iamutils.NewFromConfig'
- p: '^iam\.New$'
msg: 'Use iamutils.NewV1'
- p: '^sts\.NewFromConfig$'
msg: 'Use stsutils.NewFromConfig'
- p: '^sts\.New$'
msg: 'Use stsutils.NewV1'
- p: '^stscreds\.NewCredentials$'
msg: 'Use stsutils.NewCredentials'

run:
go: '1.23'
Expand Down
4 changes: 2 additions & 2 deletions lib/cloud/clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ import (
"github.com/aws/aws-sdk-go/service/eks/eksiface"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/aws/aws-sdk-go/service/elasticache/elasticacheiface"
"github.com/aws/aws-sdk-go/service/iam"
"github.com/aws/aws-sdk-go/service/iam/iamiface"
"github.com/aws/aws-sdk-go/service/kms"
"github.com/aws/aws-sdk-go/service/kms/kmsiface"
Expand Down Expand Up @@ -81,6 +80,7 @@ import (
gcpimds "github.com/gravitational/teleport/lib/cloud/imds/gcp"
"github.com/gravitational/teleport/lib/modules"
"github.com/gravitational/teleport/lib/utils"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -589,7 +589,7 @@ func (c *cloudClients) GetAWSIAMClient(ctx context.Context, region string, opts
if err != nil {
return nil, trace.Wrap(err)
}
return iam.New(session), nil
return iamutils.NewV1(session), nil
}

// GetAWSS3Client returns AWS S3 client.
Expand Down
5 changes: 3 additions & 2 deletions lib/configurators/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import (
"github.com/gravitational/teleport/lib/srv/db/secrets"
"github.com/gravitational/teleport/lib/utils"
awsutils "github.com/gravitational/teleport/lib/utils/aws"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -392,7 +393,7 @@ func (c *ConfiguratorConfig) CheckAndSetDefaults() error {
c.stsClient = stsutils.NewFromConfig(*c.awsCfg)
}
if c.iamClient == nil {
c.iamClient = iam.NewFromConfig(*c.awsCfg)
c.iamClient = iamutils.NewFromConfig(*c.awsCfg)
}
if c.Identity == nil {
c.Identity, err = awslib.GetIdentityWithClientV2(context.Background(), c.stsClient)
Expand Down Expand Up @@ -423,7 +424,7 @@ func (c *ConfiguratorConfig) CheckAndSetDefaults() error {
if c.Policies == nil {
partition := c.Identity.GetPartition()
accountID := c.Identity.GetAccountID()
iamClient := iam.NewFromConfig(*c.awsCfg)
iamClient := iamutils.NewFromConfig(*c.awsCfg)
c.Policies = awslib.NewPolicies(partition, accountID, iamClient)
}
}
Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/accessgraph_sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
awslib "github.com/gravitational/teleport/lib/cloud/aws"
"github.com/gravitational/teleport/lib/cloud/provisioning"
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -91,7 +92,7 @@ func NewAccessGraphIAMConfigureClient(ctx context.Context) (AccessGraphIAMConfig

return &defaultTAGIAMConfigureClient{
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
}, nil
}

Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/aws_app_access_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/gravitational/teleport/lib/cloud/provisioning"
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/modules"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -108,7 +109,7 @@ func NewAWSAppAccessConfigureClient(ctx context.Context) (AWSAppAccessConfigureC
}

return &defaultAWSAppAccessConfigureClient{
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
}, nil
}
Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/deployservice_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/integrations/awsoidc/tags"
awslibutils "github.com/gravitational/teleport/lib/utils/aws"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -146,7 +147,7 @@ func NewDeployServiceIAMConfigureClient(ctx context.Context, region string) (Dep
}

return &defaultDeployServiceIAMConfigureClient{
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
}, nil
}
Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/ec2_ssm_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import (
"github.com/gravitational/teleport/lib/cloud/provisioning"
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/integrations/awsoidc/tags"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -143,7 +144,7 @@ func NewEC2SSMConfigureClient(ctx context.Context, region string) (EC2SSMConfigu
}

return &defaultEC2SSMConfigureClient{
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
ssmClient: ssm.NewFromConfig(cfg),
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
}, nil
Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/eice_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
awslib "github.com/gravitational/teleport/lib/cloud/aws"
"github.com/gravitational/teleport/lib/cloud/provisioning"
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -101,7 +102,7 @@ func NewEICEIAMConfigureClient(ctx context.Context, region string) (EICEIAMConfi

return &defaultEICEIAMConfigureClient{
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
}, nil
}

Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/eks_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
awslib "github.com/gravitational/teleport/lib/cloud/aws"
"github.com/gravitational/teleport/lib/cloud/provisioning"
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -100,7 +101,7 @@ func NewEKSIAMConfigureClient(ctx context.Context, region string) (EKSIAMConfigu
}

return &defaultEKSEIAMConfigureClient{
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
}, nil
}
Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/idp_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/defaults"
"github.com/gravitational/teleport/lib/integrations/awsoidc/tags"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -194,7 +195,7 @@ func NewIdPIAMConfigureClient(ctx context.Context) (IdPIAMConfigureClient, error
return &defaultIdPIAMConfigureClient{
httpClient: httpClient,
awsConfig: cfg,
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
}, nil
}
Expand Down
3 changes: 2 additions & 1 deletion lib/integrations/awsoidc/listdatabases_iam_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
awslib "github.com/gravitational/teleport/lib/cloud/aws"
"github.com/gravitational/teleport/lib/cloud/provisioning"
"github.com/gravitational/teleport/lib/cloud/provisioning/awsactions"
"github.com/gravitational/teleport/lib/utils/aws/iamutils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

Expand Down Expand Up @@ -92,7 +93,7 @@ func NewListDatabasesIAMConfigureClient(ctx context.Context, region string) (Lis
}

return &defaultListDatabasesIAMConfigureClient{
Client: iam.NewFromConfig(cfg),
Client: iamutils.NewFromConfig(cfg),
CallerIdentityGetter: stsutils.NewFromConfig(cfg),
}, nil
}
Expand Down
3 changes: 2 additions & 1 deletion lib/srv/app/cloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
"github.com/gravitational/teleport/api/constants"
"github.com/gravitational/teleport/lib/tlsca"
awsutils "github.com/gravitational/teleport/lib/utils/aws"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

// Cloud provides cloud provider access related methods such as generating
Expand Down Expand Up @@ -208,7 +209,7 @@ func (c *cloud) getAWSSigninToken(ctx context.Context, req *AWSSigninRequest, en
creds.ExternalID = aws.String(req.ExternalID)
}
})
stsCredentials, err := stscreds.NewCredentials(session, req.Identity.RouteToApp.AWSRoleARN, options...).Get()
stsCredentials, err := stsutils.NewCredentialsV1(session, req.Identity.RouteToApp.AWSRoleARN, options...).Get()
if err != nil {
return "", trace.Wrap(err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

package aws
package awsfips

import (
"os"
Expand All @@ -27,8 +27,8 @@ import (
// Either "yes" or a "truthy" value (as defined by [strconv.ParseBool]) are
// considered true.
//
// Prefer using specific functions, such as those in the
// lib/utils/aws/stsutils or lib/utils/aws/dynamodbutils packages.
// Prefer using specific functions, such as those in lib/utils/aws/*
// subpackages.
func IsFIPSDisabledByEnv() bool {
const envVar = "TELEPORT_UNSTABLE_DISABLE_AWS_FIPS"

Expand Down
3 changes: 2 additions & 1 deletion lib/utils/aws/credentials.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import (

"github.com/gravitational/teleport/lib/modules"
"github.com/gravitational/teleport/lib/utils"
"github.com/gravitational/teleport/lib/utils/aws/stsutils"
)

// GetCredentialsRequest is the request for obtaining STS credentials.
Expand Down Expand Up @@ -72,7 +73,7 @@ func NewCredentialsGetter() CredentialsGetter {
// Get obtains STS credentials.
func (g *credentialsGetter) Get(_ context.Context, request GetCredentialsRequest) (*credentials.Credentials, error) {
logrus.Debugf("Creating STS session %q for %q.", request.SessionName, request.RoleARN)
return stscreds.NewCredentials(request.Provider, request.RoleARN,
return stsutils.NewCredentialsV1(request.Provider, request.RoleARN,
func(cred *stscreds.AssumeRoleProvider) {
cred.RoleSessionName = MaybeHashRoleSessionName(request.SessionName)
cred.Expiry.SetExpiration(request.Expiry, 0)
Expand Down
6 changes: 3 additions & 3 deletions lib/utils/aws/dynamodbutils/dynamo.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ package dynamodbutils

import (
"github.com/gravitational/teleport/lib/modules"
awsutils "github.com/gravitational/teleport/lib/utils/aws"
"github.com/gravitational/teleport/lib/utils/aws/awsfips"
)

// IsFIPSEnabled returns true if FIPS should be enabled for DynamoDB.
// FIPS is enabled is the binary is boring ([modules.Modules.IsBoringBinary])
// and if FIPS is not disabled by the environment
// ([awsutils.IsFIPSDisabledByEnv]).
// ([awsfips.IsFIPSDisabledByEnv]).
func IsFIPSEnabled() bool {
return !awsutils.IsFIPSDisabledByEnv() && modules.GetModules().IsBoringBinary()
return !awsfips.IsFIPSDisabledByEnv() && modules.GetModules().IsBoringBinary()
}
38 changes: 38 additions & 0 deletions lib/utils/aws/iamutils/iam.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Teleport
// Copyright (C) 2025 Gravitational, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

package iamutils

import (
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/iam"

"github.com/gravitational/teleport/lib/utils/aws/awsfips"
)

// NewFromConfig wraps [iam.NewFromConfig] and applies FIPS settings
// according to environment variables.
//
// See [awsfips.IsFIPSDisabledByEnv].
func NewFromConfig(cfg aws.Config, optFns ...func(*iam.Options)) *iam.Client {
if awsfips.IsFIPSDisabledByEnv() {
// append so it overrides any preceding settings.
optFns = append(optFns, func(opts *iam.Options) {
opts.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateDisabled
})
}
return iam.NewFromConfig(cfg, optFns...)
}
Loading

0 comments on commit 1315482

Please sign in to comment.