Pregunta 24 - NetworkPolicy
Question 24 | NetworkPolicy
Use context: kubectl config use-context k8s-c1-H
There was a security incident where an intruder was able to access the whole cluster from a single hacked backend Pod.
To prevent this create a NetworkPolicy called np-backend in Namespace project-snake. It should allow the backend-* Pods only to:
connect to db1-* Pods on port 1111 connect to db2-* Pods on port 2222
Use the app label of Pods in your policy.
After implementation, connections from backend-Pods to vault- Pods on port 3333 should for example no longer work.
Analizando esta pregunta necesitamos hacer un network policy con egress para backend solamente permitiendo solamente conexiones con los pods específicos. Como cada uno tiene una puerta diferente entonces necesitamos tener dos reglas. Si fuera hecho una única regla filtrando ambas labels y permitiendo ambas puertas, sería creada la regla las dos puertas estarían permitidas para ambos pods y no es lo que queremos.
kubectl get pods -n project-snake
backend-0 1/1 Running 0 8s
db1-0 1/1 Running 0 8s
db2-0 1/1 Running 0 10s
vault-0 1/1 Running 0 10s
# Verificando las labels que app y también más informaciones
k -n project-snake get pod -L app
NAME READY STATUS RESTARTS AGE APP
backend-0 1/1 Running 0 3m15s backend
db1-0 1/1 Running 0 3m15s db1
db2-0 1/1 Running 0 3m17s db2
vault-0 1/1 Running 0 3m17s vault
#
➜ k -n project-snake get pod -o wide
NAME READY STATUS RESTARTS AGE IP ...
backend-0 1/1 Running 0 4m14s 10.44.0.24 ...
db1-0 1/1 Running 0 4m14s 10.44.0.25 ...
db2-0 1/1 Running 0 4m16s 10.44.0.23 ...
vault-0 1/1 Running 0 4m16s 10.44.0.22 ...
vim /opt/course/24/networkpol.yaml
Vamos a editar el archivo copiando un ejemplo de network policy de la documentación y ajustando.
# /opt/course/24/networkpol.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: np-backend
namespace: project-snake
spec:
podSelector:
matchLabels:
app: backend # los pods que serán aplicados estos network policies
policyTypes:
- Egress # policy de salida
egress:
- # primera regla
to:
- podSelector: # primera condición
matchLabels:
app: db1
ports: # segunda condición
- protocol: TCP
port: 1111
- # segunda regla
to:
- podSelector: # primera condición
matchLabels:
app: db2
ports: # segunda condición
- protocol: TCP
port: 2222
Ahora vamos a aplicar y verificar.
k apply -f /opt/course/24/networkpol.yaml
# Podemos ahora testar si el backend consigue comunicarse con el vault
k -n project-snake exec backend-0 -- curl -s 10.44.0.22:3333
vault secret storage
➜ k -n project-snake exec backend-0 -- curl -s 10.44.0.25:1111
database one
➜ k -n project-snake exec backend-0 -- curl -s 10.44.0.23:2222
database two
➜ k -n project-snake exec backend-0 -- curl -s 10.44.0.22:3333
# No comunicó, entonces está ok.