Controlo de Acesso de Utilizadores,
Aplicações e Máquinas

Identificação

Para que se possa controlar o acesso aos recursos de um sistema informático é necessário antes de mais um sistema de identificação para as entidades que realizam o acesso.

Os utilizadores são geralmente identificados através de nomes curtos, obedecendo a certas restrições, geralmente utiliza-se o primeiro ou o último nome do utilizador real, ou por exemplo as respectivas iniciais. Normalmente não são permitidos espaços, e as letras maiusculas e minusculas podem ou não ter o mesmo significado.

Internamente, por razões práticas o sistema atribui a cada utilizador um número de identificação, geralmente conhecido por UID ("User IDentifier").

As aplicações em execução (processos) usam geralmente identificadores de utilizadores. Normalmente a identificação adoptada é a do utilizador que tomou a iniciativa de "arrancar" a aplicação, mas existe geralmente a possibilidade (controlada) de a aplicação adoptar também a identificação do proprietário do ficheiro executável.

As máquinas são habitualmente identificadas pelo seu nome ou endereço, a identificação de máquinas para controlo de acesso tem muitas vezes uma utilização complementar relativamente à identificação de utilizadores, por exemplo para restringir as máquinas que um dado utilizador pode usar.

A identificação de máquinas também pode ser usada para definir acessos de forma independente da identificação de utilizador, por exemplo definindo quais as máquinas que têm acesso a determinados serviços. Para que este mecanismo seja fiável é necessário um total controlo sob a rede, ou então a existencia de um processo de autenticação das máquinas, evitando que um intruso utilize uma máquina não autorizada para simular uma máquina autorizada.

Qualquer identificação só podem ser aceite depois de autenticada, no caso de endereços de máquinas isto pode ser dispensado numa rede local sobre a qual existe um grande controlo.

Controlo de acesso de utilizadores

Excluindo o controlo de acesso de máquinas, tudo se resume geralmente ao controlo do acesso de utilizadores, as aplicações ficam automaticamente englobadas pelas razões anteriormente apontadas.

Os principios de implementação do controlo de acesso são simples: para cada objecto do sistema é necessário definir quais os direitos (permissões) que cada utilizador possui, o sistema operativo utiliza estas definições para decidir se deve ou não autorizar uma determinada operação requesitada por um utilizador.

Grupos de Utilizadores

Dado o número de utilizadores e objectos envolvidos, a definição de direiros para cada par (utilizador, objecto) é extremamente pesada, quer sob o ponto de vista do sistema quer sob o ponto de vista administrativo. A solução é agrupar, surge assim o conceito de grupo de utilizadores, normalmente é também identificado por um nome e possui também um número de identificação interno: GID ("Group IDentifier").

O principio de funcionamento é simples, se um dado grupo possui determinados direitos sobre um objecto, então todos os membros desse grupo possuem esses direitos. Eventuais direitos adicionais que um utilizador possui sobre o objecto acomulam com os direitos derivados do facto de pertencer ao grupo.

Geralmente existe um grupo ao qual pertencem todos os utilizadores, este grupo pode ou não ser explicito. Num caso implicito trata-se de definir direitos por omissão (ou direitos mínimos), um utilizador que não possui nunhum direito explicito sobre o objecto (quer particularmente, quer via grupos a que pertence) possui pelo menos aquelas direitos mínimos.

Colocam-se algumas questões quando um utilizador pertence a vários grupos, por exemplo quando um utilizador cria um ficheiro com direitos de leitura para o grupo, a que grupo se está a referir ? Este problema pode ser resolvido de várias formas, por exemplo associando ao ficheiro o grupo a que pertence.

Também os objectos podem ser agrupados segundo algum principio para facilitar a definição de direitos. O modo de o fazer depende do tipo de objecto.

Direitos sobre Objectos

Obviamente que o tipo de direitos e forma de os definir depende do tipo de objecto, podemos distiguir os seguintes componentes de um sistema informático:

  • Processador
  • Memória (memória central)
  • Dispositivos periféricos

Num sistema multi-utilizador, as aplicações em execução pertencem a diferentes utilizadores. Cada aplicação em execução (processo) possui também um UID, corresponde geralmente ao UID do utilizador que a está a usar. O sistema operativo verifica se o UID em questão possui direitos que permitem a realização das tarefas requesitadas.

