Miami RP Project СЕРВЕР MTA:SA ONLINE СЕРВЕР GTA 5 RAGE MP В РАЗРАБОТКЕ ЗАПУСК MTA RAGE MP: в разработке

Настройка ACL MTA:SA — группы, права и доступ ресурсов

Сегодня Обновлено: Сегодня 0.0 (0)
Настройка ACL MTA:SA — группы, права и доступ ресурсов
Категория Настройка ACL и прав доступа на сервере MTA Опубликовано Сегодня Обновлено Сегодня Просмотров 4

ACL в MTA:SA — это система контроля доступа, определяющая права пользователей и серверных ресурсов. Через файл acl.xml можно назначить администратора, создать отдельные группы для модераторов и разработчиков, разрешить или запретить серверные команды, а также ограничить доступ Lua-ресурсов к защищённым функциям.

Неправильная настройка ACL способна либо заблокировать работу игровой сборки, либо предоставить ресурсу или сотруднику проекта чрезмерные полномочия. Поэтому права следует выдавать по принципу минимально необходимого доступа: пользователь или ресурс получает только те разрешения, которые нужны ему для работы.

В руководстве разобраны структура acl.xml, стандартные группы, создание собственных ролей, выдача административных прав, запросы ресурсов через aclrequest, защита команд с помощью hasObjectPermissionTo и поиск распространённых ошибок.

Установка серверной программы:

Установка MTA Server на Windows и Linux

Что такое ACL на сервере MTA:SA

ACL расшифровывается как Access Control List — список контроля доступа. Система определяет, какие действия разрешены конкретным аккаунтам и серверным ресурсам.

С помощью ACL можно:

  • назначить владельца и администраторов сервера;
  • создать отдельные роли для модераторов;
  • разрешить сотруднику только определённые команды;
  • запретить обычным игрокам административные действия;
  • дать ресурсу доступ к защищённой функции MTA;
  • разрешить одному ресурсу запускать другой;
  • ограничить административную панель;
  • создать собственные права игрового режима;
  • защитить команды и серверные события;
  • отозвать доступ без изменения Lua-кода.

Основной принцип

В MTA используется следующая схема:

Объект → Группа → Список ACL → Отдельные права

Например:

user.ServerOwner
 ↓
группа Admin
 ↓
списки Moderator, SuperModerator, Admin и RPC
 ↓
разрешённые команды и функции

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

Где находится файл acl.xml

Главный файл ACL расположен в каталоге игрового модуля:

mods/deathmatch/acl.xml

Пример пути на Windows

C:\MTA-Server\mods\deathmatch\acl.xml

Пример пути на Linux

/home/mtasa/mta-server/mods/deathmatch/acl.xml

Имя используемого файла задаётся в mtaserver.conf:

<acl>acl.xml</acl>

Если здесь указано другое имя, сервер будет использовать соответствующий файл:

<acl>acl-production.xml</acl>

Резервная копия acl.xml

Остановите сервер командой:

shutdown Создание резервной копии ACL

Скопируйте файл в отдельную папку:

backups/
└── acl/
 ├── acl-before-admin.xml
 ├── acl-before-new-resource.xml
 └── acl-stable.xml

На Linux

cp \
/home/mtasa/mta-server/mods/deathmatch/acl.xml \
/home/mtasa/backups/acl-before-edit.xml

Что ещё желательно сохранить

  • mtaserver.conf;
  • файлы аккаунтов или внутреннюю базу MTA;
  • ресурс admin;
  • ресурс webadmin;
  • конфигурацию собственного админ-ресурса;
  • список сотрудников и назначенных ролей.

Основная структура файла acl.xml

Файл состоит из корневого элемента acl, групп и отдельных списков прав:

<acl>

 <group name="Everyone">
 <acl name="Default" />
 <object name="user.*" />
 <object name="resource.*" />
 </group>

 <group name="Admin">
 <acl name="Moderator" />
 <acl name="SuperModerator" />
 <acl name="Admin" />
 <acl name="RPC" />

 <object name="resource.admin" />
 <object name="resource.webadmin" />
 <object name="user.ServerOwner" />
 </group>

 <acl name="Default">
 <right name="command.start" access="false" />
 <right name="command.stop" access="false" />
 </acl>

 <acl name="Admin">
 <right name="command.start" access="true" />
 <right name="command.stop" access="true" />
 </acl>

</acl>

