Skip to content

Commit

Permalink
two separate reports;warnbound config
Browse files Browse the repository at this point in the history
Signed-off-by: anushkamittal20 <anumittal4641@gmail.com>
  • Loading branch information
anushkamittal20 authored and poiana committed Jan 21, 2022
1 parent 41591e1 commit bb5bc7d
Show file tree
Hide file tree
Showing 5 changed files with 329 additions and 59 deletions.
1 change: 1 addition & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ func getConfig() *types.Configuration {
v.SetDefault("PolicyReport.Enabled", false)
v.SetDefault("PolicyReport.Kubeconfig", "")
v.SetDefault("PolicyReport.MinimumPriority", "")
v.SetDefault("PolicyReport.Warning", 4)

v.SetDefault("Rabbitmq.URL", "")
v.SetDefault("Rabbitmq.Queue", "")
Expand Down
141 changes: 103 additions & 38 deletions outputs/policyadapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ import (
"fmt"
"log"

"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/client-go/util/retry"

"github.com/DataDog/datadog-go/statsd"
"github.com/falcosecurity/falcosidekick/types"
"github.com/kubernetes-sigs/wg-policy-prototypes/policy-report/kube-bench-adapter/pkg/apis/wgpolicyk8s.io/v1alpha2"
clusterpolicyreport "github.com/kubernetes-sigs/wg-policy-prototypes/policy-report/kube-bench-adapter/pkg/apis/wgpolicyk8s.io/v1alpha2"
policyreport "github.com/kubernetes-sigs/wg-policy-prototypes/policy-report/kube-bench-adapter/pkg/apis/wgpolicyk8s.io/v1alpha2"
crdClient "github.com/kubernetes-sigs/wg-policy-prototypes/policy-report/kube-bench-adapter/pkg/generated/v1alpha2/clientset/versioned"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/retry"
)

var report *clusterpolicyreport.ClusterPolicyReport = &clusterpolicyreport.ClusterPolicyReport{
var polreport *policyreport.PolicyReport = &policyreport.PolicyReport{
ObjectMeta: metav1.ObjectMeta{
Name: "dummy-policy-report",
},
Expand All @@ -28,6 +28,16 @@ var report *clusterpolicyreport.ClusterPolicyReport = &clusterpolicyreport.Clust
Warn: 0, //to-do
},
}
var report *clusterpolicyreport.ClusterPolicyReport = &clusterpolicyreport.ClusterPolicyReport{
ObjectMeta: metav1.ObjectMeta{
Name: "dummy-cluster-policy-report",
},
Summary: v1alpha2.PolicyReportSummary{
Fail: 0,
Warn: 0, //to-do
},
}
var warnbound int

func NewPolicyReportClient(config *types.Configuration, stats *types.Statistics, promStats *types.PromStatistics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
restConfig, err := rest.InClusterConfig()
Expand Down Expand Up @@ -57,56 +67,111 @@ func NewPolicyReportClient(config *types.Configuration, stats *types.Statistics,
}, nil
}

//make one more input ns string
// PolicyReportPost creates Policy Report Resource in Kubernetes
func (c *Client) PolicyReportCreate(falcopayload types.FalcoPayload) {
report.Summary.Fail++
ats := c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports()
report.Results = append(report.Results, newResult(falcopayload))
_, getErr := ats.Get(context.Background(), report.Name, metav1.GetOptions{})
if errors.IsNotFound(getErr) {
result, err := ats.Create(context.TODO(), report, metav1.CreateOptions{})
if err != nil {
log.Printf("[ERROR] : %v\n", err)
warnbound = c.Config.PolicyReport.Warning
r, count := newResult(falcopayload)
if count == 0 {
policyr := c.Crdclient.Wgpolicyk8sV1alpha2().PolicyReports("default")
polreport.Results = append(report.Results, r)
_, getErr := policyr.Get(context.Background(), polreport.Name, metav1.GetOptions{})
if errors.IsNotFound(getErr) {
result, err := policyr.Create(context.TODO(), polreport, metav1.CreateOptions{})
if err != nil {
log.Printf("[ERROR] : %v\n", err)
}
fmt.Printf("[INFO] :Created policy-report %q.\n", result.GetObjectMeta().GetName())
} else {
// Update existing Policy Report
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
result, err := policyr.Get(context.Background(), polreport.GetName(), metav1.GetOptions{})
if errors.IsNotFound(err) {
// This doesnt ever happen even if it is already deleted or not found
log.Printf("[ERROR] :%v not found", polreport.GetName())
return nil
}
if err != nil {
return err
}
polreport.SetResourceVersion(result.GetResourceVersion())
_, updateErr := policyr.Update(context.Background(), polreport, metav1.UpdateOptions{})
return updateErr
})
if retryErr != nil {
fmt.Printf("[ERROR] :update failed: %v", retryErr)
}
fmt.Println("[INFO] :updated policy report...")
}
fmt.Printf("[INFO] :Created policy-report %q.\n", result.GetObjectMeta().GetName())
} else {
// Update existing Policy Report
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
result, err := ats.Get(context.Background(), report.GetName(), metav1.GetOptions{})
if errors.IsNotFound(err) {
// This doesnt ever happen even if it is already deleted or not found
log.Printf("[ERROR] :%v not found", report.GetName())
return nil
}
clusterpr := c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports()
report.Results = append(report.Results, r)
_, getErr := clusterpr.Get(context.Background(), report.Name, metav1.GetOptions{})
if errors.IsNotFound(getErr) {
result, err := clusterpr.Create(context.TODO(), report, metav1.CreateOptions{})
if err != nil {
return err
log.Printf("[ERROR] : %v\n", err)
}
fmt.Printf("[INFO] :Created cluster-policy-report %q.\n", result.GetObjectMeta().GetName())
} else {
// Update existing Policy Report
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
result, err := clusterpr.Get(context.Background(), report.GetName(), metav1.GetOptions{})
if errors.IsNotFound(err) {
// This doesnt ever happen even if it is already deleted or not found
log.Printf("[ERROR] :%v not found", report.GetName())
return nil
}
if err != nil {
return err
}
report.SetResourceVersion(result.GetResourceVersion())
_, updateErr := clusterpr.Update(context.Background(), report, metav1.UpdateOptions{})
return updateErr
})
if retryErr != nil {
fmt.Printf("[ERROR] :update failed: %v", retryErr)
}
report.SetResourceVersion(result.GetResourceVersion())
_, updateErr := ats.Update(context.Background(), report, metav1.UpdateOptions{})
return updateErr
})
if retryErr != nil {
fmt.Printf("[ERROR] :update failed: %v", retryErr)
fmt.Println("[INFO] :updated cluster policy report...")
}
fmt.Println("[INFO] :updated policy report...")
}
}

