RE:NODE

Безопасность12 мин чтения

RCON без риска: порты, пароли и консоль панели

Удалённая консоль - это пароль открытым текстом на открытом порту. Как RCON устроен в разных играх, какие порты закрыть и когда консоль панели его полностью заменяет.

Обновлено

0 прочтений

RCON отправляет административные команды работающему игровому серверу откуда-то извне. В исходной схеме и в большинстве реализаций, которые её копировали, пароль пересекает сеть открытым текстом, шифрования нет, сессии нет, а любой, у кого есть пароль, может сделать всё, что можно сделать в консоли сервера, - включая остановить его, выдать себе права оператора, а в некоторых играх выполнить произвольный код внутри вашего контейнера. Его придумали в 2004 году для локальной сети. И всё же он остаётся механизмом удалённого администрирования по умолчанию в десятке игр. В этой статье - как он на самом деле работает, где живёт в каждой игре, как его закрыть, если он вам нужен, и почему большинству серверов его стоит просто выключить.

Что такое RCON и как работает протокол#

RCON - это протокол поверх TCP. Клиент подключается, отправляет пароль, и сервер либо принимает его, либо отклоняет. После этого клиент шлёт строки команд и получает вывод обратно. Протокол Source RCON от Valve - тот, который реализуют почти все, включая Minecraft, поэтому стоит посмотреть, как выглядит пакет:

ПолеРазмерСодержимое
Size4 байтаДлина всего, что идёт после этого поля
ID4 байтаЧисло, которое выбираете вы, возвращается обратно
Type4 байта3 - аутентификация, 2 - команда, 0 - ответ
BodyпеременнаяПароль или команда, завершённая нулевым байтом
Empty1 байтВторой нулевой байт

Все целые числа хранятся в little-endian, а максимальный размер пакета - 4096 байт. Аутентификация - это пакет типа 3, в теле которого пароль. Сервер отвечает пакетом типа 2: если ID совпадает с отправленным вами, вы вошли; если ID равен -1, пароль был неверным.

Отсюда три следствия, и они составляют всю картину безопасности.

  • Пароль отправляется как есть. Ни хэширования, ни вызова-ответа, ни обмена ключами. Тот, кто может читать трафик, читает пароль. В открытом интернете таких людей больше, чем вы думаете, и это каждая промежуточная сеть между вами и Германией.
  • Сессии нет. Каждое подключение аутентифицируется заново. Подбор пароля - это просто много подключений, а ограничивается ли он, целиком зависит от реализации.
  • Аутентификация - всё или ничего. Пользователей RCON и прав на отдельные команды нет. Один пароль, полный контроль.

Реализация в Minecraft - тот же протокол со своими значениями по умолчанию. Некоторые игры отклоняются от него: Rust запускает RCON поверх WebSocket, а не поверх сырого TCP, а 7 Days to Die использует Telnet, то есть ту же идею с ещё меньшей защитой.

Где RCON живёт в каждой игре#

Самое полезное - знать, какой порт и какой протокол, потому что от этого зависит правило файрвола.

ИграНастройкаПорт по умолчаниюПротокол
Minecraft Javaenable-rcon, rcon.port, rcon.password25575 TCPSource RCON
Source (TF2, Gmod, CS2)rcon_passwordигровой порт, TCPSource RCON
PalworldRCONEnabled, RCONPort, AdminPassword25575 TCPSource RCON
Project ZomboidRCONPort, RCONPassword27015 TCPSource RCON
Factorio--rcon-port, --rcon-passwordнет по умолчаниюSource RCON
7 Days to DieTelnetEnabled, TelnetPort8081 TCPTelnet
Rustrcon.port, rcon.password, rcon.web28016 TCPWebSocket
server.properties
enable-rcon=falsercon.port=25575rcon.password=broadcast-rcon-to-ops=true

