Рубрики
Uncategorized

Kubernetes Security — сетевое шифрование между развертываниями K8S и вход

Calvin, который отказывается создать учетную запись dev.to. TL; DR: С простом примером здесь мы демонстрируем … Помечено с Куберанетами, безопасностью, дежопами.

Calvin, который отказывается создать учетную запись dev.to.

TL; DR: С помощью простого примера здесь мы продемонстрируем, как защитить соединения между развертыванием ваших Kubernetes (K8S) и входным, включив TLS и HTTPS. Это может быть критической частью в ваших DEVSECOPS Workf Low или бизнес-требование вашей команды разработки должны выполнить.

Это быстрое руководство по упрочнению применения K8S путем обеспечения безопасной связи между контроллером входа и другими услугами K8S. Это важно, особенно если ваши бизнес-требования, такие как в финансовых услугах или в корпоративных средах, заставьте вас обеспечить соблюдение строгих мер безопасности, таких как шифрование всего трафика в транзите.

Некоторые предостережения: Управление самим кластером Kubernetes достаточно сложна, и крепить его можно запутать. Это добавит еще один слой сложности, поэтому рассмотрим, какие ваши фактические требования и проводят оценки риска. Не все проекты требуют этого уровня безопасности. Ниже приведена простая визуализация трафика между входным и спинным концом.

        ╔═════════════════════════╗       ╔════════════════════╗
 https  ║ ingress                 ║ https ║ backend            ║
 ───>───╫─────────────────────────╫───>───╫────────────────────╢
        ║ demo.some-cluster.com   ║       ║ demo-app           ║
        ╚═════════════════════════╝       ╚════════════════════╝

Это руководство проводит вас только путем укрепления связи между входом и сервисом K8S. Скажем, у вас есть коллекция микросервисов, вы также можете обеспечить связь между каждым из них. Ниже приведены несколько предложений, взвешивают их соответственно.

Маршрут все трафик с входом

Звонки из приложения Backend к другому должны быть направлены через проникновение. Соединение закреплено, поскольку мы уже внедрили TLS между входом и сервисом (ыми), указывающими на App (ы) Backenc.

Этот подход имеет один недостаток, хотя, где выставлены точки связи всех бэкэндских приложений. IP Whitelisting и использование внутренних заголовков — это некоторые меры для защиты их открытых конечных точек.

Зашифрованное подключение для каждого приложения, реализуя TLS

С этим вам придется реализовать TLS и управлять соответствующим сертификатом для каждого приложения Backenn. Там может быть много доборов, просто для создания сертификатов, хотя этот полностью избегает выданного выпуска порта.

Интеграция сервисной сетки

Вы можете установить сервисную сетку, как LinkerD или ISTIO. Что такое сервисная сетка? В основном это принимает ваши файлы yaml и выполняет некоторое переписывание в зависимости от ваших инструкций (например, некоторые команды ISTIO). С помощью этих измененных файлов конфигурации ваши кластер K8S будут развернуты с некоторыми дополнительными прокси-сервисами, которые перехватывают все связи между микросимами и применяются применяемые меры безопасности.

  • Вы знакомы с концепциями контейнеров, докера.
  • Базовые пособия по Kubernetes и о том, как он достигает оркестрации контейнера.
  • У вас есть основы, такие как «HTTPS VS HTTP» или «TLS VS SSL» и знают, как генерировать самозагодный сертификат.

Фото Ади Голдштейн на Бессмысленно

Пример изготовлен из этих компонентов Kubernetes:

  1. Вход, где SSL прекращение для общедоступного домена, такого как secure-demo.some-cluster.com установлен.
  2. Служба K8S, маршрутизация на нашу бэкэн.
  3. Развертывание K8S A.k.a Наша бэкэнда, веб-сервер Nginx, обслуживающий HTTPS.

Образец файлов конфигурации Kubernetes

Вот файл конфигурации с именем Backend.yaml Покрытие нашей всей бэкэнда (сервер Nginx, карта конфигурации и услуга). Предоставляя Certs, мы сделаем с настройками безопасности TLS.

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app: demo-app
  name: nginx-conf
data:
  site.conf: |
    server {
      listen 443 ssl;
      server_name demo-app;
      ssl_certificate /run/secrets/nginx-cert/tls.crt;
      ssl_certificate_key /run/secrets/nginx-cert/tls.key;
      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
      }
    }
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demo-app
  name: demo-app
spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: demo-app
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: demo-app
  name: demo-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      restartPolicy: Always
      volumes:
      - name: nginx-conf
        configMap:
          name: nginx-conf
      - name: demo-app-tls
        secret:
          secretName: demo-app-tls
      containers:
      - name: demo-app
        image: nginx:1.19.2-alpine
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: "8m"
            memory: "16Mi"
          limits:
            cpu: "16m"
            memory: "64Mi"
        ports:
        - containerPort: 443
        volumeMounts:
        - name: nginx-conf
          mountPath: "/etc/nginx/conf.d"
          readOnly: true
        - name: demo-app-tls
          mountPath: "/run/secrets/nginx-cert"
          readOnly: true

И теперь приходит часть сетевой шифрования TLS, где входной конфиг Ingress.yaml применены:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo-app
  annotations:
    ingress.kubernetes.io/proxy-body-size: 4m
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/proxy-ssl-secret: "NAMESPACE/demo-app-tls"
    nginx.ingress.kubernetes.io/proxy-ssl-verify: "true"
spec:
  rules:
    - host: YOUR-NAME.EXAMPLE-CLUSTER.com
      http:
        paths:
          - path: /
            backend:
              serviceName: demo-app
              servicePort: 443
  tls:
    - hosts:
        - YOUR-NAME.EXAMPLE-CLUSTER.com
      secretName: YOUR-NAME.EXAMPLE-CLUSTER.com

Важная заметка : Если ваше развертывание не в пределах того же пространства имен контроллера входа (который является обычным случаем), вам необходимо указать пространство имен для Proxy-SSL-Secret , то есть Пространство имен/DEMO-APP-TLS Отказ

Сеть шифрование с несколькими концами

MicroServices означает иметь много бэкэндских приложений, но есть Только один Proxy-SSL-Secret Конфигурация на проход. Чтобы служить нескольким приложениям из того же входа, вы можете настроить вход в проникновение для лечения всех услуг с тем же именем, как показано в примере ниже:

nginx.ingress.kubernetes.io/proxy-ssl-name: demo-app

Что сделано под капотом, это то, что имя прокси было переопределено как Demo-App Для всех услуг, чтобы они подавали с тем же сертификатом. Это немного ослабило безопасность, снова взвешивайте различные варианты и решайте, какой уровень безопасности вы хотите достичь. Чтобы пойти на более высокий уровень безопасности связи, возможно, вы хотели бы создать несколько проникновений вместо этого. Не стесняйтесь и дайте мне знать, если у вас есть другие идеи, всегда приятно взаимодействовать моих собратьев?

Вы также можете применить дикую карту, как * .svc.cluster.local Чтобы соответствовать услугам, но путем этого технически все услуги доверяют, что просто не очень элегантно.

Создайте демонстрационный сервер

Ниже приведен фрагмент для создания самозагонного сертификата. Обратите внимание, что это просто простой пример, и вы не должны копировать эту стремительно для производства:

# root CA
openssl genrsa -out rootCA.key 4096
openssl req -x509 -nodes -new -key rootCA.key -sha256 -days 1024 -out rootCA.crt
# generate cert for demo-app
openssl genrsa -out demo-app.key 4096
openssl req -new -sha256 -key demo-app.key -out demo-app.csr \
  -subj "/C=HK/ST=HK/L=HongKong/O=Example/OU=Org/CN=demo-app"
openssl x509 -req -in demo-app.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial \
  -out demo-app.crt -days 1024 -sha256

Затем вы можете представить свои секреты в K8S:

kubectl -n NAMESPACE create secret generic demo-app-tls \
  --from-file=tls.crt=demo-app.crt \
  --from-file=tls.key=demo-app.key \
  --from-file=ca.crt=rootCA.crt

Здесь применяется фактическое развертывание и вход:

kubectl -n NAMESPACE apply -f backend.yaml
kubectl -n NAMESPACE apply -f ingress.yaml

Дождитесь вступления в силу развертывания, сервер будет готов на https://YOUR-NAME.EXAMPLE-CLUSTER.com !

Очистить пространство имен

kubectl -n NAMESPACE delete -f ingress.yaml
kubectl -n NAMESPACE delete -f backend.yaml
kubectl -n NAMESPACE delete secret demo-app-tls YOUR-NAME.EXAMPLE-CLUSTER.com

Чтобы узнать больше о работе с контроллером входа, проверьте эти ссылки на руководстве пользователя Kubernetes:

Оригинал: «https://dev.to/oursky/kubernetes-security-network-encryption-between-k8s-deployments-and-ingress-ld7»