next up previous
Next: Identificadores dos usuários Up: Informações relativas ao usuário Previous: Login


Direitos de acesso em UNIX

Cada arquivo possui, em seu nó de indexação, um identificador (ou) ID do usuário, um identificador (ou ID) do grupo do proprietário. O nó de indexação contém ainda um número binário de 16 bits para o qual os 9 primeiros dígitos (os mais à direita) constituem o direito de acesso interpretados como autorização para a leitura, a escrita e a execução pelo proprietário, grupo, ou outros usuários. Se o bit está em 0, o direito de acesso é negado, se está em 1, o contrário.

Os nove primeiros bits são detalhados a seguir:

Para modificar os direitos de acesso dos arquivos, deve-se utilizar o comando shell chmod. Existem uma série de opções para esse comando, as quais podem ser visualizadas via man. Algumas opções mais usadas são as seguintes:

Se nada é definido, as mudanças são aplicadas a todos os campos.

Exemplo:

Muitas vezes, durante a utilização de primitvas de I/O (entrada/saída), às vezes é necessário indicar os direitos de acesso associados ao arquivo, utilizando-se para isso um valor inteiro associado obtido da conversão do valor binário em octal. Por exemplo, para ter a autorização de leitura, escrita e execução pelo proprietário e pelo grupo, e a autorização de leitura e execução pelos outros, deve utilizar o seguinte código durante uma chamada da rotina de criação do arquivo :

1111111101 em binário que é equivalente a 775 em octal

Nos 7 bits restantes do número usado pelo nó de indexação, dois são associados a modificação do ID do usuário (bit 11 set-uid), e a modificação da identificador do grupo (bit 10 set-gid). Quando o bit 11 (respectivamente 10) é posicionado em 1, o indicador de permissão de execução para o proprietário (respectivamente, grupo) visualizado pelo comando ls está em s (veja o próximo exemplo). Seja o exemplo de um programa tendo o bit s (s para set-uid-bit) colocado em 1 (setado para o proprietário. Na execução deste programa, o usuário efetivo é mudado para o proprietário do arquivo contendo o programa. Uma vez que o usuário efetivo que determina os direitos de acesso (ver 1.4.3), isto vai permitir ao usuário de liberar temporariamente o direitos de acesso de qualquer um outro. Este observação se aplica também aos identificadores de grupo. É este mecanismo que permite a todo o usuário de modificar o arquivo /etc/passwd, mesmo sendo o root é o proprietário, através do comando shell passwd(). O bit s é colocado em 1 para o arquivo de referência /bin/passwd contendo o programa realizando este comando.

A primitiva system() permite a execução de um comando shell dentro de um programa e será mais detalhada nos próximos capítulos.

Exemplo:

                /* arquivo test_s.c */

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE * fp;
     system("echo Meu login e: $LOGNAME");
     printf("Vou tentar abrir o arquivo  /home/saibel/teste\n");
     if((fp=fopen("/home/saibel/teste","w+")) == NULL )
          perror("Error fopen()");
     else
          printf ("O arquivo teste esta aberto\n");
     exit(0);
}

Resultado da execução:

Seja saibel o proprietário do arquivo test_s conectado à máquina euler. Um arquivo teste é criado através do programa test_s), sendo que par défaut no sistema usado, somente para o proprietário do arquivo são assegurados os direitos de leitura e escrita deste arquivo. Considere agora que existe um usuário usertest, conectado à máquina lyapunov, do mesmo grupo de trabalho de saibel, que tenta abrir o arquivo teste, utilizando o programa test_s, o qual não lhe pertence (note que não há obriagatoriedade que ambos os usuários estejam conectados sob diferentes máquinas para que o exemplo seja executado; isso foi feito nesse exemplo devido a forma de visualização do prompt utilizada par défaut no sistema).

euler:~> chmod g+w test_s
euler:~> ls -la test_s
-rwxrwxr-x   1 saibel   prof        12333 Sep 25 10:08 test_s*
euler:~> test_s
Meu login e: saibel
Vou tentar abrir o arquivo  /home/saibel/teste
O arquivo teste esta aberto
euler:~> ls -la /home/saibel/teste
-rw-r--r--   1 saibel   prof            0 Sep 25 10:16 /home/saibel/teste

lyapunov:~> test_s
Meu login e: usertest
Error fopen(): Permission denied

Evidentemente a tentativa do usuário usertest irá fracassar, uma vez que ele não possui direito de acesso ao arquivo /home/saibel/teste.

Agora, saibel vai colocar em 1 o bit s do programa test_s, continuando entretanto, a deixar interditado o acesso ao arquivo teste aos outros usuários do grupo.

euler:~> chmod u+s test_s
euler:~> ls -al test_s
-rwsrwxr-x   1 saibel   prof        12337 Sep 25 10:28 test_s*

lyapunov:~> /home/saibel/test_s
Meu login e: usertest
Vou tentar abrir o arquivo  /home/saibel/teste
O arquivo teste esta aberto

O usuário usertest executando o programa /home/users/saibel/test_s, deverá conseguir desta vez abrir o arquivo teste. Na verdade, graças ao bit s, usertest foi assumiu a identidade do proprietário do arquivo test_s durante sua execução.

Observação: Em alguns sistemas (como no caso do Laboratório de Engenharia de Computação do LECA), a operação de mudança de identidade do usuário durante a execução de um programa (do qual ele não é proprietário) não é permitida por razões de segurança. Assim, a saída gerada em nosso sistema será:

lyapunov:~> /home/saibel/test_s
/home/saibel/test_s: Operation not permitted.

Resumindo, pode-se dizer que um processo tem o direito de acesso a um arquivo se:

  1. O ID do usuário efetivo do processo é o identificador do super-usuário (root);

  2. O ID do usuário efetivo do processo é idêntico ao ID do proprietário do arquivo, e o modo de acesso do arquivo permite o direito de acesso desejado no campo proprietário;

  3. O ID do usuário efetivo do processo não é o ID do proprietário do arquivo, e o ID do grupo efetivo do processo é idêntico ao ID do grupo do arquivo, e o modo de acesso do arquivo permite o direito de acesso desejado no campo grupo;

  4. O ID do usuário efetivo do processo não é o ID do proprietário do arquivo, e o ID do grupo efetivo do processo não é o ID do grupo do arquivo, e o modo de acesso do arquivo permite o direito de acesso desejado no campo outros.


next up previous
Next: Identificadores dos usuários Up: Informações relativas ao usuário Previous: Login
Celso Alberto Saibel Santos 2000-11-14