RE:NODE

Minecraft12 мин чтения

Whitelist и права в Minecraft: операторы, группы и роли

Почему оператор - это не роль, как на самом деле работают whitelist и ops.json и какая лестница групп LuckPerms переживёт рост сообщества.

Обновлено

0 прочтений

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

В этой статье все три разобраны на реальных файлах и реальных командах: whitelist.json и ops.json, четыре уровня оператора и почему Bukkit игнорирует большинство из них, LuckPerms от установки до работающей лестницы групп, узлы, которые вы будете вводить чаще всего, и как выяснить, какого именно права не хватает, а не гадать.

Оператор - это не система прав#

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

УровеньЧто открывает
1Обходит защиту спавна. Больше ничего
2/gamemode, /give, /tp, /summon, /setblock, /effect, /gamerule, командные блоки
3/ban, /kick, /op, /deop, /whitelist, /pardon
4/stop, /save-off, /debug - всё
ops.json
[  {    "uuid": "069a79f4-44e9-4726-a5be-fca90e38aaf5",    "name": "Notch",    "level": 2,    "bypassesPlayerLimit": false  }]

/op <player> всегда выдаёт уровень из op-permission-level в server.properties, по умолчанию 4. Чтобы выдать кому-то уровень 2, придётся править файл. function-permission-level (по умолчанию 2) - отдельный уровень, на котором выполняются функции и датапаки, а bypassesPlayerLimit пускает этого игрока, когда сервер заполнен.

Вот что делает всю систему уровней почти бесполезной на настоящем сервере: Bukkit, Spigot и Paper не учитывают уровни для прав плагинов. Почти каждый плагин объявляет свои права со значением по умолчанию op, а это значит, что любой оператор получает их все, будь у него уровень 1 или 4. Сделайте нового модератора оператором уровня 2 из осторожности - и вы заодно отдали ему WorldEdit, каждую команду EssentialsX и возможность откатывать мир через CoreProtect.

Поэтому правило простое, и соблюдать его стоит строго. Операторы - для человека, который администрирует машину. Всем остальным - модераторам, строителям, донорам, доверенным постоянным игрокам - выдаётся группа в плагине прав и никакого статуса оператора. Когда нужно один раз что-то выполнить, делайте это из консоли панели: консоль всегда на уровне 4 и обладает всеми правами, так что делать себя оператором ради одной команды не нужно. Что ещё умеет консоль, описано в статье чтение консоли, а сами команды - в шпаргалке по командам сервера.

Whitelist точно#

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

server.properties
white-list=trueenforce-whitelist=trueonline-mode=true

white-list включает его. enforce-whitelist - то, что люди упускают: при значении false включение whitelist или его перезагрузка не удаляют тех, кто уже подключён, и игрок, которого вы только что убрали из списка, остаётся, пока не выйдет сам. При значении true перезагрузка сразу выкидывает всех, кого нет в списке.

КомандаЧто делает
whitelist on / whitelist offВключает или выключает проверку и записывает white-list обратно в файл свойств
whitelist add <name>Ищет имя, определяет UUID, дописывает в whitelist.json
whitelist remove <name>Удаляет запись
whitelist listВыводит текущие имена
whitelist reloadЗаново читает whitelist.json с диска после правки вручную

Сам файл невелик:

whitelist.json
[  { "uuid": "069a79f4-44e9-4726-a5be-fca90e38aaf5", "name": "Notch" }]

Два поведения, о которых стоит знать. Операторы обходят whitelist полностью, что удобно, но и означает, что старая запись оператора - это лазейка, которую whitelist не закроет, поэтому проверяйте ops.json одновременно с whitelist. И whitelist off не очищает список, так что при повторном включении вернётся ровно тот же набор людей; удалять записи ради открытия сервера на мероприятие незачем.

UUID, offline-режим и whitelist, который не работает

whitelist add работает и для игрока, который ни разу не заходил, потому что сервер спрашивает у Mojang UUID по имени. Для этого серверу нужен доступ в интернет, а имя должно существовать. «That player does not exist» - это почти всегда опечатка, сменённое имя или гейммертег Bedrock, который набирают на сервере Java.

При online-mode=false ничего не проверяется. UUID генерируются из имени пользователя, а не выдаются Mojang, поэтому запись whitelist, сделанная при включённом online-mode, не совпадёт с тем же игроком после его выключения, а зайти под любым именем из списка может кто угодно. Offline-режим место только за прокси с правильной передачей данных и больше нигде. Если вы его используете, прочитайте что делает обратный прокси и настройте секрет пересылки правильно, прежде чем трогать online-mode.

