support self registeration

This commit is contained in:
dwertent
2021-09-10 00:56:51 +03:00
parent 6137aa5d8e
commit b9e5782264
12 changed files with 112 additions and 27 deletions
+16 -14
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+2 -2
View File
@@ -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)
}
+7 -3
View File
@@ -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)
}
}
@@ -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
}
+1 -1
View File
@@ -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")
}
}
+1 -1
View File
@@ -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 {
+20 -1
View File
@@ -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
}
+1 -1
View File
@@ -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 {
@@ -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)
}
+2 -2
View File
@@ -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
}