refactoring

This commit is contained in:
miampf 2025-01-09 16:01:03 +01:00
parent d336d06480
commit 241d0cd88d
No known key found for this signature in database
GPG key ID: EF039364B5B6886C
6 changed files with 28 additions and 32 deletions

View file

@ -19,9 +19,7 @@ package initserver
import ( import (
"bufio" "bufio"
"bytes"
"context" "context"
"crypto/ed25519"
"errors" "errors"
"fmt" "fmt"
"io" "io"
@ -234,16 +232,9 @@ func (s *Server) Init(req *initproto.InitRequest, stream initproto.API_InitServe
} }
return err return err
} }
_, priv, err := ed25519.GenerateKey(bytes.NewReader(key)) ca, err := crypto.GenerateEmergencySSHCAKey(key)
if err != nil { if err != nil {
if e := s.sendLogsWithMessage(stream, status.Errorf(codes.Internal, "generating signing key for emergency ssh CA: %s", err)); e != nil { if e := s.sendLogsWithMessage(stream, status.Errorf(codes.Internal, "generating emergency SSH CA key: %s", err)); e != nil {
err = errors.Join(err, e)
}
return err
}
ca, err := ssh.NewSignerFromSigner(priv)
if err != nil {
if e := s.sendLogsWithMessage(stream, status.Errorf(codes.Internal, "signing emergency ssh CA key: %s", err)); e != nil {
err = errors.Join(err, e) err = errors.Join(err, e)
} }
return err return err

View file

@ -11,6 +11,7 @@ go_library(
"//internal/attestation", "//internal/attestation",
"//internal/cloud/metadata", "//internal/cloud/metadata",
"//internal/constants", "//internal/constants",
"//internal/crypto",
"//internal/file", "//internal/file",
"//internal/nodestate", "//internal/nodestate",
"//internal/role", "//internal/role",

View file

@ -18,9 +18,7 @@ If the JoinClient finds an existing cluster, it will attempt to join it as eithe
package joinclient package joinclient
import ( import (
"bytes"
"context" "context"
"crypto/ed25519"
"errors" "errors"
"fmt" "fmt"
"log/slog" "log/slog"
@ -33,6 +31,7 @@ import (
"github.com/edgelesssys/constellation/v2/internal/attestation" "github.com/edgelesssys/constellation/v2/internal/attestation"
"github.com/edgelesssys/constellation/v2/internal/cloud/metadata" "github.com/edgelesssys/constellation/v2/internal/cloud/metadata"
"github.com/edgelesssys/constellation/v2/internal/constants" "github.com/edgelesssys/constellation/v2/internal/constants"
"github.com/edgelesssys/constellation/v2/internal/crypto"
"github.com/edgelesssys/constellation/v2/internal/file" "github.com/edgelesssys/constellation/v2/internal/file"
"github.com/edgelesssys/constellation/v2/internal/nodestate" "github.com/edgelesssys/constellation/v2/internal/nodestate"
"github.com/edgelesssys/constellation/v2/internal/role" "github.com/edgelesssys/constellation/v2/internal/role"
@ -274,17 +273,11 @@ func (c *JoinClient) startNodeAndJoin(ticket *joinproto.IssueJoinTicketResponse,
return fmt.Errorf("writing kubelet key: %w", err) return fmt.Errorf("writing kubelet key: %w", err)
} }
// derive CA key from emergency key ca, err := crypto.GenerateEmergencySSHCAKey(ticket.EmergencyCaKey)
_, priv, err := ed25519.GenerateKey(bytes.NewReader(ticket.EmergencyCaKey))
if err != nil { if err != nil {
return fmt.Errorf("deriving ed25519 ssh emergency key: %w", err) return fmt.Errorf("generating emergency SSH CA key: %s", err)
}
ca, err := ssh.NewSignerFromSigner(priv)
if err != nil {
return fmt.Errorf("creating emergency SSH CA key: %w", err)
} }
// TODO(miampf): Make path a constant
if err := c.fileHandler.Write(constants.SSHCAKeyPath, ssh.MarshalAuthorizedKey(ca.PublicKey()), file.OptMkdirAll); err != nil { if err := c.fileHandler.Write(constants.SSHCAKeyPath, ssh.MarshalAuthorizedKey(ca.PublicKey()), file.OptMkdirAll); err != nil {
return fmt.Errorf("writing ca key: %w", err) return fmt.Errorf("writing ca key: %w", err)
} }

View file

@ -7,8 +7,6 @@ SPDX-License-Identifier: AGPL-3.0-only
package cmd package cmd
import ( import (
"bytes"
"crypto/ed25519"
"crypto/rand" "crypto/rand"
"fmt" "fmt"
"os" "os"
@ -77,17 +75,12 @@ func runSSH(cmd *cobra.Command, _ []string) error {
return fmt.Errorf("Failed to retrieve key from key management service: %s", err) return fmt.Errorf("Failed to retrieve key from key management service: %s", err)
} }
_, priv, err := ed25519.GenerateKey(bytes.NewReader(key)) ca, err := crypto.GenerateEmergencySSHCAKey(key)
if err != nil { if err != nil {
return fmt.Errorf("Failed to create signing key from master secret: %s", err) return fmt.Errorf("Failed to generate emergency SSH CA key: %s", err)
} }
ca, err := ssh.NewSignerFromSigner(priv) debugLogger.Debug("SSH CA KEY generated", "public-key", string(ssh.MarshalAuthorizedKey(ca.PublicKey())))
if err != nil {
return fmt.Errorf("Failed to create ssh CA key from master secret: %s", err)
}
debugLogger.Debug("SSH CA KEY generated", "key", string(ssh.MarshalAuthorizedKey(ca.PublicKey())))
key_path, err := cmd.Flags().GetString("key") key_path, err := cmd.Flags().GetString("key")
if err != nil { if err != nil {

View file

@ -6,7 +6,10 @@ go_library(
srcs = ["crypto.go"], srcs = ["crypto.go"],
importpath = "github.com/edgelesssys/constellation/v2/internal/crypto", importpath = "github.com/edgelesssys/constellation/v2/internal/crypto",
visibility = ["//:__subpackages__"], visibility = ["//:__subpackages__"],
deps = ["@org_golang_x_crypto//hkdf"], deps = [
"@org_golang_x_crypto//hkdf",
"@org_golang_x_crypto//ssh",
],
) )
go_test( go_test(

View file

@ -9,6 +9,7 @@ package crypto
import ( import (
"bytes" "bytes"
"crypto/ed25519"
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"crypto/x509" "crypto/x509"
@ -18,6 +19,7 @@ import (
"math/big" "math/big"
"golang.org/x/crypto/hkdf" "golang.org/x/crypto/hkdf"
"golang.org/x/crypto/ssh"
) )
const ( const (
@ -62,6 +64,19 @@ func GenerateRandomBytes(length int) ([]byte, error) {
return nonce, nil return nonce, nil
} }
// GenerateEmergencySSHCAKey creates a CA that is used to sign keys for emergency ssh access.
func GenerateEmergencySSHCAKey(key []byte) (ssh.Signer, error) {
_, priv, err := ed25519.GenerateKey(bytes.NewReader(key))
if err != nil {
return nil, err
}
ca, err := ssh.NewSignerFromSigner(priv)
if err != nil {
return nil, err
}
return ca, nil
}
// PemToX509Cert takes a list of PEM-encoded certificates, parses the first one and returns it // PemToX509Cert takes a list of PEM-encoded certificates, parses the first one and returns it
// as an x.509 certificate. // as an x.509 certificate.
func PemToX509Cert(raw []byte) (*x509.Certificate, error) { func PemToX509Cert(raw []byte) (*x509.Certificate, error) {