Платформа 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 следующий:
Пользователь выбирает один из нескольких способов подключения к кластеру 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
Далее получим список переменных из файла 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