Подключение к запущенному Elixir-приложению с помощью удалённой оболочки IEx

Примечание: при использовании опции --remsh на локальном компьютере могут возникнуть проблемы безопасности, о которых лучше бы знать наперёд. Советую обратить внимание на последний пункт статьи, посвящённый данной проблеме.

Недавно я освоил одну любопытную встроенную в IEx опцию под названием --remsh (сокращение от «remote shell»). Она создаёт оболочку IEx в контексте Elixir-ноды, что позволяет проводить отладку и воспроизводить ошибки в уже запущенном приложении. Несмотря на своё название, --remsh может подключать IEx как к локальным, так и к удалённым нодам или приложениям. Сделать это можно, например, так:

# when running Elixir app on a server called example.com...
> iex --name "joe@iex_test" --cookie secret_cookie --remsh "node@example.com"

iex(node@example.com)1> Node.list
[:joe@iex_test]

--remsh работает в сочетании с двумя другими опциями: —name и —cookie. Первая — обязательная, создаёт оболочку IEx с именем для идентификации в других нодах кластера. Вторая — дополнительная, но обычно необходимая, представляет собой cookie безопасности для доступа к ноде (обычно они находятся в корневом каталоге по адресу ~/.erlang.cookie).

Для простоты использования можно также обернуть всё это в обычный bash-скрипт:

function reiex() {
 if [ $1 = "staging" ]; then
  iex --name "$(whoami)@reiex" --cookie secret_cookie --remsh "node@staging.example.com"
 elif [ $1 = "prod" ]; then
  iex --name "$(whoami)@reiex" --cookie secret_cookie --remsh "node@prod.example.com"
 else
  echo "Environment not found!"
 fi
}

Теперь, чтобы установить соединение с продакшн- или тестовым- серверами, достаточно лишь запустить reiex <имя среды>.

Проблемы безопасности

Существуют некоторые последствия нарушения безопасности, о которых нужно знать, прежде чем пользоваться опцией --remsh. Помните, Elixir/Erlang ноды имеют полный доступ ко всем другим нодам заданного кластера. Поэтому, подключаясь к нему со своего компьютера через --remsh, вы предоставите другим нодам доступ к локальной рабочей станции и разрешите удалённый вызов процедур. Если подключиться с локального компьютера к удалённой ноде, которая подверглась атаке, ваши конфиденциальные данные, в том числе и SSH-ключи, станут доступны кому угодно.

Если вы планируете использовать remsh в каких-либо серьёзных проектах, рекомендую прочесть статью Алекса Вебера, где данная проблема рассматривается более подробно. Алекс также предлаегает более безопасное решение: сначала создать SSH-соединение с удалённым компьютером, а затем использовать remsh для локального подключения к ноде. Это как минимум предотвратит удалённый вызов процедур по отношению к рабочей станции и установит более безопасное соединение между компьютером и нодой.

Желаю удачного опыта с --remsh!

© 2020 / Россия Любые мысли и вопросы пишите на elixir@wunsh.ru.