Захист Gateways
Завдання Контроль вхідного трафіку6 описує, як налаштувати ingress gateway, щоб відкрити HTTP-сервіс для зовнішнього трафіку. Це завдання показує, як експонувати захищений HTTPS-сервіс за допомогою простого або взаємного TLS.
Перш ніж почати
Налаштуйте Istio, дотримуючись інструкцій з Посібника з встановлення8.
Запустіть httpbin9:
Для користувачів macOS переконайтеся, що ви використовуєте
curl
, скомпільований з бібліотекою LibreSSL11:Якщо попередня команда виводить версію LibreSSL, як показано, ваша команда
curl
має працювати коректно з інструкціями у цьому завданні. В іншому випадку, спробуйте іншу реалізаціюcurl
, наприклад, на машині Linux.
Генерація сертифікатів та ключів для клієнта і сервера
Це завдання вимагає кілька наборів сертифікатів та ключів, які використовуються в наведених нижче прикладах. Ви можете скористатися улюбленим інструментом для їх створення або скористатися командами нижче для генерації за допомогою openssl12.
Створіть кореневий сертифікат і приватний ключ для підпису сертифікатів для ваших сервісів:
Згенеруйте сертифікат та приватний ключ для
httpbin.example.com
:Створіть другий набір таких самих сертифікатів та ключів:
Згенеруйте сертифікат та приватний ключ для
helloworld.example.com
:Згенеруйте клієнтський сертифікат та приватний ключ:
Налаштування TLS ingress gateway для одного хоста
Створіть секрет для ingress gateway:
Налаштуйте ingress gateway:
Спочатку визначте шлюз з розділом servers:
для порту 443 і вкажіть значення для
credentialName
, яке має бути httpbin-credential
. Значення збігається з
назвою секрету. Режим TLS повинен мати значення SIMPLE
.
Далі налаштуйте маршрути вхідного трафіку шлюзу, визначивши відповідний віртуальний сервіс:
Нарешті, дотримуйтесь цих інструкцій, щоб встановити змінні INGRESS_HOST
та SECURE_INGRESS_PORT
для доступу до шлюзу.
Спочатку створіть Kubernetes Gateway:
Потім, налаштуйте маршрути вхідного трафіку шлюзу, визначивши відповідний HTTPRoute
:
Нарешті, отримайте адресу і порт шлюзу з ресурсу Gateway
:
Надішліть HTTPS-запит, щоб отримати доступ до сервісу
httpbin
через HTTPS:Сервіс
httpbin
поверне код 418 I’m a Teapot13.Змініть облікові дані шлюзу, видаливши секрет шлюзу, а потім створивши його заново, використовуючи інші сертифікати та ключі:
Зверніться до сервісу
httpbin
за допомогоюcurl
, використовуючи новий ланцюжок сертифікатів:Якщо ви спробуєте отримати доступ до
httpbin
, використовуючи попередній ланцюжок сертифікатів, спроба завершиться невдачею:
Налаштування TLS ingress gateway для кількох хостів
Ви можете налаштувати ingress gateway для декількох хостів, наприклад, httpbin.example.com
та helloworld.example.com
. Ingress gateway налаштовується за допомогою унікальних облікових даних, що відповідають кожному хосту.
Відновіть облікові дані
httpbin
з попереднього прикладу, видаливши і створивши заново секрет з оригінальними сертифікатами і ключами:Запустіть приклад
helloworld-v1
:Створіть секрет
helloworld-credential
:Налаштуйте ingress gatewayз хостами
httpbin.example.com
таhelloworld.example.com
:
Визначте шлюз з двома секціями server для порту 443. Встановіть значення параметра
credentialName
на кожному порту на httpbin-credential
і helloworld-credential
відповідно. Встановіть режим TLS на SIMPLE
.
Налаштуйте маршрути трафіку шлюзу, визначивши відповідну віртуальну службу.
Налаштуйте Gateway
з двома слухачами для порту 443. Встановіть значення
certificateRefs
на кожному слухачі на httpbin-credential
та helloworld-credential
відповідно.
Налаштуйте маршрути трафіку шлюзу для сервісу helloworld
:
Надішліть запит HTTPS до
helloworld.example.com
:Надішліть запит HTTPS до
httpbin.example.com
і також отримайте відповідь HTTP 41815:
Налаштуйте взаємний TLS ingress gateway
Ви можете розширити визначення вашого шлюзу підтримкою mutual TLS16.
Змініть облікові дані ingress gateway, видаливши його секрет і створивши новий. Сервер використовує сертифікат ЦС для перевірки своїх клієнтів, і ми повинні використовувати ключ
ca.crt
для зберігання сертифіката ЦС.Налаштуйте ingress gateway:
Змініть визначення шлюзу, щоб встановити режим TLS на MUTUAL
.
Оскільки Kubernetes Gateway API наразі не підтримує термінацію mutual TLS в Gateway, ми використовуємо Istio-специфічну опцію, gateway.istio.io/tls-terminate-mode: MUTUAL
, щоб зробити це:
Спробуйте надіслати HTTPS-запит, використовуючи попередній підхід, і подивіться, що це не вдасться:
Передайте сертифікат клієнта і приватний ключ
curl
і повторно надішліть запит. Передайте сертифікат клієнта з прапорцем--cert
і ваш приватний ключ з прапорцем--key
вcurl
:
Додаткова інформація
Формати ключів
Istio підтримує кілька різних форматів секретів для інтеграції з різними інструментами, такими як cert-manager19:
- TLS Secret з ключами
tls.key
таtls.crt
, як описано вище. Для взаємного TLS можна використовувати ключca.crt
. - TLS Secret з ключами
tls.key
іtls.crt
, як описано вище. Для взаємного TLS, окремий загальний Secret з назвою<secret>-cacert
, з ключемcacert
. Наприклад,httpbin-credential
маєtls.key
іtls.crt
, аhttpbin-credential-cacert
маєcacert
. - Загальний Secret з ключами
key
таcert
. Для взаємного TLS можна використовувати ключcacert
. - Загальний Secret з ключами
key
таcert
. Для взаємного TLS можна використовувати окремий загальний секрет з назвою<secret>-cacert
, який містить ключcacert
. Наприклад,httpbin-credential
маєkey
таcert
, аhttpbin-credential-cacert
маєcacert
. - Значення ключа
cacert
може бути зв’язкою сертифікатів CA, яка складається з окремих об’єднаних сертифікатів CA.
SNI маршрутизація
HTTPS Gateway
здійснює SNI20 зіставлення з його сконфігурованими хостами перед пересиланням запиту, що може призвести до збою деяких запитів. Дивіться налаштування SNI маршрутизації для отримання деталей.
Усунення несправностей
Перевірте значення змінних середовища
INGRESS_HOST
таSECURE_INGRESS_PORT
. Переконайтеся, що вони мають дійсні значення відповідно до результатів наступних команд:Переконайтеся, що значення
INGRESS_HOST
є IP-адресою. У деяких хмарних платформах, наприклад, AWS, ви можете отримати доменне імʼя замість IP-адреси. Це завдання очікує IP-адресу, тому вам потрібно буде перетворити її за допомогою команд, схожих на такі:Перевірте журнал контролера шлюзу на наявність повідомлень про помилки:
Якщо ви використовуєте macOS, перевірте, чи використовуєте ви
curl
, скомпільований з бібліотекою LibreSSL11, як описано в розділі Перш ніж розпочати.Перевірте, чи секрети успішно створені в просторі імен
istio-system
:Секрети
httpbin-credential
таhelloworld-credential
повинні бути показані у переліку секретів.Перевірте журнали, щоб підтвердити, що агент ingress gateway надіслав пару ключ/сертифікат до шлюзу входу:
Журнал має показувати, що секрет
httpbin-credential
був доданий. Якщо використовується взаємний TLS, то також має зʼявитися секретhttpbin-credential-cacert
. Перевірте, що в журналі відображається, що агент шлюзу отримав запити SDS від шлюзу входу, що імʼя ресурсу єhttpbin-credential
, і що шлюз входу отримав пару ключ/сертифікат. Якщо використовується взаємний TLS, журнал має показувати, що ключ/сертифікат був надісланий до шлюзу входу, що агент шлюзу отримав запит SDS з імʼям ресурсуhttpbin-credential-cacert
, і що шлюз входу отримав кореневий сертифікат.
Очищення
- Видаліть конфігурацію шлюзу та маршрути:
Видаліть секрети, сертифікати та ключі:
Вимкніть служби
httpbin
іhelloworld
: