OpenZiti (Ziti) — open source решение для Zero Trust Network Access (ZTNA)

Docker

Что такое Ziti?

OpenZiti — это бесплатный проект с открытым исходным кодом, который фокусируется на внедрении концепции «нулевого доверия» ZTNA (Zero Trust Network Access) в любое приложение. Проект предоставляет все необходимые компоненты для реализации или интеграции концепции «нулевого доверия» в ваши решения.

OpenZiti включает в себя оверлейную сеть, туннелирование приложений для всех операционных систем и множество SDK, которые облегчают добавление концепции «нулевого доверия» ZTNA непосредственно в ваше приложение.

Также OpenZiti облегчает встраивание программно-управляемой сети с концепцией «нулевого доверия» непосредственно в ваше приложение. С OpenZiti вы можете получить высокопроизводительную, безопасную сеть с концепцией «нулевого доверия» ZTNA на любом интернет-соединении, без использования VPN!

Сеть OpenZiti (Ziti) состоит из следующих блоков: OpenZiti Controller, OpenZiti Router, OpenZiti Clients. Эти компоненты используются вместе для обеспечения безопасного подключения между двумя точками, такими как клиент и сервер. Такой тип сети считается оверлейной, потому что он обеспечивает безопасное подключение поверх существующей инфраструктуры сети (т.е. оверлейной).

Что такое Zero Trust Network Access (ZTNA)?

ZTNA (Zero Trust Network Access) — это модель безопасности, которая предполагает, что внутри и вне организации необходимо применять одинаковый подход к безопасности. Это означает, что всякий раз, когда пользователь или устройство запрашивает доступ к ресурсам в сети, он должен пройти процесс аутентификации и авторизации, чтобы получить доступ только к тем ресурсам, которые ему нужны для выполнения своей работы. Этот подход помогает снизить риски нарушения безопасности и повышает защищенность сетевой инфраструктуры.

Основная идея ZTNA заключается в том, что в сети нет доверенных устройств или пользователей. Каждый запрос на доступ к ресурсам должен проходить через контроль доступа и политики безопасности, прежде чем ему будет разрешен доступ. При этом не имеет значения, где находится пользователь или устройство — внутри или вне корпоративной сети. Все соединения должны быть защищены и проверены на соответствие политикам безопасности.

Такой подход к безопасности становится все более популярным с ростом числа удаленных работников и использования облачных сервисов. Он помогает предотвратить утечки данных и другие угрозы безопасности, которые могут возникнуть при доступе к корпоративной сети извне.

Подготовка системы

Первым делом обновляем список репозиториев Ubuntu 22.04 и обновляем систему.

Для обновления системы используем команду в консоли при SSH подключении. (Я использую SSH клиент Tabby, иногда PuTTY)

Обновляем репозитории и пакеты:

apt update -y &&
apt upgrade -y

Установка OpenZiti через Docker Compose

Описание установки на сайте разработчика: https://docs.openziti.io/docs/learn/quickstarts/network/local-docker-compose/

Устанавливаем Docker:

#Установка Docker
curl -fsSL https://get.docker.com -o get-docker.sh  &&
sh get-docker.sh

# Запускаем и включаем службу Docker
systemctl start docker  &&
systemctl enable docker

Устанавливаем Docker Compose:

# Установка docker-compose
curl -L --fail https://raw.githubusercontent.com/linuxserver/docker-docker-compose/master/run.sh -o /usr/local/bin/docker-compose  &&
chmod +x /usr/local/bin/docker-compose

Для установки OpenZiti введите следующие команды:

mkdir openziti  &&
cd openziti  &&
curl -so docker-compose.yaml https://get.openziti.io/dock/docker-compose.yml

Затем возьмите файл среды по умолчанию или просто создайте файл в этой папке, который выглядит так:

curl -so .env https://get.openziti.io/dock/.env

или, если вы предпочитаете создавать файл .env вручную, создайте файл каким-либо образом, например, с помощью команды, показанной ниже:

cat > .env <<DEFAULT_ENV_FILE
# OpenZiti Variables
ZITI_IMAGE=openziti/quickstart
ZITI_VERSION=latest
ZITI_CONTROLLER_RAWNAME=ziti-controller
ZITI_EDGE_CONTROLLER_RAWNAME=ziti-edge-controller

## Additional variables to override. 
#ZITI_EDGE_CONTROLLER_RAWNAME=some.other.name.com
#ZITI_EDGE_CTRL_ADVERTISED_HOST_PORT=some.other.name.com:1280
#ZITI_CTRL_ADVERTISED_ADDRESS=some.other.name.com
#ZITI_EDGE_CONTROLLER_HOSTNAME=some.other.name.com
#ZITI_CONTROLLER_HOSTNAME=some.other.name.com
#ZITI_EDGE_CONTROLLER_IP_OVERRIDE=20.20.20.20
DEFAULT_ENV_FILE

Разворачиваем контейнеры Docker и запускаем Ziti

docker-compose up

Пароль будет отображен в ответном коде команды запуска контейнеров, сохраните его

