Логирование и совместный доступ в SSH с помощью Team Shell

Ко мне на обзор попала очень интересная и самобытная программа, аналогов которой лично я не знаю. Речь идет о TeamShell, с помощью которой можно централизованно управлять ssh подключениями к серверам. Она умеет разграничивать доступ по ssh, записывать экран подключения и логировать все введенные команды. Расскажу подробно обо всех возможностях.

Введение

О программе Team Shell я впервые услышал, когда один из авторов попросил у меня консультацию на тему командной работы по ssh. Я поделился тем, что знал сам по данному вопросу. Особо отметил, что нет простого и быстрого способа надежно сохранить список всех команд, введенных на сервере пользователем, подключившемся с правами root. Рассказал, какой софт по моему мнению был бы полезен и на что сделать акцент. Насколько мои данные были полезны - не знаю, так как до этого программы не видел. Соответственно, изменилось ли в ней что-то после разговора со мной, тоже не знаю.

Сейчас Team Shell вышла в стадию beta и ее можно попробовать, чем я и занялся. Есть как self-hosted решение, которое можно развернуть у себя, так и облачная версия, распространяющаяся по модели SaaS. Для теста я использовал облачную версию, так как с ее помощью можно быстро протестирвоать программу и познакомиться с функционалом.

Сайт программы - https://teamshell.com.

Для чего нужен Team Shell

С помощью Team Shell вы сможете решить следующие задачи:

  1. Управление доступом по SSH. На один из серверов в инфраструктуре, к которой требуется подключение по ssh, ставится софт, который в терминологии team shell называется node. Нода связывается с сервером управления. На ноде настраивается, к каким серверам можно будет подключаться по ssh. Далее с помощью нативного клиента, который есть под все популярные операционные системы (Windows, Linux, MacOS) настраивается доступ к целевому серверу конкретному пользователю. Пользователь, которому нужно подключиться по ssh, использует клиент, авторизовывается в системе и получает соответствующие права доступа к целевому серверу. Далее он подключается по ssh через этот же клиент. Ему не нужно давать ни пароль, ни сертификат. Он подключается строго через программу-клиент. Когда нужно закрыть доступ, у пользователя просто отключаются права на подключение к конкретному серверу. В качестве клиента выступает как приложение с GUI, так и полностью консольное, которое представляет из себя готовый пакет или просто бинарник.
  2. Логирование команд и запись консоли. При подключении по ssh через клиент, записываются как все команды пользователя, так и экран консоли. Причем все эти данные хранятся централизованно на сервере и сам пользователь не может их удалить, если у него нет соответствующих прав. К каждой команде привязывается метка на записи, так что можно в любой момент посмотреть вывод экрана при вводе той или иной команды. Это очень крутая и функциональная штука. Работает просто и удобно. Дальше я покажу это на примере.
  3. Совместный доступ к консоли. Можно одновременно подключиться в один сеанс и работать с консолью совместно. При этом будет доступен чат. Получается некий аналог TeamViewer, только для консоли. Так же вместе можно смотреть записи сеансов, разбирать их. Думаю, такая штука может быть полезна для онлайн обучения, когда лектор и ученик смогут совместно разбирать урок. Либо преподаватель сможет проверять домашние задания.
  4. Менеджер соединений. Как я уже сказал выше, подключение к серверам происходит через нативное приложение, которое является в том числе менеджером подключений. При этом все настройки хранятся на сервере. Вам достаточно где угодно установить приложение, залогиниться и получить доступ ко всем своим настроенным соединениям. Доступ защищен с помощью двухфакторной аутентификации (2FA).
  5. Ограничение на запуск команд по ssh. Вы можете не открывать полный доступ к подключению по ssh. С помощью Team Shell можно разрешить запускать только какие-то определенные команды. К примеру, кому-то из саппорта вы можете разрешать запускать только одно приложение. Например, htop, если пользователь жалуется на то, что у него тормозит вируталка. Саппорт подключается к ней, запускает htop, смотрит, кто съедает все процессорное время и отвечает клиенту, что у него apachе запущен в 50-ти экземплярах. Либо какому-нибудь админу по базам данных можно разрешить запускать только консоль pgsql или mysql.
  6. Использование в качестве менеджера 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 к целевому серверу, например с помощью сертификата. Ноды собраны в пакеты под все популярные системы и ставятся очень просто. Центральный сервер коммутирует соединение от клиента, до ноды и таким образом осуществляется подключение к целевому серверу.

Схема работы TeamShell

На момент написания статьи, свой центральный сервер можно установить только в 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.

Создание Workspace

