mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-01 21:52:02 +08:00
* [draft] Add a new usage reporter This adds a new usage reporter service to the auth server. It's disabled by default in OSS and can only be turned on via startup hook in Cloud / Enterprise. In OSS, the audit log wrapper is never configured and any usage events are sent to a no-op discard reporter. Usage events are defined in prehog and can be sent to the new UsageReporter Service on the auth server. An audit event wrapper is used to capture certain events that are otherwise difficult to hook. Events are anonymized before submission, then held in a non-blocking queue for batching and submission purposes. * Remove dead code * Add SubmitUsageEvent RPC to Auth. This adds a new SubmitUsageEvent RPC to the Auth API that external clients (e.g. the UI) can use to submit usage events externally. * Slight refactor for unit testing * Add Prometheus metrics and add initial working prehog submitter * Add more metrics, tweak prehog client, and add unit tests * Further tweak http transport settings based on Teleport defaults * Add missing metrics * Fix goimports * Add new UI usage events * Update e ref * Add prehog directly for now. Improve logging. * update prehog * Add new prehog events; use username from request identity * add HTTP server for user events * Add username back to pre-onboard events * unauthenticated user events * Fix userevent build error * Use event-provided username where appropriate * Move barebones prehog reqs to lib/prehog and generate here. Also, use prod tunable values. * Fix license lints * De-flake tests by adding unfortunate amounts of synchronization. * Add missing license header * Misc PR cleanup for review * Update lib/events/usageevents/usageevents.go Co-authored-by: Edoardo Spadolini <edoardo.spadolini@goteleport.com> * Address a batch of review comments Adds `anonymizer.AnonymizeString` and parent loggers * Update e ref * Clean up comments * Remove onboard prefix from recovery code event * Address another batch of feedback * Use defaults.HTTPClient() * Remove a noisy log message * Demote noisy log message to debug * Temporarily revert e ref for merge Co-authored-by: Michelle Bergquist <michelle.bergquist@goteleport.com> Co-authored-by: Edoardo Spadolini <edoardo.spadolini@goteleport.com>
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
/*
|
|
Copyright 2018 Gravitational, Inc.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package utils
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/sha256"
|
|
"encoding/base64"
|
|
"strings"
|
|
|
|
"github.com/gravitational/trace"
|
|
)
|
|
|
|
// Anonymizer defines an interface for anonymizing data
|
|
type Anonymizer interface {
|
|
// Anonymize returns anonymized string from the provided data
|
|
Anonymize(data []byte) string
|
|
|
|
// AnonymizeString anonymizes the given string data using HMAC
|
|
AnonymizeString(s string) string
|
|
}
|
|
|
|
// hmacAnonymizer implements anonymization using HMAC
|
|
type HMACAnonymizer struct {
|
|
// key is the HMAC key
|
|
key string
|
|
}
|
|
|
|
// NewHMACAnonymizer returns a new HMAC-based anonymizer
|
|
func NewHMACAnonymizer(key string) (*HMACAnonymizer, error) {
|
|
if strings.TrimSpace(key) == "" {
|
|
return nil, trace.BadParameter("HMAC key must not be empty")
|
|
}
|
|
return &HMACAnonymizer{
|
|
key: key,
|
|
}, nil
|
|
}
|
|
|
|
// Anonymize anonymizes the provided data using HMAC
|
|
func (a *HMACAnonymizer) Anonymize(data []byte) string {
|
|
h := hmac.New(sha256.New, []byte(a.key))
|
|
h.Write(data)
|
|
return base64.StdEncoding.EncodeToString(h.Sum(nil))
|
|
}
|
|
|
|
// AnonymizeString anonymizes the given string data using HMAC
|
|
func (a *HMACAnonymizer) AnonymizeString(s string) string {
|
|
return a.Anonymize([]byte(s))
|
|
}
|