Важные правила XML

  • весь файл должен находиться внутри <acl>;
  • каждая группа должна иметь уникальное имя;
  • каждый список ACL должен иметь уникальное имя;
  • группа может подключать несколько списков;
  • объекты добавляются внутрь группы;
  • права добавляются внутрь списка ACL;
  • каждый открывающий тег должен быть закрыт;
  • значения атрибутов заключаются в кавычки.

Чем группа отличается от списка ACL

Группа

Группа содержит пользователей и ресурсы:

<group name="Moderators">
 <acl name="ModeratorRights" />

 <object name="user.Alex" />
 <object name="user.Maria" />
</group>

Список ACL

Список определяет разрешённые и запрещённые действия:

<acl name="ModeratorRights">
 <right name="command.kick" access="true" />
 <right name="command.mute" access="true" />
 <right name="command.ban" access="false" />
</acl>

Связь между ними

<group name="Moderators">
 <acl name="ModeratorRights" />
 <object name="user.Alex" />
</group>

Аккаунт Alex получает права, перечисленные в ModeratorRights.

Один список можно использовать в нескольких группах

<group name="SeniorModerators">
 <acl name="ModeratorRights" />
 <acl name="SeniorModeratorRights" />
</group>

Так можно создавать уровни доступа без повторения одинаковых строк.

Объекты user и resource

ACL работает с двумя основными типами объектов.

Пользовательский аккаунт

<object name="user.ServerOwner" />

После user. указывается имя серверного аккаунта MTA, а не игровой ник персонажа.

Серверный ресурс

<object name="resource.admin" />

После resource. указывается точное техническое название папки ресурса.

Маска всех пользователей

<object name="user.*" />

Маска всех ресурсов

<object name="resource.*" />

Неправильно

<object name="ServerOwner" />
<object name="user.Ник игрока" />
<object name="admin" />

Правильно

<object name="user.ServerOwner" />
<object name="resource.admin" />

Стандартные группы MTA Server

Группа Назначение
Everyone Общие права всех пользователей и ресурсов.
Moderator Базовые действия модерации.
SuperModerator Расширенные права модератора.
Admin Управление сервером, игроками и ресурсами.
Console Права объекта user.Console для серверной консоли.
RPC Права, связанные с удалённым вызовом функций.

Стандартная группа Admin обычно подключает несколько списков:

<group name="Admin">
 <acl name="Moderator" />
 <acl name="SuperModerator" />
 <acl name="Admin" />
 <acl name="RPC" />

 <object name="resource.admin" />
 <object name="resource.webadmin" />
</group>

Не удаляйте стандартные группы только ради упрощения файла. Собственные роли безопаснее создавать отдельно.

Особенности группы Everyone

Стандартная группа Everyone содержит маски:

<group name="Everyone">
 <acl name="Default" />
 <object name="user.*" />
 <object name="resource.*" />
</group>

Это означает, что каждый аккаунт и каждый ресурс получает базовые права из списка Default.

Опасная настройка

<acl name="Default">
 <right name="command.ban" access="true" />
 <right name="command.start" access="true" />
 <right name="function.restartResource" access="true" />
</acl>

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

Безопасный подход

  • оставляйте в Default только общие безопасные права;
  • опасные команды разрешайте отдельным группам;
  • защищённые функции выдавайте конкретным ресурсам;
  • не используйте Everyone как замену настройке зависимостей;
  • после установки сборки сравнивайте её ACL с чистым файлом MTA.

Как создать аккаунт администратора

Запустите MTA Server и выполните в серверной консоли:

addaccount ServerOwner СЛОЖНЫЙ_УНИКАЛЬНЫЙ_ПАРОЛЬ

Общий синтаксис:

addaccount имя_аккаунта пароль

Рекомендации

  • не используйте логин admin;
  • не используйте название сервера как пароль;
  • не повторяйте пароль хостинга или MySQL;
  • создавайте отдельный аккаунт каждому сотруднику;
  • не передавайте один аккаунт всей команде;
  • сохраните пароль в защищённом менеджере паролей.

После создания корректно остановите сервер:

shutdown Настройка прав администратора

Как добавить пользователя в группу Admin

Откройте acl.xml и найдите:

<group name="Admin">

Добавьте объект аккаунта перед закрывающим тегом группы:

<group name="Admin">
 <acl name="Moderator" />
 <acl name="SuperModerator" />
 <acl name="Admin" />
 <acl name="RPC" />

 <object name="resource.admin" />
 <object name="resource.webadmin" />

 <object name="user.ServerOwner" />
</group>

Имя после user. должно совпадать с аккаунтом, созданным командой addaccount.

