mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-20 22:33:53 -08:00
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package ecr
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"strings"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
|
|
|
"github.com/knqyf263/fanal/extractor/docker"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
"github.com/aws/aws-sdk-go/service/ecr"
|
|
"github.com/aws/aws-sdk-go/service/ecr/ecriface"
|
|
"golang.org/x/xerrors"
|
|
)
|
|
|
|
const ecrURL = "amazonaws.com"
|
|
|
|
func init() {
|
|
docker.RegisterRegistry(&ECR{})
|
|
}
|
|
|
|
type ECR struct {
|
|
Client ecriface.ECRAPI
|
|
}
|
|
|
|
func getSession(option docker.DockerOption) (*session.Session, error) {
|
|
// create custom credential information if option is valid
|
|
if option.AwsSecretKey != "" && option.AwsAccessKey != "" && option.AwsRegion != "" {
|
|
return session.NewSessionWithOptions(
|
|
session.Options{
|
|
Config: aws.Config{
|
|
Region: aws.String(option.AwsRegion),
|
|
Credentials: credentials.NewStaticCredentialsFromCreds(
|
|
credentials.Value{
|
|
AccessKeyID: option.AwsAccessKey,
|
|
SecretAccessKey: option.AwsSecretKey,
|
|
},
|
|
),
|
|
},
|
|
})
|
|
}
|
|
// use shared configuration normally
|
|
return session.NewSessionWithOptions(session.Options{
|
|
SharedConfigState: session.SharedConfigEnable,
|
|
})
|
|
}
|
|
|
|
func (e *ECR) CheckOptions(domain string, option docker.DockerOption) error {
|
|
if !strings.HasSuffix(domain, ecrURL) {
|
|
return xerrors.New("invalid ECR url pattern")
|
|
}
|
|
sess := session.Must(getSession(option))
|
|
svc := ecr.New(sess)
|
|
e.Client = svc
|
|
return nil
|
|
}
|
|
|
|
func (e *ECR) GetCredential(ctx context.Context) (username, password string, err error) {
|
|
input := &ecr.GetAuthorizationTokenInput{}
|
|
result, err := e.Client.GetAuthorizationTokenWithContext(ctx, input)
|
|
if err != nil {
|
|
return "", "", xerrors.Errorf("failed to get authorization token: %w", err)
|
|
}
|
|
for _, data := range result.AuthorizationData {
|
|
b, err := base64.StdEncoding.DecodeString(*data.AuthorizationToken)
|
|
if err != nil {
|
|
return "", "", xerrors.Errorf("base64 decode failed: %w", err)
|
|
}
|
|
// e.g. AWS:eyJwYXlsb2...
|
|
split := strings.SplitN(string(b), ":", 2)
|
|
if len(split) == 2 {
|
|
return split[0], split[1], nil
|
|
}
|
|
}
|
|
return "", "", nil
|
|
}
|