Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support known servers #65

Merged
merged 6 commits into from
Dec 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions artifacts/knownservers/01-example.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: spdx.softwarecomposition.kubescape.io/v1beta1
kind: KnownServer
metadata:
name: github
spec:
- ipBlock: 12.3.4.23/24
server: github.com
name: github-workflows

- ipBlock: 190.56.3.2/16
server: github.com
name: github-repositories
28 changes: 26 additions & 2 deletions pkg/apis/softwarecomposition/network_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,34 @@ type PolicyRef struct {
OriginalIP string
DNS string
Name string
Server string
}

type KnownServers struct {
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// KnownServerList is a list of KnownServer.
type KnownServerList struct {
metav1.TypeMeta
metav1.ListMeta

Items []KnownServer
}

// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// KnownServer represents a known server, containing information about its IP addresses and servers. The purpose is to enrich the GeneratedNetworkPolicy CRD
type KnownServer struct {
metav1.TypeMeta
metav1.ObjectMeta

Spec KnownServerSpec
}

type KnownServerSpec []KnownServerEntry

type KnownServerEntry struct {
IPBlock string
DNS string
Server string
Name string
}
110 changes: 57 additions & 53 deletions pkg/apis/softwarecomposition/networkpolicy/networkpolicy.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const (
storageV1Beta1ApiVersion = "spdx.softwarecomposition.kubescape.io/v1beta1"
)

func GenerateNetworkPolicy(networkNeighbors softwarecomposition.NetworkNeighbors, knownServers []softwarecomposition.KnownServers, timeProvider metav1.Time) (softwarecomposition.GeneratedNetworkPolicy, error) {
func GenerateNetworkPolicy(networkNeighbors softwarecomposition.NetworkNeighbors, knownServers []softwarecomposition.KnownServer, timeProvider metav1.Time) (softwarecomposition.GeneratedNetworkPolicy, error) {
networkPolicy := softwarecomposition.NetworkPolicy{
Kind: "NetworkPolicy",
APIVersion: "networking.k8s.io/v1",
Expand Down Expand Up @@ -86,7 +86,7 @@ func GenerateNetworkPolicy(networkNeighbors softwarecomposition.NetworkNeighbors
return generatedNetworkPolicy, nil
}

func generateEgressRule(neighbor softwarecomposition.NetworkNeighbor, knownServers []softwarecomposition.KnownServers) (softwarecomposition.NetworkPolicyEgressRule, []softwarecomposition.PolicyRef) {
func generateEgressRule(neighbor softwarecomposition.NetworkNeighbor, KnownServer []softwarecomposition.KnownServer) (softwarecomposition.NetworkPolicyEgressRule, []softwarecomposition.PolicyRef) {
egressRule := softwarecomposition.NetworkPolicyEgressRule{}
policyRefs := []softwarecomposition.PolicyRef{}

Expand All @@ -111,32 +111,35 @@ func generateEgressRule(neighbor softwarecomposition.NetworkNeighbor, knownServe
if neighbor.IPAddress != "" {
isKnownServer := false
// look if this IP is part of any known server
for _, knownServer := range knownServers {
_, subNet, err := net.ParseCIDR(knownServer.IPBlock)
if err != nil {
logger.L().Error("error parsing cidr", helpers.Error(err))
continue
}
if subNet.Contains(net.ParseIP(neighbor.IPAddress)) {
egressRule.To = append(egressRule.To, softwarecomposition.NetworkPolicyPeer{
IPBlock: &softwarecomposition.IPBlock{
CIDR: knownServer.IPBlock,
},
})
isKnownServer = true

policyRef := softwarecomposition.PolicyRef{
Name: knownServer.Name,
OriginalIP: neighbor.IPAddress,
IPBlock: knownServer.IPBlock,
for _, knownServer := range KnownServer {
for _, entry := range knownServer.Spec {
_, subNet, err := net.ParseCIDR(entry.IPBlock)
if err != nil {
logger.L().Error("error parsing cidr", helpers.Error(err))
continue
}

if knownServer.DNS != "" {
policyRef.DNS = knownServer.DNS
if subNet.Contains(net.ParseIP(neighbor.IPAddress)) {
egressRule.To = append(egressRule.To, softwarecomposition.NetworkPolicyPeer{
IPBlock: &softwarecomposition.IPBlock{
CIDR: entry.IPBlock,
},
})
isKnownServer = true

policyRef := softwarecomposition.PolicyRef{
Name: entry.Name,
OriginalIP: neighbor.IPAddress,
IPBlock: entry.IPBlock,
Server: entry.Server,
}

if neighbor.DNS != "" {
policyRef.DNS = neighbor.DNS
}

policyRefs = append(policyRefs, policyRef)
break
}

policyRefs = append(policyRefs, policyRef)
break
}
}

Expand All @@ -148,7 +151,6 @@ func generateEgressRule(neighbor softwarecomposition.NetworkNeighbor, knownServe

if neighbor.DNS != "" {
policyRefs = append(policyRefs, softwarecomposition.PolicyRef{
Name: neighbor.DNS,
DNS: neighbor.DNS,
IPBlock: ipBlock.CIDR,
OriginalIP: neighbor.IPAddress,
Expand All @@ -170,7 +172,7 @@ func generateEgressRule(neighbor softwarecomposition.NetworkNeighbor, knownServe
return egressRule, policyRefs
}

func generateIngressRule(neighbor softwarecomposition.NetworkNeighbor, knownServers []softwarecomposition.KnownServers) (softwarecomposition.NetworkPolicyIngressRule, []softwarecomposition.PolicyRef) {
func generateIngressRule(neighbor softwarecomposition.NetworkNeighbor, KnownServer []softwarecomposition.KnownServer) (softwarecomposition.NetworkPolicyIngressRule, []softwarecomposition.PolicyRef) {
ingressRule := softwarecomposition.NetworkPolicyIngressRule{}
policyRefs := []softwarecomposition.PolicyRef{}

Expand All @@ -194,32 +196,35 @@ func generateIngressRule(neighbor softwarecomposition.NetworkNeighbor, knownServ
if neighbor.IPAddress != "" {
isKnownServer := false
// look if this IP is part of any known server
for _, knownServer := range knownServers {
_, subNet, err := net.ParseCIDR(knownServer.IPBlock)
if err != nil {
logger.L().Error("error parsing cidr", helpers.Error(err))
continue
}
if subNet.Contains(net.ParseIP(neighbor.IPAddress)) {
ingressRule.From = append(ingressRule.From, softwarecomposition.NetworkPolicyPeer{
IPBlock: &softwarecomposition.IPBlock{
CIDR: knownServer.IPBlock,
},
})
isKnownServer = true

policyRef := softwarecomposition.PolicyRef{
Name: knownServer.Name,
OriginalIP: neighbor.IPAddress,
IPBlock: knownServer.IPBlock,
for _, knownServer := range KnownServer {
for _, entry := range knownServer.Spec {
_, subNet, err := net.ParseCIDR(entry.IPBlock)
if err != nil {
logger.L().Error("error parsing cidr", helpers.Error(err))
continue
}

if knownServer.DNS != "" {
policyRef.DNS = knownServer.DNS
if subNet.Contains(net.ParseIP(neighbor.IPAddress)) {
ingressRule.From = append(ingressRule.From, softwarecomposition.NetworkPolicyPeer{
IPBlock: &softwarecomposition.IPBlock{
CIDR: entry.IPBlock,
},
})
isKnownServer = true

policyRef := softwarecomposition.PolicyRef{
Name: entry.Name,
OriginalIP: neighbor.IPAddress,
IPBlock: entry.IPBlock,
Server: entry.Server,
}

if neighbor.DNS != "" {
policyRef.DNS = neighbor.DNS
}

policyRefs = append(policyRefs, policyRef)
break
}

policyRefs = append(policyRefs, policyRef)
break
}
}

Expand All @@ -231,7 +236,6 @@ func generateIngressRule(neighbor softwarecomposition.NetworkNeighbor, knownServ

if neighbor.DNS != "" {
policyRefs = append(policyRefs, softwarecomposition.PolicyRef{
Name: neighbor.DNS,
DNS: neighbor.DNS,
IPBlock: ipBlock.CIDR,
OriginalIP: neighbor.IPAddress,
Expand Down
Loading
Loading