From a43f2097ff451bf2d3d2e9043202f30ed19b3ba4 Mon Sep 17 00:00:00 2001 From: Andreas Auernhammer Date: Sat, 12 Jun 2021 00:04:26 +0200 Subject: [PATCH] admin: add KMS status API (#12429) This commit adds an admin API for fetching the KMS status information (default key ID, endpoints, ...). With this commit the server exposes REST endpoint: ``` GET /kms/status ``` Signed-off-by: Andreas Auernhammer --- cmd/admin-handlers.go | 38 ++++++++++++++++++++++++++++++++++++++ cmd/admin-router.go | 1 + 2 files changed, 39 insertions(+) diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index 0ec8d3c6b..7244dfb4d 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -1289,6 +1289,44 @@ func (a adminAPIHandlers) KMSCreateKeyHandler(w http.ResponseWriter, r *http.Req writeSuccessResponseHeadersOnly(w) } +// KMSKeyStatusHandler - GET /minio/admin/v3/kms/status +func (a adminAPIHandlers) KMSStatusHandler(w http.ResponseWriter, r *http.Request) { + ctx := newContext(r, w, "KMSStatus") + defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) + + objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.KMSKeyStatusAdminAction) + if objectAPI == nil { + return + } + + if GlobalKMS == nil { + writeErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrKMSNotConfigured), r.URL) + return + } + + stat, err := GlobalKMS.Stat() + if err != nil { + writeCustomErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrInternalError), err.Error(), r.URL) + return + } + + status := madmin.KMSStatus{ + Name: stat.Name, + DefaultKeyID: stat.DefaultKey, + Endpoints: make(map[string]madmin.ItemState, len(stat.Endpoints)), + } + for _, endpoint := range stat.Endpoints { + status.Endpoints[endpoint] = madmin.ItemOnline // TODO(aead): Implement an online check for mTLS + } + + resp, err := json.Marshal(status) + if err != nil { + writeCustomErrorResponseJSON(ctx, w, errorCodes.ToAPIErr(ErrInternalError), err.Error(), r.URL) + return + } + writeSuccessResponseJSON(w, resp) +} + // KMSKeyStatusHandler - GET /minio/admin/v3/kms/key/status?key-id= func (a adminAPIHandlers) KMSKeyStatusHandler(w http.ResponseWriter, r *http.Request) { ctx := newContext(r, w, "KMSKeyStatus") diff --git a/cmd/admin-router.go b/cmd/admin-router.go index 7ba37444c..7013cddde 100644 --- a/cmd/admin-router.go +++ b/cmd/admin-router.go @@ -201,6 +201,7 @@ func registerAdminRouter(router *mux.Router, enableConfigOps, enableIAMOps bool) // -- KMS APIs -- // + adminRouter.Methods(http.MethodPost).Path(adminVersion + "/kms/status").HandlerFunc(httpTraceAll(adminAPI.KMSStatusHandler)) adminRouter.Methods(http.MethodPost).Path(adminVersion+"/kms/key/create").HandlerFunc(httpTraceAll(adminAPI.KMSCreateKeyHandler)).Queries("key-id", "{key-id:.*}") adminRouter.Methods(http.MethodGet).Path(adminVersion + "/kms/key/status").HandlerFunc(httpTraceAll(adminAPI.KMSKeyStatusHandler))