Как стать автором
Обновить
464.4
FirstVDS
Виртуальные серверы в ДЦ в Москве и Амстердаме

Обзор Teleport: организация безопасного доступа для кластеров Kubernetes

Время на прочтение10 мин
Количество просмотров18K

Платформа Kubernetes является одной из самых популярных систем для оркестрации контейнеров. Со временем многие организации полностью переводят свою инфраструктуру и проекты на «рельсы» Kubernetes. Однако здесь возникают вопросы безопасности, связанные с необходимостью контроля – кто и как сможет получать доступ к кластеру Kubernetes. По умолчанию подключиться к кластеру Kubernetes может каждый – для этого достаточно стандартного конфигурационного файла с именем config. Для решения данных проблем безопасности существует продукт под названием Teleport.

Teleport – это инструмент для быстрого и безопасного подключения к Kubernetes-кластерам, а также к другому ПО (см. список ниже). Утилита предоставляет расширенные возможности, такие как аудит и аутентификация. Помимо Kubernetes, Teleport можно использовать для аутентификации с такими системами как:

  • Облачные провайдеры – Amazon, Google Cloud, Microsoft Azure;

  • Операционные системы – Windows, Linux;

  • СУБД – Redis, CockroachDB, MongoDB;

  • Системы для поиска и анализа данных – Elasticsearch

Среди достоинств Teleport можно выделить следующие:

Способы подключения

Teleport позволяет удаленно подключаться к Kubernetes-кластерам с использованием протоколов SSH или TLS. Также присутствует встроенный веб-интерфейс.

Аудит

Teleport отслеживает все действия, которые пользователь совершает внутри системы (кластера), и предоставляет расширенные функции, такие как фильтры, хронология, уведомления, управление учетными записями и т. д.

Аутентификация

Teleport использует многофакторную аутентификацию, чтобы удостоверить личность пользователя.

Управление учетными записями

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

Teleport был создан в 2016 году Американской компанией Gravitational Inc, которая специализируется на развертывании приложений на базе платформы Kubernetes. Программа доступна в двух редакциях – Community (бесплатная версия с открытым исходным кодом) и Enterprise (коммерческая платная версия). В редакции Enterprise, помимо клиентской поддержки, также доступны расширенные варианты SSO (англ. Single Sign-On — Технология единого входа), поддержка облачных провайдеров, наличие FedRAMP & SOC 2. Также в Enterprise версии можно создать демо-стенд, чтобы протестировать работу всех функций программы. С полным списком доступных функций можно ознакомиться на официальном сайте. Среди крупных клиентов, которые используют Teleport, можно выделить Samsung, Twitch, NASDAQ, IBM.

Архитектура и принцип работы Teleport

Teleport написан на языке программирования Go и состоит из трех независимых друг от друга исполняемых файлов:

  • tsh (клиент командной строки);

  • tctl (инструмент администрирования);

  • teleport (серверный демон).

Представляет собой прокси-сервер, предназначенный для доступа и аутентификации к требуемым системам (операционным системам, СУБД и т. д.). Управление доступом реализовано на основе ролей RBAC.

Клиент командной строки tsh предназначен для входа на конечные ресурсы и выполнения команд.

Инструмент администрирования tctl используется для создания пользователей, ключей сертификатов, а также может применяться для изменения динамической конфигурации кластеров Kubernetes, например, для создания новых ролей.

Демон сервера teleport может работать в трех режимах:

  • Node. В этом режиме демон предоставляет SSH и Kubernetes доступ к серверу, на котором он работает;

  • Прокси-сервер. В этом режиме демон действует как удостоверяющий личность прокси для всех протоколов, поддерживаемых Teleport (SSH, HTTPS, Kubernetes API);

  • Сервер аутентификации. В этом режиме демон действует как центр сертификации, который выдает сертификаты для пользователей. Также хранит журнал аудита.

На скриншоте ниже изображен принцип работы Teleport:

