Cilium CNI Secure Profile
26 января 2026 г.·275 views

🛠 Cilium CNI Secure Profile

Салют, я ранее вот тут описывал, что такое CNI, да и рассказал на примерах про Cilium, а сегодня хочу поделиться с тобой полным профилем для него.

В этом профиле пара политик на кластерный baseline и приклад. Давай посмотрим на него поближе. Профиль дает сегментацию кластера и дополнительный app‑aware контроль на уровне HTTP, то есть best practice: кластерный каркас и специфичные правила.

Что делает?

- Вводит default‑deny egress для Pod’ов, кроме DNS и FQDN, чтобы скомпрометированный сервис не мог свободно сливать данные

- CiliumClusterwideNetworkPolicy задаёт жёсткий baseline для всего кластера и базовую защиту multi-tenant

- Ограничивает пути до backend только для БД и конкретных API, а frontend для namespaces

- На L7 (HTTP, gRPC, DNS, SQL‑протоколы, запросы/ методы/ URL внутри трафика) разрешает только определённые методы, тем самым уменьшая API и предотвращая вызовы

apiVersion: "cilium.io/v2"

kind: CiliumClusterwideNetworkPolicy

meta

name: "cluster-baseline-default-deny-egress"

spec:

description: |

Кластерный baseline:

- DNS (kube-dns/CoreDNS);

- явный список внешних эндпоинтов

# Политика применяется ко всем endpoint'ам в кластере

# если CNP не переопределяет узким matchLabels

endpointSelector:

matchLabels: {}

egress:

# namespace kube-system

- toEndpoints:

- matchLabels:

"k8s:io.kubernetes.pod.namespace": kube-system

"k8s-app": kube-dns

toPorts:

- ports:

- port: "53"

protocol: ANY

rules:

dns:

- matchPattern: "*" # любые домены

# трафик к ограниченному списку внешних хостов

- toFQDNs:

- matchName: "api.payment.example.com"

toPorts:

- ports:

- port: "443"

protocol: TCP

# default-deny для egress

egressDeny:

- {}

apiVersion: "cilium.io/v2"

kind: CiliumNetworkPolicy

meta

name: "app-frontend-backend-policy"

namespace: "app-namespace"

spec:

description: |

- ingress: только от frontend к backend

- egress backend'а: только к БД и внешнему API

- L7 принимает безопасный набор методов

# backend‑pods по метке

endpointSelector:

matchLabels:

app: my-backend

ingress:

# трафик от Pod'ов с app=my-frontend

- fromEndpoints:

- matchLabels:

"k8s:io.kubernetes.pod.namespace": app-namespace

app: my-frontend

toPorts:

- ports:

- port: "8080"

protocol: TCP

rules:

http:

- method: "GET"

path: "^/healthz$"

- method: "GET"

path: "^/api/public/.*$"

- method: "POST"

path: "^/api/orders$"

- headers:

- "X-API-KEY: .+"

egress:

# backend'у к базе данных в том же namespace

- toEndpoints:

- matchLabels:

"k8s:io.kubernetes.pod.namespace": app-namespace

app: my-database

toPorts:

- ports:

- port: "5432"

protocol: TCP # PostgreSQL

# доступ к внешнему API ограниченному кластерным CNP по FQDN

- toFQDNs:

- matchName: "api.payment.example.com"

toPorts:

- ports:

- port: "443"

protocol: TCP

#appsec #toolchain #containersecurity #reco #techsolution

#appsec#toolchain#containersecurity#reco#techsolution
Открыть в Telegram