Большинство выделенных серверов устанавливаются через +login anonymous, и от вас ничего не требуется. Несколько игр - первыми вам встретятся DayZ и Arma 3 - не принимают анонимную сессию. Тогда SteamCMD просит настоящие имя пользователя и пароль Steam, один раз запрашивает код Steam Guard и сохраняет токен входа, чтобы дальнейшие обновления шли без вашего участия. Этот токен и пароль, который вы ввели для его получения, оказываются на сервере. Поэтому вся безопасность укладывается в одно предложение: используйте запасной аккаунт Steam, на котором есть эта игра и больше ничего, и считайте машину, где работает SteamCMD, местом, где теперь хранятся данные этого аккаунта.
Остальная часть статьи - подробности: каким серверам нужен аккаунт, как выглядит каждый запрос Steam Guard и как на него ответить, где хранятся сохранённые данные входа и как долго они действуют, как правильно завести запасной аккаунт и что означают ошибки входа. Основы самого SteamCMD - установка, force_install_dir, validate, скрипты - описаны в статье SteamCMD explained, здесь они не повторяются.
Что на самом деле определяет вход#
SteamCMD всегда входит в Steam до того, как что-либо скачает. Вход не имеет отношения к серверу, который вы собираетесь запускать: работающий игровой сервер эту сессию уже не использует. Вход определяет только одно - какие лицензии есть у сессии загрузки.
- Anonymous - это сессия без аккаунта. У неё есть лицензия на каждое приложение, которое издатель пометил как бесплатное для анонимной загрузки, а это большинство инструментов для выделенных серверов. Ни пароля, ни Steam Guard, ничего не сохраняется.
- Вход под аккаунтом даёт всё, чем владеет этот аккаунт, плюс бесплатные инструменты. Он нужен, когда издатель ограничил серверный инструмент или его контент из Workshop аккаунтами, владеющими игрой.
Отсюда два следствия, и оба многих удивляют. Во-первых, данные для входа нужны только во время установки и обновления. Работающий сервер DayZ или Arma 3 не входит в Steam под вашим аккаунтом - это делает SteamCMD, запущенный перед стартом сервера. Во-вторых, данные нужны снова при каждом обновлении, поэтому их кэшируют, а не вводят один раз и забывают. Сервер, который обновляется при каждом перезапуске, при каждом перезапуске входит в Steam под этим аккаунтом.
Этот вход также не то же самое, что токен входа игрового сервера. GSLT предъявляет уже работающий сервер, чтобы Steam показал его в браузере серверов; он создаётся на веб-странице и никогда не вводится в SteamCMD. Их путают, потому что оба - "учётные данные Steam, которые просит хостинг", но один устанавливает файлы, а другой идентифицирует запущенный сервер. Некоторым играм нужны оба.
Каким серверам нужен настоящий аккаунт#
Заранее прочитать флаг "этот не принимает anonymous" нельзя. Это выясняется из документации издателя, из списка выделенных серверов на вики Valve для разработчиков или из самого SteamCMD, который на анонимную попытку для закрытого приложения отвечает No subscription.
| Игра | Серверному инструменту нужен аккаунт | Для Workshop нужен аккаунт-владелец |
|---|---|---|
| DayZ | Да, владеющий DayZ | Да |
| Arma 3 | Да | Да |
| Project Zomboid | По-разному - см. ниже | Моды скачиваются через сервер |
| 7 Days to Die | Обычно anonymous | Моды устанавливаются как файлы |
| Большинство остальных (Valheim, CS2, Palworld...) | Нет | Зависит от игры |
DayZ - самый однозначный случай. Инструмент DayZ Server (приложение 223350) не установится ни для анонимной сессии, ни для аккаунта, который не владеет игрой, а предметы Workshop загружаются по идентификатору приложения игры, 221100, и для этого нужен тот же аккаунт-владелец. Остальная часть установки описана в статье DayZ server and mods.
Arma 3 - случай, где источники расходятся, и это показательно. В списке Valve серверный инструмент (233780) отмечен как недоступный анонимно, а собственная документация Bohemia по серверу велит входить под настоящим именем пользователя и советует завести для этого отдельный аккаунт. Bohemia при этом называет серверный пакет бесплатным, так что вопрос, должен ли аккаунт владеть Arma 3 ради одной загрузки сервера, в разное время и у разных людей решался по-разному. С модами из Workshop иначе: workshop_download_item 107410 <id> требует аккаунт, владеющий Arma 3. Поскольку почти любой настоящий сервер Arma 3 работает с модами, в любом случае рассчитывайте на аккаунт-владелец. Полный порядок работы с модами - в статье Arma 3 server and mods.
Project Zomboid и 7 Days to Die - серая зона. Их серверные инструменты годами массово ставились через login anonymous, но хостинги и руководства расходятся в том, нужен ли вход, а издатель может изменить доступ к приложению без предупреждения. Практическая проверка быстрая: сначала попробуйте anonymous. Если установилось, аккаунт для самого сервера не нужен. Если получили No subscription, нужен. Если не уверены, какой номер проверять, в статье SteamCMD app IDs and beta branches есть идентификаторы серверов и игр для тридцати проектов.
Первый вход#
Первый вход под аккаунтом всегда должен быть интерактивным - вы за терминалом и можете прочитать, что спрашивает SteamCMD. Запустите SteamCMD без аргументов и войдите в его приглашении, чтобы пароль не попал в командную строку:
$ ./steamcmd.shSteam> login myserveraccountpassword:Что будет дальше, зависит от того, как настроен Steam Guard на аккаунте, - это в следующем разделе. Когда вход пройдёт, вы увидите строку с подтверждением и снова приглашение Steam>. Дальше устанавливайте как обычно:
Steam> force_install_dir /srv/dayzSteam> app_update 223350 validateSteam> quitЭта одна интерактивная сессия решает две задачи: проходит Steam Guard и оставляет после себя сохранённые данные входа. Каждый следующий запуск - задание cron, скрипт перезапуска, обновление из панели - может входить только по имени пользователя:
$ ./steamcmd.sh +force_install_dir /srv/dayz \ +login myserveraccount \ +app_update 223350 +quitНи пароля, ни кода. SteamCMD находит сохранённые данные для этого имени и использует их. Если не находит, он сообщает об этом и либо спрашивает (в интерактивном запуске), либо завершается ошибкой (в скрипте с @NoPromptForPassword 1), а для задачи без присмотра это именно то, что нужно: громкий сбой вместо зависания.
Не используйте короткий путь +login user password в командной строке. Он работает, но пароль попадает в историю оболочки, в вывод ps для любого другого пользователя машины, пока работает SteamCMD, и часто в логи, куда пишется вывод задачи. В контейнере хуже: пароль, переданный переменной окружения, может прочитать любой, кто способен осмотреть контейнер. Почему это более слабое укрытие, чем думают, рассказано в статье Environment variables and secrets.
Steam Guard: коды из почты, коды из приложения и подтверждения#
Steam Guard - второй фактор Steam, и SteamCMD сталкивается с ним так же, как настольный клиент при входе с нового устройства. У аккаунта может быть три состояния, и в каждом всё выглядит по-своему.
Steam Guard по почте
На аккаунте включён Steam Guard, но мобильного аутентификатора нет. При первом входе с новой машины Steam присылает короткий код на адрес аккаунта, а SteamCMD его запрашивает:
Steam Guard code:Введите код из письма. Код привязан к конкретной попытке входа, поэтому запросите и используйте его сразу; старый код от прежней попытки отклоняется. Если письмо не приходит, прежде чем повторять, проверьте папку со спамом - частые попытки как раз и приводят к ограничению по частоте.
Мобильный аутентификатор
На аккаунте приложение Steam Mobile настроено как аутентификатор. SteamCMD просит меняющийся код из приложения:
Two-factor code:Код состоит из пяти символов и меняется каждые 30 секунд. Вводите его быстро; если код сменился, пока вы печатали, будет несовпадение, и достаточно попробовать снова с новым. Свежие сборки Steam могут также предложить подтверждение на телефоне вместо ввода кода, как это делает настольный клиент: если SteamCMD просит подтвердить вход в приложении, сделайте это, и он продолжит работу. Что вы увидите - запрос кода или подтверждение - зависит от сборки SteamCMD, поэтому читайте, что он выводит, и не полагайтесь на догадки.
SteamCMD принимает код и третьим аргументом команды login (login user password code), и именно так Steam Guard отвечают из скриптов. Это работает, но пароль оказывается в командной строке, поэтому используйте такой способ только для разового действия в терминале, который вы контролируете, и никогда не записывайте в файл.
Steam Guard отключён
Никаких запросов. К этой схеме прибегают после первого же раздражающего круга со Steam Guard, и это неверное решение. Аккаунт без Steam Guard защищён одним паролем, а пароль - ровно то, что вы только что ввели на сервере. Оставьте Steam Guard включённым: он спрашивает один раз для каждой машины.
Сохранённые данные входа: где лежат и когда перестают работать#
После успешного входа SteamCMD сохраняет токен входа для этого аккаунта в своей конфигурации, в config/config.vdf внутри каталога данных SteamCMD. В Windows это папка config рядом с steamcmd.exe. В Linux всё зависит от способа установки SteamCMD: архив Valve и пакеты дистрибутивов хранят данные в разных местах, чаще всего в ~/Steam или ~/.steam. Если не уверены, поищите config.vdf в домашнем каталоге пользователя SteamCMD. Старые сборки оставляли рядом ещё и файлы ssfn, игравшие ту же роль.
Что важно знать об этом файле:
- Это учётные данные. Это не ваш пароль, но с ним SteamCMD на этой машине входит под аккаунтом без пароля. Любой, кто может его скопировать, на практике может то же самое, поэтому файл должен относиться к запасному аккаунту и ни к какому другому.
- Он принадлежит пользователю, запускавшему SteamCMD. Выполняйте первый интерактивный вход под тем же пользователем Unix, под которым работает задание cron или служба. Войти под собой, а обновления запускать от служебного пользователя
steam- самая частая причина того, что сохранённый вход "не работает". - В контейнере он должен сохраняться. Если SteamCMD работает внутри контейнера, файловая система которого сбрасывается при перезапуске, сохранённые данные пропадают вместе с ней, и при каждом старте Steam Guard запрашивается заново. Вынесите каталог конфигурации SteamCMD на постоянный том.
Сохранённый вход действует не вечно. Он перестаёт работать, когда:
- Меняется пароль. Steam завершает существующие сессии, и SteamCMD нужен новый пароль и, как правило, новый запрос Steam Guard.
- Вы отзываете авторизацию устройств. "Deauthorize all other devices" на странице Steam Guard аккаунта разлогинивает все машины с сохранённым входом, включая SteamCMD. Это же правильный шаг, если сервер с этими данными мог быть скомпрометирован.
- Токен просто истекает. Сохранённые входы живут долго, но не бесконечно. Когда срок выходит, следующее обновление без присмотра падает на этапе входа.
Именно третий случай бьёт в продакшене, потому что происходит в случайный момент через месяцы после настройки. Поэтому обновление без присмотра должно уметь безопасно проваливаться: проверяйте строку Success! App 'X' fully installed., а не код возврата, и запускайте сервер на существующих файлах, если обновление не состоялось. Как обернуть SteamCMD так, чтобы неудачный вход означал устаревший, но живой сервер, описано в статье Automating game server updates.
Запасной аккаунт: как настроить#
Запасной аккаунт здесь - не каприз. Пароль и долгоживущий токен входа лежат на машине, которую в случае аренды администрирует кто-то другой и на которой работают моды и плагины, написанные посторонними людьми. Если этот аккаунт - тот самый, где ваша библиотека, баланс кошелька, сохранённые платёжные карты и пятнадцать лет друзей, всё это в одной утечке от потери.
Как настроить его правильно:
- Создайте новый аккаунт Steam с собственным адресом почты - ящиком, который вы больше ни для чего не используете. Если почта общая с основным аккаунтом, взлом ящика скомпрометирует оба.
- Купите или подарите игру этому аккаунту, если серверу нужен аккаунт-владелец (DayZ, а для Arma 3 - ради Workshop). Это стоит одной копии игры, и такова цена того, чтобы основной аккаунт не попал на сервер.
- Не добавляйте способ оплаты и не пополняйте кошелёк. На этом аккаунте не должно быть ничего, что можно потратить.
- Включите Steam Guard. Steam Guard по почте на отдельном ящике подойдёт; мобильный аутентификатор надёжнее. В приложении Steam Mobile можно держать несколько аккаунтов, так что запасной может лежать рядом с основным на одном телефоне.
- Задайте уникальный сгенерированный пароль в менеджере паролей. Его будут вводить на сервере, так что исходите из того, что его могут увидеть, и следите, чтобы он больше ничего не открывал.
- Не играйте на нём. Аккаунт нужен только для загрузки файлов. Пока на нём не играют, он остаётся вне обменов, заявок в друзья и фишинга, который за ними следует.
Запасной аккаунт помогает и с загрузками из Workshop для сильно модифицированных серверов, потому что подписки и загрузки Workshop привязываются к нему, а не к вашему личному аккаунту. Механика загрузки, включая то, что происходит при удалении предмета из Workshop, описана в статье Steam Workshop mods on dedicated servers.
Риски безопасности без прикрас#
Ввод логина Steam на сервере - это решение о доверии, и полезно конкретно понимать, кто потом может его увидеть.
| Кто | До чего может добраться |
|---|---|
| Любой на той же машине | Пароли в выводе ps, истории оболочки, логах |
| Любой с доступом к файлам папки SteamCMD | Сохранённый токен в config.vdf |
| Хостинг | Всё, что он хранит, чтобы запускать SteamCMD за вас |
| Вредоносный мод или плагин | Любой файл, который может прочитать процесс сервера |
| Любой, кому вы отправили скриншот | Всё, что было на экране |
Строка про хостинг заслуживает больше всего честности. Любой хостинг, который запускает SteamCMD от вашего имени для игры с обязательным входом, должен хранить ваши данные в пригодном для использования виде, а значит, может их прочитать. Хитрой схемы, которая этого избегает, нет. Хостинги различаются тем, говорят ли они об этом прямо. На RE:NODE игры, которым нужен ваш собственный вход в Steam - Arma 3, DayZ, Project Zomboid и 7 Days to Die, - создаются сразу после прохождения оплаты, а установка ждёт на вкладке Setup, пока вы введёте там данные. Они хранятся в том виде, в каком вы их ввели, и именно поэтому вся эта статья снова и снова возвращается к запасному аккаунту.
Остальные строки - то, что вы контролируете сами:
- Доступ к файлам - это доступ к учётным данным. Субпользователь, который может просматривать файлы сервера, возможно, сможет прочитать сохранённый вход. Давайте персоналу доступ к консоли без доступа к файлам, где файлы не нужны, - как построить такие роли, показано в статье Subusers and least privilege.
- Моды работают с правами сервера. Плагин может прочитать всё, что может процесс сервера. Как это выглядит на практике, описано в статье Malicious plugins and mods.
- В переписке с поддержкой данные утекают. Никогда не вставляйте пароль или код Steam Guard в Discord, на форум или в публичный канал, прося о помощи. На RE:NODE тикет поддержки принимает приватные вложения, и это правильное место для всего чувствительного.
- Аккаунт панели - парадная дверь. Любой, кто может войти в панель, увидит вкладку Setup. Включите двухфакторную защиту аккаунта панели, чтобы вход в Steam не зависел от одного утёкшего пароля панели.
Если вы считаете, что данные запасного аккаунта раскрыты, реакция займёт пять минут: смените пароль, нажмите "Deauthorize all other devices" и один раз войдите вручную на тех серверах, которые должны сохранить доступ. Поскольку на аккаунте нет ничего, кроме лицензии на игру, этим ущерб и ограничивается.
Ошибки входа и что они значат#
SteamCMD сообщает о сбоях входа в строке, начинающейся с Logging in user, а причина указана в скобках в конце.
| Сообщение содержит | Что это значит |
|---|---|
Invalid Password | Неверный пароль или опечатка в имени пользователя |
Two-factor code mismatch | Мобильный код истёк или введён с ошибкой; используйте текущий |
Invalid Login Auth Code | Код Steam Guard из почты неверный или от более старой попытки |
Account Logon Denied | Steam Guard хочет код из почты, прежде чем продолжить |
Rate Limit Exceeded | Слишком много попыток; остановитесь и подождите |
No subscription | Вход выполнен, но этой учётной записи приложение не принадлежит |
К Rate Limit Exceeded стоит отнестись серьёзно. Его вызывают повторяющиеся неудачные входы, обычно скрипт, который в цикле повторяет попытку с устаревшим паролем, и каждая следующая попытка продлевает блокировку. Остановите всё, что повторяет попытки, подождите - часто час или больше - и затем один раз войдите вручную и правильно.
No subscription после успешного входа - никогда не проблема пароля. Либо аккаунт не владеет игрой, либо вы передали идентификатор приложения, принадлежащий чему-то другому. Для DayZ убедитесь, что аккаунт владеет самой DayZ; для загрузки из Workshop Arma 3 убедитесь, что он владеет Arma 3 и что вы указали 107410, а не 233780 сервера.
Вход, который работает вручную и не работает из cron, почти всегда объясняется описанным выше несовпадением пользователей: сохранённые данные принадлежат тому, кто выполнял интерактивный вход, а плановое задание запускает кто-то другой.
FAQ#
Можно ли установить сервер DayZ, не владея DayZ?
Нет. Серверный инструмент DayZ отклоняет анонимный вход и аккаунты, которые не владеют игрой, а его моды из Workshop требуют того же аккаунта-владельца. Купите копию на запасной аккаунт, а не сажайте на сервер основной.
Нужно ли вводить код Steam Guard при каждом обновлении сервера?
Нет. Steam Guard подтверждается один раз для каждой машины. Затем SteamCMD кэширует токен входа, и последующие запуски входят только по имени пользователя. Снова вас спросят лишь после смены пароля, отзыва авторизации устройств или когда сохранённый вход в итоге истечёт.
Безопасно ли давать хостингу свой логин Steam?
Настолько безопасно, насколько надёжен хостинг, поэтому давать ему стоит только запасной аккаунт. Любой хостинг, который ставит за вас DayZ или Arma 3, обязан хранить пригодные для использования данные. Выберите хостинг, который говорит об этом прямо, и следите, чтобы на аккаунте не было ничего, чего вам было бы жаль.
Стоит ли отключить Steam Guard на запасном аккаунте, чтобы не было запросов?
Нет. Запрос появляется только при первом входе с каждой машины, так что отключение Steam Guard сэкономит вам один код и уберёт единственную защиту, которая остаётся после того, как пароль введён на сервере. Оставьте его включённым, лучше с мобильным аутентификатором.
Использует ли работающий сервер мой аккаунт Steam?
Нет. Аккаунт использует SteamCMD для загрузки и обновления файлов. Работающий сервер под ним в Steam не входит. Если игре нужен ещё и токен для списка серверов, это отдельные учётные данные, которые создаются на странице игровых серверных аккаунтов Steam.
Как заставить машину забыть вход?
Удалите сохранённые данные из config/config.vdf SteamCMD или, если вы больше не контролируете машину, нажмите "Deauthorize all other devices" в настройках Steam Guard аккаунта и смените пароль. В обоих случаях следующему входу на этой машине снова понадобятся пароль и Steam Guard.


