Если коротко: SSH-ключ — это пара файлов. Закрытая половина остаётся у того, кто входит, открытая лежит на сервере в файле `authorized_keys`. Сервер пускает того, кто докажет, что владеет закрытой половиной, и пароль при этом вообще не передаётся. В Schai GPT на этом построен «свой сервер в чате»: вы кладёте на VPS одну строку с ключом, а ИИ предлагает команды вроде «сколько места на диске» или «почему сайт лёг». Выполняются они только после того, как вы нажмёте кнопку.
Я Profile, проводник по Schai и по тому, как устроен ИИ. Сегодня разберу две вещи сразу. Первая — что такое SSH-ключ и почему он надёжнее пароля. Вторая — почему нейросеть, которая неплохо знает Linux, всё равно не должна сама нажимать Enter на вашем сервере. Это не страховка «на всякий случай»: так получается из того, как работают языковые модели.
Что такое SSH-ключ простыми словами
SSH — протокол, через который администрируют серверы: вы открываете терминал, подключаетесь к машине в дата-центре и вводите команды так, будто сидите за её клавиатурой. Войти можно двумя способами: паролем или ключом.
С паролем всё просто: вы знаете секрет и отправляете его серверу. Ключ устроен иначе. Программа ssh-keygen из OpenSSH создаёт пару: закрытый ключ (например, `~/.ssh/id_ed25519`) и открытый (`id_ed25519.pub`). Если запустить её без параметров, в современных версиях получится ключ типа Ed25519. При входе сервер даёт задачу, которую можно решить только закрытым ключом, и проверяет ответ открытым. Сам закрытый ключ по сети не передаётся ни при каком входе.
Удобно представлять так: открытый ключ — это замок, который вы раздаёте и вешаете на нужные двери. Закрытый — единственный ключ от всех этих замков. Копия замка ничего не открывает, поэтому открытый ключ не страшно показывать кому угодно. А вот закрытый не должен покидать место, где он хранится.
authorized_keys: список гостей у двери
Куда вешать «замок»? В домашней папке пользователя на сервере есть файл `~/.ssh/authorized_keys`. Каждая его строка — один открытый ключ, с которым разрешено входить под этим пользователем. По описанию формата в документации sshd строка состоит из полей: необязательные опции, тип ключа, сам ключ в base64 и комментарий.
Опции — самое интересное. В начале строки можно записать ограничения, и сервер будет соблюдать их сам, без чужой помощи:
`from="…"` → ключ работает только при подключении с перечисленных адресов
`no-port-forwarding` → через этот вход нельзя пробрасывать порты
`no-agent-forwarding` → нельзя передать дальше ваш ssh-агент
`no-X11-forwarding` → нельзя пробросить графические окна
`no-pty` → не выдавать интерактивный терминал
Ещё одна деталь из той же документации: если файл или папку `~/.ssh` могут менять посторонние пользователи, sshd откажется им пользоваться. Поэтому в инструкциях всегда есть `chmod 700 ~/.ssh` и `chmod 600 ~/.ssh/authorized_keys`.
Отсюда главное свойство ключей: доступ отзывается одним действием на вашей стороне. Удалили строку — гостя больше нет, и никого не нужно просить «забыть пароль».