Несколько администраторов

<object name="user.ServerOwner" />
<object name="user.TechnicalAdmin" />
<object name="user.GameAdmin" />

Как войти в административный аккаунт

Запустите сервер, подключитесь через MTA и откройте консоль клавишей F8.

Выполните:

login ServerOwner СЛОЖНЫЙ_УНИКАЛЬНЫЙ_ПАРОЛЬ

После успешной авторизации можно открыть стандартную панель клавишей:

P

Для работы панели должен быть запущен ресурс:

start admin

Если панель не открывается

  • проверьте успешность команды login;
  • проверьте объект user.ServerOwner;
  • убедитесь, что объект находится внутри Admin;
  • проверьте запуск ресурса admin;
  • проверьте наличие resource.admin в нужной группе;
  • выполните reloadacl после ручного изменения;
  • проверьте ошибки XML.

Как удалить административные права

Остановите сервер и удалите строку аккаунта из группы Admin:

<object name="user.OldAdministrator" />

Не удаляйте сам аккаунт, когда требуется только временно отозвать административные полномочия.

Полное удаление аккаунта

В серверной консоли доступна команда:

delaccount OldAdministrator

Смена пароля

chgpass ServerOwner НОВЫЙ_СЛОЖНЫЙ_ПАРОЛЬ

После ухода сотрудника

  • удалите его из всех ACL-групп;
  • удалите или заблокируйте аккаунт;
  • смените общие пароли, если они использовались;
  • проверьте доступ к VPS, MySQL и панели хостинга;
  • просмотрите добавленные им ресурсы;
  • проверьте историю последних изменений.

Как создать собственную ACL-группу

Для новой роли необходимо создать:

  1. группу с пользователями;
  2. список ACL с правами;
  3. связь группы со списком.

Пример минимальной группы

<group name="Helpers">
 <acl name="HelperRights" />

 <object name="user.HelperOne" />
</group>

Список её прав

<acl name="HelperRights">
 <right name="command.mute" access="true" />
 <right name="command.unmute" access="true" />
 <right name="command.kick" access="false" />
 <right name="command.ban" access="false" />
</acl>

Где размещать элементы

Группа и список находятся отдельно внутри корневого элемента:

<acl>

 <group name="Helpers">
 <acl name="HelperRights" />
 <object name="user.HelperOne" />
 </group>

 <acl name="HelperRights">
 <right name="command.mute" access="true" />
 </acl>

</acl>

Нельзя помещать список прав внутрь группы.

Пример группы модераторов

Ниже приведён демонстрационный вариант. Названия команд должны соответствовать ресурсам, установленным на конкретном сервере.

<group name="ProjectModerators">
 <acl name="ProjectModeratorRights" />

 <object name="user.ModeratorOne" />
 <object name="user.ModeratorTwo" />
</group>

<acl name="ProjectModeratorRights">
 <right name="command.kick" access="true" />
 <right name="command.mute" access="true" />
 <right name="command.unmute" access="true" />
 <right name="command.freeze" access="true" />
 <right name="command.spectate" access="true" />

 <right name="command.ban" access="false" />
 <right name="command.start" access="false" />
 <right name="command.stop" access="false" />
 <right name="command.shutdown" access="false" />

 <right name="general.adminpanel" access="true" />
 <right name="general.tab_players" access="true" />
 <right name="general.tab_resources" access="false" />
</acl>

После добавления группы проверьте

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

Пример ограниченной группы помощников

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

<group name="ProjectHelpers">
 <acl name="ProjectHelperRights" />

 <object name="user.HelperOne" />
 <object name="user.HelperTwo" />
</group>

<acl name="ProjectHelperRights">
 <right
 name="resource.admin_tools.answerReport"
 access="true"
 />

 <right
 name="resource.admin_tools.closeReport"
 access="true"
 />

 <right
 name="resource.admin_tools.teleportToPlayer"
 access="false"
 />

 <right
 name="resource.admin_tools.giveMoney"
 access="false"
 />

 <right
 name="resource.admin_tools.banPlayer"
 access="false"
 />
</acl>

Такая схема удобнее проверки имени конкретной группы внутри Lua-кода. Владелец сервера сможет переназначать права без изменения скрипта.

Пример группы разработчиков

Разработчику часто нужен перезапуск тестовых ресурсов, но не нужны права на блокировку игроков, изменение аккаунтов и остановку всего сервера.

<group name="Developers">
 <acl name="DeveloperRights" />

 <object name="user.DeveloperOne" />
