From b9e57822649bebfa0cbc5a7ace95fe9a5dc3bebe Mon Sep 17 00:00:00 2001 From: dwertent Date: Fri, 10 Sep 2021 00:56:51 +0300 Subject: [PATCH] support self registeration --- cautils/customerloader.go | 30 +++++----- cautils/getter/armoapi.go | 2 +- cautils/getter/downloadreleasedpolicy.go | 2 +- cautils/getter/getpoliciesutils.go | 4 +- cautils/k8sinterface/k8sconfig.go | 10 +++- cautils/opapolicy/datastructuresmethods.go | 59 +++++++++++++++++++ cautils/scaninfo.go | 2 +- cmd/download.go | 2 +- cmd/framework.go | 21 ++++++- resultshandling/printer/printresults.go | 2 +- .../reporter/reporteventreceiver.go | 1 + resultshandling/results.go | 4 +- 12 files changed, 112 insertions(+), 27 deletions(-) diff --git a/cautils/customerloader.go b/cautils/customerloader.go index 664c3ee2..359264b5 100644 --- a/cautils/customerloader.go +++ b/cautils/customerloader.go @@ -20,16 +20,19 @@ const ( type ConfigObj struct { CustomerGUID string `json:"customerGUID"` - ClusterName string `json:"clusterName"` Token string `json:"token"` } + +func (co *ConfigObj) Json() []byte { + if b, err := json.Marshal(co); err == nil { + return b + } + return []byte{} +} + type IClusterConfig interface { SetCustomerGUID() - SetClusterName() - GetCustomerGUID() - GetClusterName() - GenerateURL() string } @@ -49,9 +52,7 @@ func NewClusterConfig(k8s *k8sinterface.KubernetesApi, armoAPI *getter.ArmoAPI) } func (c *ClusterConfig) update(configObj *ConfigObj) { c.configObj = configObj -} -func (c *ClusterConfig) SetClusterName() { - // k8sinterface.K8SConfig. + ioutil.WriteFile(getter.GetDefaultPath(configFileName+".json"), c.configObj.Json(), 0664) } func (c *ClusterConfig) GenerateURL() string { u := url.URL{} @@ -66,9 +67,7 @@ func (c *ClusterConfig) GenerateURL() string { return u.String() } -func (c *ClusterConfig) GetClusterName() string { - return c.configObj.ClusterName -} + func (c *ClusterConfig) GetCustomerGUID() string { return c.configObj.CustomerGUID } @@ -112,6 +111,9 @@ func (c *ClusterConfig) loadConfigFromConfigMap() (*ConfigObj, error) { } func (c *ClusterConfig) updateConfigMap() error { + if c.k8s == nil { + return nil + } configMap, err := c.k8s.KubernetesClient.CoreV1().ConfigMaps(c.defaultNS).Get(context.Background(), configMapName, metav1.GetOptions{}) if err != nil { configMap = &corev1.ConfigMap{ @@ -121,7 +123,7 @@ func (c *ClusterConfig) updateConfigMap() error { } } - c.updateConfigMapData(configMap) + c.updateConfigData(configMap) if err != nil { _, err = c.k8s.KubernetesClient.CoreV1().ConfigMaps(c.defaultNS).Create(context.Background(), configMap, metav1.CreateOptions{}) @@ -130,7 +132,7 @@ func (c *ClusterConfig) updateConfigMap() error { } return err } -func (c *ClusterConfig) updateConfigMapData(configMap *corev1.ConfigMap) { +func (c *ClusterConfig) updateConfigData(configMap *corev1.ConfigMap) { if len(configMap.Data) == 0 { configMap.Data = make(map[string]string) } @@ -142,7 +144,7 @@ func (c *ClusterConfig) updateConfigMapData(configMap *corev1.ConfigMap) { } } func (c *ClusterConfig) loadConfigFromFile() (*ConfigObj, error) { - dat, err := ioutil.ReadFile(configFileName) + dat, err := ioutil.ReadFile(getter.GetDefaultPath(configFileName + ".json")) if err != nil { return nil, err } diff --git a/cautils/getter/armoapi.go b/cautils/getter/armoapi.go index d9ae1b02..ca60e2df 100644 --- a/cautils/getter/armoapi.go +++ b/cautils/getter/armoapi.go @@ -38,7 +38,7 @@ func (armoAPI *ArmoAPI) GetFramework(name string) (*opapolicy.Framework, error) if err = JSONDecoder(respStr).Decode(framework); err != nil { return nil, err } - SaveFrameworkInFile(framework, GetDefaultPath(name)) + SaveFrameworkInFile(framework, GetDefaultPath(name+".json")) return framework, err } diff --git a/cautils/getter/downloadreleasedpolicy.go b/cautils/getter/downloadreleasedpolicy.go index 837150c0..bfc06f72 100644 --- a/cautils/getter/downloadreleasedpolicy.go +++ b/cautils/getter/downloadreleasedpolicy.go @@ -43,7 +43,7 @@ func (drp *DownloadReleasedPolicy) GetFramework(name string) (*opapolicy.Framewo return framework, err } - SaveFrameworkInFile(framework, GetDefaultPath(name)) + SaveFrameworkInFile(framework, GetDefaultPath(name+".json")) return framework, err } diff --git a/cautils/getter/getpoliciesutils.go b/cautils/getter/getpoliciesutils.go index e0faadb1..8eba7a87 100644 --- a/cautils/getter/getpoliciesutils.go +++ b/cautils/getter/getpoliciesutils.go @@ -13,8 +13,8 @@ import ( "github.com/armosec/kubescape/cautils/opapolicy" ) -func GetDefaultPath(frameworkName string) string { - defaultfilePath := filepath.Join(DefaultLocalStore, frameworkName+".json") +func GetDefaultPath(name string) string { + defaultfilePath := filepath.Join(DefaultLocalStore, name) if homeDir, err := os.UserHomeDir(); err == nil { defaultfilePath = filepath.Join(homeDir, defaultfilePath) } diff --git a/cautils/k8sinterface/k8sconfig.go b/cautils/k8sinterface/k8sconfig.go index 79fda28a..dae322de 100644 --- a/cautils/k8sinterface/k8sconfig.go +++ b/cautils/k8sinterface/k8sconfig.go @@ -6,6 +6,8 @@ import ( "os" "strings" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" @@ -17,6 +19,7 @@ import ( // K8SConfig pointer to k8s config var K8SConfig *restclient.Config +var K8SCmdConfig clientcmd.ClientConfig // KubernetesApi - type KubernetesApi struct { @@ -51,13 +54,15 @@ var RunningIncluster bool // LoadK8sConfig load config from local file or from cluster func LoadK8sConfig() error { + kubeconfig, err := config.GetConfig() if err != nil { - return fmt.Errorf("failed to load kubernetes config: %s\n", strings.ReplaceAll(err.Error(), "KUBERNETES_MASTER", "KUBECONFIG")) + return fmt.Errorf("failed to load kubernetes config: %s", strings.ReplaceAll(err.Error(), "KUBERNETES_MASTER", "KUBECONFIG")) } if _, err := restclient.InClusterConfig(); err == nil { RunningIncluster = true } + K8SConfig = kubeconfig return nil } @@ -66,8 +71,7 @@ func LoadK8sConfig() error { func GetK8sConfig() *restclient.Config { if K8SConfig == nil { if err := LoadK8sConfig(); err != nil { - // print error - fmt.Printf("%s", err.Error()) + fmt.Println(err.Error()) os.Exit(1) } } diff --git a/cautils/opapolicy/datastructuresmethods.go b/cautils/opapolicy/datastructuresmethods.go index 5c81ddc2..c503707f 100644 --- a/cautils/opapolicy/datastructuresmethods.go +++ b/cautils/opapolicy/datastructuresmethods.go @@ -137,3 +137,62 @@ func (ruleReport *RuleReport) GetNumberOfWarningResources() int { } return sum } + +func (postureReport *PostureReport) RemoveData() { + for i := range postureReport.FrameworkReports { + postureReport.FrameworkReports[i].RemoveData() + } +} +func (frameworkReport *FrameworkReport) RemoveData() { + for i := range frameworkReport.ControlReports { + frameworkReport.ControlReports[i].RemoveData() + } +} +func (controlReport *ControlReport) RemoveData() { + for i := range controlReport.RuleReports { + controlReport.RuleReports[i].RemoveData() + } +} + +func (ruleReport *RuleReport) RemoveData() { + for i := range ruleReport.RuleResponses { + ruleReport.RuleResponses[i].RemoveData() + } +} + +func (r *RuleResponse) RemoveData() { + r.AlertObject.ExternalObjects = nil + + keepFields := []string{"kind", "apiVersion", "metadata"} + keepMetadataFields := []string{"name", "namespace", "labels"} + + for i := range r.AlertObject.K8SApiObjects { + deleteFromMap(r.AlertObject.K8SApiObjects[i], keepFields) + for k := range r.AlertObject.K8SApiObjects[i] { + if k == "metadata" { + if b, ok := r.AlertObject.K8SApiObjects[i][k].(map[string]interface{}); ok { + deleteFromMap(b, keepMetadataFields) + r.AlertObject.K8SApiObjects[i][k] = b + } + } + } + } +} + +func deleteFromMap(m map[string]interface{}, keepFields []string) { + for k := range m { + if StringInSlice(keepFields, k) { + continue + } + delete(m, k) + } +} + +func StringInSlice(strSlice []string, str string) bool { + for i := range strSlice { + if strSlice[i] == str { + return true + } + } + return false +} diff --git a/cautils/scaninfo.go b/cautils/scaninfo.go index 16ddfdac..0f1ac67c 100644 --- a/cautils/scaninfo.go +++ b/cautils/scaninfo.go @@ -48,7 +48,7 @@ func (scanInfo *ScanInfo) setUseFrom() { return } if scanInfo.UseDefault { - scanInfo.UseFrom = getter.GetDefaultPath(scanInfo.PolicyIdentifier.Name) + scanInfo.UseFrom = getter.GetDefaultPath(scanInfo.PolicyIdentifier.Name + ".json") } } diff --git a/cmd/download.go b/cmd/download.go index 5131ea33..dfe69a58 100644 --- a/cmd/download.go +++ b/cmd/download.go @@ -24,7 +24,7 @@ var downloadCmd = &cobra.Command{ downloadInfo.FrameworkName = args[1] g := getter.NewDownloadReleasedPolicy() if downloadInfo.Path == "" { - downloadInfo.Path = getter.GetDefaultPath(downloadInfo.FrameworkName) + downloadInfo.Path = getter.GetDefaultPath(downloadInfo.FrameworkName + ".json") } frameworks, err := g.GetFramework(downloadInfo.FrameworkName) if err != nil { diff --git a/cmd/framework.go b/cmd/framework.go index 59682b6d..7e0c1111 100644 --- a/cmd/framework.go +++ b/cmd/framework.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "io/ioutil" + "math/rand" "os" "strings" @@ -122,7 +123,7 @@ func CliSetup() error { fmt.Println(err) } cautils.CustomerGUID = clusterConfig.GetCustomerGUID() - cautils.ClusterName = "minikube" // clusterConfig.GetClusterName() + cautils.ClusterName = generateClusterName() // cli handler setup go func() { @@ -180,3 +181,21 @@ func (clihandler *CLIHandler) Scan() error { } return nil } + +func generateClusterName() string { + name := fmt.Sprintf("%d", rand.Int()) + if k8sinterface.K8SConfig == nil { + return name + } + if k8sinterface.K8SConfig.Host != "" { + name = k8sinterface.K8SConfig.Host + } else if k8sinterface.K8SConfig.ServerName != "" { + name = k8sinterface.K8SConfig.ServerName + } + + name = strings.ReplaceAll(name, ".", "-") + name = strings.ReplaceAll(name, " ", "-") + name = strings.ReplaceAll(name, "https://", "") + name = strings.ReplaceAll(name, ":", "-") + return name +} diff --git a/resultshandling/printer/printresults.go b/resultshandling/printer/printresults.go index 78f52c3c..0e43ad86 100644 --- a/resultshandling/printer/printresults.go +++ b/resultshandling/printer/printresults.go @@ -247,7 +247,7 @@ func (printer *Printer) getSortedControlsNames() []string { } func getWriter(outputFile string) *os.File { - + os.Remove(outputFile) if outputFile != "" { f, err := os.OpenFile(outputFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { diff --git a/resultshandling/reporter/reporteventreceiver.go b/resultshandling/reporter/reporteventreceiver.go index 9fff9879..efe57f27 100644 --- a/resultshandling/reporter/reporteventreceiver.go +++ b/resultshandling/reporter/reporteventreceiver.go @@ -28,6 +28,7 @@ func (report *ReportEventReceiver) ActionSendReportListenner(opaSessionObj *caut if cautils.CustomerGUID == "" { return } + opaSessionObj.PostureReport.RemoveData() if err := report.Send(opaSessionObj.PostureReport); err != nil { fmt.Println(err) } diff --git a/resultshandling/results.go b/resultshandling/results.go index 31b95f82..64ace984 100644 --- a/resultshandling/results.go +++ b/resultshandling/results.go @@ -24,9 +24,9 @@ func (resultsHandler *ResultsHandler) HandleResults() float32 { opaSessionObj := <-*resultsHandler.opaSessionObj - resultsHandler.reporterObj.ActionSendReportListenner(opaSessionObj) - score := resultsHandler.printerObj.ActionPrint(opaSessionObj) + resultsHandler.reporterObj.ActionSendReportListenner(opaSessionObj) + return score }