Алгоритм работы Teleport следующий:

  1. Пользователь выбирает один из нескольких способов подключения к кластеру Kubernetes (например, клиент командной строки tsh);

  2. Далее запрос переходит к серверному демону teleport, который, в свою очередь, отправляет запрос Identity Provider – системе, предназначенной для создания и хранения цифровых идентификационных данных (логин, пароль и т. д). В качестве провайдеров Teleport поддерживает следующие системы:

  • Azure Active Directory;

  • Active Directory;

  • Google Workspace;

  • GitHub;

  • GitLab;

  • OneLogin;

  • OIDC;

  • SSO

  1. После того как в Identity Provider найдены аутентификационные данные пользователя, запрос возвращается демону teleport, который обрабатывает поступивший запрос и разрешает доступ к кластеру Kubernetes или другой конечной системе.

Установка Teleport

Установить Teleport можно на такие операционные системы, как macOS и Linux. На Windows можно установить только утилиту tsh (клиент командной строки), тем самым ОС семейства Windows поддерживают только клиентскую часть. Teleport можно установить следующими способами:

В этой статье мы будем устанавливать Teleport на операционную систему Ubuntu 22.04 (Jammy Jellyfish) из официального репозитория. Версия Teleport 12.0.1. Задействуем 2-нодовый кластер Kubernetes версии 1.26.2. С полным списком всех требований можно ознакомиться на официальном сайте, там же доступны подробные инструкции по установке.

Для начала импортируем GPG ключ от официального репозитория Teleport:

sudo curl https://apt.releases.teleport.dev/gpg \
-o /usr/share/keyrings/teleport-archive-keyring.asc

Далее получим список переменных из файла os-release, чтобы при добавлении репозитория, был добавлен репозиторий именно для текущей используемой ОС:

source /etc/os-release

Следующий шаг – добавление официального репозитория teleport:

echo "deb [signed-by=/usr/share/keyrings/teleport-archive-keyring.asc] \
https://apt.releases.teleport.dev/${ID?} ${VERSION_CODENAME?} stable/v12" \
| sudo tee /etc/apt/sources.list.d/teleport.list > /dev/null

Наконец обновим списки репозиториев и установим программу:

sudo apt update
sudo apt -y install teleport=12.0.1

После установки необходимо добавить сервис в автозагрузку:

sudo systemctl enable teleport

На этом установка завершена.

Настройка Teleport

Прежде чем использовать Teleport, его необходимо настроить. Если веб-интерфейс программы будет доступен из внешней сети, нужно зарегистрировать доменное имя, а также выпустить SSL-сертификат. Для доменного имени потребуется создать A запись и задать ей IP-адрес, куда будет ссылаться домен. Для создания бесплатного SSL-сертификата можно использовать встроенный в Teleport сервис Let's Encrypt или самоподписные сертификаты.

В качестве основного конфигурационного файла используется файл под названием teleport.yaml, который будет сохранен в директорию etc. Команда настройки будет выглядеть следующим образом:

sudo teleport configure --acme --acme-email=testmail@gmail.com --cluster-name=myk8s | sudo tee /etc/teleport.yaml > /dev/null

Где:

--acme – означает, что будет использован протокол ACME для генерации SSL-сертификатов;

--acme-email – задается email администратора домена;

--cluster-name – задается имя кластера Kubernetes

После запуска команды в директории etc будет создан конфигурационный файл под названием teleport.yaml, который имеет следующую структуру (см. скриншот):

Проверьте следующие параметры:

data_dir: директория, где будут храниться системные файлы, сертификаты и лог файлы. По умолчанию используется путь /var/lib/teleport;

cluster_name: имя кластера Kubernetes;

public_addr: доменное имя, по которому будет открываться веб-интерфейс.

Если значения указаны верно, можно запускать teleport:

sudo systemctl start teleport