Num sistema operativo protegido, as aplicações não acedem directamente aos objectos, todos os acessos são realizados por invocação de funções do sistema operativo ("system-calls"). Só assim é possivel uma implementação eficiênte do controlo de acesso.

A acesso aos processadores deve ser inteiramente controlado pelo sistema operativo, num sistema mono-processador, cada aplicação em execução tem direito a uma fatia de tempo de utilização, este mecanismo é totalmente controlado pelo sistema operativo. O controlo do processador não pode simplesmente se cedido a um processo esperando que este seja bem comportado e o devolva.

A utilização da memória central num sistema multi-utilizador deve ser especialmente cuidada, a solução mais comum é a utilização de uma separação total: cada aplicação em execução tem à sua disposição um determinado número de blocos de memória à qual mais nenhuma aplicação tem acesso. Igualmente uma aplicação em execução apenas tem acesso aos blocos de memória que lhe pertencem. Como não existe partilha de memória central entre as aplicações, a eventual necessidade de comunicação terá de ser assegurada por mecanismos especiais (IPC - "Inter-process Comunication").

Os dispositivos periféricos concentram a maioria do esforço em termos de controlo de acesso, principalmente porque se pretende uma maior flexibilidade do foi sugerido para a memória central.

De entre os dispositivos periféricos destacam-se os sistemas de ficheiros, por um lado pretende-se uma grande flexibilidade, por outro lado o número de objectos pode ser muito grande. As definições de direitos podem ser implementadas em diversos níveis:

  • Volume ou disco lógico
  • Directório
  • Ficheiro
  • Registo/Campo

A maioria dos sistemas operativos genéricos ficam-se pelo nível de ficheiro, deixando a implementação de controlo mais fino para aplicações especializadas, como por exemplo gestores de bases de dados.

Uma vez definido um mecanismo de controlo de acessos para os sistemas de ficheiros é tentador tratar todos os dispositivos como ficheiros, isso é muito comum para dispositivos de acesso sequencial como impressoras, mas pode ser generalizado a todos os dispositivos de "hardware" e "software" (caso do Unix).

Como os sistemas de ficheiros são geralmente organizados em forma hierárquica o mais simples é usar essa hierarquia para agrupar os objectos por forma a simplificar a administração de direitos. Por exemplo em muitos sistemas os direitos definidos num ponto da estrutura em árvore propagam-se em sentido ascendente.

O tipo de direitos básicos que se definem habitualmente sobre sistemas de ficheiros são "leitura" e "escrita", mas dependendo do tipo de sistema podem ser definidos outros direitos: "execução", "listagem", "alteração de atributos", "impressão", "eliminação", "adição de dados", "bloqueio".

Mesmo usando a hierarquia dos sistemas de ficheiros a definição de direitos sobre os objectos pode ser pesada, existem duas abordagens base:

  • Associar a cada objecto uma lista de utilizadores e respectivos direitos (ACL - Access Control List).
  • Associar a cada utilizador uma lista de objectos e respectivos direitos.

Toda esta informação pode ficar guardada numa única base de dados do sistema, ou ser distribuída pelo sistema de ficheiros sob a forma de ACL's ou directamente associada aos objectos. Seja como for, o acesso do S.O. a esta informação deve ser o mais rápido possivel, sempre que um determinado tipo de acesso a um objecto é requesitado por um utilizador/aplicação, o S.O. tem de verificar os direitos, directamente através do UID e indirectamente, através dos GID.

Por exemplo, numa versão centralizada, com a base de dados organizada por utilizador/grupo, a remoção de um objecto pode tornar-se pesada, obrigando a percorrer todos os utilizadores e grupos do sistema.

Geralmente combinam-se os vários métodos por forma a minimizar a quantidade de informação. O espaço ocupado depende em grande parte do tipo de direitos definidos, no caso mais simples ("leitura" e "escrita") bastam dois bits para cada associação (utilizador; objecto).

Sem a necessidade de implementar uma ACL, geralmente cada objecto possui um dono ou proprietário ("owner"), também pode ficar associado ao objecto um grupo de utilizadores, e em certos sistemas é possivel associar também direitos a atribuir aos restantes utilizadores.

Autenticação

O controlo de acesso só faz sentido se existe um sistema de autenticação fiável que garanta que cada perfil de utilizador (UID) apenas pode ser usado por quem de direito. O método mais comum é a utilização de uma "password".