RU/Access Control List в Multi Theft Auto (MTA)

#1 2014.07.17 18:43:53

0

MTA включает в себя полноценный Access Control List (ACL, список контроля доступа), позволяющий вам обезопашивать и ограничивать доступ к серверу, его функциям и ресурсам любыми способами, которыми вы пожелаете.

Ключевая концепция MTA'шного ACL (и ACL в целом) - то, что вы даете определенному объекту набор прав. В случае с MTA, объекты - это одно из двух: либо ресурсы, либо пользователи. В MTA доступно множество прав - они в основном сфокусированы на скриптинговых функциях серверной стороны.

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

Конечно, большая сила влечет за собой большую ответственность, и очень легко можно сломать ресурсы полностью - например, отключение spawnPlayer для всех ресурсов будет ОЧЕНЬ плохой идеей. В то же время, есть ситуации, когда вам может захотеться это сделать - если вы хотите принудить все свои ресурсы использовать ресурс spawn manager, например, но даже это несколько драконовские меры.

Понимание ACL
ACL состоит из двух важных компонентов: групп и ACL-списков. Они фигурируют как узлы <group name=""> и <acl name="" />. Их назначение:

1. Предоставить пользователям полномочия контролировать сервер и пользоваться командами ресура. Примеры:
- Позволить только админам использовать функцию giveweapon мода freeroam
- Позволить всем пользователям запускать ресурс
2. Предоставить ресурсам полномочия использовать функции скриптинга и функции других ресурсов. Примеры:
- Позволить ресурсу использовать функцию restartResource
- Позволить ресурсу использовать функцию call для использования экспортированных из другого скрипта функций

Группы по умолчанию

MTA предоставляет некоторые группы по умолчанию, в списке они по возрастанию полномочий. Эти группы:
Everyone
Moderator
SuperModerator
Admin

Console - Эта контролирует полномочия людей, которые используют консоль, через <object name="user.Console" />
RPC - Remote Procedure Call (Удаленный Вызов Процедуры). Конкретно эта предоставляет доступ только к callRemote и отключает команды ресурсов по умолчанию. Для подробностей смотрите саму функцию.

Для дальнейших объяснений, я воспользуюсь группой Everyone в качестве образца. По умолчанию это выглядит так:
<group name="Everyone">
<acl name="Default" />
<object name="user.*" />
<object name="resource.*" />
</group>


Сначала вы заметите имя ACL-списка внутри группы. Он обозначает, какие у группы полномочия. Пользователи и ресурсы, принадлежные данной группе, будут иметь полномочия, указанные в acl-списке с названием "Default". Заметка: Вы увидите, что эта группа - особенная, в нее входит любой пользователь и ресурс, это благодаря использованию шаблона (*) на месте, где должно быть название пользователя или ресурса.

Теперь прокрутите далее вниз ACL'а и вы увидите acl-список <acl name="Default" />. Заметьте, что я значительно обрезал данный список из-за его длины.

<acl name="Default">
<right name="command.start" access="false" />
<right name="command.stop" access="false" />
<right name="command.stopall" access="false" />
...и т.д. и т.д...
<right name="function.executeCommandHandler" access="false" />
<right name="function.setPlayerMuted" access="false" />
<right name="function.restartResource" access="false" />
...и т.д. и т.д...
<right name="general.adminpanel" access="false" />
<right name="general.tab_players" access="false" />
<right name="general.tab_resources" access="false" />
...и т.д. и т.д...
<right name="command.freeze" access="false" />
<right name="command.shout" access="false" />
<right name="command.spectate" access="false" />
...и т.д. и т.д...
</acl>


Function - записи регулируют скриптинговые функции MTA. Например, если ресурсу понадобилось воспользоваться restartResource, а он лишь в группе 'Everyone' (с acl-списком 'Default'), ему будет отказано в доступе к restartResource и он откажется полноценно работать.

Command - записи регулируют использование команд, которые создаются при использовании ресурсом addCommandHandler'ов. Примером использования команды служит ввод в чате /createvehicle

[vehicle] при ресурсе freeroam. Данные записи контролируют, могут ли пользователи группы, использующей данный ACL-список, использовать эту команду. Заметка: команды не влияют на ресурсы внутри группы. Команды связаны только с пользователями.

General - самостоятельно придуманная группа записей, созданная ресурсом admin, хотя она работает по схожим принципам. Скрипт работает с ними через использование hasObjectPermissionTo

Вы заметите, что некоторые группы, такие как Admin, имеют несколько узлов <acl 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.Ransom" />
</group>


Это дает все полномочия, описанные в каждом из узлов <acl name="" />, по порядку списка. Так что, например, группа Admin благодаря использованию всех ACL-списков удостоверяется, что администраторам даются все полномочия. Если получается слишком много конфликтов, приоритет отдается самой нижней записи. В образце выше:

