Skip to content

Commit 8ab4013

Browse files
committed
fixing fallback to proto stream V1 for plaintext recordings and a few issues pointed out in PR feedback
1 parent 27af8ee commit 8ab4013

File tree

11 files changed

+102
-180
lines changed

11 files changed

+102
-180
lines changed

lib/auth/auth.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) {
221221
if err != nil {
222222
return nil, trace.Wrap(err)
223223
}
224-
cfg.ClusterConfiguration = recordingencryption.NewClusterConfigService(clusterConfig, cfg.RecordingEncryption)
224+
cfg.ClusterConfiguration = clusterConfig
225225
}
226226
if cfg.KeyStore == nil {
227227
keystoreOpts := &keystore.Options{
@@ -255,16 +255,16 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) {
255255
}
256256

257257
recordingEncryptionManager, err := recordingencryption.NewManager(recordingencryption.ManagerConfig{
258-
Backend: localRecordingEncryption,
259-
KeyStore: cfg.KeyStore,
260-
Logger: cfg.Logger,
258+
Backend: localRecordingEncryption,
259+
ClusterConfig: cfg.ClusterConfiguration,
260+
KeyStore: cfg.KeyStore,
261+
Logger: cfg.Logger,
261262
})
262263
if err != nil {
263264
return nil, trace.Wrap(err)
264265
}
265266

266267
cfg.RecordingEncryption = recordingEncryptionManager
267-
cfg.ClusterConfiguration = recordingencryption.NewClusterConfigService(cfg.ClusterConfiguration, recordingEncryptionManager)
268268
}
269269
if cfg.AutoUpdateService == nil {
270270
cfg.AutoUpdateService, err = local.NewAutoUpdateService(cfg.Backend)

lib/auth/helpers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) {
323323
}
324324
}
325325

326-
keyStore, err := keystore.NewManager(context.Background(), &cfg.KeystoreConfig, keystoreOpts)
326+
keyStore, err := keystore.NewManager(ctx, &cfg.KeystoreConfig, keystoreOpts)
327327
if err != nil {
328328
return nil, trace.Wrap(err)
329329
}

