Забезпечення політики авторизації

Після того, як ви додали застосунок до ambient mesh, ви можете забезпечити доступ до нього, використовуючи політики авторизації Layer 4.

Ця функція дозволяє контролювати доступ до сервісу та з сервісу на основі ідентичностей клієнтських робочих навантажень, які автоматично призначаються всім робочим навантаженням в сервісній мережі.

Забезпечення політики авторизації Layer 4

Створимо політику авторизації, яка обмежує, які сервіси можуть спілкуватися з сервісом productpage. Політика застосовується до podʼів з міткою app: productpage та дозволяє виклики тільки зі службового облікового запису cluster.local/ns/default/sa/bookinfo-gateway-istio. Це службовий обліковий запис, який використовується шлюзом Bookinfo, який ви розгорнули на попередньому кроці.

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-ztunnel
  namespace: default
spec:
  selector:
    matchLabels:
      app: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
EOF

Якщо ви відкриєте застосунок Bookinfo в оглядачі (http://localhost:8080/productpage), ви побачите сторінку продукту, як і раніше. Однак, якщо ви спробуєте отримати доступ до сервісу productpage з іншого службового облікового запису, ви повинні побачити помилку.

Спробуйте отримати доступ до застосунку Bookinfo з іншого клієнта в кластері:

Zip
$ kubectl apply -f @samples/curl/curl.yaml@

Оскільки pod curl використовує інший службовий обліковий запис, він не матиме доступу до сервісу productpage:

$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"
command terminated with exit code 56

Забезпечення політики авторизації Layer 7

Щоб забезпечити політики Layer 7, спочатку потрібно мати waypoint proxy для простору імен. Цей проксі буде обробляти весь трафік Layer 7, що входить у простір імен.

$ istioctl waypoint apply --enroll-namespace --wait
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"

Ви можете перевірити проксі waypoint і переконатися, що він має статус Programmed=True:

$ kubectl get gtw waypoint
NAME       CLASS            ADDRESS       PROGRAMMED   AGE
waypoint   istio-waypoint   10.96.58.95   True         42s

Додавання політики авторизації L7 явно дозволить сервісу curl надсилати GET запити до сервісу productpage, але не виконувати інші операції:

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-waypoint
  namespace: default
spec:
  targetRefs:
  - kind: Service
    group: ""
    name: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/curl
    to:
    - operation:
        methods: ["GET"]
EOF

Зверніть увагу, що поле targetRefs використовується для вказання цільового сервісу для політики авторизації проксі waypoint. Розділ rules подібний до попереднього, але тепер ми додали розділ to, щоб вказати дозволену операцію.

Памʼятаєте, що наша політика L4 вказувала ztunnel дозволяти зʼєднання тільки зі шлюзу? Тепер нам потрібно оновити її, щоб дозволити зʼєднання і з waypoint.

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-ztunnel
  namespace: default
spec:
  selector:
    matchLabels:
      app: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
        - cluster.local/ns/default/sa/waypoint
EOF

Перевірте, чи новий проксі waypoint застосовує оновлену політику авторизації:

$ # Це призведе до помилки RBAC, оскільки ми не використовуємо операцію GET
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied
$ # Це призведе до помилки RBAC, оскільки ідентичність сервісу reviews-v1 не дозволена
$ kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied
$ # Це працює, оскільки ми явно дозволили GET запити від podʼа curl
$ kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"

Подальші кроки

З проксі waypoint тепер ви можете забезпечити політики Layer 7 у просторі імен. Окрім політик авторизації, ми можемо використовувати проксі waypoint для розподілу трафіку між сервісами. Це корисно для проведення canary deployments або A/B тестування.

Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!