PL/Access Control List

From Multi Theft Auto: Wiki
Revision as of 07:16, 7 December 2020 by Tracer (talk | contribs)
Jump to navigation Jump to search

MTA zawiera pełną listę kontroli dostępu (ACL), która pozwala na zabezpieczenie i ograniczenie dostępu do serwera, jego funkcji i zasobów na wiele różnych sposobów.

Kluczową koncepcją ACL w MTA (i ogólnie list ACL) jest to, że nadajesz określonemu obiektowi zestaw praw. W przypadku MTA obiekty to jedna z dwóch rzeczy - zasoby lub użytkownicy. W MTA dostępnych jest wiele praw - dotyczą one głównie funkcji skryptowych po stronie serwera.

Zasadniczo oznacza to, że lista ACL pozwala dokładnie wybrać funkcje, które może wykonywać zasób lub użytkownik. Może to być oczywiście nieocenione - na przykład uniemożliwianie wszystkim graczom na serwerze możliwości blokowania się nawzajem lub uniemożliwienie tym samym nowym, nieprzetestowanym zasobom.

Oczywiście „z wielką mocą wiąże się wielka odpowiedzialność” i bardzo łatwo jest całkowicie zniszczyć zasoby - na przykład wyłączenie spawnPlayer dla wszystkich zasobów byłoby złą rzeczą. Aczkolwiek są sytuacje, w których możesz to zrobić - jeśli chcesz na przykład zmusić wszystkie swoje zasoby do korzystania z zasobu menedżera odradzania, ale nawet To jest nieco drakońskie.

Zrozumienie ACL

Lista ACL ma dwa główne składniki: grupy i listy ACL. Pojawiają się jako sekcje '<group name = "">' i '<acl name = "" />' . Ich celem jest:
1. Przyznanie użytkownikom uprawnień do kontrolowania serwera i używania poleceń dotyczących zasobów. Przykłady:

  • Zezwalanie tylko administratorom na używanie funkcji giveweapon zasobu Freeroam
  • Zezwalanie wszystkim użytkownikom na uruchamianie zasobu

2. Przyznaj zasobom uprawnienia do korzystania z funkcji skryptów i funkcji innych zasobów. Przykłady:

  • Zezwalanie zasobowi na używanie funkcji restartResource
  • Zezwalanie zasobowi na użycie wywołania (call) w celu użycia funkcji wyeksportowanych z innego skryptu

Domyślne grupy

MTA dostarcza do listy ACL domyślne grupy z rosnącymi uprawnieniami. Te grupy to:

  • Everyone
  • Moderator
  • SuperModerator
  • Admin
  • Console - Kontroluje uprawnienia osób, które używają konsoli poprzez <object name = "user.Console" />
  • RPC - Zdalne wywołanie procedury. W szczególności przyznaje dostęp tylko do callRemote i wyłącza polecenia zasobów domyślnych. Sprawdź funkcję, aby uzyskać szczegółowe informacje.


Aby dokładniej wyjaśnić, użyję grupy 'Everyone' jako przykładu. Domyślnie wygląda to tak:

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


Najpierw zauważysz nazwę ACL wewnątrz grupy. Określa ona, jakie uprawnienia ma dana grupa. Użytkownicy i zasoby w tej grupie będą mieć uprawnienia określone na liście nazw ACL „Default”. Uwaga: Zauważysz, że ta grupa jest wyjątkowa, ponieważ obejmuje każdego użytkownika i każdy zasób za pomocą symbolu wieloznacznego (*), co oznacza każdy element w danym podtypie.

Teraz przewiń listę ACL dalej w dół, a zobaczysz listę <acl name = "Default" />. Uwaga: Drastycznie przyciąłem tę listę ze względu na jej długość.

    <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>


  • Functions (Funkcje) są domyślnymi funkcjami skryptowymi MTA. Na przykład, jeśli zasób wymagałby użycia restartResource i znajdował się tylko w grupie „Everyone” (z listą „Default”), odmówiono by mu dostępu do restartResource i nie działałby poprawnie.
  • Commands (Komendy) są tworzone, gdy zasób używa funkcji addCommandHandler. Przykładem może być wpisanie /createvehicle [pojazd] w oknie czatu dla zasobu freeroam. Określa, czy użytkownicy w grupie używającej tej listy ACL mogą używać tej komendy.

Uwaga: polecenia nie mają wpływu na zasoby w grupie. Komendy dotyczą tylko użytkowników.

  • General (Ogólne) to niestandardowa grupa nazw utworzona przez zasób administracyjny, ale działa na tych samych zasadach. Skrypt współpracuje z nimi za pomocą hasObjectPermissionTo

Zauważysz, że niektóre grupy, takie jak admin, mają wiele sekcji <acl name = "" />. Przykładem jest grupa administracyjna (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.Random" />
    </group>

W ten sposób uzyskujesz wszystkie permisje zdefioniowane w każdej sekcji <acl name="" /> w kolejności umieszczenia na liście. Na przykład grupa administratorów (Admin) sprawdza czy wszystkie uprawnienia są nadane członkom grupy Administratorzy (Admin) korzystając ze wszystkich list. W przypadku konfliktów wygrywa najniższy wpis. Załóżmy na przykład, że te 2 listy ACL znajdują się w grupie w następującej kolejności:

1. <acl name="Default"> ustawia <right name="general.ModifyOtherObjects" access="false" />
2. <acl name="Admin"> ustawia <right name="general.ModifyOtherObjects" access="true" />
3. Dla wszystkich użytkowników i zasobów w grupie administratorskiej: <right name="general.ModifyOtherObjects" access="true" />


Grupy zasobów i listy ACL

Zauważysz, że istnieją jeszcze inne wbudowane grupy. Zostały one zdefiniowane przez zasoby dostarczone z MTA. Jeśli zasób chce wyznaczyć określone prawa ACL, które nie są dostarczane przez domyślne grupy, może utworzyć własną nazwę ACL i grupę, która będzie z niej korzystać. Jako przykład pokażę grupę AMX. AMX jest przeznaczony do emulacji skryptów SA-MP i potrzebuje określonego zestawu uprawnień, który nie pasuje dobrze do grup domyślnych. Jest to pokazane poniżej:

    <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>

Prawa dostępu zasobów do innych zasobów

Aby zezwolić na dostęp do dowolnego innego zasobu, musisz zezwolić na to w pliku ACL. Reguła general.ModifyOtherObjects przyznaje pełny dostęp do dowolnego zasobu na serwerze. Zobacz przykład w ostatniej sekcji, jak powinien on wyglądać.

Jeśli nie chcesz nadawać zasobowi pełnego dostępu do każdego zasobu na serwerze, możesz dołączyć nazwę zasobu poprzedzoną kropką (.) do reguły general.ModifyOtherObjects:

    <acl name="Custom">
        <right name="general.ModifyOtherObjects.resourceName" access="true" />
        <right name="general.ModifyOtherObjects.admin" access="true" />
        <right name="general.ModifyOtherObjects.runcode" access="true" />
        <right name="general.ModifyOtherObjects.mapmanager" access="true" />
    </acl>

Powyższe definicje ACL przyznają każdemu zasobowi z listą ACL "Custom" dostęp do zasobów "resourceName", "admin", "runcode" i "mapmanager”.