Skip to content

Commit 007c8aa

Browse files
authored
Reapply "[ASCII-2586] Migrating SecurityAgent to use IPC cert" (#32313)
1 parent 6fb76d5 commit 007c8aa

File tree

3 files changed

+19
-44
lines changed

3 files changed

+19
-44
lines changed

cmd/security-agent/api/server.go

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ package api
1212

1313
import (
1414
"crypto/tls"
15-
"crypto/x509"
16-
"encoding/pem"
17-
"fmt"
1815
stdLog "log"
1916
"net"
2017
"net/http"
@@ -23,10 +20,10 @@ import (
2320
"github.com/gorilla/mux"
2421

2522
"github.com/DataDog/datadog-agent/cmd/security-agent/api/agent"
23+
"github.com/DataDog/datadog-agent/comp/api/authtoken"
2624
"github.com/DataDog/datadog-agent/comp/core/settings"
2725
"github.com/DataDog/datadog-agent/comp/core/status"
2826
workloadmeta "github.com/DataDog/datadog-agent/comp/core/workloadmeta/def"
29-
"github.com/DataDog/datadog-agent/pkg/api/security"
3027
"github.com/DataDog/datadog-agent/pkg/api/util"
3128
pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup"
3229
"github.com/DataDog/datadog-agent/pkg/util/log"
@@ -35,19 +32,21 @@ import (
3532

3633
// Server implements security agent API server
3734
type Server struct {
38-
listener net.Listener
39-
agent *agent.Agent
35+
listener net.Listener
36+
agent *agent.Agent
37+
tlsConfig *tls.Config
4038
}
4139

4240
// NewServer creates a new Server instance
43-
func NewServer(statusComponent status.Component, settings settings.Component, wmeta workloadmeta.Component) (*Server, error) {
41+
func NewServer(statusComponent status.Component, settings settings.Component, wmeta workloadmeta.Component, at authtoken.Component) (*Server, error) {
4442
listener, err := newListener()
4543
if err != nil {
4644
return nil, err
4745
}
4846
return &Server{
49-
listener: listener,
50-
agent: agent.NewAgent(statusComponent, settings, wmeta),
47+
listener: listener,
48+
agent: agent.NewAgent(statusComponent, settings, wmeta),
49+
tlsConfig: at.GetTLSServerConfig(),
5150
}, nil
5251
}
5352

@@ -62,43 +61,16 @@ func (s *Server) Start() error {
6261
// Validate token for every request
6362
r.Use(validateToken)
6463

65-
err := util.CreateAndSetAuthToken(pkgconfigsetup.Datadog())
66-
if err != nil {
67-
return err
68-
}
69-
70-
hosts := []string{"127.0.0.1", "localhost"}
71-
_, rootCertPEM, rootKey, err := security.GenerateRootCert(hosts, 2048)
72-
if err != nil {
73-
return fmt.Errorf("unable to start TLS server")
74-
}
75-
76-
// PEM encode the private key
77-
rootKeyPEM := pem.EncodeToMemory(&pem.Block{
78-
Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rootKey),
79-
})
80-
81-
// Create a TLS cert using the private key and certificate
82-
rootTLSCert, err := tls.X509KeyPair(rootCertPEM, rootKeyPEM)
83-
if err != nil {
84-
return fmt.Errorf("invalid key pair: %v", err)
85-
}
86-
87-
tlsConfig := tls.Config{
88-
Certificates: []tls.Certificate{rootTLSCert},
89-
MinVersion: tls.VersionTLS13,
90-
}
91-
9264
// Use a stack depth of 4 on top of the default one to get a relevant filename in the stdlib
9365
logWriter, _ := pkglogsetup.NewLogWriter(4, log.ErrorLvl)
9466

9567
srv := &http.Server{
9668
Handler: r,
9769
ErrorLog: stdLog.New(logWriter, "Error from the agent http API server: ", 0), // log errors to seelog,
98-
TLSConfig: &tlsConfig,
70+
TLSConfig: s.tlsConfig,
9971
WriteTimeout: pkgconfigsetup.Datadog().GetDuration("server_timeout") * time.Second,
10072
}
101-
tlsListener := tls.NewListener(s.listener, &tlsConfig)
73+
tlsListener := tls.NewListener(s.listener, s.tlsConfig)
10274

10375
go srv.Serve(tlsListener) //nolint:errcheck
10476
return nil

cmd/security-agent/main_windows.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/DataDog/datadog-agent/cmd/security-agent/subcommands/start"
2626
"github.com/DataDog/datadog-agent/comp/agent/autoexit"
2727
"github.com/DataDog/datadog-agent/comp/agent/autoexit/autoexitimpl"
28+
"github.com/DataDog/datadog-agent/comp/api/authtoken"
2829
"github.com/DataDog/datadog-agent/comp/api/authtoken/fetchonlyimpl"
2930
"github.com/DataDog/datadog-agent/comp/core"
3031
"github.com/DataDog/datadog-agent/comp/core/config"
@@ -91,10 +92,11 @@ func (s *service) Run(svcctx context.Context) error {
9192
params := &cliParams{}
9293
err := fxutil.OneShot(
9394
func(log log.Component, config config.Component, _ secrets.Component, _ statsd.Component, _ sysprobeconfig.Component,
94-
telemetry telemetry.Component, _ workloadmeta.Component, _ *cliParams, statusComponent status.Component, _ autoexit.Component, settings settings.Component, wmeta workloadmeta.Component) error {
95+
telemetry telemetry.Component, _ workloadmeta.Component, _ *cliParams, statusComponent status.Component, _ autoexit.Component,
96+
settings settings.Component, wmeta workloadmeta.Component, at authtoken.Component) error {
9597
defer start.StopAgent(log)
9698

97-
err := start.RunAgent(log, config, telemetry, statusComponent, settings, wmeta)
99+
err := start.RunAgent(log, config, telemetry, statusComponent, settings, wmeta, at)
98100
if err != nil {
99101
if errors.Is(err, start.ErrAllComponentsDisabled) {
100102
// If all components are disabled, we should exit cleanly

cmd/security-agent/subcommands/start/command.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/DataDog/datadog-agent/cmd/security-agent/subcommands/runtime"
3030
"github.com/DataDog/datadog-agent/comp/agent/autoexit"
3131
"github.com/DataDog/datadog-agent/comp/agent/autoexit/autoexitimpl"
32+
"github.com/DataDog/datadog-agent/comp/api/authtoken"
3233
"github.com/DataDog/datadog-agent/comp/api/authtoken/fetchonlyimpl"
3334
"github.com/DataDog/datadog-agent/comp/core"
3435
"github.com/DataDog/datadog-agent/comp/core/config"
@@ -201,10 +202,10 @@ func Commands(globalParams *command.GlobalParams) []*cobra.Command {
201202
// TODO(components): note how workloadmeta is passed anonymously, it is still required as it is used
202203
// as a global. This should eventually be fixed and all workloadmeta interactions should be via the
203204
// injected instance.
204-
func start(log log.Component, config config.Component, _ secrets.Component, _ statsd.Component, _ sysprobeconfig.Component, telemetry telemetry.Component, statusComponent status.Component, _ pid.Component, _ autoexit.Component, settings settings.Component, wmeta workloadmeta.Component) error {
205+
func start(log log.Component, config config.Component, _ secrets.Component, _ statsd.Component, _ sysprobeconfig.Component, telemetry telemetry.Component, statusComponent status.Component, _ pid.Component, _ autoexit.Component, settings settings.Component, wmeta workloadmeta.Component, at authtoken.Component) error {
205206
defer StopAgent(log)
206207

207-
err := RunAgent(log, config, telemetry, statusComponent, settings, wmeta)
208+
err := RunAgent(log, config, telemetry, statusComponent, settings, wmeta, at)
208209
if errors.Is(err, ErrAllComponentsDisabled) || errors.Is(err, errNoAPIKeyConfigured) {
209210
return nil
210211
}
@@ -256,7 +257,7 @@ var ErrAllComponentsDisabled = errors.New("all security-agent component are disa
256257
var errNoAPIKeyConfigured = errors.New("no API key configured")
257258

258259
// RunAgent initialized resources and starts API server
259-
func RunAgent(log log.Component, config config.Component, telemetry telemetry.Component, statusComponent status.Component, settings settings.Component, wmeta workloadmeta.Component) (err error) {
260+
func RunAgent(log log.Component, config config.Component, telemetry telemetry.Component, statusComponent status.Component, settings settings.Component, wmeta workloadmeta.Component, at authtoken.Component) (err error) {
260261
if err := coredump.Setup(config); err != nil {
261262
log.Warnf("Can't setup core dumps: %v, core dumps might not be available after a crash", err)
262263
}
@@ -299,7 +300,7 @@ func RunAgent(log log.Component, config config.Component, telemetry telemetry.Co
299300
}
300301
}()
301302

302-
srv, err = api.NewServer(statusComponent, settings, wmeta)
303+
srv, err = api.NewServer(statusComponent, settings, wmeta, at)
303304
if err != nil {
304305
return log.Errorf("Error while creating api server, exiting: %v", err)
305306
}

0 commit comments

Comments
 (0)