add build tags to disable kms providers

This commit is contained in:
Nicola Murino 2020-12-02 09:44:18 +01:00
parent 87b51a6fd5
commit a67276ccc2
No known key found for this signature in database
GPG key ID: 2F1FB59433D5A8CB
13 changed files with 132 additions and 35 deletions

View file

@ -1,14 +1,6 @@
# Build SFTPGo from source # Build SFTPGo from source
You can install the package to your [\$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH") with the [go tool](https://golang.org/cmd/go/ "go command") from shell: Download the sources and use `go build`.
```bash
go get -u github.com/drakkan/sftpgo
```
Or you can download the sources and use `go build`.
Make sure [Git](https://git-scm.com/downloads) is installed on your machine and in your system's `PATH`.
The following build tags are available: The following build tags are available:
@ -21,6 +13,9 @@ The following build tags are available:
- `nosqlite`, disable SQLite data provider, default enabled - `nosqlite`, disable SQLite data provider, default enabled
- `noportable`, disable portable mode, default enabled - `noportable`, disable portable mode, default enabled
- `nometrics`, disable Prometheus metrics, default enabled - `nometrics`, disable Prometheus metrics, default enabled
- `novaultkms`, disable Vault transit secret engine, default enabled
- `noawskms`, disable AWS KMS, default enabled
- `nogcpkms`, disable GCP KMS, default enabled
If no build tag is specified the build will include the default features. If no build tag is specified the build will include the default features.

View file

@ -1400,10 +1400,10 @@ func TestSecretObjectCompatibility(t *testing.T) {
localAsJSON, err := json.Marshal(s) localAsJSON, err := json.Marshal(s)
assert.NoError(t, err) assert.NoError(t, err)
for _, provider := range []string{kms.SecretStatusRedacted} { for _, secretStatus := range []string{kms.SecretStatusSecretBox} {
kmsConfig := config.GetKMSConfig() kmsConfig := config.GetKMSConfig()
assert.Empty(t, kmsConfig.Secrets.MasterKeyPath) assert.Empty(t, kmsConfig.Secrets.MasterKeyPath)
if provider == kms.SecretStatusVaultTransit { if secretStatus == kms.SecretStatusVaultTransit {
os.Setenv("VAULT_SERVER_URL", "http://127.0.0.1:8200") os.Setenv("VAULT_SERVER_URL", "http://127.0.0.1:8200")
os.Setenv("VAULT_SERVER_TOKEN", "s.9lYGq83MbgG5KR5kfebXVyhJ") os.Setenv("VAULT_SERVER_TOKEN", "s.9lYGq83MbgG5KR5kfebXVyhJ")
kmsConfig.Secrets.URL = "hashivault://mykey" kmsConfig.Secrets.URL = "hashivault://mykey"
@ -1420,7 +1420,7 @@ func TestSecretObjectCompatibility(t *testing.T) {
err = secretClone.Decrypt() err = secretClone.Decrypt()
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, testPayload, secretClone.GetPayload()) assert.Equal(t, testPayload, secretClone.GetPayload())
if provider == kms.SecretStatusVaultTransit { if secretStatus == kms.SecretStatusVaultTransit {
// decrypt the local secret now that the provider is vault // decrypt the local secret now that the provider is vault
secretLocal := kms.NewEmptySecret() secretLocal := kms.NewEmptySecret()
err = json.Unmarshal(localAsJSON, secretLocal) err = json.Unmarshal(localAsJSON, secretLocal)
@ -1448,7 +1448,7 @@ func TestSecretObjectCompatibility(t *testing.T) {
MasterKeyPath: masterKeyPath, MasterKeyPath: masterKeyPath,
}, },
} }
if provider == kms.SecretStatusVaultTransit { if secretStatus == kms.SecretStatusVaultTransit {
config.Secrets.URL = "hashivault://mykey" config.Secrets.URL = "hashivault://mykey"
} }
err = config.Initialize() err = config.Initialize()
@ -1468,7 +1468,7 @@ func TestSecretObjectCompatibility(t *testing.T) {
err = secret.Decrypt() err = secret.Decrypt()
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, testPayload, secret.GetPayload()) assert.Equal(t, testPayload, secret.GetPayload())
if provider == kms.SecretStatusVaultTransit { if secretStatus == kms.SecretStatusVaultTransit {
// decrypt the local secret encryped without a master key now that // decrypt the local secret encryped without a master key now that
// the provider is vault and a master key is set. // the provider is vault and a master key is set.
// The provider will not change, the master key will be used // The provider will not change, the master key will be used
@ -1491,7 +1491,7 @@ func TestSecretObjectCompatibility(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
err = os.Remove(masterKeyPath) err = os.Remove(masterKeyPath)
assert.NoError(t, err) assert.NoError(t, err)
if provider == kms.SecretStatusVaultTransit { if secretStatus == kms.SecretStatusVaultTransit {
os.Unsetenv("VAULT_SERVER_URL") os.Unsetenv("VAULT_SERVER_URL")
os.Unsetenv("VAULT_SERVER_TOKEN") os.Unsetenv("VAULT_SERVER_TOKEN")
} }

View file

@ -1,13 +1,22 @@
// +build !noawskms
package kms package kms
const ( import (
awsProviderName = "AWS" // we import awskms here to be able to disable AWS KMS support using a build tag
_ "gocloud.dev/secrets/awskms"
"github.com/drakkan/sftpgo/version"
) )
type awsSecret struct { type awsSecret struct {
baseGCloudSecret baseGCloudSecret
} }
func init() {
version.AddFeature("+awskms")
}
func newAWSSecret(base baseSecret, url, masterKey string) SecretProvider { func newAWSSecret(base baseSecret, url, masterKey string) SecretProvider {
return &awsSecret{ return &awsSecret{
baseGCloudSecret{ baseGCloudSecret{

17
kms/aws_disabled.go Normal file
View file

@ -0,0 +1,17 @@
// +build noawskms
package kms
import (
"errors"
"github.com/drakkan/sftpgo/version"
)
func init() {
version.AddFeature("-awskms")
}
func newAWSSecret(base baseSecret, url, masterKey string) SecretProvider {
return newDisabledSecret(errors.New("AWS KMS disabled at build time"))
}

View file

@ -6,12 +6,6 @@ import (
"time" "time"
"gocloud.dev/secrets" "gocloud.dev/secrets"
// import awskms package
_ "gocloud.dev/secrets/awskms"
// import gcpkms package
_ "gocloud.dev/secrets/gcpkms"
// import hashivault package
_ "gocloud.dev/secrets/hashivault"
) )
type baseGCloudSecret struct { type baseGCloudSecret struct {

View file

@ -10,10 +10,6 @@ import (
"github.com/minio/sha256-simd" "github.com/minio/sha256-simd"
) )
const (
builtinProviderName = "Builtin"
)
type builtinSecret struct { type builtinSecret struct {
baseSecret baseSecret
} }

29
kms/disabled.go Normal file
View file

@ -0,0 +1,29 @@
package kms
type disabledSecret struct {
baseSecret
err error
}
func newDisabledSecret(err error) SecretProvider {
return &disabledSecret{
baseSecret: baseSecret{},
err: err,
}
}
func (s *disabledSecret) Name() string {
return disabledProviderName
}
func (s *disabledSecret) IsEncrypted() bool {
return false
}
func (s *disabledSecret) Encrypt() error {
return s.err
}
func (s *disabledSecret) Decrypt() error {
return s.err
}

View file

@ -1,13 +1,22 @@
// +build !nogcpkms
package kms package kms
const ( import (
gcpProviderName = "GCP" // we import gcpkms here to be able to disable GCP KMS support using a build tag
_ "gocloud.dev/secrets/gcpkms"
"github.com/drakkan/sftpgo/version"
) )
type gcpSecret struct { type gcpSecret struct {
baseGCloudSecret baseGCloudSecret
} }
func init() {
version.AddFeature("+gcpkms")
}
func newGCPSecret(base baseSecret, url, masterKey string) SecretProvider { func newGCPSecret(base baseSecret, url, masterKey string) SecretProvider {
return &gcpSecret{ return &gcpSecret{
baseGCloudSecret{ baseGCloudSecret{

17
kms/gcp_disabled.go Normal file
View file

@ -0,0 +1,17 @@
// +build nogcpkms
package kms
import (
"errors"
"github.com/drakkan/sftpgo/version"
)
func init() {
version.AddFeature("-gcpkms")
}
func newGCPSecret(base baseSecret, url, masterKey string) SecretProvider {
return newDisabledSecret(errors.New("GCP KMS disabled at build time"))
}

View file

@ -50,6 +50,15 @@ const (
SecretStatusRedacted SecretStatus = "Redacted" SecretStatusRedacted SecretStatus = "Redacted"
) )
const (
localProviderName = "Local"
builtinProviderName = "Builtin"
awsProviderName = "AWS"
gcpProviderName = "GCP"
vaultProviderName = "VaultTransit"
disabledProviderName = "Disabled"
)
// Configuration defines the KMS configuration // Configuration defines the KMS configuration
type Configuration struct { type Configuration struct {
Secrets Secrets `json:"secrets" mapstructure:"secrets"` Secrets Secrets `json:"secrets" mapstructure:"secrets"`

View file

@ -11,10 +11,6 @@ import (
"golang.org/x/crypto/hkdf" "golang.org/x/crypto/hkdf"
) )
const (
localProviderName = "Local"
)
type localSecret struct { type localSecret struct {
baseSecret baseSecret
masterKey string masterKey string

View file

@ -1,13 +1,22 @@
// +build !novaultkms
package kms package kms
const ( import (
vaultProviderName = "VaultTransit" // we import hashivault here to be able to disable Vault support using a build tag
_ "gocloud.dev/secrets/hashivault"
"github.com/drakkan/sftpgo/version"
) )
type vaultSecret struct { type vaultSecret struct {
baseGCloudSecret baseGCloudSecret
} }
func init() {
version.AddFeature("+vaultkms")
}
func newVaultSecret(base baseSecret, url, masterKey string) SecretProvider { func newVaultSecret(base baseSecret, url, masterKey string) SecretProvider {
return &vaultSecret{ return &vaultSecret{
baseGCloudSecret{ baseGCloudSecret{

17
kms/vault_disabled.go Normal file
View file

@ -0,0 +1,17 @@
// +build novaultkms
package kms
import (
"errors"
"github.com/drakkan/sftpgo/version"
)
func init() {
version.AddFeature("-vaultkms")
}
func newVaultSecret(base baseSecret, url, masterKey string) SecretProvider {
return newDisabledSecret(errors.New("Vault KMS disabled at build time"))
}