//mapping for the policy report
func newResult(FalcoPayload types.FalcoPayload) *clusterpolicyreport.PolicyReportResult {
//mapping for clusterpolicyreport
func newResult(FalcoPayload types.FalcoPayload) (c *clusterpolicyreport.PolicyReportResult, count int) {

count = 1 // decision variable to increment for policyreport and clusterpolicyreport //to do
var m = make(map[string]string)
for index, element := range FalcoPayload.OutputFields {
if index == "ka.target.namespace" {
count = 0
}
m[index] = fmt.Sprintf("%v", element)
}
const PolicyReportSource string = "Falco"
var pri string //initial hardcoded priority bounds
if FalcoPayload.Priority > 4 {
if FalcoPayload.Priority > types.PriorityType(warnbound) {
if count == 1 {
report.Summary.Fail++
} else {
polreport.Summary.Fail++
}
pri = "high"
} else if FalcoPayload.Priority < 3 {
} else if FalcoPayload.Priority < types.PriorityType(warnbound) {
if count == 1 {
report.Summary.Warn++
} else {
polreport.Summary.Warn++
}
pri = "low"
} else {
if count == 1 {
report.Summary.Warn++
} else {
polreport.Summary.Warn++
}
pri = "medium"
}
var m = make(map[string]string)
for index, element := range FalcoPayload.OutputFields {
m[index] = fmt.Sprintf("%v", element)
}
return &clusterpolicyreport.PolicyReportResult{
Policy: FalcoPayload.Rule,
Source: PolicyReportSource,
Expand All @@ -116,5 +181,5 @@ func newResult(FalcoPayload types.FalcoPayload) *clusterpolicyreport.PolicyRepor
Result: "fail",
Description: FalcoPayload.Output,
Properties: m,
}
}, count
}
167 changes: 167 additions & 0 deletions pres.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
apiVersion: v1
items:
- apiVersion: wgpolicyk8s.io/v1alpha2
kind: PolicyReport
metadata:
creationTimestamp: "2021-08-05T11:57:18Z"
generation: 4
name: dummy-policy-report
namespace: default
resourceVersion: "6323"
uid: c85220de-fda6-4fb1-bc3a-9a063e16f9c0
results:
- message: Disallowed inbound connection source (command=%proc.cmdline connection=%fd.name
user=%user.name user_loginuid=%user.loginuid container_id=%container.id image=%container.image.repository)
policy: Unexpected inbound connection source
properties:
container.id: '%container.id'
container.image.repository: '%container.image.repository'
fd.name: '%fd.name'
proc.cmdline: '%proc.cmdline'
user.loginuid: '%user.loginuid'
user.name: '%user.name'
result: fail
severity: medium
source: Falco
timestamp:
nanos: 622589337
seconds: 57
- message: Packet socket was created in a container (user=%user.name user_loginuid=%user.loginuid
command=%proc.cmdline socket_info=%evt.args container_id=%container.id container_name=%container.name
image=%container.image.repository:%container.image.tag)
policy: Packet socket created in container
properties:
container.id: '%container.id'
container.image.repository: '%container.image.repository'
container.image.tag: '%container.image.tag'
container.name: '%container.name'
evt.args: '%evt.args'
proc.cmdline: '%proc.cmdline'
user.loginuid: '%user.loginuid'
user.name: '%user.name'
result: fail
severity: medium
source: Falco
timestamp:
nanos: 624629194
seconds: 59
- message: |
Package management process launched in container (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline container_id=%container.id container_name=%container.name image=%container.image.repository:%container.image.tag)
policy: Launch Package Management Process in Container
properties:
container.id: '%container.id'
container.image.repository: '%container.image.repository'
container.image.tag: '%container.image.tag'
container.name: '%container.name'
proc.cmdline: '%proc.cmdline'
user.loginuid: '%user.loginuid'
user.name: '%user.name'
result: fail
severity: high
source: Falco
timestamp:
nanos: 626522810
seconds: 3
- message: Disallowed namespace created (user=%ka.user.name ns=%ka.target.name)
policy: Create Disallowed Namespace
properties:
ka.target.name: '%ka.target.name'
ka.user.name: '%ka.user.name'
result: fail
severity: high
source: Falco
timestamp:
nanos: 628570633
seconds: 6
- message: |
File below a known binary directory opened for writing (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2] container_id=%container.id image=%container.image.repository)
policy: Write below binary dir
properties:
container.id: '%container.id'
container.image.repository: '%container.image.repository'
fd.name: '%fd.name'
proc.aname: '%proc.aname'
proc.cmdline: '%proc.cmdline'
proc.pcmdline: '%proc.pcmdline'
proc.pname: '%proc.pname'
user.loginuid: '%user.loginuid'
user.name: '%user.name'
result: fail
severity: high
source: Falco
timestamp:
nanos: 629177643
seconds: 6
- message: Unexpected connection to K8s API Server from container (command=%proc.cmdline
%container.info image=%container.image.repository:%container.image.tag connection=%fd.name)
policy: Contact K8S API Server From Container
properties:
container.image.repository: '%container.image.repository'
container.image.tag: '%container.image.tag'
container.info: '%container.info'
fd.name: '%fd.name'
proc.cmdline: '%proc.cmdline'
result: fail
severity: medium
source: Falco
timestamp:
nanos: 629726055
seconds: 6
- message: Debugfs launched started in a privileged container (user=%user.name user_loginuid=%user.loginuid
command=%proc.cmdline %container.info image=%container.image.repository:%container.image.tag)
policy: Debugfs Launched in Privileged Container
properties:
container.image.repository: '%container.image.repository'
container.image.tag: '%container.image.tag'
container.info: '%container.info'
proc.cmdline: '%proc.cmdline'
user.loginuid: '%user.loginuid'
user.name: '%user.name'
result: fail
severity: high
source: Falco
timestamp:
nanos: 630716672
seconds: 7
- message: |
a shell configuration file was read by a non-shell program (user=%user.name user_loginuid=%user.loginuid command=%proc.cmdline file=%fd.name container_id=%container.id image=%container.image.repository)
policy: Read Shell Configuration File
properties:
container.id: '%container.id'
container.image.repository: '%container.image.repository'
fd.name: '%fd.name'
proc.cmdline: '%proc.cmdline'
user.loginuid: '%user.loginuid'
user.name: '%user.name'
result: fail
severity: high
source: Falco
timestamp:
nanos: 632967180
seconds: 11
- message: K8s Service Deleted (user=%ka.user.name service=%ka.target.name ns=%ka.target.namespace
resp=%ka.response.code decision=%ka.auth.decision reason=%ka.auth.reason)
policy: K8s Service Deleted
properties:
ka.auth.decision: '%ka.auth.decision'
ka.auth.reason: '%ka.auth.reason'
ka.response.code: '%ka.response.code'
ka.target.name: '%ka.target.name'
ka.target.namespace: '%ka.target.namespace'
ka.user.name: '%ka.user.name'
result: fail
severity: low
source: Falco
timestamp:
nanos: 634468268
seconds: 15
summary:
error: 0
fail: 0
pass: 0
skip: 0
warn: 1
kind: List
metadata:
resourceVersion: ""
selfLink: ""

0 comments on commit bb5bc7d

Please sign in to comment.