</group>

<acl name="DeveloperRights">
 <right name="command.refresh" access="true" />
 <right name="command.start" access="true" />
 <right name="command.stop" access="true" />
 <right name="command.restart" access="true" />
 <right name="command.debugscript" access="true" />

 <right name="command.stopall" access="false" />
 <right name="command.shutdown" access="false" />
 <right name="command.ban" access="false" />

 <right name="general.adminpanel" access="true" />
 <right name="general.tab_resources" access="true" />
 <right name="general.tab_acl" access="false" />
</acl>

Основные типы прав ACL

Префикс Назначение Пример
command. Использование серверной или ресурсной команды пользователем. command.kick
function. Вызов защищённой серверной функции ресурсом. function.banPlayer
general. Общие права, используемые отдельными ресурсами и панелями. general.adminpanel
resource. Собственное право конкретного ресурса. resource.admin_tools.kick

Разрешение

<right name="command.kick" access="true" />

Запрет

<right name="command.ban" access="false" />

Неуказанное право

Поведение зависит от способа проверки и значения по умолчанию в Lua-коде. В собственных ресурсах рекомендуется явно использовать запрет по умолчанию.

Права command для серверных команд

Команда, зарегистрированная через addCommandHandler, может управляться правом:

command.НАЗВАНИЕ_КОМАНДЫ

Пример

Lua-код регистрирует команду:

addCommandHandler("setweather", setWeatherCommand)

Соответствующее право:

<right
 name="command.setweather"
 access="true"
/>

Запрет группе

<right
 name="command.setweather"
 access="false"
/>

Команды управления сервером

<right name="command.start" access="true" />
<right name="command.stop" access="true" />
<right name="command.restart" access="true" />
<right name="command.refresh" access="true" />
<right name="command.shutdown" access="false" />

Права function для Lua-ресурсов

Некоторые серверные функции MTA защищены ACL. Ресурс без соответствующего разрешения получит ошибку доступа.

Пример списка прав ресурса

<acl name="ResourceManagerRights">
 <right
 name="function.startResource"
 access="true"
 />

 <right
 name="function.stopResource"
 access="true"
 />

 <right
 name="function.restartResource"
 access="true"
 />

 <right
 name="function.refreshResources"
 access="true"
 />

 <right
 name="function.shutdown"
 access="false"
 />
</acl>

Группа ресурса

<group name="ResourceManagerGroup">
 <acl name="ResourceManagerRights" />
 <object name="resource.resource_manager" />
</group>

Не выдавайте функции управления ресурсами обычному HUD, спидометру, карте или системе звуков.

Права general

Префикс general. используется для общих разрешений, которые проверяют системные или пользовательские ресурсы.

Примеры стандартной административной панели

<right name="general.adminpanel" access="true" />
<right name="general.tab_players" access="true" />
<right name="general.tab_resources" access="true" />
<right name="general.tab_acl" access="false" />

Изменение других ресурсов

<right
 name="general.ModifyOtherObjects"
 access="true"
/>

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

Собственные права с префиксом resource

Для функций игрового режима удобно создавать отдельные права по схеме:

resource.НАЗВАНИЕ_РЕСУРСА.ДЕЙСТВИЕ

Примеры

resource.admin_tools.kickPlayer
resource.admin_tools.banPlayer
resource.admin_tools.giveMoney
resource.reports.answer
resource.reports.close
resource.vehicles.deleteAnyVehicle

Права модератора

<acl name="CustomModeratorRights">
 <right
 name="resource.admin_tools.kickPlayer"
 access="true"
 />

 <right
 name="resource.admin_tools.banPlayer"
 access="false"
 />

 <right
 name="resource.admin_tools.giveMoney"
 access="false"
 />
</acl>

Эти названия не выполняют действие самостоятельно. Lua-ресурс должен проверять их через hasObjectPermissionTo.

Как выдать ресурсу доступ к защищённой функции

Допустим, ресурс account_manager должен создавать серверные аккаунты.

Группа

<group name="AccountManagerResource">
 <acl name="AccountManagerRights" />
 <object name="resource.account_manager" />
</group>

Права

<acl name="AccountManagerRights">
 <right name="function.addAccount" access="true" />
 <right name="function.setAccountPassword" access="true" />
 <right name="function.removeAccount" access="false" />
</acl>

Проверка перед выдачей

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

Как разрешить ресурсу управлять другим ресурсом

Полное разрешение на изменение любых ресурсов:

