You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/credential/credential.go

135 lines
3.7 KiB

// Package credential defines interfaces shared by other packages that
// manage credentials for Boundary sessions.
package credential
import (
"context"
"github.com/hashicorp/boundary/internal/boundary"
)
// Domain defines the domain for the credential package.
const Domain = "credential"
// A Store is a resource that can store, retrieve, and potentially generate
// credentials of differing types and access levels. It belongs to a scope
// and must support the principle of least privilege by providing
// mechanisms to limit the credentials it can access to the minimum
// necessary for the scope it is in.
type Store interface {
boundary.Resource
GetScopeId() string
}
// Type is the type of credential provided by a library.
type Type string
// Credential type values.
const (
UnspecifiedType Type = "unspecified"
UsernamePasswordType Type = "username_password"
SshPrivateKeyType Type = "ssh_private_key"
)
// A Library is a resource that provides credentials that are of the same
// type and access level from a single store.
type Library interface {
boundary.Resource
GetStoreId() string
CredentialType() Type
}
// Purpose is the purpose of the credential.
type Purpose string
func (p Purpose) String() string {
return string(p)
}
// Credential purpose values.
const (
// BrokeredPurpose is a credential used for brokering specific
// purposes. Brokered credentials are returned to the user.
BrokeredPurpose Purpose = "brokered"
// InjectedApplicationPurpose is a credential used by a boundary
// worker to secure the connection between the worker and the endpoint.
// Injected Application credentials are never returned to the user.
InjectedApplicationPurpose Purpose = "injected_application"
)
// ValidPurposes are the set of all credential Purposes.
var ValidPurposes = []Purpose{
BrokeredPurpose,
InjectedApplicationPurpose,
}
// SecretData represents secret data.
type SecretData interface{}
// Credential is an entity containing secret data.
type Credential interface {
boundary.Entity
Secret() SecretData
}
// Dynamic is a credential generated by a library for a specific session.
type Dynamic interface {
Credential
GetSessionId() string
Library() Library
Purpose() Purpose
}
// Static is a static credential that is stored directly in a credential store.
type Static interface {
boundary.Resource
GetStoreId() string
}
// A Request represents a request for a credential from the SourceId for
// the given purpose. For dynamic credentials, the SourceId is the PublicId
// of a credential library.
type Request struct {
SourceId string
Purpose Purpose
}
// Issuer issues dynamic credentials.
type Issuer interface {
// Issue issues dynamic credentials for a session from the requested
// libraries and for the requested purposes. The sessionId must be a
// valid sessionId. The SourceId in each request must be the public id
// of a library the Issuer can issue credentials from.
//
// If Issue encounters an error, it returns no credentials and revokes
// any credentials issued before encountering the error.
Issue(ctx context.Context, sessionId string, requests []Request) ([]Dynamic, error)
}
// Revoker revokes dynamic credentials.
type Revoker interface {
// Revoke revokes the dynamic credentials issued for sessionid.
Revoke(ctx context.Context, sessionId string) error
}
// Password represents a secret password.
type Password string
// PrivateKey represents a secret private key.
type PrivateKey []byte
// UsernamePassword is a credential containing a username and a password.
type UsernamePassword interface {
Credential
Username() string
Password() Password
}
// SshPrivateKey is a credential containing a username and a SSH private key.
type SshPrivateKey interface {
Credential
Username() string
PrivateKey() PrivateKey
}