Платформа 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

Комментарии (5)


  1. vasyakrg
    00.00.0000 00:00

    Продукт действительно отличный, но было бы честно также добавить табличку с ценами и сравнениями версий


    1. 1shaman Автор
      00.00.0000 00:00

      Добрый день!
      Существует 2 версии - Community (бесплатная) и Enterprise (коммерческая). Цена стартует от 36$ в месяц за одного пользователя. По вопросам, связанным с коммерческой версией необходимо обращаться по ссылке https://goteleport.com/signup/enterprise/


  1. BigD
    00.00.0000 00:00

    Community версия, к сожалению, не поддерживает SSO.

    А вообще по Телепорт есть классная группа в телеге.


    1. CLaiN
      00.00.0000 00:00

      Поддерживает, но только для провайдера GitHub. И работает замечательно.


      1. BigD
        00.00.0000 00:00

        Верно, но где enterprise, и где GitHub в качестве idP… поэтому считай, что не поддерживает.