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:
- Вход, где SSL прекращение для общедоступного домена, такого как
secure-demo.some-cluster.com
установлен. - Служба K8S, маршрутизация на нашу бэкэн.
- Развертывание 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://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#backend-protocol
- https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#backend-certificate-authentication
Оригинал: «https://dev.to/oursky/kubernetes-security-network-encryption-between-k8s-deployments-and-ingress-ld7»