<right
 name="general.ModifyOtherObjects"
 access="true"
/>

Это слишком широкое право для большинства систем.

Ограничение конкретным ресурсом

<acl name="UpdaterRights">
 <right
 name="general.ModifyOtherObjects.vehicle_system"
 access="true"
 />

 <right
 name="general.ModifyOtherObjects.inventory"
 access="true"
 />

 <right
 name="function.restartResource"
 access="true"
 />
</acl>

Группа обновляющего ресурса

<group name="UpdaterResource">
 <acl name="UpdaterRights" />
 <object name="resource.project_updater" />
</group>

Так ресурс project_updater получает доступ только к указанным системам, а не ко всей сборке.

Запрос прав через aclrequest в meta.xml

Ресурс может перечислить необходимые права в своём meta.xml:

<meta>

 <script src="server.lua" type="server" />

 <aclrequest>
 <right
 name="function.startResource"
 access="true"
 />

 <right
 name="function.stopResource"
 access="true"
 />
 </aclrequest>

</meta>

После установки запросы появляются в состоянии ожидания. Администратор должен вручную разрешить или отклонить каждое право.

Преимущества aclrequest

  • ресурс явно сообщает необходимые разрешения;
  • администратор видит их до выдачи;
  • не требуется добавлять ресурс в Admin;
  • можно разрешить только одну функцию;
  • ненужные права можно отклонить.

Команды управления запросами ACL

Показать все ожидающие запросы

aclrequest list

Показать запросы конкретного ресурса

aclrequest list resource_manager

Разрешить одно право

aclrequest allow resource_manager function.startResource

Запретить одно право

aclrequest deny resource_manager function.stopResource

Разрешить все заявленные права

aclrequest allow resource_manager all

Отклонить все запросы

aclrequest deny resource_manager all

После обработки проверьте результат:

aclrequest list resource_manager

Как защитить серверную команду через ACL

Для критических команд рекомендуется использовать собственное право и явно проверять его в Lua-коде.

Право в acl.xml

<acl name="AdminToolsRights">
 <right
 name="resource.admin_tools.kickPlayer"
 access="true"
 />
</acl>

Группа

<group name="AdminToolsUsers">
 <acl name="AdminToolsRights" />
 <object name="user.ServerOwner" />
 <object name="user.GameModerator" />
</group>

Безопасный обработчик команды

local ACL_RIGHT = "resource.admin_tools.kickPlayer"

local function findPlayerByNamePart(namePart)
 if type(namePart) ~= "string" or namePart == "" then
 return false
 end

 namePart = namePart:lower()

 for _, player in ipairs(getElementsByType("player")) do
 local playerName = getPlayerName(player)
 :gsub("#%x%x%x%x%x%x", "")
 :lower()

 if playerName:find(namePart, 1, true) then
 return player
 end
 end

 return false
end

local function kickPlayerCommand(player, commandName, targetName, ...)
 local aclObject = isElement(player)
 and player
 or "user.Console"

 if not hasObjectPermissionTo(aclObject, ACL_RIGHT, false) then
 if isElement(player) then
 outputChatBox(
 "У вас нет доступа к этой команде.",
 player,
 255,
 80,
 80
 )
 end

 return
 end

 local target = findPlayerByNamePart(targetName)

 if not isElement(target) then
 if isElement(player) then
 outputChatBox(
 "Игрок не найден.",
 player,
 255,
 180,
 80
 )
 end

 return
 end

 local reason = table.concat({...}, " ")

 if reason == "" then
 reason = "Нарушение правил сервера"
 end

 local responsibleName = isElement(player)
 and getPlayerName(player)
 or "Server Console"

 kickPlayer(
 target,
 player,
 responsibleName .. ": " .. reason
 )
end

addCommandHandler("pkick", kickPlayerCommand)

Почему указан false

hasObjectPermissionTo(aclObject, ACL_RIGHT, false)

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

Защита серверного события ACL-правом

Одной защиты команды недостаточно, если административное действие также вызывается клиентским событием.

Небезопасный пример

addEvent("admin:giveMoney", true)

addEventHandler("admin:giveMoney", root,
 function(target, amount)
 givePlayerMoney(target, amount)
 end
)

Клиент может попытаться вызвать событие самостоятельно и передать произвольные значения.

Безопасный вариант

local GIVE_MONEY_RIGHT =
 "resource.admin_tools.giveMoney"

addEvent("admin:giveMoney", true)