Следующий этап – создание пользователей и получение доступа к веб-интерфейсу программы. Для начала убедимся, что по доменному имени открывается веб-интерфейс. В браузере переходим по доменному имени, которое было указано в параметре public_addr, должно появиться окно аутентификации:

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

sudo tctl users add teleport-admin --roles=editor, access --logins=root, ubuntu

Утилиту tctl необходимо запускать от имени root пользователя или при помощи sudo. В качестве параметров использованы следующие:

add teleport-admin – создает пользователя с именем teleport-admin, при помощи которого будет осуществляться доступ в веб-интерфейс;

--roles=editor, access – задает роли (или по-простому права доступа) для создаваемого пользователя. С полным списком доступных ролей и их описанием можно ознакомиться по ссылке;

--logins=root, ubuntu – генерирует список пользователей, которые смогут подключаться к необходимым системам по протоколу SSH. Необходимые пользователи уже должны быть созданы заранее на том сервере, где запущен демон teleport, и получить возможность подключаться по SSH. Также можно использовать пользователей, которые находятся в Active Directory, GitHub и других системах. Полный список поддерживаемых провайдеров можно посмотреть по ссылке.

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

Далее задаем пароль администратору системы (который был создан на этапе создания пользователя, в данном случае это пользователь с именем teleport-admin):

После того как был задан пароль, необходимо настроить двухэтапную аутентификацию. После этого вы сможете входить в интерфейс Teleport (как в веб-интерфейс, так и в интерфейс командной строки tsh).

На смартфон под управлением Android или iOS скачиваем любое приложение для работы с двухэтапной аутентификацией (Authy, Google Authenticator, Twilio Authy) и сканируем QR-код, который отобразится на экране:

Разберем на примере Google Authenticator. В самом приложении нажимаем на кнопку с плюсом, которая находится справа снизу:

Далее выбираем пункт «Сканировать QR-код»:

После сканирования появится блок с кодом, который действует ограниченное время:

Цифры вводим в поле AUTHENTICATION CODE и нажимаем на кнопку SUBMIT. После этого отобразится сообщение о том, что регистрация выполнена успешно и можно перейти в веб-интерфейс:

Подключение кластера Kubernetes к Teleport

Для того чтобы использовать Teleport для входа в кластер Kubernetes, необходимо установить агент. Для начала проверим, работает ли аутентификация в Teleport при помощи следующей команды:

tsh login --proxy=teleport-test.ru --user=teleport-admin

Где:

--proxy – адрес (доменное имя), на котором присутствует веб-интерфейс Teleport;

--user – пользователь, который используется для входа в веб-интерфейс.

После ввода пароля пользователя и OTP токена (токен двухфакторной аутентификации) должна отобразиться информация о текущем подключении к Teleport (см. скриншот выше).

Следующий шаг — это генерация токена, который будет использоваться для подключения кластера Kubernetes к службе Teleport:

TOKEN=$(sudo tctl nodes add --roles=kube --ttl=10000h --format=json | jq -r '.[0]')

Проверим, что токен действительно был сгенерирован:

echo $TOKEN

Затем добавим Helm чарт, который будет использоваться для установки агента (helm должен быть установлен заранее):

helm repo add teleport https://charts.releases.teleport.dev

И обновим репозиторий:

helm repo update

Следующий шаг — это создание переменных. В переменной PROXY_ADDR зададим доменное имя, на котором находиться веб-интерфейс teleport в формате доменное_имя:443, где 443 — это порт HTTPS:

PROXY_ADDR=teleport-test.ru:443

Вторая переменная задает имя кластера. Можно задать любое имя:

CLUSTER=myk8s

Команда для установки агента выглядит следующим образом:

helm upgrade --install teleport-agent teleport/teleport-kube-agent \
  --set kubeClusterName=${CLUSTER?} \
  --set proxyAddr=${PROXY_ADDR?} \
  --set authToken=${TOKEN?} \
  --create-namespace \
  --namespace=teleport-agent \
  --version 12.1.0

