ЁЯЪлЁЯУЭ рдзрдбрд╛ 19 тАФ NetworkPolicies: рдЪрд┐рдареНрдареНрдпрд╛ рдкрд╛рдард╡рдгреНрдпрд╛рдЪреЗ рдирд┐рдпрдо
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 19 / 26 ┬╖ рдорд╛рдЧреАрд▓: lesson-18-jobs-cronjobs ┬╖ рдкреБрдвреАрд▓: lesson-20-taints-affinity
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЖрдзреАрдЪреЗ рд╕рдЧрд│реЗ, рдЖрдгрд┐ cluster рдЪреНрдпрд╛ рдЖрдд рдХреЛрдг рдХреЛрдгрд╛рд╢реА рдмреЛрд▓реВ рд╢рдХрддреЗ рдпрд╛рд╡рд░ рдХреБрд▓реВрдк. рдЦрд░реА file:
- k8s/network-policies.yaml тАФ default-deny + рдЖрдкрд▓реНрдпрд╛ app рд▓рд╛ рдЦрд░реЛрдЦрд░ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ рджреЛрди рдкрд░рд╡рд╛рдирдЧреНрдпрд╛
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрд╢реНрдЪрд░реНрдп: рдирд╡реНрдпрд╛ cluster рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ pod рдкреНрд░рддреНрдпреЗрдХ pod рд╢реА рдХреБрдЬрдмреБрдЬреВ рд╢рдХрддреЛ ЁЯШ│ тАФ рдХреЛрдгрддреЗрд╣реА рдореВрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд░реНрдЧрд╛рддрд▓реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдореБрд▓рд╛рд▓рд╛ рдЪрд┐рдареНрдареА рджреЗрдК рд╢рдХрддреЗ, рдереЗрдЯ рдЧреБрдгрдкрддреНрд░рд┐рдХреЗрдЪреНрдпрд╛ рд╡рд╣реАрдкрд░реНрдпрдВрддрд╕реБрджреНрдзрд╛. рдПрдХ compromised pod = рд╕рдВрдкреВрд░реНрдг рд╢рд╛рд│реЗрдЪреА рдореЛрдлрдд рд╕рдлрд░. (Security groups рдмрд╛рд╣реЗрд░реВрди рдмрд╛рдХрд╛рдВрдЪреЗ рд░рдХреНрд╖рдг рдХрд░рддрд╛рдд; рдЖрддрд▓реНрдпрд╛ рдЪрд┐рдареНрдареНрдпрд╛рдВрд╡рд░ рдХреЛрдгреАрдЪ рд▓рдХреНрд╖ рдареЗрд╡рдд рдирд╡реНрд╣рддреЗ.)
NetworkPolicies рдореНрд╣рдгрдЬреЗ рдЪрд┐рдареНрдареНрдпрд╛ рдкрд╛рдард╡рдгреНрдпрд╛рдЪреЗ рдирд┐рдпрдо:
- рдкрд╣рд┐рд▓рд╛ рд▓рд╛рд╡рд▓реЗрд▓рд╛ рдирд┐рдпрдо: "рдпрд╛ рд╡рд░реНрдЧрд╛рдд рдЕрдЬрд┐рдмрд╛рдд рдЪрд┐рдареНрдареНрдпрд╛ рдирд╛рд╣реАрдд" (default-deny тАФ рд░рд┐рдХрд╛рдорд╛ selector рдЕрд╕рд▓реЗрд▓реА policy, рдЬреА рдкреНрд░рддреНрдпреЗрдХ pod рдирд┐рд╡рдбрддреЗ). рдЬреНрдпрд╛ рдХреНрд╖рдгреА рдХреЛрдгрддреАрд╣реА policy рдПрдЦрд╛рджрд╛ pod рдирд┐рд╡рдбрддреЗ, рддреНрдпрд╛ рдХреНрд╖рдгреА рддреЛ pod рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдкрд░рд╡рд╛рдирдЧреА рди рджрд┐рд▓реЗрд▓реЗ рдХрд╛рд╣реАрд╣реА рд╕реНрд╡реАрдХрд╛рд░рдгреЗ рдерд╛рдВрдмрд╡рддреЛ.
- рдордЧ, рд╡рд░реНрдЧрд╛рд▓рд╛ рд▓рд╛рдЧрддрд╛рдд рддреЗрд╡рдвреНрдпрд╛рдЪ рдЪрд┐рдареНрдареНрдпрд╛рдВрдирд╛ рдкрд░рд╡рд╛рдирдЧреА рджреНрдпрд╛: "analytics school-api рд▓рд╛ рдЪрд┐рдареНрдареА рджреЗрдК рд╢рдХрддреЗ, рдлрдХреНрдд seat 3000" рдЖрдгрд┐ "рдлрд╛рдЯрдХ (ingress/ALB) рджреЛрдиреНрд╣реА apps рдирд╛ рдЪрд┐рдареНрдареА рджреЗрдК рд╢рдХрддреЗ". рд╕рдВрдкрд▓реЗ. рдЖрддрд╛ compromised pod рдкреЛрд╣реЛрдЪреВ рд╢рдХрддреЛтАж рдиреЗрдордХреЗ рдХрд╛рд╣реАрдЪ рдЬрд╛рд╕реНрддреАрдЪреЗ рдирд╛рд╣реА.
рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЕрдЯ: рдирд┐рдпрдо рддреЗрд╡реНрд╣рд╛рдЪ рдЪрд╛рд▓рддрд╛рдд рдЬреЗрд╡реНрд╣рд╛ рд╢рд╛рд│реЗрдиреЗ рддреЗ рд╡рд╛рдЪрдгрд╛рд░реА рд╢рд┐рдХреНрд╖рд┐рдХрд╛
рдиреЗрдорд▓реЗрд▓реА рдЕрд╕рддреЗ тАФ CNI рдиреЗ NetworkPolicy support рдХреЗрд▓реАрдЪ рдкрд╛рд╣рд┐рдЬреЗ. Minikube:
--cni=calico рдиреЗ рд╕реБрд░реВ рдХрд░рд╛ (рдХрд┐рдВрд╡рд╛ enable рдХрд░рд╛). EKS: VPC CNI рдордзреНрдпреЗ network-policy
switch рдЖрд╣реЗ (рдХрд┐рдВрд╡рд╛ Calico install рдХрд░рд╛). рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгрд╛рд░рд╛ рдирд╛рд╣реА = рдирд┐рдпрдо рд╢рд╛рдВрддрдкрдгреЗ
рджреБрд░реНрд▓рдХреНрд╖рд┐рдд тАФ рдиреЗрд╣рдореА test рдХрд░рд╛!
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph before["ЁЯШ│ default: everyone whispers"]
a1["ЁЯкС any pod"] ---|"any note"| b1["ЁЯкС any pod"]
end
subgraph after["ЁЯЪлЁЯУЭ with policies"]
deny["1 default-deny:<br/>no notes at all"]
allow1["2 allow: analytics тЖТ api :3000"]
allow2["3 allow: gate тЖТ apps :3000/:8000"]
blocked["тЭМ anything else: dropped"]
end
before -->|"apply k8s/network-policies.yaml"| after
тЭУ рдХрд╛рдп
- NetworkPolicy pods рдирд┐рд╡рдбрддреЗ (
podSelector) рдЖрдгрд┐ pod labels, namespace labels, рдХрд┐рдВрд╡рд╛ CIDR рдиреБрд╕рд╛рд░ тАФ ports рд╕рд╣ тАФ ingress (рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рдХреЛрдг рдмреЛрд▓реВ рд╢рдХрддреЗ) рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ egress (рддреЗ рдХреЛрдгрд╛рд╢реА рдмреЛрд▓реВ рд╢рдХрддрд╛рдд) рдпрд╛рдВрдЪреА whitelist рдХрд░рддреЗ. - Policies рдореНрд╣рдгрдЬреЗ рдПрдХрдореЗрдХрд╛рдВрдд рднрд░ рдШрд╛рд▓рдгрд╛рд▒реНрдпрд╛ allow-lists: deny rules рдирд╛рд╣реАрдд; рдЬреБрд│рдгрд╛рд▒реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ policies рдЪрд╛ union рд▓рд╛рдЧреВ рд╣реЛрддреЛ. рди рдирд┐рд╡рдбрд▓реЗрд▓реЗ pods рдкреВрд░реНрдг рдЙрдШрдбреЗ рд░рд╛рд╣рддрд╛рдд.
- рдиреЗрд╣рдореАрдЪреА рдкрд╛рдХрдХреГрддреА (рдЕрдЧрджреА рдЖрдкрд▓реА file): namespace рд╕рд╛рдареА рдПрдХ default-deny-ingress, рдордЧ рдкреНрд░рддреНрдпреЗрдХ рдпреЛрдЧреНрдп рд╕рдВрднрд╛рд╖рдгрд╛рд╕рд╛рдареА рдПрдХ рдЫреЛрдЯреА allow.
- egress rules рд▓рд┐рд╣рд┐рддрд╛рдирд╛ DNS egress (UDP 53) рд╡рд┐рд╕рд░реВ рдирдХрд╛ тАФ "рдорд╛рдЭреНрдпрд╛ policies рдореБрд│реЗ рд╕рдЧрд│реЗ рдмрд┐рдШрдбрд▓реЗ" рд╣реА рдХреНрд▓рд╛рд╕рд┐рдХ рдЪреВрдХ.
ЁЯдФ рдХрд╛
Defense in depth: security groups (AWS L10) рдЗрдорд╛рд░рддреАрдЪреЗ рд░рдХреНрд╖рдг рдХрд░рддрд╛рдд, RBAC (L17) API рдЪреЗ рд░рдХреНрд╖рдг рдХрд░рддреЗ, NetworkPolicies pod-to-pod рдЪреЗ рд░рдХреНрд╖рдг рдХрд░рддрд╛рдд. рд╣рд╛ "attacker рд▓рд╛ рдПрдХ pod рдорд┐рд│рд╛рд▓рд╛" рдЖрдгрд┐ "attacker рд▓рд╛ рдПрдХ pod рдорд┐рд│рд╛рд▓рд╛ рдЖрдгрд┐ рдордЧ database" рдпрд╛рдВрддрд▓рд╛ рдлрд░рдХ рдЖрд╣реЗ. Auditors рд╣реЗ рдирд╛рд╡рд╛рдирд┐рд╢реА рдорд╛рдЧрддрд╛рдд.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (policy рд▓рд╛рдЧреВ рдХрд░рдгрд╛рд▒реНрдпрд╛ CNI рд╕рд╣ cluster)
# before: anyone can reach the api тАФ even a random debug pod:
kubectl -n school run spy --rm -it --image=curlimages/curl --restart=Never \
-- curl -s -m 3 http://school-api && echo "ЁЯШ│ wide open"
# post the rules:
kubectl apply -f k8s/network-policies.yaml
# the spy is now blocked...
kubectl -n school run spy --rm -it --image=curlimages/curl --restart=Never \
-- curl -s -m 3 http://school-api || echo "ЁЯЪл note intercepted!"
# ...but the real conversation still works (analytics wears the right label):
kubectl -n school exec deploy/school-analytics -- \
python -c "import urllib.request;print(urllib.request.urlopen('http://school-api',timeout=3).status)"
# тЖТ 200 ЁЯОЙ (if this ALSO fails: your CNI isn't enforcing тАФ see the catch above)
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
kubectl get networkpolicy ┬╖ kubectl exec spy -- curl тАж
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L10 (security groups) ┬╖ L21 (NACLs)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
default-deny рдирдВрддрд░ spy pod рдЪрд╛ DB рдХрдбрдЪрд╛ curl time out рд╣реЛрддреЛ; analytics тЖТ api call рдЕрдЬреВрдирд╣реА рдЪрд╛рд▓рддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
kubectl delete networkpolicy тАж тАФ рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛ рдареЗрд╡рд╛, рддреНрдпрд╛рдЪ рддрд░ рдореБрджреНрджрд╛ рдЖрд╣реЗрдд
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- policies рд▓рд╛рдЧреВ рди рдХрд░рдгрд╛рд▒реНрдпрд╛ CNI рд╡рд░рдЪреНрдпрд╛ policies тАФ рд╢рд╛рдВрддрдкрдгреЗ рджреБрд░реНрд▓рдХреНрд╖рд┐рдд, рдиреЗрд╣рдореА test рдХрд░рд╛
- default-deny рдордзреНрдпреЗ DNS egress рд╡рд┐рд╕рд░рдгреЗ (рд╕рдЧрд│реЗ рдПрдХрджрдо 'рдмрд┐рдШрдбрддреЗ')
тПня╕П рдкреБрдвреЗ
рдХреЛрдгрддреЗ pods рдХреЛрдгрддреНрдпрд╛ рдмрд╛рдХрд╛рдВрд╡рд░ рдмрд╕реВ рд╢рдХрддрд╛рдд тАФ рд░рд╛рдЦреАрд╡ рдЬрд╛рдЧрд╛, allergy рдЯреЗрдмрд▓, рдЖрдгрд┐ рд╢рд┐рдХреНрд╖рд┐рдХреЗрдЪреА рдЦреБрд░реНрдЪреА: taints, tolerations рдЖрдгрд┐ affinity.
git checkout lesson-20-taints-affinity