Minecraft поставляется с выключенным RCON и пустым паролем, и это правильное значение по умолчанию. broadcast-rcon-to-ops стоит оставить включённым: он дублирует вывод команд RCON операторам, находящимся онлайн, так что админ в игре видит команду, пришедшую снаружи. Это бесплатное обнаружение вторжений.

У движка Source есть по-настоящему полезная деталь. Игровой трафик - UDP на игровом порту; RCON - TCP на том же номере порта. Значит, правило файрвола, блокирующее TCP на порту 27015, убивает RCON, не затрагивая ни одного игрока, и это самый чистый способ закрыть его на сервере Source без правки конфигов.

bash
# Сервер Source: блокируем RCON, игру не трогаем$ sudo ufw deny proto tcp to any port 27015$ sudo ufw allow proto udp to any port 27015

Про Palworld нужно отдельное предупреждение: RCONEnabled=True использует AdminPassword как пароль RCON, так что пароль администратора в игре и пароль удалённой консоли - одна и та же строка. Отдайте пароль администратора модератору, и вы отдали ему RCON. Эта конфигурация разобрана полностью в статье админ-команды Palworld и RCON.

Выключите его, если им никто не пользуется#

На большинстве серверов RCON включён и простаивает. Его включают при настройке, потому что так написано в руководстве, а потом к нему больше никто не подключается. Это защищённая паролем оболочка на открытом порту, за которой никто не следит, с паролем, выбранным впопыхах полтора года назад.

Задайте один вопрос: что к нему подключается? Если честный ответ «ничего» или «бот для Discord, который я перестал запускать», выключите его. В Minecraft это enable-rcon=false и перезапуск. В Source - удаление rcon_password из server.cfg. В Palworld - RCONEnabled=False. Если ваш хостер выделяет отдельный порт для RCON, уберите и выделение, чтобы не осталось вообще ничего, что слушает.

Если RCON нужен: шесть правил#

Многим установкам он действительно нужен: мост с Discord, веб-панель, которую вы написали, слушатель голосований, объявления по расписанию. Эти правила ничего не стоят и убирают большую часть риска.

  1. Длинный случайный пароль, нигде больше не используемый. Не пароль от панели, не пароль от базы данных, не пароль администратора в игре там, где игра позволяет их разделить. Двадцать четыре случайных символа из менеджера паролей. Пароль - это вся система аутентификации, относитесь к нему соответственно.
  2. Ограничьте по адресу источника. RCON, доступный со всего интернета, - цель для перебора, а в некоторых реализациях без блокировки. Ограничьте его адресами, которыми вы управляете, или вообще не выставляйте наружу - см. следующий раздел.
  3. Никогда не выкладывайте его на скриншотах. Классическая утечка - скриншот консоли, вставленный в канал поддержки, где видны аргументы запуска. Вторая классика - публичный репозиторий GitHub с конфигурационным файлом бота. Как не допустить ни того, ни другого, описано в статье переменные окружения и секреты.
  4. Меняйте его, когда кто-то, кто его знал, перестаёт участвовать. Общий секрет остаётся общим навсегда, пока не будет изменён. Это относится в тот же контрольный список, что и удаление их аккаунта субпользователя, который изложен в статье субпользователи и минимальные привилегии.
  5. Логируйте подключения. В Source sv_rcon_log 1 записывает активность RCON. Неудачные попытки аутентификации, появляющиеся в консоли, - самое ясное раннее предупреждение, которое вы получите, и их стоит проверять периодически, а не никогда. Более широкий список есть в статье логи, которые стоит хранить.
  6. Используйте лимиты неудач там, где они есть в игре. У серверов Source есть небольшое семейство cvar для бана адресов, не прошедших аутентификацию:
server.cfg
// Ban an address for this many minutes after too many failures. 0 means permanentsv_rcon_banpenalty 60// Failures before the address is bannedsv_rcon_maxfailures 5// Failures within the time window that trigger a bansv_rcon_minfailures 3sv_rcon_minfailuretime 30sv_rcon_log 1