Игроки Bedrock, приходящие через Geyser и Floodgate, - третий случай: им выдаётся сгенерированный UUID и имя с префиксом, так что вставка их гейммертега в whitelist.json вручную не совпадёт. У Floodgate есть собственная команда whitelist как раз по этой причине, а настройка описана в статье Geyser и кроссплей с Bedrock.

LuckPerms: сначала группы, потом права, потом люди#

LuckPerms - это плагин прав. Установка - это jar в plugins/ и перезапуск; он работает на Paper, Velocity, Fabric, Forge и NeoForge, а данные по умолчанию хранит в файле H2 в plugins/LuckPerms/. Для одного сервера этого достаточно. Если у вас несколько серверов, у которых должны быть общие ранги, смените storage-method в plugins/LuckPerms/config.yml на SQL-бэкенд и укажите данные доступа из слота базы данных в панели; одно общее хранилище всегда лучше, чем копирование файлов между серверами.

Модель состоит из трёх слоёв, и весь фокус в том, чтобы держать их раздельно:

  1. Группа хранит права.
  2. Группа может наследовать другую группу, так что вы описываете разницу, а не повторяете список.
  3. Пользователя помещают в группу, и напрямую ему не выдают ничего.

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

The first five minutes
lp creategroup trustedlp creategroup moderatorlp creategroup adminlp group trusted parent add defaultlp group moderator parent add trustedlp group admin parent add moderatorlp group trusted setweight 10lp group moderator setweight 50lp group admin setweight 100lp user Alex parent set moderator

default - группа, в которой состоят все, и её нельзя удалить. Вес определяет, чей префикс и суффикс побеждают, когда игрок состоит в нескольких группах; к тому, какие права действуют, он отношения не имеет: это решается наследованием и тем, что явные узлы false перебивают унаследованные true.

/lp editor стоит знать до того, как вы наберёте пятьдесят команд permission set. Он выгружает вашу текущую настройку на одноразовую веб-страницу, вы перетаскиваете права по таблице и вставляете код обратно командой /lp applyedits <code>. Ничего не публикуется и ничего не хранится сверх самой правки. Полный обзор - в руководстве по LuckPerms.

Лестница групп, которая работает#

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

ГруппаКтоЧто могут
defaultВсеИграть. Чат, /spawn, один дом
trustedПостоянные игроки, спустя времяКоманды для удобства, больше домов, наборы
moderatorПерсоналКик, мут, временный бан, просмотр, кто что делал
adminВы и, возможно, ещё один человекВсё, кроме аккаунта панели
Filling them in
lp group default permission set essentials.spawn truelp group default permission set essentials.home truelp group default permission set essentials.sethome truelp group trusted permission set essentials.sethome.multiple.trusted truelp group trusted permission set essentials.tpa truelp group trusted permission set essentials.back truelp group moderator permission set essentials.kick truelp group moderator permission set essentials.mute truelp group moderator permission set essentials.vanish truelp group moderator permission set coreprotect.inspect truelp group moderator permission set coreprotect.lookup truelp group admin permission set coreprotect.rollback truelp group admin permission set worldedit.* true

В этом списке три осознанных решения. Модераторы могут смотреть журнал блоков, но не откатывать его, потому что откат с неверным радиусом хуже, чем грифинг, который он должен был отменить. Никто ниже admin не получает WorldEdit, потому что WorldEdit - это редактор мира, а ошибка с //set необратима. И essentials.gamemode нет ни в одном списке: творческий режим на сервере выживания - это каждый раз решение администратора, а не удобство.

Узлы прав, которые вы будете вводить#

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

УзелЧто даёт
minecraft.command.<name>Ванильную команду на Paper, например minecraft.command.gamemode
essentials.tp, essentials.tphereТелепортироваться к игрокам и вызывать их к себе
essentials.home, essentials.sethome.multiple.<group>Дома и их количество
essentials.kit.<name>Один именованный набор
essentials.kick, essentials.ban, essentials.muteТри команды модерации
essentials.vanishЗаходить, не объявляя об этом
coreprotect.inspect, coreprotect.lookupЧитать журнал блоков
coreprotect.rollback, coreprotect.restoreМенять с его помощью мир
worldedit.*Весь WorldEdit
luckperms.*Управление правами, включая собственные

