package aws import ( "sync" "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/vault/helper/salt" "github.com/hashicorp/vault/logical" "github.com/hashicorp/vault/logical/framework" ) func Factory(conf *logical.BackendConfig) (logical.Backend, error) { b, err := Backend(conf) if err != nil { return nil, err } return b.Setup(conf) } func Backend(conf *logical.BackendConfig) (*framework.Backend, error) { salt, err := salt.NewSalt(conf.StorageView, &salt.Config{ HashFunc: salt.SHA256Hash, }) if err != nil { return nil, err } var b backend b.Salt = salt b.Backend = &framework.Backend{ Help: backendHelp, PathsSpecial: &logical.Paths{ Unauthenticated: []string{ "login", }, }, Paths: append([]*framework.Path{ pathLogin(&b), pathImage(&b), pathListImages(&b), pathImageTag(&b), pathConfigClient(&b), pathConfigCertificate(&b), pathConfigTidyBlacklistRoleTag(&b), pathConfigTidyWhitelistIdentity(&b), pathListCertificates(&b), pathBlacklistRoleTag(&b), pathListBlacklistRoleTags(&b), pathBlacklistRoleTagTidy(&b), pathWhitelistIdentity(&b), pathWhitelistIdentityTidy(&b), pathListWhitelistIdentities(&b), }), AuthRenew: b.pathLoginRenew, TidyFunc: b.tidyFunc, } b.EC2ClientsMap = make(map[string]*ec2.EC2) return b.Backend, nil } type backend struct { *framework.Backend Salt *salt.Salt configMutex sync.RWMutex EC2ClientsMap map[string]*ec2.EC2 } func (b *backend) tidyFunc(req *logical.Request) error { b.configMutex.Lock() defer b.configMutex.Unlock() // safety_buffer defaults to 72h safety_buffer := 259200 tidyBlacklistConfigEntry, err := configTidyBlacklistRoleTag(req.Storage) if err != nil { return err } skipBlacklistTidy := false if tidyBlacklistConfigEntry != nil { if tidyBlacklistConfigEntry.DisablePeriodicTidy { skipBlacklistTidy = true } safety_buffer = tidyBlacklistConfigEntry.SafetyBuffer } if !skipBlacklistTidy { tidyBlacklistRoleTag(req.Storage, safety_buffer) } // reset the safety_buffer to 72h safety_buffer = 259200 tidyWhitelistConfigEntry, err := configTidyWhitelistIdentity(req.Storage) if err != nil { return err } skipWhitelistTidy := false if tidyWhitelistConfigEntry != nil { if tidyWhitelistConfigEntry.DisablePeriodicTidy { skipWhitelistTidy = true } safety_buffer = tidyWhitelistConfigEntry.SafetyBuffer } if !skipWhitelistTidy { tidyWhitelistIdentity(req.Storage, safety_buffer) } return nil } const backendHelp = ` AWS auth backend takes in a AWS EC2 instance identity document, its PKCS#7 signature and a client created nonce to authenticates the instance with Vault. Authentication is backed by a preconfigured association of AMIs to Vault's policies through 'image/' endpoint. For instances that share an AMI, an instance tag can be created through 'image//tag'. This tag should be attached to the EC2 instance before the instance attempts to login to Vault. `