![](https://habrastorage.org/getpro/habr/upload_files/efd/db1/b60/efddb1b6011a8683d75c4d60b81d339a.jpg)
Платформа 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:
![](https://habrastorage.org/getpro/habr/upload_files/721/25f/99b/72125f99b654a60cf172b1441532a342.png)
Алгоритм работы Teleport следующий:
Пользователь выбирает один из нескольких способов подключения к кластеру Kubernetes (например, клиент командной строки tsh);
Далее запрос переходит к серверному демону teleport, который, в свою очередь, отправляет запрос Identity Provider – системе, предназначенной для создания и хранения цифровых идентификационных данных (логин, пароль и т. д). В качестве провайдеров Teleport поддерживает следующие системы:
Azure Active Directory;
Active Directory;
Google Workspace;
GitHub;
GitLab;
OneLogin;
OIDC;
SSO
После того как в 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
![](https://habrastorage.org/getpro/habr/upload_files/dec/45f/4b6/dec45f4b692ac07d9a0276a525a29801.png)
Далее получим список переменных из файла os-release, чтобы при добавлении репозитория, был добавлен репозиторий именно для текущей используемой ОС:
source /etc/os-release
![](https://habrastorage.org/getpro/habr/upload_files/091/409/2a6/0914092a61937198611817fb2e23e1e5.png)
Следующий шаг – добавление официального репозитория 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
![](https://habrastorage.org/getpro/habr/upload_files/9b4/a0b/878/9b4a0b8788577c2bf9e9df2fdae0bfd2.png)
Наконец обновим списки репозиториев и установим программу:
sudo apt update
sudo apt -y install teleport=12.0.1
![](https://habrastorage.org/getpro/habr/upload_files/752/9b4/f02/7529b4f02cd0ca26f60b475805347cce.png)
После установки необходимо добавить сервис в автозагрузку:
sudo systemctl enable teleport
![](https://habrastorage.org/getpro/habr/upload_files/00c/bff/171/00cbff171efa220c20a357034e0b4dbb.png)
На этом установка завершена.
Настройка 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, который имеет следующую структуру (см. скриншот):
![](https://habrastorage.org/getpro/habr/upload_files/bb5/3bc/08e/bb53bc08e0cd44a1e3be092ca7c8f50a.png)
Проверьте следующие параметры:
data_dir: директория, где будут храниться системные файлы, сертификаты и лог файлы. По умолчанию используется путь /var/lib/teleport;
cluster_name: имя кластера Kubernetes;
public_addr: доменное имя, по которому будет открываться веб-интерфейс.
Если значения указаны верно, можно запускать teleport:
sudo systemctl start teleport
Следующий этап – создание пользователей и получение доступа к веб-интерфейсу программы. Для начала убедимся, что по доменному имени открывается веб-интерфейс. В браузере переходим по доменному имени, которое было указано в параметре public_addr, должно появиться окно аутентификации:
![](https://habrastorage.org/getpro/habr/upload_files/c79/15f/15b/c7915f15b626b69288b1524043985b31.png)
Так как пользователей у нас нет, необходимо их создать. Для этого выполним следующую команду в терминале:
sudo tctl users add teleport-admin --roles=editor, access --logins=root, ubuntu
![](https://habrastorage.org/getpro/habr/upload_files/95b/c93/bd1/95bc93bd1c1b75ff1a872c77bf7ba8dd.png)
Утилиту tctl необходимо запускать от имени root пользователя или при помощи sudo. В качестве параметров использованы следующие:
add teleport-admin – создает пользователя с именем teleport-admin, при помощи которого будет осуществляться доступ в веб-интерфейс;
--roles=editor, access – задает роли (или по-простому права доступа) для создаваемого пользователя. С полным списком доступных ролей и их описанием можно ознакомиться по ссылке;
--logins=root, ubuntu – генерирует список пользователей, которые смогут подключаться к необходимым системам по протоколу SSH. Необходимые пользователи уже должны быть созданы заранее на том сервере, где запущен демон teleport, и получить возможность подключаться по SSH. Также можно использовать пользователей, которые находятся в Active Directory, GitHub и других системах. Полный список поддерживаемых провайдеров можно посмотреть по ссылке.
После нажатия на клавишу Enter в выводе команды отобразится ссылка, по которой необходимо перейти в браузере для дальнейшей настройки системы:
![](https://habrastorage.org/getpro/habr/upload_files/818/923/92d/81892392d27b5cf7c87cfd9114ee79e8.png)
Далее задаем пароль администратору системы (который был создан на этапе создания пользователя, в данном случае это пользователь с именем teleport-admin):
![](https://habrastorage.org/getpro/habr/upload_files/94f/fcb/0b9/94ffcb0b9c6cd09f14ac042f0b09676b.png)
После того как был задан пароль, необходимо настроить двухэтапную аутентификацию. После этого вы сможете входить в интерфейс Teleport (как в веб-интерфейс, так и в интерфейс командной строки tsh).
На смартфон под управлением Android или iOS скачиваем любое приложение для работы с двухэтапной аутентификацией (Authy, Google Authenticator, Twilio Authy) и сканируем QR-код, который отобразится на экране:
![](https://habrastorage.org/getpro/habr/upload_files/8ff/41e/593/8ff41e59384323b3608e05f9aa29d28c.png)
Разберем на примере Google Authenticator. В самом приложении нажимаем на кнопку с плюсом, которая находится справа снизу:
![](https://habrastorage.org/getpro/habr/upload_files/87b/77e/db6/87b77edb685d3dd7ac936fdfb1eafed5.png)
Далее выбираем пункт «Сканировать QR-код»:
![](https://habrastorage.org/getpro/habr/upload_files/633/d1e/29a/633d1e29a33bbec23160b0378ab9797b.png)
После сканирования появится блок с кодом, который действует ограниченное время:
![](https://habrastorage.org/getpro/habr/upload_files/fd9/268/287/fd9268287a29eb1c4b337cd19cc6a02f.png)
Цифры вводим в поле AUTHENTICATION CODE и нажимаем на кнопку SUBMIT. После этого отобразится сообщение о том, что регистрация выполнена успешно и можно перейти в веб-интерфейс:
![](https://habrastorage.org/getpro/habr/upload_files/f52/a51/bc6/f52a51bc6a294fe09690b1a4a170aa57.png)
![](https://habrastorage.org/getpro/habr/upload_files/b6d/3ed/06e/b6d3ed06e7ca80734ac990b944cbcc17.png)
Подключение кластера Kubernetes к Teleport
Для того чтобы использовать Teleport для входа в кластер Kubernetes, необходимо установить агент. Для начала проверим, работает ли аутентификация в Teleport при помощи следующей команды:
tsh login --proxy=teleport-test.ru --user=teleport-admin
![](https://habrastorage.org/getpro/habr/upload_files/c16/1e5/460/c161e5460a4b192279243b437a56d57c.png)
Где:
--proxy – адрес (доменное имя), на котором присутствует веб-интерфейс Teleport;
--user – пользователь, который используется для входа в веб-интерфейс.
После ввода пароля пользователя и OTP токена (токен двухфакторной аутентификации) должна отобразиться информация о текущем подключении к Teleport (см. скриншот выше).
Следующий шаг — это генерация токена, который будет использоваться для подключения кластера Kubernetes к службе Teleport:
TOKEN=$(sudo tctl nodes add --roles=kube --ttl=10000h --format=json | jq -r '.[0]')
![](https://habrastorage.org/getpro/habr/upload_files/b68/66e/955/b6866e955633907d553bd646b0bc1917.png)
Проверим, что токен действительно был сгенерирован:
echo $TOKEN
![](https://habrastorage.org/getpro/habr/upload_files/eec/0b7/c82/eec0b7c82f9b841ac28969f0930304ce.png)
Затем добавим Helm чарт, который будет использоваться для установки агента (helm должен быть установлен заранее):
helm repo add teleport https://charts.releases.teleport.dev
![](https://habrastorage.org/getpro/habr/upload_files/814/715/8ec/8147158ecf0ecadd716e457ffe873e94.png)
И обновим репозиторий:
helm repo update
![](https://habrastorage.org/getpro/habr/upload_files/b5a/dd0/f0f/b5add0f0f7ce06e80024f06446663bef.png)
Следующий шаг — это создание переменных. В переменной PROXY_ADDR зададим доменное имя, на котором находиться веб-интерфейс teleport в формате доменное_имя:443, где 443 — это порт HTTPS:
PROXY_ADDR=teleport-test.ru:443
![](https://habrastorage.org/getpro/habr/upload_files/440/d03/173/440d03173e4b321d81246b7457cb6fdd.png)
Вторая переменная задает имя кластера. Можно задать любое имя:
CLUSTER=myk8s
![](https://habrastorage.org/getpro/habr/upload_files/5f7/377/1b7/5f73771b73f5aea03881eccb306e0d9e.png)
Команда для установки агента выглядит следующим образом:
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
![](https://habrastorage.org/getpro/habr/upload_files/734/225/c6b/734225c6bd3dd102e59bdd19422f320a.png)
Будет создан новый namespace с именем teleport-agent.
Примерно через минуту агент будет поднят, а кластер отображен в веб-интерфейсе в разделе Kubernetes:
![](https://habrastorage.org/getpro/habr/upload_files/983/fea/8f1/983fea8f12fbd279176aa5644c658ca1.png)
Справа от имени кластера будет кнопка CONNECT, при нажатии на которую отобразится инструкция для подключения к кластеру Kubernetes:
![](https://habrastorage.org/getpro/habr/upload_files/b7a/240/db3/b7a240db3419095c02414c6bdc0e4df6.png)
Первая команда — это подключение к Teleport:
tsh login --proxy=teleport-test.ru:443 --auth=local --user=teleport-admin teleport-test.ru
![](https://habrastorage.org/getpro/habr/upload_files/bf2/b3c/f57/bf2b3cf576f4ef80fd3f2ee7f22d0f1e.png)
Далее происходит подключение к самому кластеру:
sudo tsh kube login myk8s
Где myk8s — имя кластера, которое было задано на этапе установки агента. Если аутентификация прошла успешно, в выводе команды появится сообщение о том, что выполнен вход в кластер:
![](https://habrastorage.org/getpro/habr/upload_files/49d/456/1ac/49d4561ac5d7733a97e055775646545c.png)
Вывести список всех кластеров Kubernetes, которые добавлены в Teleport, можно при помощи команды:
sudo tsh kube ls
![](https://habrastorage.org/getpro/habr/upload_files/0de/1d2/b72/0de1d2b721b469532fcf063507a3667f.png)
После того как вход выполнен, можно проверить выполнение команд при помощи утилиты kubectl. Для начала выведем версию кластера Kubernetes:
kubectl version --short
![](https://habrastorage.org/getpro/habr/upload_files/179/295/1d5/1792951d5fab61aae6070442030742e3.png)
А теперь выведем список всех подов в кластере:
kubectl get po -A
![](https://habrastorage.org/getpro/habr/upload_files/020/89f/c8a/02089fc8a574ddd9094facad1b0b3940.png)
Получение доступа к кластеру Kubernetes при помощи ролей
Получить доступ к Kubernetes кластеру можно также при помощи ролей. Для этого необходим хотя бы один пользователь, который присутствует в Kubernetes. Для того чтобы узнать имя текущего пользователя в Kubernetes, выполним следующую команду:
kubectl config view \
-o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.user}"
![](https://habrastorage.org/getpro/habr/upload_files/ba0/33a/cd0/ba033acd0dc6b0b92909c657296d5b4a.png)
В данном случае это пользователь с именем 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
![](https://habrastorage.org/getpro/habr/upload_files/7de/902/ee7/7de902ee7401f74381dbe4e26323e818.png)
Следующим шагом назначим созданную роль пользователю, который уже присутствует в Teleport. Для этого выполним команду:
tctl get users/$(tsh status -f json | jq -r '.active.username') > out.yaml
Будет создан файл с именем out.yaml откроем его на редактирование. Структура файла будет следующей:
![](https://habrastorage.org/getpro/habr/upload_files/6ba/8f7/781/6ba8f778155cdd4a601151142aaf77dc.png)
В разделе roles необходимо добавить значение kube-access:
![](https://habrastorage.org/getpro/habr/upload_files/3b6/a4c/9ba/3b6a4c9bab3c95d0ac8fd31d9ac7115c.png)
После этого сохраним изменения в файле и выполним команду:
tctl create -f out.yaml
![](https://habrastorage.org/getpro/habr/upload_files/aaf/1fe/4de/aaf1fe4de775d997bd7ad17ece9a5313.png)
Для того чтобы созданная роль появилась в 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
![](https://habrastorage.org/getpro/habr/upload_files/5c4/919/366/5c49193660cc0a70f7e4aaa0e0805601.png)
И выполним вход в кластер с именем myk8s:
sudo tsh kube login myk8s
![](https://habrastorage.org/getpro/habr/upload_files/6aa/dba/c77/6aadbac77a1fe846cf9b05188b8ce474.png)
Выведем список подов, чтобы убедиться, что все работает:
kubectl get po -A
![](https://habrastorage.org/getpro/habr/upload_files/322/1ce/3dc/3221ce3dc69d00078937568692288e70.png)
Подводя итог, можно сказать, что Teleport является отличным профессиональным решением для обеспечения безопасного и прозрачного доступа как к кластерам Kubernetes, так и к другим системам. Программа предоставляет серьезный набор функций, включая поддержку как большого количества Identity провайдеров, так и способов подключения.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS