Lista de Controle de Acesso
O MTA possui uma lista de controle de acesso chamada ACL (Access Control List ou Lista de Controle de Acesso). Ele permite proteger e limitar o acesso ao servidor, a suas funções e recursos da forma desejada.
Um conceito chave do ACL é que você dá a um determinado objeto um conjunto de direitos. No MTA, os objetos são ora recursos, ora usuários. Existem inúmeros direitos disponíveis, e eles principalmente se referem às funções do lado do servidor (server-side, em Inglês).
Em outras palavras, o ACL permite que você escolha exatamente o que é permitido - o que um recurso ou usuário pode fazer. Essa funcionalidade dentro do jogo é essencial, porque por exemplo, ele impede os jogadores comuns do seu servidor serem capazes de banir outros jogadores, ou previne novos recursos não testados de fazerem o mesmo.
É claro, qualquer grande poder precisa de grandes responsabilidades, ou seja, é facílimo romper completamente os recursos. Por exemplo, desativar a função spawnPlayer para todos eles seria uma coisa ruim. Porém, há certas situações em que será necessário fazer isso, mesmo sendo uma medida bem rígida.
Anatomia do ACL
Há em dois componentes principais no arquivo: os grupos e as listas. Eles aparecem como tags <group name=""> e <acl name="" />. Suas finalidades são:
1. Conceder permissão a usuários para controlar o servidor e usar comandos oferecidos pelos recursos. Exemplos:
- Permitir administradores a usem apenas a função giveweapon do Freeroam.
- Permitir todos os usuários iniciem recursos.
2. Conceder permissão a recursos para usar funções de script e de outros recursos. Exemplos:
- Permitir um recurso utilizar a função restartResource.
- Permitir um recurso utilizar funções exportadas por um script a partir do call.
Grupos Padrões
MTA fornece alguns grupos padrões com permissões em ordem decrescente (mais restrito). Estes grupos são os seguintes:
- Everyone
- Moderator
- SuperModerator
- Admin
- Console - Este controla as permissões de pessoas que estão usando o console do servidor através do objeto: <object name="user.Console" />
- RPC - Remote Procedure Call. Especificamente concede acesso à função callRemote e o desativa a demais recursos. Dê uma olhada em sua página para saber mais.
Para explicar melhor, será usado o grupo Everyone como exemplo. Se você não tiver modificado o arquivo ainda, ele é idêntico a isso:
<group name="Everyone"> <acl name="Default" /> <object name="user.*" /> <object name="resource.*" /> </group>
Você primeiro deve identificar o conjunto ACL (o nome) dentro do grupo. Essa tag define quais são poderes do grupo. Quaisquer usuários e recursos neste grupo herdarão as permissões estabelecidos neste conjunto com o nome de "Default".
Obs: É bom destacar que esse grupo é especial, pois inclui todos os usuários e recursos por meio de um asterisco (*) ; ou seja, os nomes de todos serão automaticamente preenchidos pelo computador na hora da leitura
Agora, desça um pouco o ACL e você verá a entrada <acl name="Default" />. Note que eu omiti drasticamente esta lista devido a sua extensão.
<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 - cada tag dele representa uma função do MTA. Por exemplo, se um recurso precisa usar a função restartResource e ele estiver no grupo "Everyone", será negado o acesso e ele não funcionará corretamente.
- Command - cada um se refere a um comando criado com addCommandHandler. Um exemplo de comando seria digitar "/createvehicle [ID]" no chat para o recurso Freeroam criar um veículo. Em outras palavras, esse elemento controla se os usuários do grupo ACL podem ou não usar o comando. Os comandos não fazem nenhum efeito sobre os recursos incluídos no grupo, ou seja, os comandos só servem para usuários.
- General, é um direito personalizado criado pelo recurso "admin", mas ele funciona com os mesmos princípios. O script trabalha com eles através da função hasObjectPermissionTo.
É possível notar alguns grupos, tais como admin, possuem múltiplas tags do tipo <acl name="" /> definidas nele. Um exemplo:
<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>
O que acontece aqui é: a cada tag <acl name="" /> apresentada, todas suas permissões serão concedidas a esse grupo. Por exemplo, o recurso admin se certifica que ganhou todas as permissões de administrador ao usar todos os conjuntos. Caso houver conflito, é dada prioridade ao seguinte. Partindo do exemplo acima, é apresentado o esquema a seguir:
1. O conjunto <acl name="Moderator"> define a permissão <right name="general.ModifyOtherObjects" access="false" /> como negada
2. O conjunto <acl name="Admin"> define a permissão <right name="general.ModifyOtherObjects" access="true" /> como permitida
3. Portanto, para todos os usuários e recursos do grupo "admin", a permissão será: <right name="general.ModifyOtherObjects" access="true"/> permitida
Grupos e Recursos ACL
É possível notar que alguns outros grupos vieram no arquivo. Eles são identificados como recursos já inclusos na instalação. Se um recurso deseja designar direitos específicos não previstas pelos grupos padrões do MTA, ele pode criar o seu próprio grupo e conjunto ACL, e usá-lo eventualmente. Por exemplo, o recurso AMX foi projetado para emular scripts do SA-MP e ele precisa de um certo conjunto de permissões que não se enquadram nos grupos existentes. Então ele criou seus próprios conjuntos no arquivo, como mostra a seguir:
<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>
Modificando o ACL
Há três maneiras de alterar o ACL, como você irá fazer isso depende de onde partirá a alteração:
Interface HTTP
Você pode usar a interface HTTP oferecida pelo webadmin para modificar o ACL no seu navegador. Esta é a maneira mais fácil de modifica-lo. Apenas certifique-se de que o servidor está executando os recursos de webadmin e visite http://<IP-do-servidor>:<porta>/. Em seguida, será possível acessar duas seções:
- ACLs - permite que você crie suas lista de controle de acesso
- Groups - permite criar grupos de usuários e atribuir-lhes a um conjunto ACL
Por exemplo, a seção ACLs permite que dê a um grupo de administradores existente o acesso ao comando start do console. Em seguida, você pode ir até a seção "Groups" e criar um novo grupo de administração, tendo acesso a esse mesmo conjunto ACL referido na seção ACLs. Finalmente, você pode adicionar novos usuários e esse grupo criado.
Arquivo XML
Você pode modificar o arquivo ACL.xml manualmente. Ele tem uma sintaxe bastante simples, mas pode ficar um pouco confuso às vezes. Se você editá-lo quando o servidor estiver em execução, não se esqueça de chamar a função de script aclReload ("start runcode", "run aclReload()"), para a nova ACL carregar as alterações. Desta maneira, serão evitadas substituições acidentais no servidor.
Funções de Scripting
Você pode usar um certo número de funções de script para modificar a ACL. Claro, você pode (e certamente deve!), limitar o acesso à funções ACL através do próprio ACL.xml. Note-se que o recurso admin, incluso na instalaçao do MTA, pode ser usado para gerenciar a ACL na aba "resources". Você deve estar logado como administrador para usar o painel de administração. Clique aqui para mais informações de como se fazer isto.
Veja também
- aclCreate
- aclCreateGroup
- aclDestroy
- aclDestroyGroup
- aclGet
- aclGetGroup
- aclGetName
- aclGetRight
- aclGroupAddACL
- aclGroupAddObject
- aclGroupGetName
- aclGroupList
- aclGroupListACL
- aclGroupListObjects
- aclGroupRemoveACL
- aclGroupRemoveObject
- aclList
- aclListRights
- aclReload
- aclRemoveRight
- aclSave
- aclSetRight
- hasObjectPermissionTo
- isObjectInACLGroup