// Verify data sent through is encrypted func TestAESGCMBarrier_Confidential(t *testing.T) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } // Initialize and unseal key, _ := b.GenerateKey() b.Initialize(key) b.Unseal(key) // Put a logical entry entry := &Entry{Key: "test", Value: []byte("test")} err = b.Put(entry) if err != nil { t.Fatalf("err: %v", err) } // Check the physcial entry pe, err := inm.Get("test") if err != nil { t.Fatalf("err: %v", err) } if pe == nil { t.Fatalf("missing physical entry") } if pe.Key != "test" { t.Fatalf("bad: %#v", pe) } if bytes.Equal(pe.Value, entry.Value) { t.Fatalf("bad: %#v", pe) } }
// TestCoreWithSeal returns a pure in-memory, uninitialized core with the // specified seal for testing. func TestCoreWithSeal(t *testing.T, testSeal Seal) *Core { noopAudits := map[string]audit.Factory{ "noop": func(config *audit.BackendConfig) (audit.Backend, error) { view := &logical.InmemStorage{} view.Put(&logical.StorageEntry{ Key: "salt", Value: []byte("foo"), }) var err error config.Salt, err = salt.NewSalt(view, &salt.Config{ HMAC: sha256.New, HMACType: "hmac-sha256", }) if err != nil { t.Fatalf("error getting new salt: %v", err) } return &noopAudit{ Config: config, }, nil }, } noopBackends := make(map[string]logical.Factory) noopBackends["noop"] = func(config *logical.BackendConfig) (logical.Backend, error) { b := new(framework.Backend) b.Setup(config) return b, nil } noopBackends["http"] = func(config *logical.BackendConfig) (logical.Backend, error) { return new(rawHTTP), nil } logicalBackends := make(map[string]logical.Factory) for backendName, backendFactory := range noopBackends { logicalBackends[backendName] = backendFactory } logicalBackends["generic"] = LeasedPassthroughBackendFactory for backendName, backendFactory := range testLogicalBackends { logicalBackends[backendName] = backendFactory } logger := log.New(os.Stderr, "", log.LstdFlags) physicalBackend := physical.NewInmem(logger) conf := &CoreConfig{ Physical: physicalBackend, AuditBackends: noopAudits, LogicalBackends: logicalBackends, CredentialBackends: noopBackends, DisableMlock: true, Logger: logger, } if testSeal != nil { conf.Seal = testSeal } c, err := NewCore(conf) if err != nil { t.Fatalf("err: %s", err) } return c }
// Test an upgrade from the old (0.1) barrier/init to the new // core/keyring style func TestAESGCMBarrier_BackwardsCompatible(t *testing.T) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } // Generate a barrier/init entry encrypt, _ := b.GenerateKey() init := &barrierInit{ Version: 1, Key: encrypt, } buf, _ := json.Marshal(init) // Protect with master key master, _ := b.GenerateKey() gcm, _ := b.aeadFromKey(master) value := b.encrypt(initialKeyTerm, gcm, buf) // Write to the physical backend pe := &physical.Entry{ Key: barrierInitPath, Value: value, } inm.Put(pe) // Should still be initialized isInit, err := b.Initialized() if err != nil { t.Fatalf("err: %v", err) } if !isInit { t.Fatalf("should be initialized") } // Unseal should work and migrate online err = b.Unseal(master) if err != nil { t.Fatalf("err: %v", err) } // Check for migraiton out, err := inm.Get(barrierInitPath) if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("should delete old barrier init") } // Should have keyring out, err = inm.Get(keyringPath) if err != nil { t.Fatalf("err: %v", err) } if out == nil { t.Fatalf("should have keyring file") } }
// Verify data sent through cannot be tampered with func TestAESGCMBarrier_Integrity(t *testing.T) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } // Initialize and unseal key, _ := b.GenerateKey() b.Initialize(key) b.Unseal(key) // Put a logical entry entry := &Entry{Key: "test", Value: []byte("test")} err = b.Put(entry) if err != nil { t.Fatalf("err: %v", err) } // Change a byte in the underlying physical entry pe, _ := inm.Get("test") pe.Value[15]++ err = inm.Put(pe) if err != nil { t.Fatalf("err: %v", err) } // Read from the barrier _, err = b.Get("test") if err == nil { t.Fatalf("should fail!") } }
func TestEncrypt_Unique(t *testing.T) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } key, _ := b.GenerateKey() b.Initialize(key) b.Unseal(key) if b.keyring == nil { t.Fatalf("barrier is sealed") } entry := &Entry{Key: "test", Value: []byte("test")} term := b.keyring.ActiveTerm() primary, _ := b.aeadForTerm(term) first := b.encrypt("test", term, primary, entry.Value) second := b.encrypt("test", term, primary, entry.Value) if bytes.Equal(first, second) == true { t.Fatalf("improper random seeding detected") } }
// TestCore returns a pure in-memory, uninitialized core for testing. func TestCore(t *testing.T) *Core { noopAudits := map[string]audit.Factory{ "noop": func(map[string]string) (audit.Backend, error) { return new(noopAudit), nil }, } noopBackends := make(map[string]logical.Factory) noopBackends["noop"] = func(map[string]string) (logical.Backend, error) { return new(framework.Backend), nil } noopBackends["http"] = func(map[string]string) (logical.Backend, error) { return new(rawHTTP), nil } physicalBackend := physical.NewInmem() c, err := NewCore(&CoreConfig{ Physical: physicalBackend, AuditBackends: noopAudits, LogicalBackends: noopBackends, CredentialBackends: noopBackends, DisableMlock: true, }) if err != nil { t.Fatalf("err: %s", err) } return c }
func TestInitialize_KeyLength(t *testing.T) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } long := []byte("ThisKeyDoesNotHaveTheRightLength!") middle := []byte("ThisIsASecretKeyAndMore") short := []byte("Key") err = b.Initialize(long) if err == nil { t.Fatalf("key length protection failed") } err = b.Initialize(middle) if err == nil { t.Fatalf("key length protection failed") } err = b.Initialize(short) if err == nil { t.Fatalf("key length protection failed") } }
// NewClient creates a new in-memory vault. func NewClient() (*client, error) { // Create the core, sealed and in-memory core, err := vault.NewCore(&vault.CoreConfig{ // Heroku doesn't support mlock syscall DisableMlock: true, Physical: &Physical{ Backend: physical.NewInmem(), Limit: 64000, }, }) if err != nil { return nil, err } // Create the HTTP server on a random local port, and start listening ln, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { return nil, err } go http.Serve(ln, vaulthttp.Handler(core)) return &client{ id: strconv.FormatInt(int64(rand.Int31n(math.MaxInt32)), 10), core: core, listener: ln, }, nil }
func TestAESGCMBarrier_Rekey(t *testing.T) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } testBarrier_Rekey(t, b) }
func TestNewCore_badAdvertiseAddr(t *testing.T) { conf := &CoreConfig{ AdvertiseAddr: "127.0.0.1:8200", Physical: physical.NewInmem(), DisableMlock: true, } _, err := NewCore(conf) if err == nil { t.Fatal("should error") } }
func TestNewCore_badAdvertiseAddr(t *testing.T) { logger = log.New(os.Stderr, "", log.LstdFlags) conf := &CoreConfig{ AdvertiseAddr: "127.0.0.1:8200", Physical: physical.NewInmem(logger), DisableMlock: true, } _, err := NewCore(conf) if err == nil { t.Fatal("should error") } }
func TestAESGCMBarrier_Upgrade(t *testing.T) { inm := physical.NewInmem() b1, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } b2, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } testBarrier_Upgrade(t, b1, b2) }
func TestAESGCMBarrier_UpgradeV1toV2(t *testing.T) { inm := physical.NewInmem(logger) b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } b.currentAESGCMVersionByte = AESGCMVersion1 // Initialize and unseal key, _ := b.GenerateKey() err = b.Initialize(key) if err != nil { t.Fatalf("err: %v", err) } err = b.Unseal(key) if err != nil { t.Fatalf("err: %v", err) } // Put a logical entry entry := &Entry{Key: "test", Value: []byte("test")} err = b.Put(entry) if err != nil { t.Fatalf("err: %v", err) } // Seal err = b.Seal() if err != nil { t.Fatalf("err: %v", err) } // Open again as version 2 b, err = NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } b.currentAESGCMVersionByte = AESGCMVersion2 // Unseal err = b.Unseal(key) if err != nil { t.Fatalf("err: %v", err) } // Check successful decryption _, err = b.Get("test") if err != nil { t.Fatalf("Upgrade unsuccessful") } }
// mockBarrier returns a physical backend, security barrier, and master key func mockBarrier(t *testing.T) (physical.Backend, SecurityBarrier, []byte) { inm := physical.NewInmem() b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } // Initialize and unseal key, _ := b.GenerateKey() b.Initialize(key) b.Unseal(key) return inm, b, key }
func TestNewCore_badRedirectAddr(t *testing.T) { logger = logformat.NewVaultLogger(log.LevelTrace) conf := &CoreConfig{ RedirectAddr: "127.0.0.1:8200", Physical: physical.NewInmem(logger), DisableMlock: true, } _, err := NewCore(conf) if err == nil { t.Fatal("should error") } }
func testCore_NewTestCore(t *testing.T, seal Seal) (*Core, *CoreConfig) { logger := log.New(os.Stderr, "", log.LstdFlags) inm := physical.NewInmem(logger) conf := &CoreConfig{ Physical: inm, DisableMlock: true, LogicalBackends: map[string]logical.Factory{ "generic": LeasedPassthroughBackendFactory, }, Seal: seal, } c, err := NewCore(conf) if err != nil { t.Fatalf("err: %v", err) } return c, conf }
// TestCore returns a pure in-memory, uninitialized core for testing. func TestCore(t *testing.T) *Core { noopAudits := map[string]audit.Factory{ "noop": func(config *audit.BackendConfig) (audit.Backend, error) { return &noopAudit{ Config: config, }, nil }, } noopBackends := make(map[string]logical.Factory) noopBackends["noop"] = func(config *logical.BackendConfig) (logical.Backend, error) { b := new(framework.Backend) b.Setup(config) return b, nil } noopBackends["http"] = func(config *logical.BackendConfig) (logical.Backend, error) { return new(rawHTTP), nil } logicalBackends := make(map[string]logical.Factory) for backendName, backendFactory := range noopBackends { logicalBackends[backendName] = backendFactory } logicalBackends["generic"] = LeasedPassthroughBackendFactory for backendName, backendFactory := range testLogicalBackends { logicalBackends[backendName] = backendFactory } physicalBackend := physical.NewInmem() c, err := NewCore(&CoreConfig{ Physical: physicalBackend, AuditBackends: noopAudits, LogicalBackends: logicalBackends, CredentialBackends: noopBackends, DisableMlock: true, }) if err != nil { t.Fatalf("err: %s", err) } return c }
func TestAESGCMBarrier_MoveIntegrityV2(t *testing.T) { inm := physical.NewInmem(logger) b, err := NewAESGCMBarrier(inm) if err != nil { t.Fatalf("err: %v", err) } b.currentAESGCMVersionByte = AESGCMVersion2 // Initialize and unseal key, _ := b.GenerateKey() err = b.Initialize(key) if err != nil { t.Fatalf("err: %v", err) } err = b.Unseal(key) if err != nil { t.Fatalf("err: %v", err) } // Put a logical entry entry := &Entry{Key: "test", Value: []byte("test")} err = b.Put(entry) if err != nil { t.Fatalf("err: %v", err) } // Change the location of the underlying physical entry pe, _ := inm.Get("test") pe.Key = "moved" err = inm.Put(pe) // Read from the barrier _, err = b.Get("moved") if err == nil { t.Fatalf("should fail with version 2!") } }
func TestCore_Standby_Rotate(t *testing.T) { // Create the first core and initialize it logger = logformat.NewVaultLogger(log.LevelTrace) inm := physical.NewInmem(logger) inmha := physical.NewInmemHA(logger) redirectOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Wait for core to become active TestWaitActive(t, core) // Create a second core, attached to same in-memory store redirectOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Rotate the encryption key req := &logical.Request{ Operation: logical.UpdateOperation, Path: "sys/rotate", ClientToken: root, } _, err = core.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Seal the first core, should step down err = core.Seal(root) if err != nil { t.Fatalf("err: %v", err) } // Wait for core2 to become active TestWaitActive(t, core2) // Read the key status req = &logical.Request{ Operation: logical.ReadOperation, Path: "sys/key-status", ClientToken: root, } resp, err := core2.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Verify the response if resp.Data["term"] != 2 { t.Fatalf("bad: %#v", resp) } }
func TestCore_CleanLeaderPrefix(t *testing.T) { // Create the first core and initialize it logger = logformat.NewVaultLogger(log.LevelTrace) inm := physical.NewInmem(logger) inmha := physical.NewInmemHA(logger) redirectOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err := core.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Wait for core to become active TestWaitActive(t, core) // Ensure that the original clean function has stopped running time.Sleep(2 * time.Second) // Put several random entries for i := 0; i < 5; i++ { keyUUID, err := uuid.GenerateUUID() if err != nil { t.Fatal(err) } valueUUID, err := uuid.GenerateUUID() if err != nil { t.Fatal(err) } core.barrier.Put(&Entry{ Key: coreLeaderPrefix + keyUUID, Value: []byte(valueUUID), }) } entries, err := core.barrier.List(coreLeaderPrefix) if err != nil { t.Fatalf("err: %v", err) } if len(entries) != 6 { t.Fatalf("wrong number of core leader prefix entries, got %d", len(entries)) } // Check the leader is local isLeader, advertise, err := core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Create a second core, attached to same in-memory store redirectOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err = core2.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Core2 should be in standby standby, err := core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Seal the first core, should step down err = core.Seal(root) if err != nil { t.Fatalf("err: %v", err) } // Core should be in standby standby, err = core.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Wait for core2 to become active TestWaitActive(t, core2) // Check the leader is local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != redirectOriginal2 { t.Fatalf("Bad advertise: %v", advertise) } // Give time for the entries to clear out; it is conservative at 1/second time.Sleep(10 * leaderPrefixCleanDelay) entries, err = core2.barrier.List(coreLeaderPrefix) if err != nil { t.Fatalf("err: %v", err) } if len(entries) != 1 { t.Fatalf("wrong number of core leader prefix entries, got %d", len(entries)) } }
func TestCore_StepDown(t *testing.T) { // Create the first core and initialize it logger = logformat.NewVaultLogger(log.LevelTrace) inm := physical.NewInmem(logger) inmha := physical.NewInmemHA(logger) redirectOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err := core.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Wait for core to become active TestWaitActive(t, core) // Check the leader is local isLeader, advertise, err := core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Create the second core and initialize it redirectOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err = core2.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Core2 should be in standby standby, err := core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } req := &logical.Request{ ClientToken: root, Path: "sys/step-down", } // Create an identifier for the request req.ID, err = uuid.GenerateUUID() if err != nil { t.Fatalf("failed to generate identifier for the request: path: %s err: %v", req.Path, err) } // Step down core err = core.StepDown(req) if err != nil { t.Fatal("error stepping down core 1") } // Give time to switch leaders time.Sleep(5 * time.Second) // Core1 should be in standby standby, err = core.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is core2 isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != redirectOriginal2 { t.Fatalf("Bad advertise: %v", advertise) } // Check the leader is not local isLeader, advertise, err = core.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != redirectOriginal2 { t.Fatalf("Bad advertise: %v", advertise) } // Step down core2 err = core2.StepDown(req) if err != nil { t.Fatal("error stepping down core 1") } // Give time to switch leaders -- core 1 will still be waiting on its // cooling off period so give it a full 10 seconds to recover time.Sleep(10 * time.Second) // Core2 should be in standby standby, err = core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is core1 isLeader, advertise, err = core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } }
func TestCluster(t *testing.T, handlers []http.Handler, base *CoreConfig, unsealStandbys bool) []*TestClusterCore { if handlers == nil || len(handlers) != 3 { t.Fatal("handlers must be size 3") } // // TLS setup // block, _ := pem.Decode([]byte(TestClusterCACert)) if block == nil { t.Fatal("error decoding cluster CA cert") } caBytes := block.Bytes caCert, err := x509.ParseCertificate(caBytes) if err != nil { t.Fatal(err) } serverCert, err := tls.X509KeyPair([]byte(TestClusterServerCert), []byte(TestClusterServerKey)) if err != nil { t.Fatal(err) } rootCAs := x509.NewCertPool() rootCAs.AppendCertsFromPEM([]byte(TestClusterCACert)) tlsConfig := &tls.Config{ Certificates: []tls.Certificate{serverCert}, RootCAs: rootCAs, ClientCAs: rootCAs, ClientAuth: tls.RequireAndVerifyClientCert, } tlsConfig.BuildNameToCertificate() // Sanity checking block, _ = pem.Decode([]byte(TestClusterServerCert)) if block == nil { t.Fatal(err) } parsedServerCert, err := x509.ParseCertificate(block.Bytes) if err != nil { t.Fatal(err) } chains, err := parsedServerCert.Verify(x509.VerifyOptions{ DNSName: "127.0.0.1", Roots: rootCAs, KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, }) if err != nil { t.Fatal(err) } if chains == nil || len(chains) == 0 { t.Fatal("no verified chains for server auth") } chains, err = parsedServerCert.Verify(x509.VerifyOptions{ DNSName: "127.0.0.1", Roots: rootCAs, KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, }) if err != nil { t.Fatal(err) } if chains == nil || len(chains) == 0 { t.Fatal("no verified chains for chains auth") } logger := logformat.NewVaultLogger(log.LevelTrace) // // Listener setup // ln, err := net.ListenTCP("tcp", &net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 0, }) if err != nil { t.Fatal(err) } c1lns := []*TestListener{&TestListener{ Listener: tls.NewListener(ln, tlsConfig), Address: ln.Addr().(*net.TCPAddr), }, } ln, err = net.ListenTCP("tcp", &net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 0, }) if err != nil { t.Fatal(err) } c1lns = append(c1lns, &TestListener{ Listener: tls.NewListener(ln, tlsConfig), Address: ln.Addr().(*net.TCPAddr), }) server1 := &http.Server{ Handler: handlers[0], } for _, ln := range c1lns { go server1.Serve(ln) } ln, err = net.ListenTCP("tcp", &net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 0, }) if err != nil { t.Fatal(err) } c2lns := []*TestListener{&TestListener{ Listener: tls.NewListener(ln, tlsConfig), Address: ln.Addr().(*net.TCPAddr), }, } server2 := &http.Server{ Handler: handlers[1], } for _, ln := range c2lns { go server2.Serve(ln) } ln, err = net.ListenTCP("tcp", &net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 0, }) if err != nil { t.Fatal(err) } c3lns := []*TestListener{&TestListener{ Listener: tls.NewListener(ln, tlsConfig), Address: ln.Addr().(*net.TCPAddr), }, } server3 := &http.Server{ Handler: handlers[2], } for _, ln := range c3lns { go server3.Serve(ln) } // Create three cores with the same physical and different redirect/cluster addrs coreConfig := &CoreConfig{ Physical: physical.NewInmem(logger), HAPhysical: physical.NewInmemHA(logger), LogicalBackends: make(map[string]logical.Factory), CredentialBackends: make(map[string]logical.Factory), AuditBackends: make(map[string]audit.Factory), RedirectAddr: fmt.Sprintf("https://127.0.0.1:%d", c1lns[0].Address.Port), ClusterAddr: fmt.Sprintf("https://127.0.0.1:%d", c1lns[0].Address.Port+1), DisableMlock: true, } if base != nil { // Used to set something non-working to test fallback switch base.ClusterAddr { case "empty": coreConfig.ClusterAddr = "" case "": default: coreConfig.ClusterAddr = base.ClusterAddr } if base.LogicalBackends != nil { for k, v := range base.LogicalBackends { coreConfig.LogicalBackends[k] = v } } if base.CredentialBackends != nil { for k, v := range base.CredentialBackends { coreConfig.CredentialBackends[k] = v } } if base.AuditBackends != nil { for k, v := range base.AuditBackends { coreConfig.AuditBackends[k] = v } } } c1, err := NewCore(coreConfig) if err != nil { t.Fatalf("err: %v", err) } coreConfig.RedirectAddr = fmt.Sprintf("https://127.0.0.1:%d", c2lns[0].Address.Port) if coreConfig.ClusterAddr != "" { coreConfig.ClusterAddr = fmt.Sprintf("https://127.0.0.1:%d", c2lns[0].Address.Port+1) } c2, err := NewCore(coreConfig) if err != nil { t.Fatalf("err: %v", err) } coreConfig.RedirectAddr = fmt.Sprintf("https://127.0.0.1:%d", c3lns[0].Address.Port) if coreConfig.ClusterAddr != "" { coreConfig.ClusterAddr = fmt.Sprintf("https://127.0.0.1:%d", c3lns[0].Address.Port+1) } c3, err := NewCore(coreConfig) if err != nil { t.Fatalf("err: %v", err) } // // Clustering setup // clusterAddrGen := func(lns []*TestListener) []*net.TCPAddr { ret := make([]*net.TCPAddr, len(lns)) for i, ln := range lns { ret[i] = &net.TCPAddr{ IP: ln.Address.IP, Port: ln.Address.Port + 1, } } return ret } c2.SetClusterListenerAddrs(clusterAddrGen(c2lns)) c2.SetClusterSetupFuncs(WrapHandlerForClustering(handlers[1], logger)) c3.SetClusterListenerAddrs(clusterAddrGen(c3lns)) c3.SetClusterSetupFuncs(WrapHandlerForClustering(handlers[2], logger)) key, root := TestCoreInitClusterWrapperSetup(t, c1, clusterAddrGen(c1lns), WrapHandlerForClustering(handlers[0], logger)) if _, err := c1.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err := c1.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } TestWaitActive(t, c1) if unsealStandbys { if _, err := c2.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } if _, err := c3.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Let them come fully up to standby time.Sleep(2 * time.Second) // Ensure cluster connection info is populated isLeader, _, err := c2.Leader() if err != nil { t.Fatal(err) } if isLeader { t.Fatal("c2 should not be leader") } isLeader, _, err = c3.Leader() if err != nil { t.Fatal(err) } if isLeader { t.Fatal("c3 should not be leader") } } return []*TestClusterCore{ &TestClusterCore{ Core: c1, Listeners: c1lns, Root: root, Key: TestKeyCopy(key), CACertBytes: caBytes, CACert: caCert, TLSConfig: tlsConfig, }, &TestClusterCore{ Core: c2, Listeners: c2lns, Root: root, Key: TestKeyCopy(key), CACertBytes: caBytes, CACert: caCert, TLSConfig: tlsConfig, }, &TestClusterCore{ Core: c3, Listeners: c3lns, Root: root, Key: TestKeyCopy(key), CACertBytes: caBytes, CACert: caCert, TLSConfig: tlsConfig, }, } }
func TestCore_StepDown(t *testing.T) { // Create the first core and initialize it logger = log.New(os.Stderr, "", log.LstdFlags) inm := physical.NewInmem(logger) inmha := physical.NewInmemHA(logger) advertiseOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, AdvertiseAddr: advertiseOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := core.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err := core.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Wait for core to become active testWaitActive(t, core) // Check the leader is local isLeader, advertise, err := core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != advertiseOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Create the second core and initialize it advertiseOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, AdvertiseAddr: advertiseOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := core2.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err = core2.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Core2 should be in standby standby, err := core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != advertiseOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Step down core err = core.StepDown(root) if err != nil { t.Fatal("error stepping down core 1") } // Give time to switch leaders time.Sleep(2 * time.Second) // Core1 should be in standby standby, err = core.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is core2 isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != advertiseOriginal2 { t.Fatalf("Bad advertise: %v", advertise) } // Check the leader is not local isLeader, advertise, err = core.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != advertiseOriginal2 { t.Fatalf("Bad advertise: %v", advertise) } // Step down core2 err = core2.StepDown(root) if err != nil { t.Fatal("error stepping down core 1") } // Give time to switch leaders -- core 1 will still be waiting on its // cooling off period so give it a full 10 seconds to recover time.Sleep(10 * time.Second) // Core2 should be in standby standby, err = core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is core1 isLeader, advertise, err = core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != advertiseOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != advertiseOriginal { t.Fatalf("Bad advertise: %v", advertise) } }
func (s *InmemStorage) init() { s.phys = physical.NewInmem(nil) }
// Test performs an acceptance test on a backend with the given test case. // // Tests are not run unless an environmental variable "TF_ACC" is // set to some non-empty value. This is to avoid test cases surprising // a user by creating real resources. // // Tests will fail unless the verbose flag (`go test -v`, or explicitly // the "-test.v" flag) is set. Because some acceptance tests take quite // long, we require the verbose flag so users are able to see progress // output. func Test(t TestT, c TestCase) { // We only run acceptance tests if an env var is set because they're // slow and generally require some outside configuration. if os.Getenv(TestEnvVar) == "" { t.Skip(fmt.Sprintf( "Acceptance tests skipped unless env '%s' set", TestEnvVar)) return } // We require verbose mode so that the user knows what is going on. if !testTesting && !testing.Verbose() { t.Fatal("Acceptance tests must be run with the -v flag on tests") return } // Run the PreCheck if we have it if c.PreCheck != nil { c.PreCheck() } // Check that something is provided if c.Backend == nil && c.Factory == nil { t.Fatal("Must provide either Backend or Factory") } // Create an in-memory Vault core core, err := vault.NewCore(&vault.CoreConfig{ Physical: physical.NewInmem(), LogicalBackends: map[string]logical.Factory{ "test": func(conf *logical.BackendConfig) (logical.Backend, error) { if c.Backend != nil { return c.Backend, nil } return c.Factory(conf) }, }, }) if err != nil { t.Fatal("error initializing core: ", err) return } // Initialize the core init, err := core.Initialize(&vault.SealConfig{ SecretShares: 1, SecretThreshold: 1, }) if err != nil { t.Fatal("error initializing core: ", err) } // Unseal the core if unsealed, err := core.Unseal(init.SecretShares[0]); err != nil { t.Fatal("error unsealing core: ", err) return } else if !unsealed { t.Fatal("vault shouldn't be sealed") return } // Create an HTTP API server and client ln, addr := http.TestServer(nil, core) defer ln.Close() clientConfig := api.DefaultConfig() clientConfig.Address = addr client, err := api.NewClient(clientConfig) if err != nil { t.Fatal("error initializing HTTP client: ", err) return } // Set the token so we're authenticated client.SetToken(init.RootToken) // Mount the backend prefix := "mnt" if err := client.Sys().Mount(prefix, "test", "acceptance test"); err != nil { t.Fatal("error mounting backend: ", err) return } // Make requests var revoke []*logical.Request for i, s := range c.Steps { log.Printf("[WARN] Executing test step %d", i+1) // Make sure to prefix the path with where we mounted the thing path := fmt.Sprintf("%s/%s", prefix, s.Path) // Create the request req := &logical.Request{ Operation: s.Operation, Path: path, Data: s.Data, } if !s.Unauthenticated { req.ClientToken = client.Token() } if s.RemoteAddr != "" { req.Connection = &logical.Connection{RemoteAddr: s.RemoteAddr} } if s.ConnState != nil { req.Connection = &logical.Connection{ConnState: s.ConnState} } // Make the request resp, err := core.HandleRequest(req) if resp != nil && resp.Secret != nil { // Revoke this secret later revoke = append(revoke, &logical.Request{ Operation: logical.WriteOperation, Path: "sys/revoke/" + resp.Secret.LeaseID, }) } if err == nil && resp.IsError() && !s.ErrorOk { err = fmt.Errorf("Erroneous response:\n\n%#v", resp) } if err == nil && s.Check != nil { // Call the test method err = s.Check(resp) } if err != nil { t.Error(fmt.Sprintf("Failed step %d: %s", i+1, err)) break } } // Revoke any secrets we might have. var failedRevokes []*logical.Secret for _, req := range revoke { log.Printf("[WARN] Revoking secret: %#v", req) req.ClientToken = client.Token() resp, err := core.HandleRequest(req) if err == nil && resp.IsError() { err = fmt.Errorf("Erroneous response:\n\n%#v", resp) } if err != nil { failedRevokes = append(failedRevokes, req.Secret) t.Error(fmt.Sprintf("[ERR] Revoke error: %s", err)) } } // Perform any rollbacks. This should no-op if there aren't any. // We set the "immediate" flag here that any backend can pick up on // to do all rollbacks immediately even if the WAL entries are new. log.Printf("[WARN] Requesting RollbackOperation") req := logical.RollbackRequest(prefix + "/") req.Data["immediate"] = true req.ClientToken = client.Token() resp, err := core.HandleRequest(req) if err == nil && resp.IsError() { err = fmt.Errorf("Erroneous response:\n\n%#v", resp) } if err != nil && err != logical.ErrUnsupportedOperation { t.Error(fmt.Sprintf("[ERR] Rollback error: %s", err)) } // If we have any failed revokes, log it. if len(failedRevokes) > 0 { for _, s := range failedRevokes { t.Error(fmt.Sprintf( "WARNING: Revoking the following secret failed. It may\n"+ "still exist. Please verify:\n\n%#v", s)) } } // Cleanup if c.Teardown != nil { c.Teardown() } }
// Test performs an acceptance test on a backend with the given test case. // // Tests are not run unless an environmental variable "VAULT_ACC" is // set to some non-empty value. This is to avoid test cases surprising // a user by creating real resources. // // Tests will fail unless the verbose flag (`go test -v`, or explicitly // the "-test.v" flag) is set. Because some acceptance tests take quite // long, we require the verbose flag so users are able to see progress // output. func Test(tt TestT, c TestCase) { // We only run acceptance tests if an env var is set because they're // slow and generally require some outside configuration. if c.AcceptanceTest && os.Getenv(TestEnvVar) == "" { tt.Skip(fmt.Sprintf( "Acceptance tests skipped unless env '%s' set", TestEnvVar)) return } // We require verbose mode so that the user knows what is going on. if c.AcceptanceTest && !testTesting && !testing.Verbose() { tt.Fatal("Acceptance tests must be run with the -v flag on tests") return } // Run the PreCheck if we have it if c.PreCheck != nil { c.PreCheck() } // Check that something is provided if c.Backend == nil && c.Factory == nil { tt.Fatal("Must provide either Backend or Factory") return } // Create an in-memory Vault core core, err := vault.NewCore(&vault.CoreConfig{ Physical: physical.NewInmem(logger), LogicalBackends: map[string]logical.Factory{ "test": func(conf *logical.BackendConfig) (logical.Backend, error) { if c.Backend != nil { return c.Backend, nil } return c.Factory(conf) }, }, DisableMlock: true, }) if err != nil { tt.Fatal("error initializing core: ", err) return } // Initialize the core init, err := core.Initialize(&vault.SealConfig{ SecretShares: 1, SecretThreshold: 1, }, nil) if err != nil { tt.Fatal("error initializing core: ", err) return } // Unseal the core if unsealed, err := core.Unseal(init.SecretShares[0]); err != nil { tt.Fatal("error unsealing core: ", err) return } else if !unsealed { tt.Fatal("vault shouldn't be sealed") return } // Create an HTTP API server and client ln, addr := http.TestServer(nil, core) defer ln.Close() clientConfig := api.DefaultConfig() clientConfig.Address = addr client, err := api.NewClient(clientConfig) if err != nil { tt.Fatal("error initializing HTTP client: ", err) return } // Set the token so we're authenticated client.SetToken(init.RootToken) // Mount the backend prefix := "mnt" mountInfo := &api.MountInput{ Type: "test", Description: "acceptance test", } if err := client.Sys().Mount(prefix, mountInfo); err != nil { tt.Fatal("error mounting backend: ", err) return } // Make requests var revoke []*logical.Request for i, s := range c.Steps { log.Printf("[WARN] Executing test step %d", i+1) // Create the request req := &logical.Request{ Operation: s.Operation, Path: s.Path, Data: s.Data, } if !s.Unauthenticated { req.ClientToken = client.Token() } if s.RemoteAddr != "" { req.Connection = &logical.Connection{RemoteAddr: s.RemoteAddr} } if s.ConnState != nil { req.Connection = &logical.Connection{ConnState: s.ConnState} } if s.PreFlight != nil { ct := req.ClientToken req.ClientToken = "" if err := s.PreFlight(req); err != nil { tt.Error(fmt.Sprintf("Failed preflight for step %d: %s", i+1, err)) break } req.ClientToken = ct } // Make sure to prefix the path with where we mounted the thing req.Path = fmt.Sprintf("%s/%s", prefix, req.Path) // Make the request resp, err := core.HandleRequest(req) if resp != nil && resp.Secret != nil { // Revoke this secret later revoke = append(revoke, &logical.Request{ Operation: logical.UpdateOperation, Path: "sys/revoke/" + resp.Secret.LeaseID, }) } // Test step returned an error. if err != nil { // But if an error is expected, do not fail the test step, // regardless of whether the error is a 'logical.ErrorResponse' // or not. Set the err to nil. If the error is a logical.ErrorResponse, // it will be handled later. if s.ErrorOk { err = nil } else { // If the error is not expected, fail right away. tt.Error(fmt.Sprintf("Failed step %d: %s", i+1, err)) break } } // If the error is a 'logical.ErrorResponse' and if error was not expected, // set the error so that this can be caught below. if resp.IsError() && !s.ErrorOk { err = fmt.Errorf("Erroneous response:\n\n%#v", resp) } // Either the 'err' was nil or if an error was expected, it was set to nil. // Call the 'Check' function if there is one. // // TODO: This works perfectly for now, but it would be better if 'Check' // function takes in both the response object and the error, and decide on // the action on its own. if err == nil && s.Check != nil { // Call the test method err = s.Check(resp) } if err != nil { tt.Error(fmt.Sprintf("Failed step %d: %s", i+1, err)) break } } // Revoke any secrets we might have. var failedRevokes []*logical.Secret for _, req := range revoke { log.Printf("[WARN] Revoking secret: %#v", req) req.ClientToken = client.Token() resp, err := core.HandleRequest(req) if err == nil && resp.IsError() { err = fmt.Errorf("Erroneous response:\n\n%#v", resp) } if err != nil { failedRevokes = append(failedRevokes, req.Secret) tt.Error(fmt.Sprintf("[ERR] Revoke error: %s", err)) } } // Perform any rollbacks. This should no-op if there aren't any. // We set the "immediate" flag here that any backend can pick up on // to do all rollbacks immediately even if the WAL entries are new. log.Printf("[WARN] Requesting RollbackOperation") req := logical.RollbackRequest(prefix + "/") req.Data["immediate"] = true req.ClientToken = client.Token() resp, err := core.HandleRequest(req) if err == nil && resp.IsError() { err = fmt.Errorf("Erroneous response:\n\n%#v", resp) } if err != nil { if !errwrap.Contains(err, logical.ErrUnsupportedOperation.Error()) { tt.Error(fmt.Sprintf("[ERR] Rollback error: %s", err)) } } // If we have any failed revokes, log it. if len(failedRevokes) > 0 { for _, s := range failedRevokes { tt.Error(fmt.Sprintf( "WARNING: Revoking the following secret failed. It may\n"+ "still exist. Please verify:\n\n%#v", s)) } } // Cleanup if c.Teardown != nil { c.Teardown() } }
func TestCore_Standby_Seal(t *testing.T) { // Create the first core and initialize it inm := physical.NewInmem() inmha := physical.NewInmemHA() advertiseOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, AdvertiseAddr: advertiseOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := core.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err := core.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Wait for core to become active testWaitActive(t, core) // Ensure that the original clean function has stopped running time.Sleep(2 * time.Second) // Check the leader is local isLeader, advertise, err := core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != advertiseOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Create the second core and initialize it advertiseOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, AdvertiseAddr: advertiseOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := core2.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err = core2.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Core2 should be in standby standby, err := core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != advertiseOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Seal the standby core with the correct token. Shouldn't go down err = core2.Seal(root) if err == nil { t.Fatal("should not be sealed") } keyUUID, err := uuid.GenerateUUID() if err != nil { t.Fatal(err) } // Seal the standby core with an invalid token. Shouldn't go down err = core2.Seal(keyUUID) if err == nil { t.Fatal("should not be sealed") } }
func TestCore_Standby_Rekey(t *testing.T) { // Create the first core and initialize it inm := physical.NewInmem() inmha := physical.NewInmemHA() advertiseOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, AdvertiseAddr: advertiseOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := core.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Wait for core to become active testWaitActive(t, core) // Create a second core, attached to same in-memory store advertiseOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, AdvertiseAddr: advertiseOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := core2.Unseal(TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Rekey the master key newConf := &SealConfig{ SecretShares: 1, SecretThreshold: 1, } err = core.RekeyInit(newConf) if err != nil { t.Fatalf("err: %v", err) } // Fetch new config with generated nonce rkconf, err := core.RekeyConfig() if err != nil { t.Fatalf("err: %v", err) } if rkconf == nil { t.Fatalf("bad: no rekey config received") } result, err := core.RekeyUpdate(key, rkconf.Nonce) if err != nil { t.Fatalf("err: %v", err) } if result == nil { t.Fatalf("rekey failed") } // Seal the first core, should step down err = core.Seal(root) if err != nil { t.Fatalf("err: %v", err) } // Wait for core2 to become active testWaitActive(t, core2) // Rekey the master key again err = core2.RekeyInit(newConf) if err != nil { t.Fatalf("err: %v", err) } // Fetch new config with generated nonce rkconf, err = core2.RekeyConfig() if err != nil { t.Fatalf("err: %v", err) } if rkconf == nil { t.Fatalf("bad: no rekey config received") } result, err = core2.RekeyUpdate(result.SecretShares[0], rkconf.Nonce) if err != nil { t.Fatalf("err: %v", err) } if result == nil { t.Fatalf("rekey failed") } }
func TestCore_Standby_Seal(t *testing.T) { // Create the first core and initialize it logger = logformat.NewVaultLogger(log.LevelTrace) inm := physical.NewInmem(logger) inmha := physical.NewInmemHA(logger) redirectOriginal := "http://127.0.0.1:8200" core, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } key, root := TestCoreInit(t, core) if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err := core.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Wait for core to become active TestWaitActive(t, core) // Check the leader is local isLeader, advertise, err := core.Leader() if err != nil { t.Fatalf("err: %v", err) } if !isLeader { t.Fatalf("should be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Create the second core and initialize it redirectOriginal2 := "http://127.0.0.1:8500" core2, err := NewCore(&CoreConfig{ Physical: inm, HAPhysical: inmha, RedirectAddr: redirectOriginal2, DisableMlock: true, }) if err != nil { t.Fatalf("err: %v", err) } if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil { t.Fatalf("unseal err: %s", err) } // Verify unsealed sealed, err = core2.Sealed() if err != nil { t.Fatalf("err checking seal status: %s", err) } if sealed { t.Fatal("should not be sealed") } // Core2 should be in standby standby, err := core2.Standby() if err != nil { t.Fatalf("err: %v", err) } if !standby { t.Fatalf("should be standby") } // Check the leader is not local isLeader, advertise, err = core2.Leader() if err != nil { t.Fatalf("err: %v", err) } if isLeader { t.Fatalf("should not be leader") } if advertise != redirectOriginal { t.Fatalf("Bad advertise: %v", advertise) } // Seal the standby core with the correct token. Shouldn't go down err = core2.Seal(root) if err == nil { t.Fatal("should not be sealed") } keyUUID, err := uuid.GenerateUUID() if err != nil { t.Fatal(err) } // Seal the standby core with an invalid token. Shouldn't go down err = core2.Seal(keyUUID) if err == nil { t.Fatal("should not be sealed") } }
func TestCore_Init(t *testing.T) { inm := physical.NewInmem() conf := &CoreConfig{ Physical: inm, DisableMlock: true, } c, err := NewCore(conf) if err != nil { t.Fatalf("err: %v", err) } init, err := c.Initialized() if err != nil { t.Fatalf("err: %v", err) } if init { t.Fatalf("should not be init") } // Check the seal configuration outConf, err := c.SealConfig() if err != nil { t.Fatalf("err: %v", err) } if outConf != nil { t.Fatalf("bad: %v", outConf) } sealConf := &SealConfig{ SecretShares: 1, SecretThreshold: 1, } res, err := c.Initialize(sealConf) if err != nil { t.Fatalf("err: %v", err) } if len(res.SecretShares) != 1 { t.Fatalf("Bad: %v", res) } if res.RootToken == "" { t.Fatalf("Bad: %v", res) } _, err = c.Initialize(sealConf) if err != ErrAlreadyInit { t.Fatalf("err: %v", err) } init, err = c.Initialized() if err != nil { t.Fatalf("err: %v", err) } if !init { t.Fatalf("should be init") } // Check the seal configuration outConf, err = c.SealConfig() if err != nil { t.Fatalf("err: %v", err) } if !reflect.DeepEqual(outConf, sealConf) { t.Fatalf("bad: %v expect: %v", outConf, sealConf) } // New Core, same backend c2, err := NewCore(conf) if err != nil { t.Fatalf("err: %v", err) } _, err = c2.Initialize(sealConf) if err != ErrAlreadyInit { t.Fatalf("err: %v", err) } init, err = c2.Initialized() if err != nil { t.Fatalf("err: %v", err) } if !init { t.Fatalf("should be init") } // Check the seal configuration outConf, err = c2.SealConfig() if err != nil { t.Fatalf("err: %v", err) } if !reflect.DeepEqual(outConf, sealConf) { t.Fatalf("bad: %v expect: %v", outConf, sealConf) } }