Как отладить связь mTLS с istio в кубернетах?

Я очень новичок в Istio, поэтому это может быть простой вопрос, но у меня есть некоторая путаница в отношении Istio. Я использую Istio 1.8.0 и 1.19 для k8s. Извините за несколько вопросов, но буду признателен, если вы поможете мне прояснить лучшие подходы .

  1. Я полагаю, что после внедрения Istio я не смог получить доступ к сервису для сервиса непосредственно внутри модуля, но, как вы можете видеть ниже, я могу. Возможно, я неправильно понял, но это ожидаемое поведение? Между тем, как я могу отладить, взаимодействуют ли службы друг с другом через прокси-сервер посланника с mTLS? Я использую режим STRICT и должен ли я развернуть повторную аутентификацию в пространстве имен, в котором работают микросервисы, чтобы избежать этого?

     kubectl get peerauthentication --all-namespaces
     NAMESPACE      NAME      AGE
     istio-system   default   26h
    
  2. Как я могу ограничить трафик, допустим, служба api-dev не должна иметь доступ к auth-dev, но может иметь доступ к backend-dev?

  3. Некоторым микросервисам необходимо взаимодействовать с базой данных, где они также работают в пространстве имен database. У нас также есть такие, которые мы не хотим вводить istio, также используя ту же базу данных? Итак, должна ли база данных также разворачиваться в том же пространстве имен, где у нас есть внедрение istio? Если да, то означает ли это, что мне нужно развернуть другой экземпляр базы данных для остальных служб?


    $ kubectl get ns --show-labels
    NAME              STATUS   AGE    LABELS
    database          Active   317d   name=database
    hub-dev           Active   15h    istio-injection=enabled
    dev               Active   318d   name=dev


    capel0068340585:~ semural$ kubectl get pods -n hub-dev
    NAME                                     READY   STATUS    RESTARTS   AGE
    api-dev-5b9cdfc55c-ltgqz                  3/3     Running   0          117m
    auth-dev-54bd586cc9-l8jdn                 3/3     Running   0          13h
    backend-dev-6b86994697-2cxst              2/2     Running   0          120m
    cronjob-dev-7c599bf944-cw8ql              3/3     Running   0          137m
    mp-dev-59cb8d5589-w5mxc                   3/3     Running   0          117m
    ui-dev-5884478c7b-q8lnm                   2/2     Running   0          114m
    redis-hub-master-0                        2/2     Running   0           2m57s
    
    $ kubectl get svc -n hub-dev
    NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    api-dev                ClusterIP   xxxxxxxxxxxxx      <none>        80/TCP    13h
    auth-dev               ClusterIP   xxxxxxxxxxxxx      <none>        80/TCP    13h
    backend-dev            ClusterIP   xxxxxxxxxxxxx      <none>        80/TCP    14h
    cronjob-dev            ClusterIP   xxxxxxxxxxxxx      <none>        80/TCP    14h
    mp-dev                 ClusterIP   xxxxxxxxxxxxx      <none>        80/TCP    13h
    ui-dev                 ClusterIP   xxxxxxxxxxxxx      <none>        80/TCP    13h
    redis-hub-master       ClusterIP   xxxxxxxxxxxxx      <none>        6379/TCP  3m47s
    