После создания можно сразу же пригласить кого-то из пользователей в него. Если их пока нет, добавьте одного себя. Теперь снова возвращайтесь в настройки и выбирайте только что созданное окружение. Надо добавить ноду в него.

Добавление Node

Сгенерируйте ключ и сохраните его. С его помощью мы будем подключать ноды к этому окружению. Теперь идем на целевой сервер, к которому хотим подключаться. В моем примере это будет сервер 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

Запуск службы teamshell

Все в порядке, нода запущена. Теперь идем в приложение и проверяем, подключилась ли нода к выбранному окружению.

Проверка работы ноды

Нода подключилась с дефолтным конфигом, в который входит одна служба - оболочка bash. Так что можно пойти и проверить подключение. Открываем вкладку с нашим workspace и выбираем единственную службу.

Подключение по ssh через teamshell

Далее вы можете указать причину подключения. Например, установка обновлений. Ваша сессия будет сохранена с этим описанием.

Параметры подключения

Вы оказываетесь в терминале.

Подключение по ssh через teamshell

Выполните все необходимые действия и завершите работу в терминале, как вы обычно это делаете. После завершения сессии, она будет сохранена. Будут записаны вводимые команды и полный внешний вид консоли, который можно будет просматривать через встроенный плеер, как обычный видеоролик. Справа будет список команд, при нажатии на которые вы будете перемещаться в момент ввода этой команды в консоль.

История команд

Когда увидел этот плеер и его возможности, я был в восторге. Это же очень крутая штука. Надеюсь со временем можно будет выгружать эти записи. Они мне могут очень сильно облегчить создание видео к моим статьям, которые чаще всего все проходят в консоли.

Я вам показал самый базовый функционал, который можно сразу запустить и потестить, ничего особо не настраивая. Далее посмотрим на дополнительные возможности Team Shell.

Совместный доступ к консоли по ssh

Нет никаких проблем с тем, чтобы одновременно двум или более пользователям оказаться в одной консоли. Логика действий тут такая:

  1. Регистрируем нового пользователя в систему.
  2. Даем ему доступ к нужному Workspace.
  3. Открываем одним из пользователей соединение.
  4. Подключаемся вторым пользователем в это соединение.

Получится вот так. Вид от инициатора соединения.

Совместный доступ по ssh

Вид от второго пользователя, который подключился в консоль с правами на просмотр.

Одновременное подключение по ssh

Права доступа пользователей можно настраивать с помощью ролей. По умолчанию идут две роли: 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 и только он.

Пример ограничения на запуск программ через ssh

После выхода из 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 сессию, открытую с ноды.

agentless подключение по 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

Консольный клиент team shell

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

Подключение к серверу через ttui

Это очень удобно, если вам нужно выполнить разовое подключение и не хочется ставить стороннее ПО на основную рабочую машину. Можно подключиться с любой машины под управлением Linux или MacOS, просто запустив бинарник. После подключения его можно удалить.

Отдельно обращаю внимание на следующий момент. При использовании hosted версии, при подключении к нему по SSH, можно открыть показанный выше ttui и подключаться к серверам. То есть ставить себе вообще ничего не надо. Можно без проблем подключиться к серверу через любой мобильный ssh клиент.

Передача файлов

В TeamShell реализована простая передача файлов на сервер с помощью клиента. Работает и в графическом приложении, и в консольном. Пока передать файлы можно только на сервер с установленной нодой. Надеюсь со временем и на остальные сервера можно будет передавать. Работает это достаточно просто. Вот пример графического клиента.

Передача файлов по ssh через teamshell

А вот тот же функционал в консольном варианте.

Передача файлов через ttui

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Интересно, вам так же как и мне понравился TeamShell? Поделитесь своим мнением. Несмотря на то, что продукт еще достаточно сырой, так как мы смотрим пока на beta, предлагаемый функционал очень интересен. Лично мне не известны аналоги. Я вижу, что он может закрыть несколько открытых потребностей пользователей. В основном в тех поддержке, распределенных командах и онлайн школах. Да и просто удобно кого-то запустить быстренько на сервер и посмотреть, что он там делал.

Даже если вы не админ, а владелец, к примеру, какого-то онлайн магазина, над которым работают фрилансеры по одиночным задачам. Попросите настроить вам Team Shell и пускайте на сервер только через него. Так у вас останется история того, что на сервере делали. Можно будет хоть какой-то аудит провести потом. А то у меня были ситуации, когда я подключался к серверу и видел там в списке последних команд полную очистку истории команд консоли.