Админ панель расположена по адресу https://IP-сервера:8443/login

В поле Edge Controller Name введите docker, а в поле URL введите https://ziti-edge-controller:1280

Нажмите на кнопку Set Controller и вы перейдете на окно авторизации.

Ваш логин по умолчанию admin, пароль вы сохранили ранее.

Нажимаем Login после ввода пароля и попадем в панель администратора Ziti

Схема сети

Файл docker-compose создаст довольно много контейнеров от вашего имени. Вот логический обзор сети, которая будет создана:

Как вы можете увидеть docker compose создаст множество элементов сети, давайте разберем их. Первое, на что следует обратить внимание, это то, что весь образ находится в пределах сети Docker. В используемом compose файле вы увидите три части оверлея (наложений на основную сеть), которые охватывают сеть Docker: контроллер, пограничный маршрутизатор и пограничный маршрутизатор на основе веб-сокетов.

Стандартный docker-compose.yml развертывает множество компонентов и несколько сложен. Если вы предпочитаете упрощенное развертывание с помощью Docker compose, которое включает только базовую комбинацию контроллера и пограничного маршрутизатора, вы можете вместо этого загрузить simplified-docker-compose.yml

Описание сетей

Внутри сети Docker вы увидите, что есть три сети:

  • синяя сеть Docker
  • красная сеть Docker
  • фиолетовая «логическая» сеть

Docker гарантирует, что только элементы в данной сети могут обмениваться сообщениями только внутри этой сети. Топология этой сети приблизительно соответствует тому, как это было бы в публичной сети. Фиолетовая сеть приблизительно соответствует самому Интернету, синяя сеть представляет частную сеть провайдера облачных услуг (например, AWS), а красная сеть может представлять собой другую сеть провайдера облачных услуг (например, Azure). Эти детали не являются важными, главное, что сети полностью закрыты друг от друга. Подробнее об этом смотрите в разделе «Тестирование» ниже.

Фиолетовая сеть Ziti

В файле Compose нет сети Docker с названием «фиолетовая», это полностью логическая конструкция. Она показана только для ясности. Все активы в фиолетовой сети находятся как в синей, так и в красной сети Docker (отсюда и название «фиолетовая»). Активы в фиолетовой сети должны находиться как в красной, так и в синей сетях, потому что активы, расположенные в синих и красных сетях, должны общаться с публичными краевыми маршрутизаторами и контроллером. Если это вызывает затруднения, смотрите раздел «Тестирование» ниже, который, надеемся, сделает это более понятным.

Красная сеть Ziti

Красная сеть существует только для демонстрации на данный момент. Как видно, в красной сети нет активов, кроме частного маршрутизатора ziti-private-red и маршрутизатора ziti-fabric-router-br. Это означает, что в красной сети нет ничего, к чему можно было бы получить доступ через Ziti. Это может служить отличным местом, чтобы поместить свои активы и изучать использование Ziti!

Синяя сеть

Синяя сеть содержит два важных актива: маршрутизатор ziti-private-blue и сервер web-test-blue. Наряду с этими активами сеть также содержит ziti-fabric-router-br.

Хотя сервер web-test-blue экспортирует порт по умолчанию (порт 80 на вашем локальном хосте будет преобразован в порт 8000 на сервере web-test-blue), вы можете использовать Ziti для доступа к этому серверу без экспортированного порта.

«Fabric» Router

Маршрутизатор ziti-fabric-router-br существует, чтобы показать, что вы можете создавать граничные маршрутизаторы, которые не обязательно являются полностью публичными. Этот единственный маршрутизатор может общаться со всеми другими маршрутизаторами. Сеть Ziti может выбрать использование этого маршрутизатора, если алгоритм покажет, что это самый быстрый путь. Возможно, мы узнаем больше об этом в будущих документах.

Тестирование OpenZiti и выполнение команд внутри контейнера Docker

Теперь, когда мы развернули контейнеры docker compose для создания относительно сложной сети, мы можем приступить к ее тестированию и убедиться, что все службы запущены и работают правильно. Давайте попробуем.

Для проверки мы воспользуемся командой docker exec для активного контроллера Ziti:

docker exec -it openziti_ziti-controller_1 bash

После выполнения указанной выше команды в интерфейсе командной строки будет прописан путь для выполнения команд внутри контейнера OpenZiti.

Аутентификация в OpenZiti внутри контейнера Docker

Существует также команда zitiLogin работающая внтури контейнера OpenZiti, упрощающая аутентификацию на контроллере Ziti. Запустите zitiLogin сейчас и убедитесь, что вы прошли аутентификацию.

zitiLogin

Ответный код команды будет примерно таким:

ziti@724087d30014:/persistent$ zitiLogin
Token: 55ec6721-f33b-4101-970a-412331bd7578
Saving identity 'default' to /persistent/ziti-cli.json

Проверка статусов Edge Routers

После аутентификации давайте посмотрим, подключены ли все наши маршрутизаторы к сети, запустив ziti edge list edge-routers:

ziti edge list edge-routers

