Ко мне на обзор попала очень интересная и самобытная программа, аналогов которой лично я не знаю. Речь идет о TeamShell, с помощью которой можно централизованно управлять ssh подключениями к серверам. Она умеет разграничивать доступ по ssh, записывать экран подключения и логировать все введенные команды. Расскажу подробно обо всех возможностях.
Введение
О программе Team Shell я впервые услышал, когда один из авторов попросил у меня консультацию на тему командной работы по ssh. Я поделился тем, что знал сам по данному вопросу. Особо отметил, что нет простого и быстрого способа надежно сохранить список всех команд, введенных на сервере пользователем, подключившемся с правами root. Рассказал, какой софт по моему мнению был бы полезен и на что сделать акцент. Насколько мои данные были полезны - не знаю, так как до этого программы не видел. Соответственно, изменилось ли в ней что-то после разговора со мной, тоже не знаю.
Сейчас Team Shell вышла в стадию beta и ее можно попробовать, чем я и занялся. Есть как self-hosted решение, которое можно развернуть у себя, так и облачная версия, распространяющаяся по модели SaaS. Для теста я использовал облачную версию, так как с ее помощью можно быстро протестирвоать программу и познакомиться с функционалом.
Сайт программы - https://teamshell.com.
Для чего нужен Team Shell
С помощью Team Shell вы сможете решить следующие задачи:
- Управление доступом по SSH. На один из серверов в инфраструктуре, к которой требуется подключение по ssh, ставится софт, который в терминологии team shell называется node. Нода связывается с сервером управления. На ноде настраивается, к каким серверам можно будет подключаться по ssh. Далее с помощью нативного клиента, который есть под все популярные операционные системы (Windows, Linux, MacOS) настраивается доступ к целевому серверу конкретному пользователю. Пользователь, которому нужно подключиться по ssh, использует клиент, авторизовывается в системе и получает соответствующие права доступа к целевому серверу. Далее он подключается по ssh через этот же клиент. Ему не нужно давать ни пароль, ни сертификат. Он подключается строго через программу-клиент. Когда нужно закрыть доступ, у пользователя просто отключаются права на подключение к конкретному серверу. В качестве клиента выступает как приложение с GUI, так и полностью консольное, которое представляет из себя готовый пакет или просто бинарник.
- Логирование команд и запись консоли. При подключении по ssh через клиент, записываются как все команды пользователя, так и экран консоли. Причем все эти данные хранятся централизованно на сервере и сам пользователь не может их удалить, если у него нет соответствующих прав. К каждой команде привязывается метка на записи, так что можно в любой момент посмотреть вывод экрана при вводе той или иной команды. Это очень крутая и функциональная штука. Работает просто и удобно. Дальше я покажу это на примере.
- Совместный доступ к консоли. Можно одновременно подключиться в один сеанс и работать с консолью совместно. При этом будет доступен чат. Получается некий аналог TeamViewer, только для консоли. Так же вместе можно смотреть записи сеансов, разбирать их. Думаю, такая штука может быть полезна для онлайн обучения, когда лектор и ученик смогут совместно разбирать урок. Либо преподаватель сможет проверять домашние задания.
- Менеджер соединений. Как я уже сказал выше, подключение к серверам происходит через нативное приложение, которое является в том числе менеджером подключений. При этом все настройки хранятся на сервере. Вам достаточно где угодно установить приложение, залогиниться и получить доступ ко всем своим настроенным соединениям. Доступ защищен с помощью двухфакторной аутентификации (2FA).
- Ограничение на запуск команд по ssh. Вы можете не открывать полный доступ к подключению по ssh. С помощью Team Shell можно разрешить запускать только какие-то определенные команды. К примеру, кому-то из саппорта вы можете разрешать запускать только одно приложение. Например, htop, если пользователь жалуется на то, что у него тормозит вируталка. Саппорт подключается к ней, запускает htop, смотрит, кто съедает все процессорное время и отвечает клиенту, что у него apachе запущен в 50-ти экземплярах. Либо какому-нибудь админу по базам данных можно разрешить запускать только консоль pgsql или mysql.
- Использование в качестве менеджера SSH соединений. Для неискушенного пользователя TeamShell может заменить менеджер ssh подключений. Да, у него не так много настроек и возможностей именно как менеджера, но зато присутствуют явные плюсы, которые следуют из принципа его работы. Можно закрыть ноутбук, уйти на обед и потом начать с того же места без потери сеанса, так как при разрыве интернет соединения, сам ssh сеанс с сервером не разрывается. В дополнение к этому вы тут же в приложении видите все свои прошлые команды, что может облегчить работу. Так же вы можете при подключении сразу запускать нужное вам приложение, например, консоль pgsql. Об этом я подробно расскажу далее. Еще один явный плюск к TeamShell, как менеджеру ssh - откуда бы вы не запустили терминал, после аутентификации, вы получите все свои настроенне ssh подключения.
Кому может быть полезен
Исходя из описанных возможностей, можно составить примерный список людей, которым это приложение может быть полезно.
- На первое место я бы поставил саппорт, который оказывает массовую поддержку пользователям. В таких сервисах неизменно присутствует текучка, поэтому вопрос безопасности и удобства стоит очень остро. Нужен полный контроль за подключениями, чтобы потом можно было проводить разбор полетов в случае конфликтных ситуаций. Да и доступ к серверам необходимо по возможности организовать удобно и безпроблемно как для клиента, так и саппорта.
- Всякого рода команды разработчиков, инженеров, сисадминов. С помощью Team Shell можно удобно организовать доступ по ssh к серверам. Не нужно создавать и раскатывать ключи по серверам. Достаточно всех завести в единую систему и там разграничивать доступ. Не нужно новому джуну с виндой и putty объяснять, как сделать нормальный ключ для подключения.
- Онлайн школы смогут вывести на новый уровень ведение занятий и проверку домашних заданий. Для каждого пользователя можно сделать отдельную тестовую лабу и контролировать ход обучения, подключаться к сессии ученика, проверять домашние задания.
- Любые другие пользователи, которые хотят заказать со стороны какую-то поддержку или настройку на своем сервере по ssh. При этом они хотят понимать и контролировать то, что будет сделано. Им не нужно будет передавать данные для авторизации на сервере по ssh. Достаточно будет предложить скачать клиент Team Shell и зарегистрироваться в нем. А потом уже через него осуществить доступ.
Принцип работы Team Shell
В начале я уже упомянул, что Team Shell может работать как коробочная версия, установленная в вашу инфраструктуру, так и по модели SaaS, когда работа идет через облако разработчиков. В обоих случаях принцип работы один и тот же.
Существует центральный сервер, свой или облачный. На нем хранится вся информация - пользователи, логи. Через него же происходит авторизация. Вся информация на центральном сервере зашифрована. Для подключения к серверу используется консольный или графический клиент, написанный с помощью Qt. Весь обмен информацией клиента и сервера так же защищается сквозным шифрованием (E2EE).
TeamShell может работать в режиме agentless. На целевые сервера, к которым надо подключаться, не обязательно что-то устанавливать. Достаточно на ноде настроить доступ по ssh к целевому серверу, например с помощью сертификата. Ноды собраны в пакеты под все популярные системы и ставятся очень просто. Центральный сервер коммутирует соединение от клиента, до ноды и таким образом осуществляется подключение к целевому серверу.
На момент написания статьи, свой центральный сервер можно установить только в Kubernetes с помощью готового Helm чарта. Если у вас есть тестовый кластер, можете сделать это. У меня под рукой его не было, поэтому я смотрел на облачную версию. Базовая информация для старта дана в документации - http://docs.teamshell.com. В целом, мне хватило этой информации для того, чтобы потестировать весь функционал. Роли Node и Central Server могут совмещаться на одном сервере, если вы используете self-hosted установку.
Стоит так же отметить важную возможность. TeamShell умеет интегрироваться с LDAP, чтобы подтягивать оттуда пользователей.
Установка и запуск Team Shell
Рассказываю по шагам, что нужно сделать, чтобы запустить Team Shell в работу. Для начала скачиваем и устанавливаем графический клиент под свою систему - http://docs.teamshell.com/docs/gui/installation. После запуска регистрируемся и логинимся в систему.
Дальше идем в настройки и добавляем новый Workspace.
После создания можно сразу же пригласить кого-то из пользователей в него. Если их пока нет, добавьте одного себя. Теперь снова возвращайтесь в настройки и выбирайте только что созданное окружение. Надо добавить ноду в него.
Сгенерируйте ключ и сохраните его. С его помощью мы будем подключать ноды к этому окружению. Теперь идем на целевой сервер, к которому хотим подключаться. В моем примере это будет сервер Ubuntu. Скачиваем пакет с node по ссылке с этой страницы.
# wget https://download.teamshell.com/node/teamshell-node.deb # dpkg -i teamshell-node.deb
Вариант установки выбирайте сами. Я поставил из пакета, но ничто не мешает запустить ноду в докер контейнере.
Теперь нам нужно отредактировать конфиг, добавив туда код окружения, к которому будет присоединен сервер. Открываем файл /etc/teamshell/teamshell.yaml и указываем код.
secret: i8in9aubm16smiv0rpl37f6mhdgf9hx5z6ok2ws
Все остальное можно оставить дефолтное. Запускаем ноду и проверяем ее статус.
# systemctl start teamshell-node.service # systemctl status teamshell-node.service
Все в порядке, нода запущена. Теперь идем в приложение и проверяем, подключилась ли нода к выбранному окружению.
Нода подключилась с дефолтным конфигом, в который входит одна служба - оболочка bash. Так что можно пойти и проверить подключение. Открываем вкладку с нашим workspace и выбираем единственную службу.
Далее вы можете указать причину подключения. Например, установка обновлений. Ваша сессия будет сохранена с этим описанием.
Вы оказываетесь в терминале.
Выполните все необходимые действия и завершите работу в терминале, как вы обычно это делаете. После завершения сессии, она будет сохранена. Будут записаны вводимые команды и полный внешний вид консоли, который можно будет просматривать через встроенный плеер, как обычный видеоролик. Справа будет список команд, при нажатии на которые вы будете перемещаться в момент ввода этой команды в консоль.
Когда увидел этот плеер и его возможности, я был в восторге. Это же очень крутая штука. Надеюсь со временем можно будет выгружать эти записи. Они мне могут очень сильно облегчить создание видео к моим статьям, которые чаще всего все проходят в консоли.
Я вам показал самый базовый функционал, который можно сразу запустить и потестить, ничего особо не настраивая. Далее посмотрим на дополнительные возможности Team Shell.
Совместный доступ к консоли по ssh
Нет никаких проблем с тем, чтобы одновременно двум или более пользователям оказаться в одной консоли. Логика действий тут такая:
- Регистрируем нового пользователя в систему.
- Даем ему доступ к нужному Workspace.
- Открываем одним из пользователей соединение.
- Подключаемся вторым пользователем в это соединение.
Получится вот так. Вид от инициатора соединения.
Вид от второго пользователя, который подключился в консоль с правами на просмотр.
Права доступа пользователей можно настраивать с помощью ролей. По умолчанию идут две роли: admin с полным доступом и default с правами на просмотр всех логов команды. Вот пример создания роли с разрешением на просмотр только своих логов.
Можно сделать роль с правами только на просмотр логов, без возможности подключения. Функционал ролей пока не очень большой. Напоминаю, что продукт в бете и только выходит на широкую публику.
Ограничение на выполнение команд по ssh
Покажу на примере, как можно настроить ограничение запуска по ssh только определенных команд. Например, разрешим через подключение запускать только программу htop. Для этого идем на ноду и рисуем примерно такой конфиг.
services: - name: cent-dev bash command: /bin/bash save_history: true max_history_length: 10M tags: - bash - dev env: TERM: xterm - name: cent-dev htop command: htop save_history: true max_history_length: 10M tags: - htop - dev env: TERM: xterm server: shell1.teamshell.com:7890 control_server: grpc1.teamshell.com:443 secret: yzji89u2jkyaqhhn2pdv8u23m1qovz6r9a3bt39 keyFile: "/etc/teamshell/nodekey.pem" node_name: cent-dev
Я создал две службы - одна для открытия оболочки bash, другая для htop. Настроил их в одном конфиге, чтобы показать его формат. После перезапуска ноды, конфиг автоматом уйдет на сервер и применится. Изменения в клиенте появятся через несколько секунд.
Идем в клиент и открываем соединение со службой cent-dev htop. У вас сразу же откроется htop и только он.
После выхода из htop, подключение завершится. Очень полезная и легко настраиваемая возможность. Я думаю, многие найдут для нее применение.
Agentless подключение к серверу
Выше я использовал примеры подключения к серверу, где установлена нода. Для простого подключения по ssh на целевой сервер, ставить для этого везде ноды не нужно. Достаточно одной, через которую будет осуществляться подключение. Для этого вам надо настроить возможность подключаться к целевому серверу самой ноде. В общем случае достаточно на ней сгенерировать rsa ключи с помощью ssh-keygen и добавить публичный ключ на целевой сервер.
Далее просто добавляем очередную службу на ноде. Примерно так:
- name: ubuntu-dev command: ssh root@10.20.1.28 save_history: true tags: - bash
Здесь 10.20.1.28 - ip адрес сервера, к которому хотим подключаться. После перезапуска ноды, новая служба появится в интерфейсе клиента. К ней можно так же подключиться и работать, как с любой другой службой ноды. При этом в списке подключений на целевом сервере мы увидим ssh сессию, открытую с ноды.
В данном случае 10.20.1.23 ip адрес, где установлена нода.
Teamshell text UI (ttui) - консольный клиент
У TeamShell есть очень интересный и необычный консольный клиент. Для того, чтобы подключаться по ssh к целевым серверам, нет необходимости ставить себе на компьютер графический клиент. Можно воспользоваться консольным, который поставляется в виде пакета, либо простого бинарника. Если у вас Linux или Windows с WSL, для регистрации и подключения через Team Shell достаточно выполнить пару шагов.
# curl https://download.teamshell.com/ttui/ttui_linux --output ttui # chmod +x ttui # ./ttui
Вы можете либо зарегистрироваться, либо сразу залогиниться, если есть учетная запись. А дальше вам доступен функционал по подключению на основе сервисов, к которым у вас есть доступ.
Это очень удобно, если вам нужно выполнить разовое подключение и не хочется ставить стороннее ПО на основную рабочую машину. Можно подключиться с любой машины под управлением Linux или MacOS, просто запустив бинарник. После подключения его можно удалить.
Отдельно обращаю внимание на следующий момент. При использовании hosted версии, при подключении к нему по SSH, можно открыть показанный выше ttui и подключаться к серверам. То есть ставить себе вообще ничего не надо. Можно без проблем подключиться к серверу через любой мобильный ssh клиент.
Передача файлов
В TeamShell реализована простая передача файлов на сервер с помощью клиента. Работает и в графическом приложении, и в консольном. Пока передать файлы можно только на сервер с установленной нодой. Надеюсь со временем и на остальные сервера можно будет передавать. Работает это достаточно просто. Вот пример графического клиента.
А вот тот же функционал в консольном варианте.
Заключение
Интересно, вам так же как и мне понравился TeamShell? Поделитесь своим мнением. Несмотря на то, что продукт еще достаточно сырой, так как мы смотрим пока на beta, предлагаемый функционал очень интересен. Лично мне не известны аналоги. Я вижу, что он может закрыть несколько открытых потребностей пользователей. В основном в тех поддержке, распределенных командах и онлайн школах. Да и просто удобно кого-то запустить быстренько на сервер и посмотреть, что он там делал.
Даже если вы не админ, а владелец, к примеру, какого-то онлайн магазина, над которым работают фрилансеры по одиночным задачам. Попросите настроить вам Team Shell и пускайте на сервер только через него. Так у вас останется история того, что на сервере делали. Можно будет хоть какой-то аудит провести потом. А то у меня были ситуации, когда я подключался к серверу и видел там в списке последних команд полную очистку истории команд консоли.
На всякий случай напоминаю еще раз адрес сайта программы - https://teamshell.com.
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Ser*'
namo : openssh.serever***0.0.1.0
state: installed
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd
Для корректной работы «SSH-сервера», нужно добавить разрешающие правила в Windows Defender Firewall
Авторизуемся под учетными данными нашей виртуальный машины и переходим по пути «Control Panel» -> «System and Security» -> «Windows Defender Firewall»
Открываем параметр «Windows Defender Firewall» и кликаем по пункту «Advanced Settings»
Выбираем пункт «Inbound Rules» и создаем новое правило при помощи кнопки «New Rule»
Выбираем тип правила «Port»
Указываем протокол «TCP» и порт «2222»
Разрешаем подключение к выбранному порту «Allow the connection»
Выбираем тип сетей, где будет доступен протокол
Называем правило «SSH» и нажимаем кнопку «Finish» для завершения создания правила
Открываем конфигурацию «SSH-сервера» для редактирования
изменяем port 2222
открываем
start-process notepad C:\Programdata\ssh\sshd_config
permitRootLogin yes
PasswordAuthentication yes
permitEmptyPassword no
restart-service sshd
открываем hq-r
iptables -t nat -A PREROUTING --dst 1.1.1.100 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.60:2222
ip6tables -t nat -A PREROUTING --dst 1110:a::100 -p tcp --dport 22 -j DNAT --to-destination 192:168:d::6:2222
dpkg-reconfigure iptables-persistent
[ Виртуальная машина HQ-SRV ]
Авторизуемся под учетными данными нашей виртуальный машины и переходим по пути «Control Panel» -> «System and Security» -> «Windows Defender Firewall»
Открываем параметр «Windows Defender Firewall» и кликаем по пункту «Advanced Settings»
Выбираем пункт «Inbound Rules» и создаем новое правило при помощи кнопки «New Rule»
Выбираем тип правила «Custom»
Выбираем тип «All Programs»
Выбираем тип протокола «TCP» и указываем локальный порт «2222»
Указываем IP-адреса, которые будут заблокированы к SSH-сервису
Запрещаем подключение к выбранному порту «Block the connection
Называем правило «BlockCLI-SSH» и нажимаем кнопку «Finish» для завершения создания правила
Не нашел цену программы. Кто-то спрашивал или есть ссылка ?
Цен пока нет, так как это только beta. Ближе к релизу, я думаю, будет понятно ценообразование.
не нашел где и как настраивать, а есть возможность использовать собственный ssh_config под это дело?
нужно:
1. чтобы каждый попадал на remote server под собственным юзверем
2. чтобы ssh-proxy аналогично пробрасывал выбранного пользователя (например брать user из WS Username)
3. не работает локальный env, который есть у root на удаленном сервере (первое на чем заметил - не работает bash-completion)
для чего все это нужно:
1. есть парк локаций, где наружу выведено только по одному серверу с ssh, на остальные заходим через ssh-proxy (предварительно сконфигурирован пользовательский ssh_config)
2. пробрасываются переменные окружения с авторизационными данными для некоторых служб (соответственно у каждого пользователя они свои)
3. все ноды diskless и конфигурируются при поднятии самой ноды, тут собственно вопрос (опять таки, пока что не нарыл) - как именно автоматизировать получение ключа у сервера (естественно тут уже и получение ключа, и удаление ноды должно управлятся оркестратором)
В teamshell все есть команда, и дополнительно к которой можно настроить различные параметры, вроде переменных окружения и пользователя, от имени которого она запускается. Таким образом, если вы сможете настроить подключения(сервисы в нашей терминологии), которые будут вызывать соответствующую команду (в вашему случае ssh с нужными параметрами), то это должно решить вашу задачу. В целом вы можете настроить свой сервис на каждого пользователя, но у нас скорее подразумевается вход через одну точку, там где это возможно. Diskless нода должна хранить где то ключ(в текущей версии так), но если он потеряется при перезапуске, то худшее что может произойти - логи расшифровать не получится. Что касается оркестрации, то мы планируем добавить API и модули для популярных систем вроде ansible, terraform для удобного управления базой нод и пользователей.
Добрый день Александр!
Ваш продукт живёт и развивается?
Сайт сегодня не работает от слова совсем (
Ссылки на скачивание на сайте недоступны.
Будет жалко, если проект забросят. Мне он показался интересным и полезным.
довольно интересный продукт.
быстрый старт, поддержка куба и запись логов (видео как бы через чур по моему) - это гуд.
ui под мак - сыровато и даже не коряво, а скорее не очень юзабилити. не всегда понятно, почему нажатие на крестик справа сверху порой просто ничего не делает. так же как и стрелка справа. вроде ты во вложенном списке, но опять же ничего нет. и new request && new file manager - не интуитивно.
идея хорошая. как я буду разбираться с зоопарком логов при +50 хостах - вопрос.
а вот то, что ставится на свой on-demand - это опять же плюс.
в общем тестить буду однозначно.
на порядок интереснее платного термиуса
остается понять, что какие страшные цифры появятся на вкладке billing, когда продукт выйдет из беты ))
Из коммерческих аналогов похоже на BalaBit Shell Control Box
Посмотрел описание. Похоже на то. Функционал схожий. Пользовались им?
Его внедряли в соседнем департаменте безопасности. Говорят - крутая штука, местами даже черезчур. Следит за абсолютно всем, являясь своего рода ssh-proxy, которая к тому же пишет видео всего происходящего в консоли, а также транскрибированный вариант, чтобы можно было искать по истории.
Очень гибко настраивается, имеет свой выделенный кластер, через который перенаправляется весь ssh траффик, даже админы там как обычные пользователи, которые нуждаются в аппрувах других админов и тд.
Сам не пользовался, потому что к моменту внедрения уволился, но коллеги говорят - штука страшная. Ощущение от неё, как будто 24 часа в сутки у тебя над душой кто-то стоит и всё записывает, что сильно демотивирует, а польза от неё в плане безопасности - весьма сомнительная. Больше похоже на тоталитарный тюремный режим, где никому нет доверия в принципе.
Мрачное описание. Контроль всегда уместен, даже за админами. За ними, возможно, даже в большей степени. Видел админов, которые откровенно берега теряли и могли делать всякую фигню, смотреть данные, которые им не положено смотреть, просто по приколу или в корыстных целях. Меня, к примеру, не напрягает, если за мной следят в процессе работы. Конечно, если я знаю, что делаю :)
А случаи злоупотребления действительно были.
Один админ сделал вообще такое чудо - зашифровал все бинарники, запаролил SVN, также зашифровал свою собственную систему выкладки в прод, в результате никто кроме него не мог ничего выставлять, а также попытки ему пригрозить или уволить тоже ни к чему хорошему не привели, комплекс был нагружен 24/7 и достаточно важен, и не было ни схем, ни описания, ни документации. Решили его таки оставить, но в принудительном порядке дали двоих напарников, которые через пол года аж смогли его заменить.
Наша система позиционируется иначе: она скорее про удобство, чем про концлагерь, так же как и TeamViewer. Цель — удобно и быстро подключать/отключать пользователей, вместе работать с консолью, быстро подключаться к службам, хранить список соединений и сеансы. Команде и админам в целом проще будет работать с консолью. Балабит — это аппаратно-програмный комплекс (то есть вам нужно не просто зарегистрироваться в облаке, а воткнуть в серверную целый новый прибор). Это довольно громоздкое и консервативное решение — дорогой продукт для больших корпораций.
Да, Балабит нужно не только воткнуть, а ещё и перенастроить все свои скрипты и программы, потому что напрямую обращаться к серверам уже не получится, а только через него.