lib/auth/init.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import (
4545
autoupdatev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1"
4646
clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1"
4747
machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1"
48+
recordingencryptionv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/recordingencryption/v1"
4849
"github.com/gravitational/teleport/api/types"
4950
"github.com/gravitational/teleport/api/types/clusterconfig"
5051
apievents "github.com/gravitational/teleport/api/types/events"
@@ -90,8 +91,8 @@ type VersionStorage interface {
9091
// operations.
9192
type RecordingEncryptionManager interface {
9293
services.RecordingEncryption
93-
recordingencryption.Resolver
9494
recordingencryption.DecryptionKeyFinder
95+
ResolveRecordingEncryption(ctx context.Context) (*recordingencryptionv1pb.RecordingEncryption, error)
9596
}
9697

9798
// InitConfig is auth server init config

lib/auth/recordingencryption/clusterconfig.go

Lines changed: 0 additions & 105 deletions
This file was deleted.

lib/auth/recordingencryption/encryptedio.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ func (e *EncryptedIO) WithEncryption(ctx context.Context, writer io.WriteCloser)
6868
// WithDecryption wraps the given io.Reader with decryption using the recordingencryption.RecordingIdentity. This
6969
// will dynamically search for an accessible decryption key using the provided recordingencryption.DecryptionKeyFinder
7070
// in order to perform decryption
71-
func (e *EncryptedIO) WithDecryption(reader io.Reader) (io.Reader, error) {
71+
func (e *EncryptedIO) WithDecryption(ctx context.Context, reader io.Reader) (io.Reader, error) {
7272
if e.keyFinder == nil {
7373
return reader, nil
7474
}
7575

76-
ident := NewRecordingIdentity(e.keyFinder)
76+
ident := NewRecordingIdentity(ctx, e.keyFinder)
7777
r, err := age.Decrypt(reader, ident)
7878
if err != nil {
7979
return nil, trace.Wrap(err)
@@ -112,10 +112,35 @@ func (s *EncryptionWrapper) WithEncryption(ctx context.Context, writer io.WriteC
112112
recipients = append(recipients, recipient)
113113
}
114114

115-
w, err := age.Encrypt(writer, recipients...)
116-
if err != nil {
117-
return nil, trace.Wrap(err)
115+
return &ageWriter{
116+
w: writer,
117+
recipients: recipients,
118+
}, nil
119+
}
120+
121+
// ageWriter defers initializing the age encrypter to the first write so we can
122+
// prevent age from immediately writing the header
123+
type ageWriter struct {
124+
w io.WriteCloser
125+
recipients []age.Recipient
126+
initialized bool
127+
}
128+
129+
// Write data using age encryption, initializing the encrypter if needed
130+
func (a *ageWriter) Write(data []byte) (int, error) {
131+
if !a.initialized {
132+
w, err := age.Encrypt(a.w, a.recipients...)
133+
if err != nil {
134+
return 0, trace.Wrap(err)
135+
}
136+
a.w = w
137+
a.initialized = true
118138
}
119139

120-
return w, nil
140+
return a.w.Write(data)
141+
}
142+
143+
// Close flushes any buffered encrypted data and closes the underlying io.WriteCloser
144+
func (a *ageWriter) Close() error {
145+
return a.w.Close()
121146
}

lib/auth/recordingencryption/encryptedio_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func TestEncryptedIO(t *testing.T) {
5656
err = writer.Close()
5757
require.NoError(t, err)
5858

59-
reader, err := encryptedIO.WithDecryption(out)
59+
reader, err := encryptedIO.WithDecryption(ctx, out)
6060
require.NoError(t, err)
6161

6262
plaintext, err := io.ReadAll(reader)

lib/auth/recordingencryption/manager.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -300,12 +300,8 @@ func (m *Manager) searchActiveKeys(ctx context.Context, activeKeys []*recordinge
300300
continue
301301
}
302302

303-
// TODO (eriktate): this is a bit of a hack to allow encryption to work while the public key isn't retrievable
304-
// from the age header
305-
if publicKey != nil {
306-
if !slices.Equal(key.RecordingEncryptionPair.PublicKey, publicKey) {
307-
continue
308-
}
303+
if !slices.Equal(key.RecordingEncryptionPair.PublicKey, publicKey) {
304+
continue
309305
}
310306

311307
decrypter, err := m.keyStore.GetDecrypter(ctx, key.KeyEncryptionPair)
@@ -329,8 +325,7 @@ func (m *Manager) searchActiveKeys(ctx context.Context, activeKeys []*recordinge
329325
}
330326

331327
// FindDecryptionKey returns the first accessible decryption key that matches one of the given public keys.
332-
func (m *Manager) FindDecryptionKey(publicKeys ...[]byte) (*types.EncryptionKeyPair, error) {
333-
ctx := context.Background()
328+
func (m *Manager) FindDecryptionKey(ctx context.Context, publicKeys ...[]byte) (*types.EncryptionKeyPair, error) {
334329
encryption, err := m.GetRecordingEncryption(ctx)
335330
if err != nil {
336331
return nil, trace.Wrap(err)

lib/auth/recordingencryption/manager_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,21 @@ func TestFindDecryptionKeyFromActiveKeys(t *testing.T) {
305305
pubKey := activeKeys[0].RecordingEncryptionPair.PublicKey
306306

307307
// fail to find private key for manager B because it is waiting for key fulfillment
308-
_, err = managerB.FindDecryptionKey(pubKey)
308+
_, err = managerB.FindDecryptionKey(ctx, pubKey)
309309
require.Error(t, err)
310310

311311
_, err = managerA.ResolveRecordingEncryption(ctx)
312312
require.NoError(t, err)
313313

314314
// find private key for manager A because it provisioned the key
315-
decryptionPair, err := managerA.FindDecryptionKey(pubKey)
315+
decryptionPair, err := managerA.FindDecryptionKey(ctx, pubKey)
316316
require.NoError(t, err)
317317
ident, err := age.ParseX25519Identity(string(decryptionPair.PrivateKey))
318318
require.NoError(t, err)
319319
require.Equal(t, ident.Recipient().String(), string(pubKey))
320320

321321
// find private key for manager B after fulfillment
322-
decryptionPair, err = managerB.FindDecryptionKey(pubKey)
322+
decryptionPair, err = managerB.FindDecryptionKey(ctx, pubKey)
323323
require.NoError(t, err)
324324
ident, err = age.ParseX25519Identity(string(decryptionPair.PrivateKey))
325325
require.NoError(t, err)

0 commit comments

Comments
 (0)