1. <acl name="Default"> устанавливает <right name="general.http" access="false" /> <br\>
2. <acl name="Admin"> устанавливает <right name="general.ModifyOtherObjects" access="true" /> <br\>
3. Для всех пользователей и ресурсов в группе admin будет:
<right name="general.ModifyOtherObjects" access="true" /><br\> <br\>
#2 2014.07.17 18:47:07

0

Группы и ACL ресурсов

Вы заметите, что вместе с использованием MTA появляются и некоторые другие группы. Они определены ресурсами, которые идут вместе с MTA. Если ресурс хочет обозначить собственные ACL-права, не предоставляемые группами MTA по умолчанию, он может создать ACL со своими собственными названием и группой и использовать его. Я покажу это на примере AMX. AMX предназначен для эмуляции SA-MP скриптов, и ему нужен определенный набор полномочий, который, в том числе, не входит в рамки групп по умолчанию. Он покан ниже:
<group name="AMX">
<acl name="AMX" />
<object name="resource.amx" />
</group>

<acl name="AMX">
<right name="general.ModifyOtherObjects" access="true" />
<right name="function.startResource" access="true" />
<right name="function.stopResource" access="true" />
<right name="general.adminpanel" access="false" />
...и т.д. и т.д...
<right name="command.kick" access="false" />
<right name="command.freeze" access="false" />
<right name="command.mute" access="false" />
...и т.д. и т.д...
</acl>


Изменение ACL
Есть три способа изменения ACL - как это делать зависит от вас.

HTTP-интерфейс
Вы можете воспользоваться http-интерфейсом webadmin для изменения ACL через ваш веб-браузере. Это наиболее легкий способ. Просто удостоверьтесь, что на сервере запущен ресурс webadmin и посетите http://IPсервера:Httpпорт/. Затем вам будут доступны две секции - ACLs и Groups. ACLs позволяет вам создавать ваш Access Control List - список прав. Groups позволяет вам вместе группировать скопления пользователей и назначать им ACL-список. Например, секция ACLs позволяет вам указывать, что пользователи группы с ACL-списком Admin имеет доступ к консольной команде start. Затем вы можете зайти в секцию Groups и создать группу Admin, имеющую доступ к вашему acl-списку Admin. Потом вы сможете добавлять в вашу группу Admin пользователей.

XML-файл
Вы можете вручную изменять файл ACL.xml. Он обладает довольно простым синтаксисом, но может временами немного вводить в заблуждение. Если вы редактируете его, когда сервер запущен, либо потом не забудьте вызвать скриптинговую функцию aclReload ("start runcode", "run aclReload()"), чтобы новый ACL загрузился, либо перед внесением изменений остановите сервер. Это также предотвратит случайную перезапись ваших изменений сервером.

Функции скриптинга
Вы можете использовать огромное количество скриптинговых ACL-функций для его изменения "на лету". Конечно, можно (и на самом деле нужно!) ограничивать доступ к ACL-функциям через сам ACL. Заметьте, что ресурс admin, идущий вместе с MTA, может использоваться для распоряжения ACL (из вкладки "resources"). Вы должны быть админом сервера для использования этого.

Инструкции по установке admin.
A quick tutorial on how to get admin rights and install admin resource.
Click to expand [+]MTA 1.0.0 and lower
To add an account in MTA 1.3 use the following command in the server
Note: The server needs to run for this action

addaccount <username> <password>

Note: Server should not be running when you are editing the acl file below
Then you open the acl.xml file located in the same folder and add yourself as an object to the Admin group by using the 'user.*' syntax, where * would be your account name.
Img


Now open your mtaserver.conf file and scroll to the bottom, make sure the admin resource is added to the ones that start with the server (note: protected="1" means that it can not be stopped).

Img


Now that you're done with server files, you can finally start it. Connect to the server itself and login with your account details: use 'login [username] <password>'. If it tells you to press 'p' you have done everything right, congratulations! If not, do this from the very beginning.
Отредактировано: Panda 2022.08.05 13:35:00
#3 2014.07.17 18:48:13

0

aclReload

This function reloads the ACL's and the ACL groups from the ACL XML file. All ACL and ACL group elements are invalid after a call to this and should not be used anymore.

Syntax
bool aclReload ()

OOP Syntax
Method: ACL.reload()

Returns
Returns true if the XML was successfully reloaded from the file, false or nil if the XML was invalid, didn't exist or could not be loaded for some other reason.

Example
This example allows an admin to reload the ACL by typing "/reloadACL".

function reloadACL ( source, command )
-- Check if they're an admin...
if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( source )), aclGetGroup ( "Admin" ) ) ) then
local reload = aclReload() -- Reload the ACL
if ( reload ) then -- Check it was reloaded successfully
outputChatBox ( "ACL was successfully reloaded.", source, 255, 0, 0 ) -- If so, output it
else -- If not, output it (line below)
outputChatBox ( "An unknown error occured. Please check the ACL file exists.", source, 255, 0, 0 )
end
else -- If they're not an admin, output it (below)
outputChatBox ( "You must be an admin to use this command!", source, 255, 0, 0 )
end
end
addCommandHandler ( "reloadACL", reloadACL )