В ванильном Minecraft ничего подобного нет. Неудачный вход по RCON там просто закрывает соединение, и всё, так что атакующий может пробовать так быстро, как позволяет сеть. Из-за этого правило второе в Minecraft важнее, чем где-либо ещё.

Учтите, что sv_rcon_whitelist_address в Source, несмотря на название, не является списком разрешённых: он называет адрес, который никогда не будет забанен по правилам выше. Он не мешает подключаться кому-либо ещё. Для этого используйте файрвол.

Как ограничить доступ правильно#

К админ-интерфейсу работающего сервера ведут три пути, и открыты они по-разному.

HTTPSSSHоткрытый интернетВыноутбук или телефонКонсоль панелиаккаунт и 2FASSH-туннельшифрованиеПорт RCONпароль открытым текстомИгровой серверпроцесс
Три способа отправить админ-команду

Консоль панели - это та же возможность за аккаунтом, который вы и так защищаете как следует. Это настоящие стандартные вывод и ввод сервера по HTTPS, с командной строкой, историей и автодополнением по Tab, за паролем, вторым фактором и сессией, которую можно отозвать. Никакого второго пароля, никакого лишнего порта и ничего открытым текстом. Если хостер даёт вам такую консоль, она должна быть вашим выбором по умолчанию, а RCON - исключением.

SSH-туннель - правильный ответ на вашей собственной машине. Привяжите RCON к 127.0.0.1, где игра это позволяет, а затем пробрасывайте порт через SSH, когда он нужен:

bash
$ ssh -N -L 25575:127.0.0.1:25575 you@your-server# in another terminal, the client now talks to a local port$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" "list"

Ничего не выставлено публично, трафик зашифрован, а доступом управляет ваш ключ SSH, а не общая строка. Часть про ключи разобрана в статье ключи SSH и укрепление защиты.

Правило файрвола - запасной вариант, когда игра настаивает на привязке ко всем интерфейсам. Разрешите адреса, которым нужно, и запретите остальные, помня, что адрес домашнего подключения обычно меняется. Синтаксис описан в статьях правила файрвола, которые важны и руководство по UFW; принцип - запрет по умолчанию, а затем разрешение конкретного.

Варианта, которого в списке нет, - «всё нормально, пароль же надёжный». Надёжный пароль защищает от подбора. Он не защищает от того, что его прочтут из сети, найдут в конфигурационном файле, который кто-то скачает, или в архиве резервной копии, экспортированном субпользователем.

Инструменты и скрипты#

Если вы автоматизируете, большинство задач закрывают два клиента. mcrcon - небольшой клиент на C, который, несмотря на название, работает с любым сервером Source RCON, а rcon-cli - клиент на Go с конфигурационным файлом для сохранённых серверов.

bash
# Одна команда и выход$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" "say Restarting in 5 minutes"# Интерактивный режим терминала$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" -t# Несколько команд за одно соединение$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" "save-all" "say Saved"

Две привычки стоит завести. Читайте пароль из окружения, а не набирайте в командной строке, потому что командные строки попадают в историю оболочки и в список процессов, где их может прочитать любой на машине. И не размножайте пароль: поскольку в RCON нет пользователей, каждый скрипт делит один пароль, так что чем меньше скриптов его хранит, тем меньше мест, откуда он может утечь.

Для работы по расписанию проверьте, нужен ли вам вообще RCON. Панель с планировщиком может отправлять консольные команды напрямую по выражению cron, с упорядоченными задачами и задержками - сохранение, объявление, ожидание, перезапуск, - а это самая частая причина, по которой люди пишут скрипт на RCON. Этот приём описан в статьях задачи по расписанию, которые стоит завести и выражения cron простыми словами.

Что делают с украденным паролем RCON#