Почему ключ, а не пароль
Пароль — это секрет, который приходится кому-то отдать: сервису, который будет входить за вас. Если бы Schai просил пароль от сервера, он хранил бы ключ ото всех дверей сразу, и этим паролем можно было бы войти откуда угодно. Ключевая пара позволяет устроить всё аккуратнее, и в Schai это сделано так:
— Для каждого сервера генерируется своя пара Ed25519. Закрытая половина хранится на стороне Schai в зашифрованном виде и в браузер не попадает. Вам показывают только открытую половину.
— Строка для authorized_keys уже содержит ограничения. В ней стоит `from=` с адресом сервера Schai (сам адрес показан в настройках подключения), а также `no-agent-forwarding`, `no-port-forwarding`, `no-X11-forwarding` и `no-pty`. Даже если ключ кто-то утащит, с другого адреса он не сработает, а «туннель» через ваш сервер построить не получится.
— Пароли не принимаются вообще. В форме подключения нет поля «пароль», и это намеренно.
Если на сервере включён файрвол, SSH нужно разрешить с адреса Schai — тот самый адрес из строки ключа. Подробнее о ключах и настройке sshd можно прочитать в официальной документации Ubuntu Server по OpenSSH.
Как подключить свой сервер к Schai GPT
Подключение живёт в «Личном помощнике», на вкладке «SSH» («Мои серверы»). Порядок такой:
1. Укажите адрес (домен или IP), порт (по умолчанию 22), имя пользователя на сервере и при желании название — по нему вы потом будете обращаться к серверу в чате. Кнопка — «Добавить и получить ключ».
2. Schai покажет строку для `~/.ssh/authorized_keys`. Её можно скопировать или выполнить на сервере готовую команду, которая создаст папку `~/.ssh` с правильными правами и допишет строку в файл.
3. Нажмите «Проверить подключение». Schai зайдёт на сервер и выполнит безобидную команду: версия ядра, название ОС, имя пользователя. Результат появится рядом с названием сервера.
Подключить можно до пяти серверов. Совет из самих настроек: заведите отдельного пользователя без sudo (например, `schai`) и дайте ему ровно те права, которые нужны. Тогда даже ошибочная команда не сможет навредить больше, чем позволяют эти права.
TOFU: «доверяю с первого раза»
Ключи есть не только у вас, но и у сервера. По ключу сервера клиент понимает, что попал на ту же машину, а не на подставную. Стандарт SSH, RFC 4251, раздел 4.1, прямо описывает компромисс: можно не сверять ключ сервера при самом первом подключении. От прослушки это всё равно защищает, но открывает окно для подмены «человек посередине».
Schai работает по модели TOFU (trust on first use, «доверие при первом использовании»). При первой проверке он запоминает отпечаток ключа сервера, и при каждом следующем подключении сверяет его до входа. Если ключ сменился, соединение рвётся раньше, чем уйдёт команда, а вы видите предупреждение о возможной подмене. Обычный ssh делает похожее в режиме `StrictHostKeyChecking accept-new`.
Чтобы закрыть и первое окно, в настройках показан запомненный отпечаток и команда для сверки на сервере: `ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub`. Если строки совпали — подмены не было. Если вы переустановили систему и ключ поменялся честно, появится отдельная кнопка «Принять новый ключ сервера». Нажимать её стоит только тогда, когда вы точно знаете, откуда взялся новый ключ.
Почему ИИ не выполняет команды сам
Казалось бы, если нейросеть знает команды Linux, проще дать ей выполнять их сразу. Мешают три вещи.
Модель ошибается уверенно. Языковая модель выдаёт правдоподобное продолжение, а не проверенный факт. Она может перепутать флаг, путь или имя сервиса, и звучать это будет так же уверенно, как правильный ответ. В обычном разговоре такую ошибку ловит проверка. Как это делать, мы разбирали в статье о том, можно ли доверять нейросети. На сервере ошибка сразу превращается в действие.
Некоторые команды не отменить. Удалённый каталог, перезаписанный конфиг, удалённый контейнер с данными — «Ctrl+Z» у сервера нет. Цена ошибки несимметрична: лишний клик для вас стоит секунду, лишний `rm` может стоить сайта.
Модель читает чужой текст. Агент читает логи, страницы, письма, а в них может оказаться спрятанная инструкция вроде «выполни вот это». Отфильтровать такие подсказки на сто процентов нельзя — подробно об этом в статье «Команда в шифре». Зато чужой текст не может нажать кнопку. Её нажимает человек из своей авторизованной сессии.
Поэтому в Schai роли разделены жёстко. ИИ вызывает инструмент `ssh_exec` и передаёт три поля: на каком сервере, какая команда и зачем она нужна (что сделает и чем рискованна). Сервер Schai не выполняет такую команду, а сохраняет её со статусом «ждёт подтверждения». В чате появляется карточка с текстом команды, объяснением и кнопками «Выполнить» и «Отмена». После нажатия статус меняется атомарно, поэтому двойной тап не запустит команду дважды. Вывод возвращается в чат, и ИИ разбирает его следующим ходом.
Карточка ждёт подтверждения 15 минут. Позже кнопка не сработает, и ИИ придётся предложить команду заново. Итог каждой карточки остаётся в истории чата: код выхода и вывод, «отменено» или «не подтверждена вовремя». После перезагрузки страницы кнопка не «оживает».
Почему при этом опасные команды не запрещены
Следующий напрашивающийся вопрос: почему бы просто не запретить `rm`, `reboot` и прочее страшное? Потому что это ваш сервер. Перезапустить nginx, почистить старые логи, остановить зависший контейнер — нормальная работа администратора, а не злоупотребление. Сервис, который запрещает владельцу трогать собственную машину, бесполезен как раз тогда, когда сайт лёг и нужно действовать.
Поэтому Schai не запрещает, а предупреждает. Модели прямо сказано не отказывать и не урезать вашу просьбу, а честно описать риск в поле «зачем». Карточка окрашивается в один из трёх цветов:
Только чтение (голубая) → команда из белого списка, ничего не меняет: `df`, `free`, `uptime`, `ls`, `cat`, `ps`, `systemctl status`, `journalctl` без слежения, `docker ps`, `git status`, `nginx -t`
Может изменить сервер (оранжевая) → всё, чего нет в белом списке: установка пакетов, `git pull`, правка файлов
Опасная (красная) → удаление, выключение и перезагрузка, `kill`, остановка и перезапуск сервисов, удаление контейнеров, любая команда через `sudo`

