@@ -30,8 +30,10 @@ import (
30
30
"strings"
31
31
32
32
configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
33
+ corev1 "k8s.io/api/core/v1"
33
34
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
34
35
"k8s.io/client-go/kubernetes"
36
+ corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
35
37
"k8s.io/client-go/rest"
36
38
"k8s.io/klog/v2"
37
39
k8snet "k8s.io/utils/net"
@@ -50,6 +52,13 @@ const (
50
52
"some data won't be anonymized(ipv4 and cluster base domain). The error is %v"
51
53
)
52
54
55
+ var (
56
+ TranslationTableSecretName = "obfuscation-translation-table" //nolint: gosec
57
+ secretAPIVersion = "v1"
58
+ secretKind = "Secret"
59
+ secretNamespace = "openshift-insights"
60
+ )
61
+
53
62
type subnetInformation struct {
54
63
network net.IPNet
55
64
lastIP net.IP
@@ -63,14 +72,15 @@ type Anonymizer struct {
63
72
networks []subnetInformation
64
73
translationTable map [string ]string
65
74
ipNetworkRegex * regexp.Regexp
75
+ secretsClient corev1client.SecretInterface
66
76
}
67
77
68
78
type ConfigProvider interface {
69
79
Config () * config.Controller
70
80
}
71
81
72
- // NewAnonymizer creates a new instance of anonymizer
73
- func NewAnonymizer (clusterBaseDomain string , networks []string ) (* Anonymizer , error ) {
82
+ // NewAnonymizer creates a new instance of anonymizer with a provided config observer and sensitive data
83
+ func NewAnonymizer (clusterBaseDomain string , networks []string , secretsClient corev1client. SecretInterface ) (* Anonymizer , error ) {
74
84
networks = append (networks , "127.0.0.1/8" )
75
85
76
86
cidrs , err := k8snet .ParseCIDRs (networks )
@@ -92,6 +102,7 @@ func NewAnonymizer(clusterBaseDomain string, networks []string) (*Anonymizer, er
92
102
networks : networksInformation ,
93
103
translationTable : make (map [string ]string ),
94
104
ipNetworkRegex : regexp .MustCompile (Ipv4AddressOrNetworkRegex ),
105
+ secretsClient : secretsClient ,
95
106
}, nil
96
107
}
97
108
@@ -123,6 +134,8 @@ func NewAnonymizerFromConfigClient(
123
134
return nil , err
124
135
}
125
136
137
+ secretsClient := kubeClient .CoreV1 ().Secrets (secretNamespace )
138
+
126
139
if installConfig , exists := clusterConfigV1 .Data ["install-config" ]; exists {
127
140
networkRegex := regexp .MustCompile (Ipv4NetworkRegex )
128
141
networks = append (networks , networkRegex .FindAllString (installConfig , - 1 )... )
@@ -145,7 +158,7 @@ func NewAnonymizerFromConfigClient(
145
158
return network1 [0 ] > network2 [0 ]
146
159
})
147
160
148
- return NewAnonymizer (baseDomain , networks )
161
+ return NewAnonymizer (baseDomain , networks , secretsClient )
149
162
}
150
163
151
164
// NewAnonymizerFromConfig creates a new instance of anonymizer with a provided kubeconfig
@@ -249,6 +262,48 @@ func (anonymizer *Anonymizer) ObfuscateIP(ipStr string) string {
249
262
return "::"
250
263
}
251
264
265
+ // Stores the translation table in a Secret in the openshift-insights namespace.
266
+ // The actual data is stored in the StringData portion of the Secret.
267
+ func (anonymizer * Anonymizer ) StoreTranslationTable () * corev1.Secret {
268
+ if len (anonymizer .translationTable ) == 0 {
269
+ return nil
270
+ }
271
+ defer anonymizer .ResetTranslationTable ()
272
+
273
+ err := anonymizer .secretsClient .Delete (context .TODO (), TranslationTableSecretName , metav1.DeleteOptions {})
274
+ if err != nil {
275
+ klog .V (4 ).Infof ("Failed to delete translation table secret. err: %s" , err )
276
+ }
277
+
278
+ secret := corev1.Secret {
279
+ TypeMeta : metav1.TypeMeta {
280
+ Kind : secretKind ,
281
+ APIVersion : secretAPIVersion ,
282
+ },
283
+ ObjectMeta : metav1.ObjectMeta {
284
+ Name : TranslationTableSecretName ,
285
+ },
286
+ StringData : anonymizer .translationTable ,
287
+ }
288
+
289
+ createOptions := metav1.CreateOptions {
290
+ FieldManager : "insights-operator" ,
291
+ }
292
+
293
+ result , err := anonymizer .secretsClient .Create (context .TODO (), & secret , createOptions )
294
+ if err != nil {
295
+ klog .Errorf ("Failed to create the translation table secret. err: %s" , err )
296
+ return nil
297
+ }
298
+ klog .V (3 ).Infof ("Created/Updated %s secret in %s namespace" , TranslationTableSecretName , secretNamespace )
299
+ return result
300
+ }
301
+
302
+ // Resets the translation table, so that the translation table of multiple gathers wont mix toghater.
303
+ func (anonymizer * Anonymizer ) ResetTranslationTable () {
304
+ anonymizer .translationTable = make (map [string ]string )
305
+ }
306
+
252
307
// IsObfuscationEnabled returns true if obfuscation(hiding IP and domain names) is enabled and false otherwise
253
308
func IsObfuscationEnabled (configObserver ConfigProvider ) bool {
254
309
if configObserver == nil {
0 commit comments