Два приёма, экономящих время. Узел со значением false перебивает тот же узел, унаследованный как true, так что вы можете построить moderator поверх trusted и потом забрать одну возможность:

code
lp group moderator permission set essentials.tphere false

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

Контексты, треки и доступ на время#

Контексты привязывают право к условию - миру, серверу в сети прокси, игровому режиму. Именно так одна настройка LuckPerms обслуживает мир выживания и творческий мир без двух наборов групп:

code
lp group builder permission set worldedit.* true world=creativelp group default permission set essentials.fly true world=creative

Треки - это упорядоченный список групп, который превращает повышение в одну команду и делает лестницу видимой:

code
lp createtrack memberslp track members append defaultlp track members append trustedlp track members append moderatorlp user Sam promote members

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

code
lp user Sam parent addtemp moderator 14dlp user Guest permission settemp worldedit.* true 48h

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

Когда кто-то говорит, что у него нет прав#

Не угадывайте узел. LuckPerms скажет, какой именно проверялся:

code
lp verbose on

Попросите игрока выполнить команду, которая не работает, а затем:

code
lp verbose paste

Вы получите ссылку со списком всех произошедших проверок прав: для кого, какой узел и вернулось ли true или false. Проблемный узел там есть, написанный правильно, в том числе те, в которые вшито имя или число, как essentials.sethome.multiple.5. После этого выключите режим командой lp verbose off, потому что он многословен.

Другие проверки, в порядке, в котором они обычно помогают:

  • lp user <name> info показывает группы игрока, вес, префикс и любые временные записи с обратным отсчётом.
  • lp group <group> permission info перечисляет, что реально есть у группы, включая унаследованные узлы.
  • lp user <name> permission check <node> отвечает на прямой вопрос.

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

Доступ к панели - это другой вопрос#

Игровой ранг и доступ к хостингу - две отдельные системы, и смешивать их - реальный риск. Модератору нужно мутить людей. Ему не нужно уметь удалить сервер, читать страницу оплаты или скачивать мир.

На RE:NODE это разделение встроено. Роль хранит права - только консоль, только файлы, без биллинга, - команда хранит людей, а выдача связывает команду с сервером. Доступ можно ограничить по времени, приглашения рассылаются по ссылке, коду присоединения или email, а у каждого сервера есть собственный журнал действий, так что у вопроса «кто перезапустил его в 2 часа ночи» есть ответ. Дайте строителю файловый менеджер и ничего больше; соавтору - консоль и бэкапы; биллинг оставьте себе. Добавьте двухфакторную защиту аккаунта, и худший случай перестанет быть катастрофой.

Та же логика применима к RCON. Если Discord-боту нужно выполнять команды, он получает пароль RCON на ограниченном порту, а не аккаунт оператора; чем вы рискуете, если сделаете это неправильно, описано в статье безопасная работа с RCON. А прежде чем открывать сервер для чужих, остальной список есть в чек-листе запуска SMP и в статье защита от грифинга и античит.

FAQ#

Нужен ли плагин прав, если я играю только с друзьями?

Если все доверяют друг другу и никому не нужны команды - нет: whitelist и один оператор - это законченная настройка. Установите LuckPerms в тот момент, когда захотите дать кому-то /tp без /stop, а для большинства групп это происходит примерно через месяц.

Останавливает ли whitelist тех, кто уже зашёл?

Только при enforce-whitelist=true. При выключенном whitelist проверяется при входе, так что все, кто подключён сейчас, остаются подключёнными до отключения. Включите его, и whitelist reload уберёт их, как только вы скажете.

Как добавить в whitelist человека, который никогда не играл на моём сервере?

Достаточно whitelist add <name>. Сервер сам определяет UUID по имени, так что заходить сначала не нужно. Не сработает только если имя написано с ошибкой, аккаунта не существует или у сервера нет доступа в интернет.

Может ли игрок быть оператором и при этом ограничиваться LuckPerms?

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

Что происходит с правами при перезапуске сервера?

Они сохраняются: LuckPerms пишет в собственное хранилище сразу, а не при выключении. При выключении перезаписываются ванильные файлы: ops.json, whitelist.json и списки банов. Правьте их командами или при остановленном сервере.

Должны ли модераторы уметь откатывать мир?

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


Комментарии

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

0/2000