Netwerk Scanning met NetPeek
Netwerken scannen hebben we hier al vaker bekeken, bijvoorbeeld met nmap.
Maar dit is wel altijd een commandline bezigheid geweest, met veel opties,
vlaggetjes, en een steile leercurve.
Dat moet ook makkelijker kunnen…
Netwerken scannen hebben we hier al vaker bekeken, bijvoorbeeld met nmap.
Maar dit is wel altijd een commandline bezigheid geweest, met veel opties,
vlaggetjes, en een steile leercurve.
Dat moet ook makkelijker kunnen…
In het verleden hebben we op dit kanaal al gekeken naar de verschillende soorten “Services” die je op Kubernetes kunt aanmaken, maar eentje zijn we toen overgeslagen: “ExternalName”.
Met dit soort services kun je een Service op Kubernetes laten doorverwijzen (via DNS CNAME) naar een externe service.
Het is al een lange tijd mogelijk om uitgaand netwerk verkeer vanuit een namespace op OpenShift vanaf een ander IP adres te laten komen dan het andere cluster verkeer. Vroeger, met OpenShiftSDN, was dit puur op namespace basis, als het verkeer kwam vanaf een apart IP adres, of niet. IP adressen konden ook niet door meer dan één namespace gebruikt worden.
Tegenwoordig, met OVN Kubernetes als SDN, kan dit een stuk fijnmaziger. Egress IPs kunnen geselecteerd worden door labels op zowel de namespace als de workload zelf, waardoor het mogelijk wordt om IP adressen te delen tussen namespaces, en zelf meerdere IP adressen te gebruiken voor verschillende workloads in een namespace.
Meestal als je KubeVirt (OpenShift Virtualization voor de OpenShift gebruikers onder ons) draait, en je wilt virtuele machines van buiten het cluster beschikbaar maken, dan grijp je naar zaken als Secundaire netwerken met OVS of Multus. Dit is dan ook de methode die bijvoorbeeld door Red Hat wordt aangeraden voor OpenShift. Het voordeel hiervan is dat het mooi samenwerkt met dingen als UserDefinedNetworks (UDN), VLAN tagging/trunking, etc.
Maar we hebben niet altijd allemaal toegang tot nodes met extra netwerk-kaarten, mooie netwerk setups, enzovoort. Sommige van ons doen veel werk met dingen als Kind, OpenShift Local (CRC), of andere kleine setups. In die gevallen kun je je VMs wel exposen aan het externe netwerk als je een beetje vals speelt door bijvoorbeeld MetalLB te gebruiken.
In sommige omgevingen krijgen OpenShift beheerders te horen dat (specifieke)
workloads gelimiteerd moeten worden in wat ze (buiten het cluster) kunnen
aanspreken aan externe diensten en hosts. Nu kun je dit met standaard
NetworkPolicy objecten oplossen, maar aangezien afnemers over het
algemeenNetworkPolicy objecten in hun eigen namespaces mogen editen is dit
niet de meest robuuste oplossing.
Je zou ook kunnen gaan werken met EgressIP objecten, en verkeer van die IP
adressen buiten het cluster laten filteren, maar dan kom je al snel in een
wereld waar je honderden extra IPv4 adressen nodig hebt.
Je zou ook met AdminNetworkPolicy objecten bezig kunnen gaan, maar deze zijn
nog redelijk nieuw, en werken nog niet buiten OpenShift.
Gelukkig is er ook nog een vierde optie voor gebruikers van het OVN-Kubernetes SDN: EgressFirewalls
Wanneer je met Podman een container of pod maakt wordt deze als je niks anders opgeeft aan het standaard “podman” network gekoppeld. Als je meer controle wilt, bijvoorbeeld omdat je een gelaagde applicatie in meerdere containers of pods draait, dan mag je ook zelf extra netwerken aanmaken en bepalen welke containers/pods aan welke netwerken gekoppeld zitten.
Praktisch elke Kubernetes/OpenShift beheerder kent het principe van de NetworkPolicy, objecten binnen een namespace die bepalen welk verkeer van en naar je pods is toegestaan binnen die namespace.
Om hier gezonde defaults voor af te dwingen hebben de meeste (multi-tenant) clusters ook al maatregelen, zoals DefaultProjectRequestTemplates of Kyverno “generate” regels, die een set “standaard” NetworkPolicies in elke namespace neerzetten.
Het probleem dat nu ontstaat is dat als tenants hun eigen NetworkPolicies moeten kunnen maken, om de toegang binnen hun applicaties fijnschalig te kunnen regelen, ze ook rechten moeten hebben om de defaults aan te passen of te verwijderen. Nu hoeft dat geen probleem te zijn, maar als teams minder voorzichtig of ervaren zijn kan dat al snel leiden tot support calls omdat de OpenShift ingress pods bijvoorbeeld niet meer bij hun applicatie mogen, en hun Routes zijn stukgegaan.
Gelukkig hebben in OpenShift 4.14 NetworkPolicies een uitbreiding gehad, die in 4.16 GA gegaan is en dus ondersteund gebruikt kan worden: AdminNetworkPolicies.
In recente versies van OpenShift kun je de “Network Observability Operator” installeren om een beter inzicht te krijgen in de netwerk flows tussen de verschillende componenten/pods/services/etc op je cluster, als ook het netwerk verkeer dat je cluster verlaat.
Deze inzichten kunnen dan gebruikt worden voor verschillende zaken; Het doorberekenen van netwerk gebruik, optimalisatie van traffic-flow tussen de componenten van een micro service, of zelfs het detecteren van “ongebruikelijk” verkeer in een applicatie.
Om verkeer van buiten een Kubernetes/OpenShift cluster in te krijgen heb je waarschijnlijk een LoadBalancer nodig, om bijvoorbeeld je Ingress te ontsluiten, of om services rechtstreeks aan te bieden.
Wanneer je in een cloud omgeving draait biedt je provider waarschijnlijk loadbalancers aan die rechtstreeks door je cluster aangestuurd kunnen worden, maar wanneer je op Baremetal draait, of op LibVirt, of op VMWare, dan missen deze opties.
Op een Kubernetes cluster (dus ook OpenShift) kun je je pods bereikbaar maken
met Service objecten. Deze objecten kunnen verschillende types hebben,
headless, ClusterIP, NodePort, LoadBalancer, en ExternalName.