----------


    $ kubectl exec -ti ui-dev-5884478c7b-q8lnm -n hub-dev sh
    Defaulting container name to oneapihub-ui.
    Use 'kubectl describe pod/ui-dev-5884478c7b-q8lnm -n hub-dev' to see all of the containers in this pod.
    /usr/src/app $ curl -vv  http://hub-backend-dev
    *   Trying 10.254.78.120:80...
    * TCP_NODELAY set
    * Connected to backend-dev (10.254.78.120) port 80 (#0)
    > GET / HTTP/1.1
    > Host: backend-dev
    > User-Agent: curl/7.67.0
    > Accept: */*
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 404 Not Found
    < content-security-policy: default-src 'self'

    <
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>Error</title>
    </head>
    <body>
    <pre>Cannot GET /</pre>
    </body>
    </html>
    * Connection #0 to host oneapihub-backend-dev left intact
    /usr/src/app $

person semural    schedule 14.01.2021    source источник


Ответы (1)


  1. Согласно документации, если вы используете STRICT mtls, рабочие нагрузки должны принимать только зашифрованный трафик.

Одноранговая аутентификация

Политики одноранговой аутентификации определяют режим взаимного TLS, который Istio применяет к целевым рабочим нагрузкам. Поддерживаются следующие режимы:

  • РАЗРЕШЕНИЕ: рабочие нагрузки принимают как взаимный TLS, так и обычный текстовый трафик. Этот режим наиболее полезен во время миграции, когда рабочие нагрузки без дополнительного элемента не могут использовать взаимный TLS. После переноса рабочих нагрузок с помощью внедрения sidecar вы должны переключить режим на STRICT.
  • СТРОГО: рабочие нагрузки принимают только взаимный трафик TLS.
  • ОТКЛЮЧИТЬ: взаимный TLS отключен. С точки зрения безопасности вам не следует использовать этот режим, если вы не предоставили собственное решение безопасности.

Когда режим не установлен, наследуется режим родительской области. Политики одноранговой аутентификации на уровне сети с неустановленным режимом по умолчанию используют РАЗРЕШЕННЫЙ режим.

Также стоит взглянуть здесь, так как это очень хорошо описано здесь banzaicloud.


Вы можете включить строгий режим mtls глобально, но также для конкретного пространство имен или рабочая нагрузка.


  1. Для этого вы можете использовать Политику авторизации istio.

Политика авторизации Istio позволяет контролировать доступ к рабочим нагрузкам в сети.

Вот пример.

Ниже приведен еще один пример, в котором для действия задается значение «ОТКАЗАТЬ» для создания политики отказа. Он отклоняет запросы из пространства имен «dev» к методу «POST» для всех рабочих нагрузок в пространстве имен «foo».

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: httpbin
 namespace: foo
spec:
 action: DENY
 rules:
 - from:
   - source:
       namespaces: ["dev"]
   to:
   - operation:
       methods: ["POST"]

  1. Вы можете настроить базу данных, не вводя ее, а затем добавить ее в реестр Istio, используя ServiceEntry, чтобы он мог взаимодействовать с остальными службами istio.

ServiceEntry позволяет добавлять дополнительные записи во внутренний реестр служб Istio, чтобы автоматически обнаруженные службы в сети могли получать доступ к этим службам, указанным вручную, и маршрутизировать их. Запись службы описывает свойства службы (имя DNS, виртуальные IP-адреса, порты, протоколы, конечные точки). Эти службы могут быть внешними по отношению к сетке (например, веб-API) или внутренними службами сетки, которые не являются частью реестра служб платформы (например, набор виртуальных машин, взаимодействующих со службами в Kubernetes). Кроме того, конечные точки записи службы также можно динамически выбирать с помощью поля workloadSelector. Эти конечные точки могут быть рабочими нагрузками виртуальных машин, объявленными с помощью объекта WorkloadEntry или модулей Kubernetes. Возможность выбора модулей и виртуальных машин в рамках одной службы позволяет переносить службы с виртуальных машин на Kubernetes без изменения существующих имен DNS, связанных с этими службами.

В документации istio есть примеры:


Чтобы ответить на ваш главный вопрос о том, как отлаживать связь mtls

Самый простой тест - попытаться вызвать из не введенного модуля в введенный модуль, например, с помощью curl. Об этом есть документация istio.

Вы также можете использовать istioctl x describe, подробнее об этом здесь.


Не уверен, что не так с curl -vv http://hub-backend-dev, но поскольку это 404, я подозреваю, что это может быть проблема с вашими зависимостями istio, например, неправильная конфигурация виртуальной службы.

person Jakub    schedule 14.01.2021
comment
спасибо за подробное объяснение .. В чем может быть причина того, что глобальный не работает для меня .. Потому что я ожидал, что у меня не будет доступа к модулю после того, как я включу peerauth - person semural; 14.01.2021
comment
@semural Извините за поздний ответ, да, вы не сможете сделать это с не внедренным модулем. Можете ли вы добавить свое определение PeerAuthentication в yaml? Я бы начал с этой документации, чтобы проверить, правильно ли он работает для служб сна и httpbin, если он будет работать, я бы сказал, что это может быть проблема с конкретным приложением или кластером. - person Jakub; 18.01.2021