addEventHandler("admin:giveMoney", root,
 function(target, amount)
 if client ~= source then
 return
 end

 if not hasObjectPermissionTo(
 client,
 GIVE_MONEY_RIGHT,
 false
 ) then
 outputDebugString(
 "[ACL] Запрещённая попытка выдачи денег: "
 .. getPlayerName(client),
 2
 )

 return
 end

 if not isElement(target)
 or getElementType(target) ~= "player" then
 return
 end

 amount = tonumber(amount)

 if not amount then
 return
 end

 amount = math.floor(amount)

 if amount < 1 or amount > 100000 then
 return
 end

 givePlayerMoney(target, amount)

 outputDebugString(
 "[ADMIN] "
 .. getPlayerName(client)
 .. " выдал "
 .. tostring(amount)
 .. " игроку "
 .. getPlayerName(target),
 3
 )
 end
)

Сервер должен проверять

  • объект client;
  • ACL-право сотрудника;
  • тип целевого элемента;
  • тип переданного значения;
  • минимальный и максимальный диапазон;
  • частоту вызовов;
  • результат операции;
  • запись действия в журнал.

Что лучше проверять: группу или право

Проверка конкретной группы

local adminGroup = aclGetGroup("Admin")

if adminGroup
and isObjectInACLGroup(
 "user." .. getAccountName(getPlayerAccount(player)),
 adminGroup
) then
 -- действие администратора
end

Такой код жёстко привязан к группе с названием Admin.

Проверка отдельного права

if hasObjectPermissionTo(
 player,
 "resource.admin_tools.kickPlayer",
 false
) then
 -- действие разрешено
end

Преимущества проверки права

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

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

Настройка ACL через webadmin

Для работы веб-интерфейса должны быть запущены необходимые ресурсы:

start resourcebrowser
start resourcemanager
start webadmin

В mtaserver.conf должен быть включён HTTP-сервер:

<httpserver>1</httpserver>
<httpport>22005</httpport>

Локальный адрес

http://127.0.0.1:22005/

Адрес VPS

http://IP_СЕРВЕРА:22005/

Авторизуйтесь под серверным аккаунтом администратора. В интерфейсе доступны разделы групп и списков ACL.

Через webadmin можно

  • просматривать группы;
  • создавать новые роли;
  • добавлять аккаунты;
  • добавлять ресурсы;
  • подключать списки прав;
  • редактировать отдельные разрешения;
  • управлять ресурсами сервера.

Управление ACL через Lua-функции

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

Создание группы и списка прав

local function createSupportACL()
 local group = aclGetGroup("SupportTeam")

 if not group then
 group = aclCreateGroup("SupportTeam")
 end

 if not group then
 outputDebugString(
 "[ACL] Не удалось создать группу SupportTeam.",
 1
 )

 return false
 end

 local rightsACL = aclGet("SupportRights")

 if not rightsACL then
 rightsACL = aclCreate("SupportRights")
 end

 if not rightsACL then
 outputDebugString(
 "[ACL] Не удалось создать список SupportRights.",
 1
 )

 return false
 end

 aclSetRight(
 rightsACL,
 "resource.reports.answer",
 true
 )

 aclSetRight(
 rightsACL,
 "resource.reports.close",
 true
 )

 aclSetRight(
 rightsACL,
 "resource.admin_tools.banPlayer",
 false
 )

 aclGroupAddACL(group, rightsACL)

 aclSave()

 outputDebugString(
 "[ACL] Группа SupportTeam настроена.",
 3
 )

 return true
end

Добавление аккаунта в группу

local function addAccountToSupport(accountName)
 if type(accountName) ~= "string"
 or accountName == "" then
 return false
 end

 local group = aclGetGroup("SupportTeam")

 if not group then
 return false
 end

 local objectName = "user." .. accountName

 if isObjectInACLGroup(objectName, group) then
 return true
 end

 local added = aclGroupAddObject(
 group,
 objectName
 )

 if added then
 aclSave()
 end

 return added
end

Удаление пользователя из группы

local function removeAccountFromSupport(accountName)
 local group = aclGetGroup("SupportTeam")

 if not group then
 return false
 end

 local removed = aclGroupRemoveObject(
 group,
 "user." .. tostring(accountName)
 )

 if removed then
 aclSave()
 end

 return removed
end

Как применить изменения ACL

Самый безопасный способ

  1. Остановите MTA Server.
  2. Создайте резервную копию.
  3. Отредактируйте acl.xml.
  4. Проверьте структуру XML.
  5. Сохраните файл.
  6. Запустите сервер.