Это не абстракция, и от игры к игре последствия важно различаются.

  • Minecraft. Выдают себе op, снимают его с вас через deop, выполняют whitelist off, gamemode creative, затем любые команды редактирования мира. stop в момент, когда мир не сохранён. Если установлен плагин вроде редактора мира, ущерб измеряется в чанках.
  • Garry's Mod и другие игры Source. lua_run выполняет произвольный серверный Lua. Это доступ к файлам, HTTP-запросы и закрепление внутри вашего контейнера. sv_downloadurl можно направить на сервер, контролируемый атакующим, который затем раздаёт файлы вашим игрокам. Это худший случай в списке.
  • Palworld, Project Zomboid, 7 Days to Die. Выключение, кик, бан, админские команды, близкие к вайпу, и выключение в момент, когда потеряется больше всего прогресса. Консоль - это админ-интерфейс, так что на столе всё, что может админ.
  • Любая игра. Повторяющиеся остановки. Сервер, который не может оставаться в сети, теряет сообщество примерно за неделю, а для соперника это и есть вся цель.

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

Устранение неполадок#

Connection refused. Ничто не слушает. RCON отключён, пароль пуст (что в Source его отключает), сервер ещё не закончил запуск или вы обращаетесь не на тот порт. Найдите в логе запуска строку, подтверждающую старт RCON.

Соединение уходит в таймаут вместо отказа. Файрвол отбрасывает пакеты, а не отклоняет их. Обычно это файрвол хоста или порт, который не выделен, а не игра.

Аутентификация не проходит с паролем, в котором вы уверены. Проверьте пробел или перевод строки в конце, особенно если пароль взят из файла. Проверьте, что игра не делит пароль с чем-то, что вы изменили. В Palworld убедитесь, что используете AdminPassword, а не отдельное значение, которое вы придумали.

Работает, а потом перестаёт после нескольких попыток. Вы упёрлись в лимиты неудач. В Source ваш адрес теперь забанен на sv_rcon_banpenalty минут. Исправьте пароль, прежде чем пробовать снова, а не долбите.

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

Вывод обрезан примерно на 4 килобайтах. Это предел протокола на пакет. Клиенты по-разному обрабатывают многопакетные ответы, так что длинный list на нагруженном сервере может вернуться сокращённым.

FAQ#

Нужно ли мне вообще использовать RCON?

Только если что-то автоматическое в нём нуждается. Для человека, отправляющего команду, консоль панели даёт ту же возможность без второго пароля и без открытого порта. Для бота, моста или скрипта RCON - интерфейс, который предоставляет игра, так что пользуйтесь им с ограничением по адресу источника и паролем, которого нет больше нигде.

Шифруется ли RCON?

Нет. Пароль и каждая команда идут открытым текстом по TCP. Любой, кто может наблюдать трафик, прочитает и то и другое. Именно этот факт должен определять, как вы его выставляете: либо никак, либо через туннель.

Можно ли сменить порт RCON, чтобы его спрятать?

Можно, и это немного помогает против нецелевого сканирования. Но это не защита. Сканирование всего адресного пространства дёшево, а сервис, отвечающий на рукопожатие RCON, сразу выдаёт себя. Меняйте порт, если хотите, но правило файрвола делайте тоже.

Какой пароль использует RCON на RE:NODE?

Предустановленные установки генерируют пароли администратора, RCON и базы данных для каждого сервера, а не поставляются с паролем по умолчанию, поэтому вы не начинаете с известного значения. Менять его по-прежнему вам, а консоль панели может избавить от необходимости в нём вовсе.

Работает ли RCON, пока сервер ещё запускается?

Нет. Слушатель RCON стартует вместе с игрой, обычно после загрузки мира или карты. Скрипты, подключающиеся сразу после команды запуска, будут падать: добавьте задержку или повтор и не считайте сбой признаком неверного пароля.

Можно ли дать модератору RCON вместо доступа к панели?

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


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000