Skip to content
This repository has been archived by the owner on Jan 10, 2023. It is now read-only.

Commit

Permalink
Metadata service: refresh Metatron certs every 5 minutes
Browse files Browse the repository at this point in the history
  • Loading branch information
rgulewich committed Jun 27, 2019
1 parent 9604d23 commit ff1d302
Show file tree
Hide file tree
Showing 4 changed files with 266 additions and 97 deletions.
17 changes: 17 additions & 0 deletions cmd/titus-metadata-service/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import (
// 169 is the first octet of 169.254...
const defaultListeningPort = 8169

const certRefreshTime = 5 * time.Minute

/* Either returns a listener, or logs a fatal error */
func getListener(listenPort int, listenerFd int64) net.Listener {
if listenerFd != -1 && listenPort != defaultListeningPort {
Expand Down Expand Up @@ -78,6 +80,20 @@ func readTaskConfigFile(taskID string) (*titus.ContainerInfo, error) {
return &cInfo, nil
}

func reloadSigner(ms *metadataserver.MetadataServer) {
t := time.NewTicker(certRefreshTime)
defer t.Stop()
for range t.C {
if newSigner, err := identity.NewDefaultSigner(); err != nil {
log.WithError(err).Fatal("Cannot instantiate new default signer")
} else {
if err := ms.SetSigner(newSigner); err != nil {
log.WithError(err).Error("Error reloading signing certificate")
}
}
}
}

func main() {
app := cli.NewApp()
app.Name = "titus-metadata-service"
Expand Down Expand Up @@ -236,6 +252,7 @@ func main() {
}
ms := metadataserver.NewMetaDataServer(context.Background(), mdscfg)
go notifySystemd()
go reloadSigner(ms)
// TODO: Wire up logic to shut down mds on signal
if err := http.Serve(listener, ms); err != nil {
return cli.NewExitError(err.Error(), 1)
Expand Down
39 changes: 39 additions & 0 deletions metadataserver/identity.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package metadataserver

import (
"crypto/x509"
"encoding/json"
"net/http"
"time"

"github.com/Netflix/titus-executor/api/netflix/titus"
"github.com/Netflix/titus-executor/metadataserver/identity"
"github.com/Netflix/titus-executor/metadataserver/metrics"
"github.com/pkg/errors"

"github.com/golang/protobuf/proto"
log "github.com/sirupsen/logrus"
Expand All @@ -29,6 +32,38 @@ func (ms *MetadataServer) generateTaskIdentity() *titus.TaskIdentity {
}
}

// SetSigner updates the identity server's signer
func (ms *MetadataServer) SetSigner(newSigner *identity.Signer) error {
newCert, err := x509.ParseCertificate(newSigner.Certificate.Certificate[0])
if err != nil {
return errors.Wrap(err, "error parsing new certificate")
}

ms.signLock.Lock()
defer ms.signLock.Unlock()
oldSigner := ms.signer
oldCert, err := x509.ParseCertificate(oldSigner.Certificate.Certificate[0])
if err != nil {
return errors.Wrap(err, "error parsing old certificate")
}

log.WithFields(log.Fields{
"newSubject": newCert.Subject,
"newIssuer": newCert.Issuer,
"newNotBefore": newCert.NotBefore,
"newNotAfter": newCert.NotAfter,
"newSerialNumber": newCert.SerialNumber,
"oldSubject": oldCert.Subject,
"oldIssuer": oldCert.Issuer,
"oldNotBefore": oldCert.NotBefore,
"oldNotAfter": oldCert.NotAfter,
"oldSerialNumber": oldCert.SerialNumber,
}).Info("signer cert updated")

ms.signer = newSigner
return nil
}

func (ms *MetadataServer) taskIdentity(w http.ResponseWriter, r *http.Request) {
metrics.PublishIncrementCounter("handler.task-identity.count")

Expand All @@ -42,7 +77,9 @@ func (ms *MetadataServer) taskIdentity(w http.ResponseWriter, r *http.Request) {
return
}

ms.signLock.Lock()
sig, err := ms.signer.Sign(identData)
ms.signLock.Unlock()
if err != nil {
log.WithError(err).Error("Error signing data")
w.WriteHeader(http.StatusInternalServerError)
Expand Down Expand Up @@ -80,7 +117,9 @@ func (ms *MetadataServer) taskIdentityJSON(w http.ResponseWriter, r *http.Reques
return
}

ms.signLock.Lock()
sig, err := ms.signer.SignString(identData)
ms.signLock.Unlock()
if err != nil {
log.WithError(err).Error("Error signing data")
w.WriteHeader(http.StatusInternalServerError)
Expand Down
3 changes: 3 additions & 0 deletions metadataserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"net/http/httputil"
"net/url"
"strings"
"sync"
"time"

"github.com/Netflix/titus-executor/api/netflix/titus"
Expand Down Expand Up @@ -57,6 +58,8 @@ type MetadataServer struct {
eniID string
container *titus.ContainerInfo
signer *identity.Signer
// Need to hold `signLock` while accessing `signer`
signLock sync.Mutex
}

func dumpRoutes(r *mux.Router) {
Expand Down
Loading

0 comments on commit ff1d302

Please sign in to comment.