Будет создан новый namespace с именем teleport-agent.

Примерно через минуту агент будет поднят, а кластер отображен в веб-интерфейсе в разделе Kubernetes:

Справа от имени кластера будет кнопка CONNECT, при нажатии на которую отобразится инструкция для подключения к кластеру Kubernetes:

Первая команда — это подключение к Teleport:

tsh login --proxy=teleport-test.ru:443 --auth=local --user=teleport-admin teleport-test.ru

Далее происходит подключение к самому кластеру:

sudo tsh kube login myk8s

Где myk8s — имя кластера, которое было задано на этапе установки агента. Если аутентификация прошла успешно, в выводе команды появится сообщение о том, что выполнен вход в кластер:

Вывести список всех кластеров Kubernetes, которые добавлены в Teleport, можно при помощи команды:

sudo tsh kube ls

После того как вход выполнен, можно проверить выполнение команд при помощи утилиты kubectl. Для начала выведем версию кластера Kubernetes:

kubectl version --short

А теперь выведем список всех подов в кластере:

kubectl get po -A

Получение доступа к кластеру Kubernetes при помощи ролей

Получить доступ к Kubernetes кластеру можно также при помощи ролей. Для этого необходим хотя бы один пользователь, который присутствует в Kubernetes. Для того чтобы узнать имя текущего пользователя в Kubernetes, выполним следующую команду:

kubectl config view \
-o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.user}"

В данном случае это пользователь с именем kubernetes-admin.

Далее создадим файл с именем kube-access.yaml исо следующим содержимым:

kind: role
metadata:
  name: kube-access
version: v6
spec:
  allow:
    kubernetes_labels:
      '*': '*'
    kubernetes_resources:
      - kind: pod
        namespace: "*"
        name: "*"
    kubernetes_groups:
    - viewers
    kubernetes_users:
    - kubernetes-admin
  deny: {}

Где в параметре kubernetes_users необходимо вписать имя пользователя, которое было получено из предыдущей команды. Создадим данную роль с помощью команды:

sudo tctl create -f kube-access.yaml

Следующим шагом назначим созданную роль пользователю, который уже присутствует в Teleport. Для этого выполним команду:

tctl get users/$(tsh status -f json | jq -r '.active.username') > out.yaml

Будет создан файл с именем out.yaml откроем его на редактирование. Структура файла будет следующей:

В разделе roles необходимо добавить значение kube-access:

После этого сохраним изменения в файле и выполним команду:

tctl create -f out.yaml

Для того чтобы созданная роль появилась в Teleport, необходимо выйти из Teleport и войти еще раз.

Для того чтобы аутентифицироваться при помощи ранее созданного пользователя нужно создать объект типа ClusterRoleBinding. Создадим файл с именем viewers-bind.yaml со следующим содержимым:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: viewers-crb
subjects:
- kind: Group
  name: viewers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

Где значение viewers в параметре kind: Group означает группу, которую мы создали ранее в файле kube-access.yaml. Сохраним файл и создадим объект:

kubectl apply -f viewers-bind.yaml

После этого необходимо повторно выйти из Teleport и войти еще раз.

Отобразим список всех доступных кластеров Kubernetes при помощи команды:

sudo tsh kube ls

И выполним вход в кластер с именем myk8s:

sudo tsh kube login myk8s

Выведем список подов, чтобы убедиться, что все работает:

kubectl get po -A

Подводя итог, можно сказать, что Teleport является отличным профессиональным решением для обеспечения безопасного и прозрачного доступа как к кластерам Kubernetes, так и к другим системам. Программа предоставляет серьезный набор функций, включая поддержку как большого количества Identity провайдеров, так и способов подключения. 


НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS

Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии9

Публикации

Информация

Сайт
firstvds.ru
Дата регистрации
Дата основания
Численность
51–100 человек
Местоположение
Россия
Представитель
FirstJohn