Перезагрузка без остановки

После ручного редактирования выполните в серверной консоли:

reloadacl

После программного изменения

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

aclSave()

Проверка после применения

  • авторизуйтесь тестовым аккаунтом;
  • проверьте разрешённую команду;
  • проверьте запрещённую команду;
  • перезапустите нужный ресурс;
  • просмотрите серверную консоль;
  • включите debugscript 2;
  • убедитесь, что изменения сохранились после перезапуска.

Распространённые ошибки ACL

Администратор не получает права

  • аккаунт не был создан;
  • объект добавлен не в ту группу;
  • отсутствует префикс user.;
  • указан игровой ник вместо аккаунта;
  • пользователь не выполнил login;
  • ACL не был перезагружен;
  • редактировался файл другого сервера;
  • в XML присутствует ошибка.

Изменения исчезают после выключения

Файл редактировался при работающем сервере и был перезаписан текущим состоянием. Остановите сервер перед ручным изменением.

Ресурс пишет Access denied

  • не выдано право function.;
  • в ACL указана команда вместо функции;
  • неверно написано имя ресурса;
  • запрос aclrequest остался pending;
  • ресурс находится только в Everyone;
  • разрешена не та функция.

Команда доступна обычному игроку

  • право разрешено в Default;
  • игрок состоит в другой группе;
  • Lua-код не проверяет собственное право;
  • проверка использует разрешение по умолчанию;
  • сервер доверяет клиентскому событию;
  • существует вторая команда с таким же названием.

Команда запрещена даже администратору

  • нужное право отсутствует в списках Admin;
  • используется собственное право ресурса;
  • в коде написано другое название права;
  • регистр или название команды не совпадает;
  • аккаунт не авторизован;
  • ACL ещё не перезагружен.

Ресурс не появляется в aclrequest

  • в meta.xml нет блока aclrequest;
  • ресурс не был обновлён командой refresh;
  • meta.xml содержит ошибку;
  • неправильно указано название права;
  • ресурс не обнаружен сервером.

Ошибка парсинга acl.xml

  • не закрыт тег;
  • не закрыта кавычка;
  • список ACL помещён внутрь группы;
  • дублируется имя элемента;
  • удалён корневой тег;
  • добавлен текст вне XML-структуры.

Сотрудник получает больше прав, чем ожидалось

Проверьте все группы, в которых находится аккаунт. Он может одновременно состоять в Moderators, Developers и Admin.

Права работают только после полного перезапуска

Выполните команду:

reloadacl

Затем повторно авторизуйтесь и перезапустите ресурс, который кэширует результат проверки.

Безопасная настройка ACL

  • создавайте отдельный аккаунт каждому сотруднику;
  • не используйте общий административный пароль;
  • не добавляйте обычных игроков в Admin;
  • не добавляйте неизвестные ресурсы в Admin;
  • не разрешайте все запросы aclrequest автоматически;
  • не выдавайте general.ModifyOtherObjects без необходимости;
  • не разрешайте функции ACL обычным игровым ресурсам;
  • не храните резервную копию в публичном архиве;
  • проверяйте серверные события независимо от ACL команды;
  • используйте запрет по умолчанию в hasObjectPermissionTo;
  • ограничивайте доступ к webadmin;
  • удаляйте аккаунты бывших сотрудников;
  • регулярно проверяйте группы и объекты;
  • записывайте опасные административные действия в журнал;
  • тестируйте новую роль на отдельном аккаунте.

Минимально необходимые права

Спидометру не нужны:

function.banPlayer
function.startResource
function.aclSetRight
general.ModifyOtherObjects

Системе репортов обычно не нужны:

function.shutdown
function.removeAccount
command.stopall
general.tab_acl

Чем меньше полномочий у ресурса, тем меньше потенциальный ущерб при ошибке или уязвимости.

Периодическая проверка

Раз в несколько недель проверяйте:

  • список объектов в Admin;
  • неиспользуемые аккаунты;
  • ресурсы с расширенными функциями;
  • права на управление другими ресурсами;
  • права на изменение ACL;
  • ожидающие запросы aclrequest;
  • доступ к webadmin;
  • актуальность резервной копии.

Частые вопросы по ACL MTA:SA

Где находится acl.xml?

В каталоге mods/deathmatch установленного MTA Server.

Нужно ли останавливать сервер перед изменением?

Это наиболее безопасный способ. При редактировании во время работы выполните reloadacl и убедитесь, что изменения не были перезаписаны.

Как создать аккаунт администратора?