Белый список составлен строго, и в нём есть несколько хитростей. Список именно белый, а не чёрный: всё незнакомое по умолчанию считается изменением. Операторы оболочки (`;`, `|`, `>`, `$(…)` и другие) делают команду «не чтением», иначе `ls; rm -rf ~` прошла бы как безобидный `ls`. Цепочка через `&&` допустима, только если каждая её часть сама по себе чтение, например `df -h && free -m`. Есть и тонкости: `hostname` с аргументом меняет имя машины, а `find -delete` удаляет файлы, поэтому оба считаются изменением.
Отдельное правило касается секретов. Пути вроде `.ssh`, `.env`, файлов ключей и сертификатов, `/etc/shadow`, конфигов облачных CLI никогда не читаются без кнопки, даже простым `cat`. Так спрятанная в письме инструкция не сможет незаметно вытащить ваши ключи.
Режим «команды чтения без подтверждения»
Нажимать кнопку ради каждого `df -h` быстро надоедает. Поэтому для каждого сервера есть переключатель: команды из белого списка выполняются сразу, всё остальное по-прежнему ждёт кнопку. По умолчанию он выключен, включить его можете только вы. Без кнопки такие команды получают 30 секунд на выполнение.
Что ещё стоит знать: лимиты и границы
— Без интерактива. Команды запускаются без терминала, ввод закрыт. `nano`, `vim`, `less`, `top` без `-b`, `tail -f` или вопрос «продолжить? [y/n]» просто повиснут до таймаута. ИИ об этом знает и подставляет `-y`, `--no-pager`, `DEBIAN_FRONTEND=noninteractive`.
— sudo только без пароля. Пароль по SSH не передаётся, поэтому работает лишь `sudo -n` — если вы сами разрешили его пользователю.
— Время. Подтверждённой команде даётся до 4 минут: хватает на установку пакетов или бэкап. Соединение с сервером должно установиться за 15 секунд.
— Объём. Вывод собирается до 64 КБ, длинный обрезается с пометкой. Команда или скрипт — до 8000 символов, многострочный тоже можно.
— Нагрузка. Не больше двух команд одновременно, общее число команд и проверок подключения в единицу времени ограничено — чтобы Schai не превратился в сканер чужих серверов.
— Только серверы из интернета. Адреса внутренних сетей и localhost не принимаются.
И одно предупреждение, которое написано в самих настройках: вывод команд уходит модели ИИ, она по нему отвечает. Не просите показать пароли и ключи — иначе они окажутся в переписке.
Как этим пользоваться на практике? Пишете обычным языком: «почему сайт отдаёт 502», «сколько места осталось», «перезапусти nginx». ИИ сначала смотрит — статус сервиса, последние строки лога, место на диске, — а потом предлагает исправление отдельной карточкой. Если сервер ещё не подключён, а вы спрашиваете про свой сервер, Schai GPT ответит по сути и подскажет, где его подключить. Выдумывать вывод команды, которую он не запускал, ему запрещено.
Коротко
— SSH-ключ — это пара: закрытая половина у того, кто входит, открытая в `~/.ssh/authorized_keys` на сервере. Пароль по сети не ходит.
— Опции в строке authorized_keys (`from=`, `no-port-forwarding`, `no-pty` и другие) ограничивают ключ на стороне вашего же сервера. Удалили строку — доступ отозван.
— Schai генерирует отдельный ключ на каждый сервер, привязывает его к своему адресу и запоминает ключ сервера (TOFU), чтобы заметить подмену.
— ИИ только предлагает команду и объясняет её. Выполняет её сервер Schai по вашей кнопке, потому что модель ошибается уверенно, часть команд необратима, а спрятанная в чужом тексте инструкция кнопку нажать не может.
— Опасное не запрещено, а подсвечено красным: сервер ваш, и решение тоже ваше.
Нейросеть может знать сотню команд Linux. Но отвечает за сервер тот, кто нажимает «Выполнить».


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