Skip to content

Commit 621cbe6

Browse files
fix(ssh-proxy): Generate host key for gcp (#527)
Signed-off-by: Nathanael Ruf <nathanael@codesphere.com>
1 parent c37c2ba commit 621cbe6

3 files changed

Lines changed: 46 additions & 0 deletions

File tree

internal/installer/files/secret_names.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ const (
5757
// Ceph
5858
SecretCephSshPrivateKey = "cephSshPrivateKey"
5959

60+
// SSH workspace proxy
61+
SecretSshWorkspaceProxyHostKey = "sshWorkspaceProxyHostKey"
62+
6063
// Cluster / TLS
6164
SecretSelfSignedCaKeyPem = "selfSignedCaKeyPem"
6265

internal/installer/secrets/secrets.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ func EnsureSecrets(vault *files.InstallVault, config *files.RootConfig) error {
3535
if err := EnsureCephSSHKeys(vault, &config.Ceph); err != nil {
3636
return fmt.Errorf("ensure ceph SSH keys: %w", err)
3737
}
38+
if err := EnsureSshWorkspaceProxyHostKey(vault); err != nil {
39+
return fmt.Errorf("ensure ssh workspace proxy host key: %w", err)
40+
}
3841
if config.Postgres.Primary != nil {
3942
if err := EnsurePostgresSecrets(vault, &config.Postgres); err != nil {
4043
return fmt.Errorf("ensure postgres secrets: %w", err)
@@ -328,6 +331,24 @@ func EnsureCephSSHKeys(vault *files.InstallVault, ceph *files.CephConfig) error
328331
return nil
329332
}
330333

334+
// EnsureSshWorkspaceProxyHostKey generates the SSH host key for the SSH workspace proxy if not
335+
// already present in vault. Only the private key is stored (as key.pem); the matching public key
336+
// is derived by the proxy at runtime.
337+
func EnsureSshWorkspaceProxyHostKey(vault *files.InstallVault) error {
338+
if vault.GetSecret(files.SecretSshWorkspaceProxyHostKey) != nil {
339+
return nil
340+
}
341+
privKey, _, err := GenerateSSHKeyPair()
342+
if err != nil {
343+
return fmt.Errorf("generate ssh workspace proxy host key: %w", err)
344+
}
345+
vault.SetSecret(files.SecretEntry{
346+
Name: files.SecretSshWorkspaceProxyHostKey,
347+
File: &files.SecretFile{Name: "key.pem", Content: privKey},
348+
})
349+
return nil
350+
}
351+
331352
// EnsurePostgresSecrets generates all postgres certificates and passwords if not already present
332353
// in vault (sentinel: postgresPassword). Private keys and passwords are written to vault;
333354
// cert PEMs are set on the postgres config struct for inclusion in the config YAML.

internal/installer/secrets/secrets_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,28 @@ var _ = Describe("EnsureCephSSHKeys", func() {
287287
})
288288
})
289289

290+
var _ = Describe("EnsureSshWorkspaceProxyHostKey", func() {
291+
It("writes the host private key to vault", func() {
292+
vault := newVault()
293+
294+
Expect(secrets.EnsureSshWorkspaceProxyHostKey(vault)).To(Succeed())
295+
296+
hostKey := vault.GetSecret("sshWorkspaceProxyHostKey")
297+
Expect(hostKey).NotTo(BeNil())
298+
Expect(hostKey.File.Name).To(Equal("key.pem"))
299+
Expect(hostKey.File.Content).To(ContainSubstring("BEGIN RSA PRIVATE KEY"))
300+
})
301+
302+
It("is idempotent", func() {
303+
vault := newVault()
304+
Expect(secrets.EnsureSshWorkspaceProxyHostKey(vault)).To(Succeed())
305+
306+
origKey := vault.GetSecret("sshWorkspaceProxyHostKey").File.Content
307+
Expect(secrets.EnsureSshWorkspaceProxyHostKey(vault)).To(Succeed())
308+
Expect(vault.GetSecret("sshWorkspaceProxyHostKey").File.Content).To(Equal(origKey))
309+
})
310+
})
311+
290312
var _ = Describe("EnsurePostgresSecrets", func() {
291313
var postgres *files.PostgresConfig
292314

0 commit comments

Comments
 (0)