common/aws.go (57 lines of code) (raw):

package common import ( "context" "errors" "fmt" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/securityhub" shTypes "github.com/aws/aws-sdk-go-v2/service/securityhub/types" "github.com/aws/aws-sdk-go-v2/service/sts" ) func validateCredentials(ctx context.Context, stsClient *sts.Client, profile string) (*sts.GetCallerIdentityOutput, error) { resp, err := stsClient.GetCallerIdentity(ctx, &sts.GetCallerIdentityInput{}) if err != nil { return resp, errors.New("Could not find valid credentials for profile: " + profile) } return resp, nil } func LoadDefaultConfig(ctx context.Context, profile string, region string) (aws.Config, error) { cfg, err := config.LoadDefaultConfig(ctx, config.WithSharedConfigProfile(profile), config.WithDefaultRegion(region)) if err != nil { fmt.Println("Error loading configuration") return cfg, err } stsClient := sts.NewFromConfig(cfg) _, err = validateCredentials(ctx, stsClient, profile) if err != nil { return cfg, err } return cfg, nil } func ReturnFindings(ctx context.Context, securityHubClient *securityhub.Client, controlId string, maxResults int32) (*securityhub.GetFindingsOutput, error) { complianceStatus := "PASSED" recordState := "ACTIVE" fmt.Printf("Retrieving Security Hub control failures for %s\n", controlId) findings, err := securityHubClient.GetFindings(ctx, &securityhub.GetFindingsInput{ MaxResults: &maxResults, Filters: &shTypes.AwsSecurityFindingFilters{ ComplianceSecurityControlId: []shTypes.StringFilter{{ Value: &controlId, Comparison: shTypes.StringFilterComparisonEquals, }}, ComplianceStatus: []shTypes.StringFilter{{ Value: &complianceStatus, Comparison: shTypes.StringFilterComparisonNotEquals, }}, RecordState: []shTypes.StringFilter{{ Value: &recordState, Comparison: shTypes.StringFilterComparisonEquals, }}, }, }) if err != nil { return nil, err } return findings, nil }