Questão 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.
Analisando essa questão precisamos fazer um network policy com egress para backend somente permitindo somente conexões com os pods específicos. Como cada um tem uma porta diferente então precisamos ter duas regras. Se fosse feito uma única regra filtrando ambas as labels e permitindo ambas as portas, seria criada a regra as duas portas estariam permitidas para ambos os pods e não é o 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
# Conferindo as labels que app e também mais informações
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 editar o arquivo copiando um exemplo de network policy da documentação e 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 # os pods que serão aplicados esses network policies
policyTypes:
- Egress # policy de saída
egress:
- # primeira regra
to:
- podSelector: # primeira condição
matchLabels:
app: db1
ports: # segunda condição
- protocol: TCP
port: 1111
- # segunda regra
to:
- podSelector: # primeira condição
matchLabels:
app: db2
ports: # segunda condição
- protocol: TCP
port: 2222
Agora vamos aplicar e conferir.
k apply -f /opt/course/24/networkpol.yaml
# Podemos agora testar se o backend consegue se comunicar com o 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
# Não comunicou, então esta ok.