В серверной консоли выполните addaccount логин пароль.

Как выдать аккаунту Admin?

Добавьте объект user.ЛОГИН внутрь группы Admin.

Ник игрока и аккаунт — одно и то же?

Нет. В ACL используется имя серверного аккаунта, под которым игрок выполняет команду login.

Как войти в аккаунт?

Откройте F8 и выполните login логин пароль.

Как удалить права администратора?

Удалите объект аккаунта из группы Admin и перезагрузите ACL.

Можно ли создать собственную группу?

Да. Создайте элемент group, отдельный список acl и подключите его к группе.

Что означает access="true"?

Список разрешает указанное действие.

Что означает access="false"?

Список явно запрещает указанное действие.

Чем command отличается от function?

command. управляет использованием команды пользователем, а function. — вызовом защищённой серверной функции Lua-ресурсом.

Для чего нужен префикс resource?

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

Что такое user.*?

Маска всех пользовательских аккаунтов.

Что такое resource.*?

Маска всех серверных ресурсов.

Можно ли добавить ресурс в Admin?

Технически да, но это выдаёт очень широкие полномочия. Безопаснее разрешить только необходимые функции.

Как посмотреть запросы ресурса?

Выполните aclrequest list название_ресурса.

Как разрешить один запрос?

Используйте aclrequest allow ресурс право.

Как запретить запрос?

Используйте aclrequest deny ресурс право.

Как применить ручное изменение?

Выполните команду reloadacl либо перезапустите сервер.

Почему ресурс пишет not enough permissions?

Ресурс вызывает защищённую функцию без соответствующего права function..

Можно ли проверять только группу Admin в Lua?

Можно, но проверка отдельного права предоставляет владельцу сервера больше гибкости.

Как запретить действие по умолчанию?

Передайте false третьим аргументом hasObjectPermissionTo.

Защищает ли ACL клиентское событие автоматически?

Нет. Серверный обработчик должен самостоятельно проверять client, ACL-право и все полученные аргументы.

Можно ли управлять ACL через браузер?

Да. Запустите webadmin и откройте HTTP-адрес MTA Server.

Можно ли изменять ACL через Lua?

Да. Для этого существуют функции aclCreate, aclCreateGroup, aclSetRight, aclGroupAddACL, aclGroupAddObject и другие.

Нужно ли вызывать aclSave?

Изменения обычно сохраняются автоматически с задержкой, но aclSave() позволяет доверенному ресурсу принудительно сохранить файл сразу.

Почему нельзя разрешать ModifyOtherObjects всем ресурсам?

Право позволяет взаимодействовать с другими ресурсами и значительно увеличивает возможный ущерб при уязвимости.

Как безопасно выдать разработчику доступ?

Создайте отдельную группу с ограниченным набором команд или используйте отдельный тестовый сервер.

Как восстановить ACL после ошибки?

Остановите сервер, верните сохранённую копию acl.xml и запустите сервер повторно.

Заключение

ACL на сервере MTA:SA состоит из групп, объектов и списков прав. Пользовательские аккаунты записываются как user.ЛОГИН, а серверные ресурсы — как resource.НАЗВАНИЕ.

Для назначения владельца создайте аккаунт командой addaccount, остановите сервер и добавьте его в группу Admin. Для модераторов, помощников и разработчиков лучше создавать отдельные роли с ограниченными разрешениями.

Права command. управляют серверными командами пользователей, function. разрешают ресурсам вызов защищённых Lua-функций, а собственные права resource. позволяют гибко защищать функции игрового режима.

Не добавляйте неизвестные ресурсы в Admin. Используйте блок aclrequest в meta.xml и разрешайте только те функции, которые действительно нужны ресурсу.

В собственных командах и серверных событиях проверяйте доступ через hasObjectPermissionTo с запретом по умолчанию. ACL не заменяет проверку аргументов, объекта client, диапазонов значений и запись административных действий в журнал.

Установка MTA Server:

Установить сервер MTA:SA

Основная настройка сервера:

Настроить MTA Server

Настройка файла mtaserver.conf:

Открыть руководство по mtaserver.conf

Установка ресурсов и скриптов:

Установить Lua-ресурсы MTA

RSS инструкций
0 комментариев 0.0 из 0 оценок
MIAMI RP COMMUNITY

Комментарии к инструкции

Обсудите решение, задайте вопрос или дополните инструкцию

Всего: 0
Страница: /
Показано: 0
Добавление комментариев сейчас недоступно для текущего пользователя.