Ответный код должен быть таким и в нем мы увидим что все созданные маршрутизаторы Ziti в сети:

ziti@724087d30014:/persistent$ ziti edge list edge-routers
╭────────────┬───────────────────────┬────────┬───────────────┬──────┬───────────────────────╮
│ ID         │ NAME                  │ ONLINE │ ALLOW TRANSIT │ COST │ ATTRIBUTES            │
├────────────┼───────────────────────┼────────┼───────────────┼──────┼───────────────────────┤
│ C6LbVE7fIc │ ziti-edge-router      │ true   │ true          │    0 │ public                │
│ GY1pcE78Ic │ ziti-private-blue     │ true   │ true          │    0 │ ziti-private-blue     │
│ H0UbcE78Tc │ ziti-fabric-router-br │ true   │ true          │    0 │ ziti-fabric-router-br │
│ KHTAct78Tc │ ziti-private-red      │ true   │ true          │    0 │ ziti-private-red      │
│ Yblbct7fTc │ ziti-edge-router-wss  │ true   │ true          │    0 │ public                │
╰────────────┴───────────────────────┴────────┴───────────────┴──────┴───────────────────────╯
results: 1-5 of 5

Просмотр идентификаторов Edge Routers

В этом файле компоновки мы использовали сценарий, который также добавляет идентификатор для каждого из наших пограничных маршрутизаторов. Мы можем увидеть их, запустив ziti edge list identities:

ziti edge list identities

Обратите внимание, что у каждого маршрутизатора есть идентификатор

ziti@724087d30014:/persistent$ ziti edge list identities
╭────────────┬───────────────────────┬────────┬────────────╮
│ ID         │ NAME                  │ TYPE   │ ATTRIBUTES │
├────────────┼───────────────────────┼────────┼────────────┤
│ C6LbVE7fIc │ ziti-edge-router      │ Router │            │
│ GY1pcE78Ic │ ziti-private-blue     │ Router │            │
│ H0UbcE78Tc │ ziti-fabric-router-br │ Router │            │
│ KHTAct78Tc │ ziti-private-red      │ Router │            │
│ Yblbct7fTc │ ziti-edge-router-wss  │ Router │            │
│ kkVrSLy.D  │ Default Admin         │ User   │            │
╰────────────┴───────────────────────┴────────┴────────────╯
results: 1-6 of 6

Пинг сетей Ziti

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

ping ziti-private-red -c 1

Ответный код:

PING ziti-private-red (172.29.0.2): 56 data bytes
64 bytes from 172.29.0.2: icmp_seq=0 ttl=64 time=0.387 ms
--- ziti-private-red ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.387/0.387/0.387/0.000 ms

Затем пропингуем синий маршрутизатор:

ping ziti-private-blue -c 1

Ответный код:

PING ziti-private-blue (172.28.0.6): 56 data bytes
64 bytes from 172.28.0.6: icmp_seq=0 ttl=64 time=0.633 ms
--- ziti-private-blue ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.633/0.633/0.633/0.000 ms

Тест — сбой подключения к базовой сети Ziti

Теперь давайте выйдем из контроллера Ziti и вместо этого подключимся к синему маршрутизатору Ziti. После подключения к синему маршрутизатору мы убедимся, что не можем подключиться к частному красному маршрутизатору.

Сперва выполните команду exit чтобы выйти из ранее выбранного docker контейнера контроллера Ziti:

exit

Затем введите команду для подключения к синему маршрутизатору Ziti:

docker exec -it openziti_ziti-private-blue_1 bash

После подключения к синему маршрутизатору пропингуем с него подключение к красному маршрутизатору следующей командой:

ping ziti-private-red -c 1

Ответный код:

ping: unknown host

Тест — Подключение к Web Test Blue

Пока мы подключены к синему маршрутизатору, давайте удостоверимся, что можем подключиться к тестовому серверу web-test-blue следующей командой:

curl http://web-test-blue:8000

Ответный код:

<pre>
Hello World


                                       ##         .
                                 ## ## ##        ==
                              ## ## ## ## ##    ===
                           /""""""""""""""""\___/ ===
                      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
                           \______ o          _,/
                            \      \       _,'
                             `'--.._\..--''
</pre>

Не забывайте — вы также можете получить доступ к этому через экспортированный порт 80 на вашей локальной машине!

exit

затем

curl http://localhost:80

Ответный код:

<pre>
Hello World


                                       ##         .
                                 ## ## ##        ==
                              ## ## ## ## ##    ===
                           /""""""""""""""""\___/ ===
                      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
                           \______ o          _,/
                            \      \       _,'
                             `'--.._\..--''
</pre>

Настройка сервисов OpenZiti

Настройка OpenZiti ZTNA в качестве альтернативы VPN

Единственная информация которую я нашел по выходу в интернет через OpenZiti с использованием IP сервера. Сам я так и не настроил данный сервис, как только получится добавлю описание настройки в инструкцию

https://openziti.discourse.group/t/openziti-as-replacement-for-client-vpn/980/6

Оцените статью
Кибер Лис
Добавить комментарий