diff --git a/go.mod b/go.mod index fa613907..c215fd76 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.17 require ( github.com/armosec/armoapi-go v0.0.23 - github.com/armosec/k8s-interface v0.0.36 - github.com/armosec/opa-utils v0.0.62 - github.com/armosec/rbac-utils v0.0.8 + github.com/armosec/k8s-interface v0.0.37 + github.com/armosec/opa-utils v0.0.64 + github.com/armosec/rbac-utils v0.0.9 github.com/armosec/utils-go v0.0.3 github.com/briandowns/spinner v1.16.0 github.com/enescakir/emoji v1.0.0 diff --git a/go.sum b/go.sum index 018ba6a5..aa051b4d 100644 --- a/go.sum +++ b/go.sum @@ -87,15 +87,13 @@ github.com/armosec/armoapi-go v0.0.2/go.mod h1:vIK17yoKbJRQyZXWWLe3AqfqCRITxW8qm github.com/armosec/armoapi-go v0.0.23 h1:jqoLIWM5CR7DCD9fpFgN0ePqtHvOCoZv/XzCwsUluJU= github.com/armosec/armoapi-go v0.0.23/go.mod h1:iaVVGyc23QGGzAdv4n+szGQg3Rbpixn9yQTU3qWRpaw= github.com/armosec/k8s-interface v0.0.8/go.mod h1:xxS+V5QT3gVQTwZyAMMDrYLWGrfKOpiJ7Jfhfa0w9sM= -github.com/armosec/k8s-interface v0.0.19/go.mod h1:0ztwEWLez2lpMMKHbs0DoZV64S0YIA4s72vCs9iAAiE= -github.com/armosec/k8s-interface v0.0.26/go.mod h1:vHxGWqD/uh6+GQb9Sqv7OGMs+Rvc2dsFVc0XtgRh1ZU= -github.com/armosec/k8s-interface v0.0.36 h1:i/fdgpXEsQq08Py8Utg537VzITpWJW4sjR9OXTfi4Oc= -github.com/armosec/k8s-interface v0.0.36/go.mod h1:vHxGWqD/uh6+GQb9Sqv7OGMs+Rvc2dsFVc0XtgRh1ZU= -github.com/armosec/opa-utils v0.0.62 h1:C/VN1HUDoa0BX2CTSqgjuKEIlb/rkIwGY2/UlvfS154= -github.com/armosec/opa-utils v0.0.62/go.mod h1:P63qZDPG3vjPtSQqwx2N4Nfm8VaboDul7R7kmnUvvWc= +github.com/armosec/k8s-interface v0.0.37 h1:EPjzozpkVw0SmizoALmVg6D8VZIX7gcgTg+WxA02jNc= +github.com/armosec/k8s-interface v0.0.37/go.mod h1:vHxGWqD/uh6+GQb9Sqv7OGMs+Rvc2dsFVc0XtgRh1ZU= +github.com/armosec/opa-utils v0.0.64 h1:RdiFpy6QqoTD2e9k5eIwgDrTWctUL215QI3ust8tnD0= +github.com/armosec/opa-utils v0.0.64/go.mod h1:6tQP8UDq2EvEfSqh8vrUdr/9QVSCG4sJfju1SXQOn4c= github.com/armosec/rbac-utils v0.0.1/go.mod h1:pQ8CBiij8kSKV7aeZm9FMvtZN28VgA7LZcYyTWimq40= -github.com/armosec/rbac-utils v0.0.8 h1:Hpr2p9F3Elp9NxbDAZiMlNUcQOdfyu9rWFE2fM2nNGw= -github.com/armosec/rbac-utils v0.0.8/go.mod h1:fmLZDgT5ILNo5gzR19boIIn7TOpfWh2pIgprxLrYN/g= +github.com/armosec/rbac-utils v0.0.9 h1:rIOWp4K7BELUNX32ktSjVbb8d/0SpH7W76W6Tf+8rzw= +github.com/armosec/rbac-utils v0.0.9/go.mod h1:Ex/IdGWhGv9HZq6Hs8N/ApzCKSIvpNe/ETqDfnuyah0= github.com/armosec/utils-go v0.0.2/go.mod h1:itWmRLzRdsnwjpEOomL0mBWGnVNNIxSjDAdyc+b0iUo= github.com/armosec/utils-go v0.0.3 h1:uyQI676yRciQM0sSN9uPoqHkbspTxHO0kmzXhBeE/xU= github.com/armosec/utils-go v0.0.3/go.mod h1:itWmRLzRdsnwjpEOomL0mBWGnVNNIxSjDAdyc+b0iUo= diff --git a/hostsensorutils/hostsensordataenvelope.go b/hostsensorutils/hostsensordataenvelope.go deleted file mode 100644 index de394157..00000000 --- a/hostsensorutils/hostsensordataenvelope.go +++ /dev/null @@ -1,67 +0,0 @@ -package hostsensorutils - -import ( - "encoding/json" - "fmt" - - "k8s.io/apimachinery/pkg/runtime/schema" -) - -type HostSensorDataEnvelope struct { - schema.GroupVersionResource - NodeName string `json:"nodeName"` - Data json.RawMessage `json:"data"` -} - -func (hsde *HostSensorDataEnvelope) SetNamespace(string) { - -} - -func (hsde *HostSensorDataEnvelope) SetName(val string) { - hsde.NodeName = val -} - -func (hsde *HostSensorDataEnvelope) SetKind(val string) { - hsde.Resource = val - -} - -func (hsde *HostSensorDataEnvelope) SetWorkload(val map[string]interface{}) { //deprecated - hsde.Data, _ = json.Marshal(val) -} - -func (hsde *HostSensorDataEnvelope) SetObject(val map[string]interface{}) { - hsde.Data, _ = json.Marshal(val) -} - -func (hsde *HostSensorDataEnvelope) GetNamespace() string { - return "" -} - -func (hsde *HostSensorDataEnvelope) GetName() string { - return hsde.NodeName -} - -func (hsde *HostSensorDataEnvelope) GetKind() string { - return hsde.Resource -} - -func (hsde *HostSensorDataEnvelope) GetApiVersion() string { - return hsde.Version -} - -func (hsde *HostSensorDataEnvelope) GetWorkload() map[string]interface{} { // DEPRECATED - res := map[string]interface{}{} - json.Unmarshal(hsde.Data, &res) - return res -} - -func (hsde *HostSensorDataEnvelope) GetObject() map[string]interface{} { - res := map[string]interface{}{} - json.Unmarshal(hsde.Data, &res) - return res -} - -func (hsde *HostSensorDataEnvelope) GetID() string { // -> /// - return fmt.Sprintf("%s/%s/%s/%s", hsde.Group, hsde.GetApiVersion(), hsde.GetKind(), hsde.GetName()) -} diff --git a/hostsensorutils/hostsensorgetfrompod.go b/hostsensorutils/hostsensorgetfrompod.go index 865bf276..dbc583dc 100644 --- a/hostsensorutils/hostsensorgetfrompod.go +++ b/hostsensorutils/hostsensorgetfrompod.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/armosec/kubescape/cautils" + "github.com/armosec/opa-utils/objectsenvelopes" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" ) @@ -56,12 +57,12 @@ func (hsh *HostSensorHandler) ForwardToPod(podName, path string) ([]byte, error) // sendAllPodsHTTPGETRequest fills the raw byte response in the envelope and the node name, but not the GroupVersionKind // so the caller is responsible to convert the raw data to some structured data and add the GroupVersionKind details -func (hsh *HostSensorHandler) sendAllPodsHTTPGETRequest(path string) ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) sendAllPodsHTTPGETRequest(path string) ([]objectsenvelopes.HostSensorDataEnvelope, error) { podList, err := hsh.getPodList() if err != nil { return nil, fmt.Errorf("failed to sendAllPodsHTTPGETRequest: %v", err) } - res := make([]HostSensorDataEnvelope, 0, len(podList)) + res := make([]objectsenvelopes.HostSensorDataEnvelope, 0, len(podList)) resLock := sync.Mutex{} wg := sync.WaitGroup{} wg.Add(len(podList)) @@ -74,7 +75,7 @@ func (hsh *HostSensorHandler) sendAllPodsHTTPGETRequest(path string) ([]HostSens } else { resLock.Lock() defer resLock.Unlock() - res = append(res, HostSensorDataEnvelope{NodeName: podList[podName], Data: resBytes}) + res = append(res, objectsenvelopes.HostSensorDataEnvelope{NodeName: podList[podName], Data: resBytes}) } }(podName, path) @@ -84,7 +85,7 @@ func (hsh *HostSensorHandler) sendAllPodsHTTPGETRequest(path string) ([]HostSens } // return list of -func (hsh *HostSensorHandler) GetOpenPortsList() ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) GetOpenPortsList() ([]objectsenvelopes.HostSensorDataEnvelope, error) { // loop over pods and port-forward it to each of them res, err := hsh.sendAllPodsHTTPGETRequest("/openedPorts") for resIdx := range res { @@ -96,7 +97,7 @@ func (hsh *HostSensorHandler) GetOpenPortsList() ([]HostSensorDataEnvelope, erro } // return list of -func (hsh *HostSensorHandler) GetLinuxSecurityHardeningStatus() ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) GetLinuxSecurityHardeningStatus() ([]objectsenvelopes.HostSensorDataEnvelope, error) { // loop over pods and port-forward it to each of them res, err := hsh.sendAllPodsHTTPGETRequest("/linuxSecurityHardening") for resIdx := range res { @@ -108,7 +109,7 @@ func (hsh *HostSensorHandler) GetLinuxSecurityHardeningStatus() ([]HostSensorDat } // return list of -func (hsh *HostSensorHandler) GetKubeletCommandLine() ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) GetKubeletCommandLine() ([]objectsenvelopes.HostSensorDataEnvelope, error) { // loop over pods and port-forward it to each of them res, err := hsh.sendAllPodsHTTPGETRequest("/kubeletCommandLine") for resIdx := range res { @@ -120,7 +121,7 @@ func (hsh *HostSensorHandler) GetKubeletCommandLine() ([]HostSensorDataEnvelope, } // return list of -func (hsh *HostSensorHandler) GetKernelVersion() ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) GetKernelVersion() ([]objectsenvelopes.HostSensorDataEnvelope, error) { // loop over pods and port-forward it to each of them res, err := hsh.sendAllPodsHTTPGETRequest("/kernelVersion") for resIdx := range res { @@ -132,7 +133,7 @@ func (hsh *HostSensorHandler) GetKernelVersion() ([]HostSensorDataEnvelope, erro } // return list of -func (hsh *HostSensorHandler) GetOsReleaseFile() ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) GetOsReleaseFile() ([]objectsenvelopes.HostSensorDataEnvelope, error) { // loop over pods and port-forward it to each of them res, err := hsh.sendAllPodsHTTPGETRequest("/osRelease") for resIdx := range res { @@ -144,7 +145,7 @@ func (hsh *HostSensorHandler) GetOsReleaseFile() ([]HostSensorDataEnvelope, erro } // return list of -func (hsh *HostSensorHandler) GetKubeletConfigurations() ([]HostSensorDataEnvelope, error) { +func (hsh *HostSensorHandler) GetKubeletConfigurations() ([]objectsenvelopes.HostSensorDataEnvelope, error) { // loop over pods and port-forward it to each of them res, err := hsh.sendAllPodsHTTPGETRequest("/kubeletConfigurations") for resIdx := range res { @@ -166,8 +167,8 @@ func (hsh *HostSensorHandler) GetKubeletConfigurations() ([]HostSensorDataEnvelo return res, err } -func (hsh *HostSensorHandler) CollectResources() ([]HostSensorDataEnvelope, error) { - res := make([]HostSensorDataEnvelope, 0) +func (hsh *HostSensorHandler) CollectResources() ([]objectsenvelopes.HostSensorDataEnvelope, error) { + res := make([]objectsenvelopes.HostSensorDataEnvelope, 0) if hsh.DaemonSet == nil { return res, nil } diff --git a/hostsensorutils/hostsensorinterface.go b/hostsensorutils/hostsensorinterface.go index 6b9e4170..d708b3bd 100644 --- a/hostsensorutils/hostsensorinterface.go +++ b/hostsensorutils/hostsensorinterface.go @@ -1,8 +1,10 @@ package hostsensorutils +import "github.com/armosec/opa-utils/objectsenvelopes" + type IHostSensor interface { Init() error TearDown() error - CollectResources() ([]HostSensorDataEnvelope, error) + CollectResources() ([]objectsenvelopes.HostSensorDataEnvelope, error) GetNamespace() string } diff --git a/hostsensorutils/hostsensormock.go b/hostsensorutils/hostsensormock.go index a8610a33..6fd37071 100644 --- a/hostsensorutils/hostsensormock.go +++ b/hostsensorutils/hostsensormock.go @@ -1,5 +1,7 @@ package hostsensorutils +import "github.com/armosec/opa-utils/objectsenvelopes" + type HostSensorHandlerMock struct { } @@ -11,8 +13,8 @@ func (hshm *HostSensorHandlerMock) TearDown() error { return nil } -func (hshm *HostSensorHandlerMock) CollectResources() ([]HostSensorDataEnvelope, error) { - return []HostSensorDataEnvelope{}, nil +func (hshm *HostSensorHandlerMock) CollectResources() ([]objectsenvelopes.HostSensorDataEnvelope, error) { + return []objectsenvelopes.HostSensorDataEnvelope{}, nil } func (hshm *HostSensorHandlerMock) GetNamespace() string { diff --git a/opaprocessor/processorhandler.go b/opaprocessor/processorhandler.go index bca27171..e2ac76c7 100644 --- a/opaprocessor/processorhandler.go +++ b/opaprocessor/processorhandler.go @@ -6,6 +6,7 @@ import ( "time" "github.com/armosec/kubescape/cautils" + "github.com/armosec/opa-utils/objectsenvelopes" "github.com/armosec/opa-utils/reporthandling" "github.com/golang/glog" @@ -183,20 +184,20 @@ func (opap *OPAProcessor) processRule(rule *reporthandling.PolicyRule) (*reporth if err != nil { return nil, err } - inputResources = workloadinterface.ListMapToMeta(enumeratedData) + inputResources = objectsenvelopes.ListMapToMeta(enumeratedData) ruleReport.ListInputKinds = workloadinterface.ListMetaIDs(inputResources) for i := range inputResources { opap.AllResources[inputResources[i].GetID()] = inputResources[i] } - failedResources := workloadinterface.ListMapToMeta(ruleReport.GetFailedResources()) + failedResources := objectsenvelopes.ListMapToMeta(ruleReport.GetFailedResources()) for i := range failedResources { if r, ok := opap.AllResources[failedResources[i].GetID()]; !ok { opap.AllResources[failedResources[i].GetID()] = r } } - warningResources := workloadinterface.ListMapToMeta(ruleReport.GetWarnignResources()) + warningResources := objectsenvelopes.ListMapToMeta(ruleReport.GetWarnignResources()) for i := range warningResources { if r, ok := opap.AllResources[warningResources[i].GetID()]; !ok { opap.AllResources[warningResources[i].GetID()] = r diff --git a/opaprocessor/processorhandler_test.go b/opaprocessor/processorhandler_test.go index 320f2baf..d3ec4204 100644 --- a/opaprocessor/processorhandler_test.go +++ b/opaprocessor/processorhandler_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/armosec/kubescape/cautils" + "github.com/armosec/opa-utils/objectsenvelopes" "github.com/armosec/opa-utils/reporthandling" "github.com/armosec/opa-utils/resources" @@ -20,7 +21,7 @@ func TestProcess(t *testing.T) { // set k8s k8sResources := make(cautils.K8SResources) allResources := make(map[string]workloadinterface.IMetadata) - imetaObj := workloadinterface.ListMapToMeta(k8sinterface.ConvertUnstructuredSliceToMap(k8sinterface.V1KubeSystemNamespaceMock().Items)) + imetaObj := objectsenvelopes.ListMapToMeta(k8sinterface.ConvertUnstructuredSliceToMap(k8sinterface.V1KubeSystemNamespaceMock().Items)) for i := range imetaObj { allResources[imetaObj[i].GetID()] = imetaObj[i] } diff --git a/opaprocessor/processorhandlerutils_test.go b/opaprocessor/processorhandlerutils_test.go index 7ade114b..ac1c74a1 100644 --- a/opaprocessor/processorhandlerutils_test.go +++ b/opaprocessor/processorhandlerutils_test.go @@ -65,7 +65,7 @@ func TestRemoveData(t *testing.T) { c, _ := workload.GetContainers() for i := range c { for _, e := range c[i].Env { - assert.Equal(t, "", e.Value) + assert.Equal(t, "XXXXXX", e.Value) } } } diff --git a/resourcehandler/filesloader.go b/resourcehandler/filesloader.go index 2b9ebf3a..28cce904 100644 --- a/resourcehandler/filesloader.go +++ b/resourcehandler/filesloader.go @@ -14,6 +14,7 @@ import ( "github.com/armosec/k8s-interface/k8sinterface" "github.com/armosec/kubescape/cautils" + "github.com/armosec/opa-utils/objectsenvelopes" "github.com/armosec/opa-utils/reporthandling" "gopkg.in/yaml.v2" @@ -211,7 +212,7 @@ func readYamlFile(yamlFile []byte) ([]workloadinterface.IMetadata, []error) { continue } if obj, ok := j.(map[string]interface{}); ok { - if o := workloadinterface.NewObject(obj); o != nil { + if o := objectsenvelopes.NewObject(obj); o != nil { yamlObjs = append(yamlObjs, o) } } else { @@ -237,7 +238,7 @@ func convertJsonToWorkload(jsonObj interface{}, workloads *[]workloadinterface.I switch x := jsonObj.(type) { case map[string]interface{}: - if o := workloadinterface.NewObject(x); o != nil { + if o := objectsenvelopes.NewObject(x); o != nil { (*workloads) = append(*workloads, o) } case []interface{}: diff --git a/resourcehandler/k8sresources.go b/resourcehandler/k8sresources.go index 654dfa5f..ff3c42e5 100644 --- a/resourcehandler/k8sresources.go +++ b/resourcehandler/k8sresources.go @@ -7,6 +7,7 @@ import ( "github.com/armosec/kubescape/cautils" "github.com/armosec/kubescape/hostsensorutils" + "github.com/armosec/opa-utils/objectsenvelopes" "github.com/armosec/opa-utils/reporthandling" "github.com/armosec/k8s-interface/k8sinterface" @@ -142,7 +143,7 @@ func (k8sHandler *K8sResourceHandler) pullSingleResource(resource *schema.GroupV func ConvertMapListToMeta(resourceMap []map[string]interface{}) []workloadinterface.IMetadata { workloads := []workloadinterface.IMetadata{} for i := range resourceMap { - if w := workloadinterface.NewObject(resourceMap[i]); w != nil { + if w := objectsenvelopes.NewObject(resourceMap[i]); w != nil { workloads = append(workloads, w) } } diff --git a/resultshandling/printer/prettyprinter.go b/resultshandling/printer/prettyprinter.go index 7fe156b4..42b8a770 100644 --- a/resultshandling/printer/prettyprinter.go +++ b/resultshandling/printer/prettyprinter.go @@ -7,6 +7,7 @@ import ( "github.com/armosec/k8s-interface/workloadinterface" "github.com/armosec/kubescape/cautils" + "github.com/armosec/opa-utils/objectsenvelopes" "github.com/armosec/opa-utils/reporthandling" "github.com/enescakir/emoji" "github.com/olekukonko/tablewriter" @@ -178,9 +179,8 @@ func (printer *PrettyPrinter) printGroupedResource(indent string, ns string, rsc func generateRelatedObjectsStr(workload WorkloadSummary) string { relatedStr := "" - w := workload.resource.GetObject() - if workloadinterface.IsTypeRegoResponseVector(w) { - relatedObjects := workloadinterface.NewRegoResponseVectorObject(w).GetRelatedObjects() + if workload.resource.GetObjectType() == workloadinterface.TypeWorkloadObject { + relatedObjects := objectsenvelopes.NewRegoResponseVectorObject(workload.resource.GetObject()).GetRelatedObjects() for i, related := range relatedObjects { if ns := related.GetNamespace(); i == 0 && ns != "" { relatedStr += fmt.Sprintf("Namespace - %s, ", ns)