mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-30 18:17:55 +00:00
Remove old audit behavior from test code (#24540)
* Export audit event * Move older tests away from audit behavior that didn't use eventlogger * spelling--; * no more struct initialization of NoopAudit outside of NewNoopAudit * locking since we're accessing the shared backend
This commit is contained in:
@@ -29,7 +29,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// NewEntryFormatter should be used to create an EntryFormatter.
|
// NewEntryFormatter should be used to create an EntryFormatter.
|
||||||
// Accepted options: WithPrefix.
|
// Accepted options: WithPrefix, WithHeaderFormatter.
|
||||||
func NewEntryFormatter(config FormatterConfig, salter Salter, opt ...Option) (*EntryFormatter, error) {
|
func NewEntryFormatter(config FormatterConfig, salter Salter, opt ...Option) (*EntryFormatter, error) {
|
||||||
const op = "audit.NewEntryFormatter"
|
const op = "audit.NewEntryFormatter"
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ func (f *EntryFormatter) Process(ctx context.Context, e *eventlogger.Event) (*ev
|
|||||||
return nil, fmt.Errorf("%s: event is nil: %w", op, event.ErrInvalidParameter)
|
return nil, fmt.Errorf("%s: event is nil: %w", op, event.ErrInvalidParameter)
|
||||||
}
|
}
|
||||||
|
|
||||||
a, ok := e.Payload.(*auditEvent)
|
a, ok := e.Payload.(*AuditEvent)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("%s: cannot parse event payload: %w", op, event.ErrInvalidParameter)
|
return nil, fmt.Errorf("%s: cannot parse event payload: %w", op, event.ErrInvalidParameter)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
// NewEvent should be used to create an audit event. The subtype field is needed
|
// NewEvent should be used to create an audit event. The subtype field is needed
|
||||||
// for audit events. It will generate an ID if no ID is supplied. Supported
|
// for audit events. It will generate an ID if no ID is supplied. Supported
|
||||||
// options: WithID, WithNow.
|
// options: WithID, WithNow.
|
||||||
func NewEvent(s subtype, opt ...Option) (*auditEvent, error) {
|
func NewEvent(s subtype, opt ...Option) (*AuditEvent, error) {
|
||||||
const op = "audit.newEvent"
|
const op = "audit.newEvent"
|
||||||
|
|
||||||
// Get the default options
|
// Get the default options
|
||||||
@@ -30,7 +30,7 @@ func NewEvent(s subtype, opt ...Option) (*auditEvent, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
audit := &auditEvent{
|
audit := &AuditEvent{
|
||||||
ID: opts.withID,
|
ID: opts.withID,
|
||||||
Timestamp: opts.withNow,
|
Timestamp: opts.withNow,
|
||||||
Version: version,
|
Version: version,
|
||||||
@@ -44,8 +44,8 @@ func NewEvent(s subtype, opt ...Option) (*auditEvent, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// validate attempts to ensure the audit event in its present state is valid.
|
// validate attempts to ensure the audit event in its present state is valid.
|
||||||
func (a *auditEvent) validate() error {
|
func (a *AuditEvent) validate() error {
|
||||||
const op = "audit.(auditEvent).validate"
|
const op = "audit.(AuditEvent).validate"
|
||||||
|
|
||||||
if a == nil {
|
if a == nil {
|
||||||
return fmt.Errorf("%s: event is nil: %w", op, event.ErrInvalidParameter)
|
return fmt.Errorf("%s: event is nil: %w", op, event.ErrInvalidParameter)
|
||||||
|
|||||||
@@ -29,14 +29,14 @@ func TestAuditEvent_new(t *testing.T) {
|
|||||||
Subtype: subtype(""),
|
Subtype: subtype(""),
|
||||||
Format: format(""),
|
Format: format(""),
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.newEvent: audit.(auditEvent).validate: audit.(subtype).validate: '' is not a valid event subtype: invalid parameter",
|
ExpectedErrorMessage: "audit.newEvent: audit.(AuditEvent).validate: audit.(subtype).validate: '' is not a valid event subtype: invalid parameter",
|
||||||
},
|
},
|
||||||
"empty-Option": {
|
"empty-Option": {
|
||||||
Options: []Option{},
|
Options: []Option{},
|
||||||
Subtype: subtype(""),
|
Subtype: subtype(""),
|
||||||
Format: format(""),
|
Format: format(""),
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.newEvent: audit.(auditEvent).validate: audit.(subtype).validate: '' is not a valid event subtype: invalid parameter",
|
ExpectedErrorMessage: "audit.newEvent: audit.(AuditEvent).validate: audit.(subtype).validate: '' is not a valid event subtype: invalid parameter",
|
||||||
},
|
},
|
||||||
"bad-id": {
|
"bad-id": {
|
||||||
Options: []Option{WithID("")},
|
Options: []Option{WithID("")},
|
||||||
@@ -108,22 +108,22 @@ func TestAuditEvent_new(t *testing.T) {
|
|||||||
// TestAuditEvent_Validate exercises the validation for an audit event.
|
// TestAuditEvent_Validate exercises the validation for an audit event.
|
||||||
func TestAuditEvent_Validate(t *testing.T) {
|
func TestAuditEvent_Validate(t *testing.T) {
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
Value *auditEvent
|
Value *AuditEvent
|
||||||
IsErrorExpected bool
|
IsErrorExpected bool
|
||||||
ExpectedErrorMessage string
|
ExpectedErrorMessage string
|
||||||
}{
|
}{
|
||||||
"nil": {
|
"nil": {
|
||||||
Value: nil,
|
Value: nil,
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.(auditEvent).validate: event is nil: invalid parameter",
|
ExpectedErrorMessage: "audit.(AuditEvent).validate: event is nil: invalid parameter",
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
Value: &auditEvent{},
|
Value: &AuditEvent{},
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.(auditEvent).validate: missing ID: invalid parameter",
|
ExpectedErrorMessage: "audit.(AuditEvent).validate: missing ID: invalid parameter",
|
||||||
},
|
},
|
||||||
"id-empty": {
|
"id-empty": {
|
||||||
Value: &auditEvent{
|
Value: &AuditEvent{
|
||||||
ID: "",
|
ID: "",
|
||||||
Version: version,
|
Version: version,
|
||||||
Subtype: RequestType,
|
Subtype: RequestType,
|
||||||
@@ -131,10 +131,10 @@ func TestAuditEvent_Validate(t *testing.T) {
|
|||||||
Data: nil,
|
Data: nil,
|
||||||
},
|
},
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.(auditEvent).validate: missing ID: invalid parameter",
|
ExpectedErrorMessage: "audit.(AuditEvent).validate: missing ID: invalid parameter",
|
||||||
},
|
},
|
||||||
"version-fiddled": {
|
"version-fiddled": {
|
||||||
Value: &auditEvent{
|
Value: &AuditEvent{
|
||||||
ID: "audit_123",
|
ID: "audit_123",
|
||||||
Version: "magic-v2",
|
Version: "magic-v2",
|
||||||
Subtype: RequestType,
|
Subtype: RequestType,
|
||||||
@@ -142,10 +142,10 @@ func TestAuditEvent_Validate(t *testing.T) {
|
|||||||
Data: nil,
|
Data: nil,
|
||||||
},
|
},
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.(auditEvent).validate: event version unsupported: invalid parameter",
|
ExpectedErrorMessage: "audit.(AuditEvent).validate: event version unsupported: invalid parameter",
|
||||||
},
|
},
|
||||||
"subtype-fiddled": {
|
"subtype-fiddled": {
|
||||||
Value: &auditEvent{
|
Value: &AuditEvent{
|
||||||
ID: "audit_123",
|
ID: "audit_123",
|
||||||
Version: version,
|
Version: version,
|
||||||
Subtype: subtype("moon"),
|
Subtype: subtype("moon"),
|
||||||
@@ -153,10 +153,10 @@ func TestAuditEvent_Validate(t *testing.T) {
|
|||||||
Data: nil,
|
Data: nil,
|
||||||
},
|
},
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.(auditEvent).validate: audit.(subtype).validate: 'moon' is not a valid event subtype: invalid parameter",
|
ExpectedErrorMessage: "audit.(AuditEvent).validate: audit.(subtype).validate: 'moon' is not a valid event subtype: invalid parameter",
|
||||||
},
|
},
|
||||||
"default-time": {
|
"default-time": {
|
||||||
Value: &auditEvent{
|
Value: &AuditEvent{
|
||||||
ID: "audit_123",
|
ID: "audit_123",
|
||||||
Version: version,
|
Version: version,
|
||||||
Subtype: ResponseType,
|
Subtype: ResponseType,
|
||||||
@@ -164,10 +164,10 @@ func TestAuditEvent_Validate(t *testing.T) {
|
|||||||
Data: nil,
|
Data: nil,
|
||||||
},
|
},
|
||||||
IsErrorExpected: true,
|
IsErrorExpected: true,
|
||||||
ExpectedErrorMessage: "audit.(auditEvent).validate: event timestamp cannot be the zero time instant: invalid parameter",
|
ExpectedErrorMessage: "audit.(AuditEvent).validate: event timestamp cannot be the zero time instant: invalid parameter",
|
||||||
},
|
},
|
||||||
"valid": {
|
"valid": {
|
||||||
Value: &auditEvent{
|
Value: &AuditEvent{
|
||||||
ID: "audit_123",
|
ID: "audit_123",
|
||||||
Version: version,
|
Version: version,
|
||||||
Subtype: ResponseType,
|
Subtype: ResponseType,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// SinkWrapper is a wrapper for any kind of Sink Node that processes events
|
// SinkWrapper is a wrapper for any kind of Sink Node that processes events
|
||||||
// containing an auditEvent payload.
|
// containing an AuditEvent payload.
|
||||||
type SinkWrapper struct {
|
type SinkWrapper struct {
|
||||||
Name string
|
Name string
|
||||||
Sink eventlogger.Node
|
Sink eventlogger.Node
|
||||||
@@ -23,7 +23,7 @@ type SinkWrapper struct {
|
|||||||
// once this method returns.
|
// once this method returns.
|
||||||
func (s *SinkWrapper) Process(ctx context.Context, e *eventlogger.Event) (*eventlogger.Event, error) {
|
func (s *SinkWrapper) Process(ctx context.Context, e *eventlogger.Event) (*eventlogger.Event, error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
auditEvent, ok := e.Payload.(*auditEvent)
|
auditEvent, ok := e.Payload.(*AuditEvent)
|
||||||
if ok {
|
if ok {
|
||||||
metrics.MeasureSince([]string{"audit", s.Name, auditEvent.Subtype.MetricTag()}, e.CreatedAt)
|
metrics.MeasureSince([]string{"audit", s.Name, auditEvent.Subtype.MetricTag()}, e.CreatedAt)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ type subtype string
|
|||||||
// format defines types of format audit events support.
|
// format defines types of format audit events support.
|
||||||
type format string
|
type format string
|
||||||
|
|
||||||
// auditEvent is the audit event.
|
// AuditEvent is the audit event.
|
||||||
type auditEvent struct {
|
type AuditEvent struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Version string `json:"version"`
|
Version string `json:"version"`
|
||||||
Subtype subtype `json:"subtype"` // the subtype of the audit event.
|
Subtype subtype `json:"subtype"` // the subtype of the audit event.
|
||||||
|
|||||||
@@ -6,9 +6,10 @@
|
|||||||
package corehelpers
|
package corehelpers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"context"
|
"context"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
@@ -29,6 +30,11 @@ import (
|
|||||||
"github.com/mitchellh/go-testing-interface"
|
"github.com/mitchellh/go-testing-interface"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ audit.Backend = (*NoopAudit)(nil)
|
||||||
|
_ eventlogger.Node = (*noopWrapper)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
var externalPlugins = []string{"transform", "kmip", "keymgmt"}
|
var externalPlugins = []string{"transform", "kmip", "keymgmt"}
|
||||||
|
|
||||||
// RetryUntil runs f until it returns a nil result or the timeout is reached.
|
// RetryUntil runs f until it returns a nil result or the timeout is reached.
|
||||||
@@ -210,52 +216,51 @@ func (m *mockBuiltinRegistry) DeprecationStatus(name string, pluginType consts.P
|
|||||||
return consts.Unknown, false
|
return consts.Unknown, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNoopAudit(t testing.T, config map[string]string) *NoopAudit {
|
func TestNoopAudit(t testing.T, path string, config map[string]string, opts ...audit.Option) *NoopAudit {
|
||||||
n, err := NewNoopAudit(config)
|
cfg := &audit.BackendConfig{Config: config, MountPath: path}
|
||||||
|
n, err := NewNoopAudit(cfg, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewNoopAudit(config map[string]string) (*NoopAudit, error) {
|
// NewNoopAudit should be used to create a NoopAudit as it handles creation of a
|
||||||
|
// predictable salt and wraps eventlogger nodes so information can be retrieved on
|
||||||
|
// what they've seen or formatted.
|
||||||
|
func NewNoopAudit(config *audit.BackendConfig, opts ...audit.Option) (*NoopAudit, error) {
|
||||||
view := &logical.InmemStorage{}
|
view := &logical.InmemStorage{}
|
||||||
err := view.Put(context.Background(), &logical.StorageEntry{
|
|
||||||
Key: "salt",
|
// Create the salt with a known key for predictable hmac values.
|
||||||
Value: []byte("foo"),
|
se := &logical.StorageEntry{Key: "salt", Value: []byte("foo")}
|
||||||
})
|
err := view.Put(context.Background(), se)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
n := &NoopAudit{
|
// Override the salt related config settings.
|
||||||
Config: &audit.BackendConfig{
|
backendConfig := &audit.BackendConfig{
|
||||||
SaltView: view,
|
SaltView: view,
|
||||||
SaltConfig: &salt.Config{
|
SaltConfig: &salt.Config{
|
||||||
HMAC: sha256.New,
|
HMAC: sha256.New,
|
||||||
HMACType: "hmac-sha256",
|
HMACType: "hmac-sha256",
|
||||||
},
|
|
||||||
Config: config,
|
|
||||||
},
|
},
|
||||||
|
Config: config.Config,
|
||||||
|
MountPath: config.MountPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
n := &NoopAudit{Config: backendConfig}
|
||||||
|
|
||||||
cfg, err := audit.NewFormatterConfig()
|
cfg, err := audit.NewFormatterConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := audit.NewEntryFormatter(cfg, n)
|
f, err := audit.NewEntryFormatter(cfg, n, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error creating formatter: %w", err)
|
return nil, fmt.Errorf("error creating formatter: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fw, err := audit.NewEntryFormatterWriter(cfg, f, &audit.JSONWriter{})
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("error creating formatter writer: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
n.formatter = fw
|
|
||||||
|
|
||||||
n.nodeIDList = make([]eventlogger.NodeID, 2)
|
n.nodeIDList = make([]eventlogger.NodeID, 2)
|
||||||
n.nodeMap = make(map[eventlogger.NodeID]eventlogger.Node, 2)
|
n.nodeMap = make(map[eventlogger.NodeID]eventlogger.Node, 2)
|
||||||
|
|
||||||
@@ -264,8 +269,11 @@ func NewNoopAudit(config map[string]string) (*NoopAudit, error) {
|
|||||||
return nil, fmt.Errorf("error generating random NodeID for formatter node: %w", err)
|
return nil, fmt.Errorf("error generating random NodeID for formatter node: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wrap the formatting node, so we can get any bytes that were formatted etc.
|
||||||
|
wrappedFormatter := &noopWrapper{format: "json", node: f, backend: n}
|
||||||
|
|
||||||
n.nodeIDList[0] = formatterNodeID
|
n.nodeIDList[0] = formatterNodeID
|
||||||
n.nodeMap[formatterNodeID] = f
|
n.nodeMap[formatterNodeID] = wrappedFormatter
|
||||||
|
|
||||||
sinkNode := event.NewNoopSink()
|
sinkNode := event.NewNoopSink()
|
||||||
sinkNodeID, err := event.GenerateNodeID()
|
sinkNodeID, err := event.GenerateNodeID()
|
||||||
@@ -279,9 +287,12 @@ func NewNoopAudit(config map[string]string) (*NoopAudit, error) {
|
|||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NoopAuditFactory should be used when the test needs a way to access bytes that
|
||||||
|
// have been formatted by the pipeline during audit requests.
|
||||||
|
// The records parameter will be repointed to the one used within the pipeline.
|
||||||
func NoopAuditFactory(records **[][]byte) audit.Factory {
|
func NoopAuditFactory(records **[][]byte) audit.Factory {
|
||||||
return func(_ context.Context, config *audit.BackendConfig, _ bool, _ audit.HeaderFormatter) (audit.Backend, error) {
|
return func(_ context.Context, config *audit.BackendConfig, _ bool, headerFormatter audit.HeaderFormatter) (audit.Backend, error) {
|
||||||
n, err := NewNoopAudit(config.Config)
|
n, err := NewNoopAudit(config, audit.WithHeaderFormatter(headerFormatter))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -293,8 +304,19 @@ func NoopAuditFactory(records **[][]byte) audit.Factory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// noopWrapper is designed to wrap a formatter node in order to allow access to
|
||||||
|
// bytes formatted, headers formatted and parts of the logical.LogInput.
|
||||||
|
// Some older tests relied on being able to query this information so while those
|
||||||
|
// tests stick around we should look after them.
|
||||||
|
type noopWrapper struct {
|
||||||
|
format string
|
||||||
|
node eventlogger.Node
|
||||||
|
backend *NoopAudit
|
||||||
|
}
|
||||||
|
|
||||||
type NoopAudit struct {
|
type NoopAudit struct {
|
||||||
Config *audit.BackendConfig
|
Config *audit.BackendConfig
|
||||||
|
|
||||||
ReqErr error
|
ReqErr error
|
||||||
ReqAuth []*logical.Auth
|
ReqAuth []*logical.Auth
|
||||||
Req []*logical.Request
|
Req []*logical.Request
|
||||||
@@ -309,81 +331,164 @@ type NoopAudit struct {
|
|||||||
RespNonHMACKeys [][]string
|
RespNonHMACKeys [][]string
|
||||||
RespReqNonHMACKeys [][]string
|
RespReqNonHMACKeys [][]string
|
||||||
RespErrs []error
|
RespErrs []error
|
||||||
|
records [][]byte
|
||||||
formatter *audit.EntryFormatterWriter
|
l sync.RWMutex
|
||||||
records [][]byte
|
salt *salt.Salt
|
||||||
l sync.RWMutex
|
saltMutex sync.RWMutex
|
||||||
salt *salt.Salt
|
|
||||||
saltMutex sync.RWMutex
|
|
||||||
|
|
||||||
nodeIDList []eventlogger.NodeID
|
nodeIDList []eventlogger.NodeID
|
||||||
nodeMap map[eventlogger.NodeID]eventlogger.Node
|
nodeMap map[eventlogger.NodeID]eventlogger.Node
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Process handles the contortions required by older test code to ensure behavior.
|
||||||
|
// It will attempt to do some pre/post processing of the logical.LogInput that should
|
||||||
|
// form part of the event's payload data, as well as capturing the resulting headers
|
||||||
|
// that were formatted and track the overall bytes that a formatted event uses when
|
||||||
|
// it's ready to head down the pipeline to the sink node (a noop for us).
|
||||||
|
func (n *noopWrapper) Process(ctx context.Context, e *eventlogger.Event) (*eventlogger.Event, error) {
|
||||||
|
n.backend.l.Lock()
|
||||||
|
defer n.backend.l.Unlock()
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
// We're expecting audit events since this is an audit device.
|
||||||
|
a, ok := e.Payload.(*audit.AuditEvent)
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.New("cannot parse payload as an audit event")
|
||||||
|
}
|
||||||
|
|
||||||
|
in := a.Data
|
||||||
|
|
||||||
|
// Depending on the type of the audit event (request or response) we need to
|
||||||
|
// track different things.
|
||||||
|
switch a.Subtype {
|
||||||
|
case audit.RequestType:
|
||||||
|
n.backend.ReqAuth = append(n.backend.ReqAuth, in.Auth)
|
||||||
|
n.backend.Req = append(n.backend.Req, in.Request)
|
||||||
|
n.backend.ReqNonHMACKeys = in.NonHMACReqDataKeys
|
||||||
|
n.backend.ReqErrs = append(n.backend.ReqErrs, in.OuterErr)
|
||||||
|
|
||||||
|
if n.backend.ReqErr != nil {
|
||||||
|
return nil, n.backend.ReqErr
|
||||||
|
}
|
||||||
|
case audit.ResponseType:
|
||||||
|
n.backend.RespAuth = append(n.backend.RespAuth, in.Auth)
|
||||||
|
n.backend.RespReq = append(n.backend.RespReq, in.Request)
|
||||||
|
n.backend.Resp = append(n.backend.Resp, in.Response)
|
||||||
|
n.backend.RespErrs = append(n.backend.RespErrs, in.OuterErr)
|
||||||
|
|
||||||
|
if in.Response != nil {
|
||||||
|
n.backend.RespNonHMACKeys = append(n.backend.RespNonHMACKeys, in.NonHMACRespDataKeys)
|
||||||
|
n.backend.RespReqNonHMACKeys = append(n.backend.RespReqNonHMACKeys, in.NonHMACReqDataKeys)
|
||||||
|
}
|
||||||
|
|
||||||
|
if n.backend.RespErr != nil {
|
||||||
|
return nil, n.backend.RespErr
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown audit event type: %q", a.Subtype)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Once we've taken note of the relevant properties of the event, we get the
|
||||||
|
// underlying (wrapped) node to process it as normal.
|
||||||
|
e, err = n.node.Process(ctx, e)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error processing wrapped node: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Once processing has been carried out, the underlying node (a formatter node)
|
||||||
|
// should contain the output ready for the sink node. We'll get that in order
|
||||||
|
// to track how many bytes we formatted.
|
||||||
|
b, ok := e.Format(n.format)
|
||||||
|
if ok {
|
||||||
|
n.backend.records = append(n.backend.records, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, the last bit of post-processing is to make sure that we track the
|
||||||
|
// formatted headers that would have made it to the logs via the sink node.
|
||||||
|
// They only appear in requests.
|
||||||
|
if a.Subtype == audit.RequestType {
|
||||||
|
reqEntry := &audit.RequestEntry{}
|
||||||
|
err = json.Unmarshal(b, &reqEntry)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to parse formatted audit entry data: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
n.backend.ReqHeaders = append(n.backend.ReqHeaders, reqEntry.Request.Headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the event and no error in order to let the pipeline continue on.
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *noopWrapper) Reopen() error {
|
||||||
|
return n.node.Reopen()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *noopWrapper) Type() eventlogger.NodeType {
|
||||||
|
return n.node.Type()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: use eventlogger.
|
||||||
func (n *NoopAudit) LogRequest(ctx context.Context, in *logical.LogInput) error {
|
func (n *NoopAudit) LogRequest(ctx context.Context, in *logical.LogInput) error {
|
||||||
n.l.Lock()
|
return nil
|
||||||
defer n.l.Unlock()
|
|
||||||
|
|
||||||
if n.formatter != nil {
|
|
||||||
var w bytes.Buffer
|
|
||||||
err := n.formatter.FormatAndWriteRequest(ctx, &w, in)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
n.records = append(n.records, w.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
n.ReqAuth = append(n.ReqAuth, in.Auth)
|
|
||||||
n.Req = append(n.Req, in.Request)
|
|
||||||
n.ReqHeaders = append(n.ReqHeaders, in.Request.Headers)
|
|
||||||
n.ReqNonHMACKeys = in.NonHMACReqDataKeys
|
|
||||||
n.ReqErrs = append(n.ReqErrs, in.OuterErr)
|
|
||||||
|
|
||||||
return n.ReqErr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: use eventlogger.
|
||||||
func (n *NoopAudit) LogResponse(ctx context.Context, in *logical.LogInput) error {
|
func (n *NoopAudit) LogResponse(ctx context.Context, in *logical.LogInput) error {
|
||||||
n.l.Lock()
|
return nil
|
||||||
defer n.l.Unlock()
|
|
||||||
|
|
||||||
if n.formatter != nil {
|
|
||||||
var w bytes.Buffer
|
|
||||||
err := n.formatter.FormatAndWriteResponse(ctx, &w, in)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
n.records = append(n.records, w.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
n.RespAuth = append(n.RespAuth, in.Auth)
|
|
||||||
n.RespReq = append(n.RespReq, in.Request)
|
|
||||||
n.Resp = append(n.Resp, in.Response)
|
|
||||||
n.RespErrs = append(n.RespErrs, in.OuterErr)
|
|
||||||
|
|
||||||
if in.Response != nil {
|
|
||||||
n.RespNonHMACKeys = append(n.RespNonHMACKeys, in.NonHMACRespDataKeys)
|
|
||||||
n.RespReqNonHMACKeys = append(n.RespReqNonHMACKeys, in.NonHMACReqDataKeys)
|
|
||||||
}
|
|
||||||
|
|
||||||
return n.RespErr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LogTestMessage will manually crank the handle on the nodes associated with this backend.
|
||||||
func (n *NoopAudit) LogTestMessage(ctx context.Context, in *logical.LogInput, config map[string]string) error {
|
func (n *NoopAudit) LogTestMessage(ctx context.Context, in *logical.LogInput, config map[string]string) error {
|
||||||
n.l.Lock()
|
n.l.Lock()
|
||||||
defer n.l.Unlock()
|
defer n.l.Unlock()
|
||||||
var w bytes.Buffer
|
|
||||||
|
|
||||||
tempFormatter, err := audit.NewTemporaryFormatter(config["format"], config["prefix"])
|
// Fake event for test purposes.
|
||||||
if err != nil {
|
e := &eventlogger.Event{
|
||||||
return err
|
Type: eventlogger.EventType(event.AuditType.String()),
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
Formatted: make(map[string][]byte),
|
||||||
|
Payload: in,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tempFormatter.FormatAndWriteResponse(ctx, &w, in)
|
// Try to get the required format from config and default to JSON.
|
||||||
if err != nil {
|
format, ok := config["format"]
|
||||||
return err
|
if !ok {
|
||||||
|
format = "json"
|
||||||
}
|
}
|
||||||
|
cfg, err := audit.NewFormatterConfig(audit.WithFormat(format))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot create config for formatter node: %w", err)
|
||||||
|
}
|
||||||
|
// Create a temporary formatter node for reuse.
|
||||||
|
f, err := audit.NewEntryFormatter(cfg, n, audit.WithPrefix(config["prefix"]))
|
||||||
|
|
||||||
n.records = append(n.records, w.Bytes())
|
// Go over each node in order from our list.
|
||||||
|
for _, id := range n.nodeIDList {
|
||||||
|
node, ok := n.nodeMap[id]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("node not found: %v", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch node.Type() {
|
||||||
|
case eventlogger.NodeTypeFormatter:
|
||||||
|
// Use a temporary formatter node which doesn't persist its salt anywhere.
|
||||||
|
if formatNode, ok := node.(*audit.EntryFormatter); ok && formatNode != nil {
|
||||||
|
e, err = f.Process(ctx, e)
|
||||||
|
|
||||||
|
// Housekeeping, we should update that we processed some bytes.
|
||||||
|
if e != nil {
|
||||||
|
b, ok := e.Format(format)
|
||||||
|
if ok {
|
||||||
|
n.records = append(n.records, b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
e, err = node.Process(ctx, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -569,10 +569,8 @@ func TestLogical_RespondWithStatusCode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLogical_Audit_invalidWrappingToken(t *testing.T) {
|
func TestLogical_Audit_invalidWrappingToken(t *testing.T) {
|
||||||
t.Setenv("VAULT_AUDIT_DISABLE_EVENTLOGGER", "true")
|
|
||||||
|
|
||||||
// Create a noop audit backend
|
// Create a noop audit backend
|
||||||
noop := corehelpers.TestNoopAudit(t, nil)
|
noop := corehelpers.TestNoopAudit(t, "noop", nil)
|
||||||
c, _, root := vault.TestCoreUnsealedWithConfig(t, &vault.CoreConfig{
|
c, _, root := vault.TestCoreUnsealedWithConfig(t, &vault.CoreConfig{
|
||||||
AuditBackends: map[string]audit.Factory{
|
AuditBackends: map[string]audit.Factory{
|
||||||
"noop": func(ctx context.Context, config *audit.BackendConfig, _ bool, _ audit.HeaderFormatter) (audit.Backend, error) {
|
"noop": func(ctx context.Context, config *audit.BackendConfig, _ bool, _ audit.HeaderFormatter) (audit.Backend, error) {
|
||||||
@@ -584,7 +582,6 @@ func TestLogical_Audit_invalidWrappingToken(t *testing.T) {
|
|||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
// Enable the audit backend
|
// Enable the audit backend
|
||||||
|
|
||||||
resp := testHttpPost(t, root, addr+"/v1/sys/audit/noop", map[string]interface{}{
|
resp := testHttpPost(t, root, addr+"/v1/sys/audit/noop", map[string]interface{}{
|
||||||
"type": "noop",
|
"type": "noop",
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -247,8 +247,6 @@ func testServerWithAudit(t *testing.T, records **[][]byte) (net.Listener, string
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSysGenerateRoot_badKey(t *testing.T) {
|
func TestSysGenerateRoot_badKey(t *testing.T) {
|
||||||
t.Setenv("VAULT_AUDIT_DISABLE_EVENTLOGGER", "true")
|
|
||||||
|
|
||||||
var records *[][]byte
|
var records *[][]byte
|
||||||
ln, addr, token, _ := testServerWithAudit(t, &records)
|
ln, addr, token, _ := testServerWithAudit(t, &records)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/hashicorp/vault/helper/testhelpers/corehelpers"
|
"github.com/hashicorp/vault/helper/testhelpers/corehelpers"
|
||||||
|
|
||||||
"github.com/hashicorp/errwrap"
|
"github.com/hashicorp/errwrap"
|
||||||
@@ -340,14 +342,16 @@ func verifyDefaultAuditTable(t *testing.T, table *MountTable) {
|
|||||||
|
|
||||||
func TestAuditBroker_LogRequest(t *testing.T) {
|
func TestAuditBroker_LogRequest(t *testing.T) {
|
||||||
l := logging.NewVaultLogger(log.Trace)
|
l := logging.NewVaultLogger(log.Trace)
|
||||||
b, err := NewAuditBroker(l, false)
|
b, err := NewAuditBroker(l, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
a1 := corehelpers.TestNoopAudit(t, nil)
|
a1 := corehelpers.TestNoopAudit(t, "foo", nil)
|
||||||
a2 := corehelpers.TestNoopAudit(t, nil)
|
a2 := corehelpers.TestNoopAudit(t, "bar", nil)
|
||||||
b.Register("foo", a1, false)
|
err = b.Register("foo", a1, false)
|
||||||
b.Register("bar", a2, false)
|
require.NoError(t, err)
|
||||||
|
err = b.Register("bar", a2, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
auth := &logical.Auth{
|
auth := &logical.Auth{
|
||||||
ClientToken: "foo",
|
ClientToken: "foo",
|
||||||
@@ -423,21 +427,23 @@ func TestAuditBroker_LogRequest(t *testing.T) {
|
|||||||
|
|
||||||
// Should FAIL work with both failing backends
|
// Should FAIL work with both failing backends
|
||||||
a2.ReqErr = fmt.Errorf("failed")
|
a2.ReqErr = fmt.Errorf("failed")
|
||||||
if err := b.LogRequest(ctx, logInput, headersConf); !errwrap.Contains(err, "no audit backend succeeded in logging the request") {
|
if err := b.LogRequest(ctx, logInput, headersConf); !errwrap.Contains(err, "event not processed by enough 'sink' nodes") {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAuditBroker_LogResponse(t *testing.T) {
|
func TestAuditBroker_LogResponse(t *testing.T) {
|
||||||
l := logging.NewVaultLogger(log.Trace)
|
l := logging.NewVaultLogger(log.Trace)
|
||||||
b, err := NewAuditBroker(l, false)
|
b, err := NewAuditBroker(l, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
a1 := corehelpers.TestNoopAudit(t, nil)
|
a1 := corehelpers.TestNoopAudit(t, "foo", nil)
|
||||||
a2 := corehelpers.TestNoopAudit(t, nil)
|
a2 := corehelpers.TestNoopAudit(t, "bar", nil)
|
||||||
b.Register("foo", a1, false)
|
err = b.Register("foo", a1, false)
|
||||||
b.Register("bar", a2, false)
|
require.NoError(t, err)
|
||||||
|
err = b.Register("bar", a2, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
auth := &logical.Auth{
|
auth := &logical.Auth{
|
||||||
NumUses: 10,
|
NumUses: 10,
|
||||||
@@ -531,23 +537,36 @@ func TestAuditBroker_LogResponse(t *testing.T) {
|
|||||||
// Should FAIL work with both failing backends
|
// Should FAIL work with both failing backends
|
||||||
a2.RespErr = fmt.Errorf("failed")
|
a2.RespErr = fmt.Errorf("failed")
|
||||||
err = b.LogResponse(ctx, logInput, headersConf)
|
err = b.LogResponse(ctx, logInput, headersConf)
|
||||||
if !strings.Contains(err.Error(), "no audit backend succeeded in logging the response") {
|
if !strings.Contains(err.Error(), "event not processed by enough 'sink' nodes") {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAuditBroker_AuditHeaders(t *testing.T) {
|
func TestAuditBroker_AuditHeaders(t *testing.T) {
|
||||||
logger := logging.NewVaultLogger(log.Trace)
|
logger := logging.NewVaultLogger(log.Trace)
|
||||||
b, err := NewAuditBroker(logger, false)
|
|
||||||
|
b, err := NewAuditBroker(logger, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
_, barrier, _ := mockBarrier(t)
|
_, barrier, _ := mockBarrier(t)
|
||||||
view := NewBarrierView(barrier, "headers/")
|
view := NewBarrierView(barrier, "headers/")
|
||||||
a1 := corehelpers.TestNoopAudit(t, nil)
|
|
||||||
a2 := corehelpers.TestNoopAudit(t, nil)
|
headersConf := &AuditedHeadersConfig{
|
||||||
b.Register("foo", a1, false)
|
view: view,
|
||||||
b.Register("bar", a2, false)
|
}
|
||||||
|
err = headersConf.add(context.Background(), "X-Test-Header", false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
err = headersConf.add(context.Background(), "X-Vault-Header", false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
a1 := corehelpers.TestNoopAudit(t, "foo", nil, audit.WithHeaderFormatter(headersConf))
|
||||||
|
a2 := corehelpers.TestNoopAudit(t, "bar", nil, audit.WithHeaderFormatter(headersConf))
|
||||||
|
|
||||||
|
err = b.Register("foo", a1, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
err = b.Register("bar", a2, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
auth := &logical.Auth{
|
auth := &logical.Auth{
|
||||||
ClientToken: "foo",
|
ClientToken: "foo",
|
||||||
@@ -575,19 +594,13 @@ func TestAuditBroker_AuditHeaders(t *testing.T) {
|
|||||||
}
|
}
|
||||||
reqCopy := reqCopyRaw.(*logical.Request)
|
reqCopy := reqCopyRaw.(*logical.Request)
|
||||||
|
|
||||||
headersConf := &AuditedHeadersConfig{
|
|
||||||
view: view,
|
|
||||||
}
|
|
||||||
headersConf.add(context.Background(), "X-Test-Header", false)
|
|
||||||
headersConf.add(context.Background(), "X-Vault-Header", false)
|
|
||||||
|
|
||||||
logInput := &logical.LogInput{
|
logInput := &logical.LogInput{
|
||||||
Auth: auth,
|
Auth: auth,
|
||||||
Request: reqCopy,
|
Request: reqCopy,
|
||||||
OuterErr: respErr,
|
OuterErr: respErr,
|
||||||
}
|
}
|
||||||
ctx := namespace.RootContext(context.Background())
|
ctx := namespace.RootContext(context.Background())
|
||||||
err = b.LogRequest(ctx, logInput, headersConf)
|
err = b.LogRequest(ctx, logInput, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
@@ -599,7 +612,7 @@ func TestAuditBroker_AuditHeaders(t *testing.T) {
|
|||||||
|
|
||||||
for _, a := range []*corehelpers.NoopAudit{a1, a2} {
|
for _, a := range []*corehelpers.NoopAudit{a1, a2} {
|
||||||
if !reflect.DeepEqual(a.ReqHeaders[0], expected) {
|
if !reflect.DeepEqual(a.ReqHeaders[0], expected) {
|
||||||
t.Fatalf("Bad audited headers: %#v", a.Req[0].Headers)
|
t.Fatalf("Bad audited headers: %#v", a.ReqHeaders[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,7 +631,7 @@ func TestAuditBroker_AuditHeaders(t *testing.T) {
|
|||||||
// Should FAIL work with both failing backends
|
// Should FAIL work with both failing backends
|
||||||
a2.ReqErr = fmt.Errorf("failed")
|
a2.ReqErr = fmt.Errorf("failed")
|
||||||
err = b.LogRequest(ctx, logInput, headersConf)
|
err = b.LogRequest(ctx, logInput, headersConf)
|
||||||
if !errwrap.Contains(err, "no audit backend succeeded in logging the request") {
|
if !errwrap.Contains(err, "event not processed by enough 'sink' nodes") {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1464,16 +1464,13 @@ func TestCore_HandleLogin_Token(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_HandleRequest_AuditTrail(t *testing.T) {
|
func TestCore_HandleRequest_AuditTrail(t *testing.T) {
|
||||||
t.Setenv("VAULT_AUDIT_DISABLE_EVENTLOGGER", "true")
|
|
||||||
|
|
||||||
// Create a noop audit backend
|
// Create a noop audit backend
|
||||||
noop := &corehelpers.NoopAudit{}
|
var noop *corehelpers.NoopAudit
|
||||||
c, _, root := TestCoreUnsealed(t)
|
c, _, root := TestCoreUnsealed(t)
|
||||||
c.auditBackends["noop"] = func(ctx context.Context, config *audit.BackendConfig, _ bool, _ audit.HeaderFormatter) (audit.Backend, error) {
|
c.auditBackends["noop"] = func(ctx context.Context, config *audit.BackendConfig, _ bool, headerFormatter audit.HeaderFormatter) (audit.Backend, error) {
|
||||||
noop = &corehelpers.NoopAudit{
|
var err error
|
||||||
Config: config,
|
noop, err = corehelpers.NewNoopAudit(config, audit.WithHeaderFormatter(headerFormatter))
|
||||||
}
|
return noop, err
|
||||||
return noop, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable the audit backend
|
// Enable the audit backend
|
||||||
@@ -1530,16 +1527,13 @@ func TestCore_HandleRequest_AuditTrail(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_HandleRequest_AuditTrail_noHMACKeys(t *testing.T) {
|
func TestCore_HandleRequest_AuditTrail_noHMACKeys(t *testing.T) {
|
||||||
t.Setenv("VAULT_AUDIT_DISABLE_EVENTLOGGER", "true")
|
|
||||||
|
|
||||||
// Create a noop audit backend
|
// Create a noop audit backend
|
||||||
var noop *corehelpers.NoopAudit
|
var noop *corehelpers.NoopAudit
|
||||||
c, _, root := TestCoreUnsealed(t)
|
c, _, root := TestCoreUnsealed(t)
|
||||||
c.auditBackends["noop"] = func(ctx context.Context, config *audit.BackendConfig, _ bool, _ audit.HeaderFormatter) (audit.Backend, error) {
|
c.auditBackends["noop"] = func(ctx context.Context, config *audit.BackendConfig, _ bool, headerFormatter audit.HeaderFormatter) (audit.Backend, error) {
|
||||||
noop = &corehelpers.NoopAudit{
|
var err error
|
||||||
Config: config,
|
noop, err = corehelpers.NewNoopAudit(config, audit.WithHeaderFormatter(headerFormatter))
|
||||||
}
|
return noop, err
|
||||||
return noop, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Specify some keys to not HMAC
|
// Specify some keys to not HMAC
|
||||||
@@ -1636,10 +1630,8 @@ func TestCore_HandleRequest_AuditTrail_noHMACKeys(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_HandleLogin_AuditTrail(t *testing.T) {
|
func TestCore_HandleLogin_AuditTrail(t *testing.T) {
|
||||||
t.Setenv("VAULT_AUDIT_DISABLE_EVENTLOGGER", "true")
|
|
||||||
|
|
||||||
// Create a badass credential backend that always logs in as armon
|
// Create a badass credential backend that always logs in as armon
|
||||||
noop := &corehelpers.NoopAudit{}
|
var noop *corehelpers.NoopAudit
|
||||||
noopBack := &NoopBackend{
|
noopBack := &NoopBackend{
|
||||||
Login: []string{"login"},
|
Login: []string{"login"},
|
||||||
Response: &logical.Response{
|
Response: &logical.Response{
|
||||||
@@ -1659,11 +1651,10 @@ func TestCore_HandleLogin_AuditTrail(t *testing.T) {
|
|||||||
c.credentialBackends["noop"] = func(context.Context, *logical.BackendConfig) (logical.Backend, error) {
|
c.credentialBackends["noop"] = func(context.Context, *logical.BackendConfig) (logical.Backend, error) {
|
||||||
return noopBack, nil
|
return noopBack, nil
|
||||||
}
|
}
|
||||||
c.auditBackends["noop"] = func(ctx context.Context, config *audit.BackendConfig, _ bool, _ audit.HeaderFormatter) (audit.Backend, error) {
|
c.auditBackends["noop"] = func(ctx context.Context, config *audit.BackendConfig, _ bool, headerFormatter audit.HeaderFormatter) (audit.Backend, error) {
|
||||||
noop = &corehelpers.NoopAudit{
|
var err error
|
||||||
Config: config,
|
noop, err = corehelpers.NewNoopAudit(config, audit.WithHeaderFormatter(headerFormatter))
|
||||||
}
|
return noop, err
|
||||||
return noop, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable the credential backend
|
// Enable the credential backend
|
||||||
|
|||||||
@@ -51,9 +51,7 @@ func doTwoPhaseLogin(t *testing.T, client *api.Client, totpCodePath, methodID, u
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLoginMfaGenerateTOTPTestAuditIncluded(t *testing.T) {
|
func TestLoginMfaGenerateTOTPTestAuditIncluded(t *testing.T) {
|
||||||
t.Setenv("VAULT_AUDIT_DISABLE_EVENTLOGGER", "true")
|
noop := corehelpers.TestNoopAudit(t, "noop", nil)
|
||||||
|
|
||||||
noop := corehelpers.TestNoopAudit(t, nil)
|
|
||||||
|
|
||||||
cluster := vault.NewTestCluster(t, &vault.CoreConfig{
|
cluster := vault.NewTestCluster(t, &vault.CoreConfig{
|
||||||
CredentialBackends: map[string]logical.Factory{
|
CredentialBackends: map[string]logical.Factory{
|
||||||
|
|||||||
Reference in New Issue
Block a user