Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Seal migration with Raft #8103

Merged
merged 38 commits into from
Feb 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
4164481
Seal migration after unsealing
vishalnayak Jan 6, 2020
2047eed
Refactor migration fields migrationInformation in core
vishalnayak Jan 7, 2020
b96f840
Perform seal migration as part of postUnseal
vishalnayak Jan 8, 2020
e668955
Remove the sleep logic
vishalnayak Jan 8, 2020
67e870e
Use proper seal in the unseal function
vishalnayak Jan 8, 2020
f486b16
Fix migration from Auto to Shamir
vishalnayak Jan 10, 2020
96cb241
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Jan 14, 2020
032a5dc
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Jan 21, 2020
df92ebb
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Jan 21, 2020
23b948e
Fix the recovery config missing issue
vishalnayak Jan 23, 2020
b2ab3c4
Address the non-ha migration case
vishalnayak Jan 23, 2020
cf1a5bf
Fix the multi cluster case
vishalnayak Jan 23, 2020
640c5a1
Avoid re-running seal migration
vishalnayak Jan 27, 2020
bbb79b8
Merge branch 'master' into raft-seal-migration
vishalnayak Jan 27, 2020
6fb8f69
Run the post migration code in new leaders
vishalnayak Jan 27, 2020
8852469
Fix the issue of wrong recovery being set
vishalnayak Jan 27, 2020
146adc6
Address review feedback
vishalnayak Jan 28, 2020
d3b4811
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Jan 28, 2020
3739f17
Add more complete testing coverage for seal migrations. (#8247)
ncabatoff Jan 28, 2020
faed5ef
Fix all known issues
vishalnayak Jan 29, 2020
10066be
Remove warning
vishalnayak Jan 30, 2020
c9d4025
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Jan 30, 2020
06b53eb
Review feedback.
ncabatoff Feb 5, 2020
d89ce53
Revert my previous change that broke raft tests. We'll need to come …
ncabatoff Feb 6, 2020
b19544a
Don't allow migration between same types for now
vishalnayak Feb 6, 2020
cf76c32
Disable auto to auto tests for now since it uses migration between sa…
vishalnayak Feb 6, 2020
5042988
Merge branch 'master' into raft-seal-migration
vishalnayak Feb 6, 2020
841cb7f
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Feb 7, 2020
cb0ef6a
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Feb 12, 2020
925d758
Update vault/core.go
vishalnayak Feb 12, 2020
69ff49d
Add migration logs
vishalnayak Feb 12, 2020
5a14ddf
Address review comments
vishalnayak Feb 12, 2020
d6faa9a
Add the recovery config check back
vishalnayak Feb 12, 2020
0ddd2c2
Skip a few steps if migration is already done
vishalnayak Feb 12, 2020
48c7832
Merge branch 'master-oss' into raft-seal-migration
vishalnayak Feb 13, 2020
a31fcfb
Return from waitForLeadership if migration fails
vishalnayak Feb 13, 2020
d668aff
Merge branch 'master' into raft-seal-migration
vishalnayak Feb 13, 2020
1cfbc19
Merge branch 'master' into raft-seal-migration
vishalnayak Feb 13, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions command/seal_migration_oss_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
// +build !enterprise

package command

import (
"context"
"encoding/base64"
"testing"

wrapping "github.com/hashicorp/go-kms-wrapping"
aeadwrapper "github.com/hashicorp/go-kms-wrapping/wrappers/aead"
"github.com/hashicorp/vault/api"
"github.com/hashicorp/vault/helper/testhelpers"
"github.com/hashicorp/vault/helper/testhelpers/teststorage"
vaulthttp "github.com/hashicorp/vault/http"
"github.com/hashicorp/vault/vault"
"github.com/hashicorp/vault/vault/seal"
)

func TestSealMigration_AutoToShamir(t *testing.T) {
t.Parallel()
t.Run("inmem", func(t *testing.T) {
t.Parallel()
testSealMigrationAutoToShamir(t, teststorage.InmemBackendSetup)
})

t.Run("file", func(t *testing.T) {
t.Parallel()
testSealMigrationAutoToShamir(t, teststorage.FileBackendSetup)
})

t.Run("consul", func(t *testing.T) {
t.Parallel()
testSealMigrationAutoToShamir(t, teststorage.ConsulBackendSetup)
})

t.Run("raft", func(t *testing.T) {
t.Parallel()
testSealMigrationAutoToShamir(t, teststorage.RaftBackendSetup)
})
}

func testSealMigrationAutoToShamir(t *testing.T, setup teststorage.ClusterSetupMutator) {
tcluster := newTransitSealServer(t)
defer tcluster.Cleanup()

tcluster.makeKey(t, "key1")
var seals []vault.Seal
conf, opts := teststorage.ClusterSetup(&vault.CoreConfig{
DisableSealWrap: true,
}, &vault.TestClusterOptions{
HandlerFunc: vaulthttp.Handler,
SkipInit: true,
NumCores: 3,
SealFunc: func() vault.Seal {
tseal := tcluster.makeSeal(t, "key1")
seals = append(seals, tseal)
return tseal
},
},
setup,
)
opts.SetupFunc = nil
vishalnayak marked this conversation as resolved.
Show resolved Hide resolved
cluster := vault.NewTestCluster(t, conf, opts)
cluster.Start()
defer cluster.Cleanup()

client := cluster.Cores[0].Client
initResp, err := client.Sys().Init(&api.InitRequest{
RecoveryShares: 5,
RecoveryThreshold: 3,
})
if err != nil {
t.Fatal(err)
}
for _, k := range initResp.RecoveryKeysB64 {
b, _ := base64.RawStdEncoding.DecodeString(k)
cluster.RecoveryKeys = append(cluster.RecoveryKeys, b)
}

testhelpers.WaitForActiveNode(t, cluster)

rootToken := initResp.RootToken
client.SetToken(rootToken)
if err := client.Sys().Seal(); err != nil {
t.Fatal(err)
}

logger := cluster.Logger.Named("shamir")
shamirSeal := vault.NewDefaultSeal(&seal.Access{
Wrapper: aeadwrapper.NewWrapper(&wrapping.WrapperOptions{
Logger: logger,
}),
})

if err := adjustCoreForSealMigration(logger, cluster.Cores[0].Core, shamirSeal, seals[0]); err != nil {
t.Fatal(err)
}

// Although we're unsealing using the recovery keys, this is still an
// autounseal; if we stopped the transit cluster this would fail.
var resp *api.SealStatusResponse
for _, key := range initResp.RecoveryKeysB64 {
resp, err = client.Sys().UnsealWithOptions(&api.UnsealOpts{Key: key})
if err == nil {
t.Fatal("expected error due to lack of migrate parameter")
}
resp, err = client.Sys().UnsealWithOptions(&api.UnsealOpts{Key: key, Migrate: true})
if err != nil {
t.Fatal(err)
}
if resp == nil || !resp.Sealed {
break
}
}
if resp == nil || resp.Sealed {
t.Fatalf("expected unsealed state; got %#v", resp)
}
testhelpers.WaitForActiveNode(t, cluster)

// Seal and unseal again to verify that things are working fine
if err := client.Sys().Seal(); err != nil {
t.Fatal(err)
}

tcluster.Cleanup()
// Assign nil to Cores so the deferred Cleanup doesn't break.
tcluster.Cores = nil

// Now the recovery keys are actually the barrier unseal keys.
for _, key := range initResp.RecoveryKeysB64 {
resp, err = client.Sys().UnsealWithOptions(&api.UnsealOpts{Key: key})
if err != nil {
t.Fatal(err)
}
if resp == nil || !resp.Sealed {
break
}
}
if resp == nil || resp.Sealed {
t.Fatalf("expected unsealed state; got %#v", resp)
}

b, r, err := cluster.Cores[0].Core.PhysicalSealConfigs(context.Background())
if err != nil {
t.Fatal(err)
}
verifyBarrierConfig(t, b, wrapping.Shamir, 5, 3, 1)
if r != nil {
t.Fatalf("expected nil recovery config, got: %#v", r)
}
}
Loading