На всякий случай напоминаю еще раз адрес сайта программы - https://teamshell.com.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

16 комментариев

  1. 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» для завершения создания правила

  2. Не нашел цену программы. Кто-то спрашивал или есть ссылка ?

    • Цен пока нет, так как это только beta. Ближе к релизу, я думаю, будет понятно ценообразование.

  3. не нашел где и как настраивать, а есть возможность использовать собственный 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)

      В teamshell все есть команда, и дополнительно к которой можно настроить различные параметры, вроде переменных окружения и пользователя, от имени которого она запускается. Таким образом, если вы сможете настроить подключения(сервисы в нашей терминологии), которые будут вызывать соответствующую команду (в вашему случае ssh с нужными параметрами), то это должно решить вашу задачу. В целом вы можете настроить свой сервис на каждого пользователя, но у нас скорее подразумевается вход через одну точку, там где это возможно. Diskless нода должна хранить где то ключ(в текущей версии так), но если он потеряется при перезапуске, то худшее что может произойти - логи расшифровать не получится. Что касается оркестрации, то мы планируем добавить API и модули для популярных систем вроде ansible, terraform для удобного управления базой нод и пользователей.

  4. довольно интересный продукт.
    быстрый старт, поддержка куба и запись логов (видео как бы через чур по моему) - это гуд.
    ui под мак - сыровато и даже не коряво, а скорее не очень юзабилити. не всегда понятно, почему нажатие на крестик справа сверху порой просто ничего не делает. так же как и стрелка справа. вроде ты во вложенном списке, но опять же ничего нет. и new request && new file manager - не интуитивно.

    идея хорошая. как я буду разбираться с зоопарком логов при +50 хостах - вопрос.
    а вот то, что ставится на свой on-demand - это опять же плюс.
    в общем тестить буду однозначно.
    на порядок интереснее платного термиуса
    остается понять, что какие страшные цифры появятся на вкладке billing, когда продукт выйдет из беты ))

  5. Из коммерческих аналогов похоже на BalaBit Shell Control Box

    • Посмотрел описание. Похоже на то. Функционал схожий. Пользовались им?

      • Его внедряли в соседнем департаменте безопасности. Говорят - крутая штука, местами даже черезчур. Следит за абсолютно всем, являясь своего рода ssh-proxy, которая к тому же пишет видео всего происходящего в консоли, а также транскрибированный вариант, чтобы можно было искать по истории.
        Очень гибко настраивается, имеет свой выделенный кластер, через который перенаправляется весь ssh траффик, даже админы там как обычные пользователи, которые нуждаются в аппрувах других админов и тд.
        Сам не пользовался, потому что к моменту внедрения уволился, но коллеги говорят - штука страшная. Ощущение от неё, как будто 24 часа в сутки у тебя над душой кто-то стоит и всё записывает, что сильно демотивирует, а польза от неё в плане безопасности - весьма сомнительная. Больше похоже на тоталитарный тюремный режим, где никому нет доверия в принципе.

        • Мрачное описание. Контроль всегда уместен, даже за админами. За ними, возможно, даже в большей степени. Видел админов, которые откровенно берега теряли и могли делать всякую фигню, смотреть данные, которые им не положено смотреть, просто по приколу или в корыстных целях. Меня, к примеру, не напрягает, если за мной следят в процессе работы. Конечно, если я знаю, что делаю :)

          • А случаи злоупотребления действительно были.
            Один админ сделал вообще такое чудо - зашифровал все бинарники, запаролил SVN, также зашифровал свою собственную систему выкладки в прод, в результате никто кроме него не мог ничего выставлять, а также попытки ему пригрозить или уволить тоже ни к чему хорошему не привели, комплекс был нагружен 24/7 и достаточно важен, и не было ни схем, ни описания, ни документации. Решили его таки оставить, но в принудительном порядке дали двоих напарников, которые через пол года аж смогли его заменить.

        • Наша система позиционируется иначе: она скорее про удобство, чем про концлагерь, так же как и TeamViewer. Цель — удобно и быстро подключать/отключать пользователей, вместе работать с консолью, быстро подключаться к службам, хранить список соединений и сеансы. Команде и админам в целом проще будет работать с консолью. Балабит — это аппаратно-програмный комплекс (то есть вам нужно не просто зарегистрироваться в облаке, а воткнуть в серверную целый новый прибор). Это довольно громоздкое и консервативное решение — дорогой продукт для больших корпораций.

          • Да, Балабит нужно не только воткнуть, а ещё и перенастроить все свои скрипты и программы, потому что напрямую обращаться к серверам уже не получится, а только через него.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar