FreeBSD Handbook/Iniciando/UNIX Básico/Permissões

Origem: Wikilivros, livros abertos por um mundo aberto.


FreeBSD Handbook
Anterior Capítulo 3. UNIX Básico Próxima

3.3 Permissões

O FreeBSD, como decendente direto do UNIX® BSD, se baseia em inúmeros conceitos chaves do UNIX. O primeiro e mais citado, é que o FreeBSD é um sistema operacional multi-usuário. O sistema pode gerenciar inúmeros usuários, todos trabalhando simultaneamente em tarefas completamente distintas. O sistema é responsável pelo compartilhamento e gerencialmente apropriado de pedidos de acesso aos dispositivos de controle de equipamentos, periféricos, memória e tempo de processamento, de forma justa entre os usuários.

Pelo fato do sistema poder suportar múltiplos usuários, tudo que o sistema gerencia é composto de um conjunto de permissões que governam quem pode ler, escrever, e executar recursos. Estas permissões são armazenadas como três octetos divididos em três partes, uma para o dono do arquivo, uma para o grupo à que o arquivo pertence, e uma para todos os outros usuários. Sua representação numérica funcionam assim:

Valor Permissões Listagem de diretório
0 Sem leitura, sem escrita, sem execução ---
1 Sem leitura, sem escrita, com execução --x
2 Sem leitura, com escrita, sem execução -w-
3 Sem leitura, com escrita, com execução -wx
4 Com leitura, sem escrita, sem execução r—
5 Com leitura, sem escrita, com execução r-x
6 Com leitura, com escrita, sem execução rw-
7 Com leitura, com escrita, com execução rwx

A opção -l pode ser usada junto ao ls(1) para visualizar listagem detalhada do diretório incluindo uma coluna com informações sobre as permissões de cada arquivo, para o dono, grupo, e outros. Por exemplo, a saída do comando ls -l em um diretório qualquer, mostrará:

% ls -l
total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
...

Aqui está a forma como a primeira coluna do ls -l é dividida:

-rw-r--r--

O primeiro caracter (o mais à esquerda) indica que se este é um arquivo normal, se é um diretório, um dispositivo especial, um socket ou qualquer outro pseudo-dispositivo especial. Nesse caso, o - indica que trata-se de um arquivo regular. Os próximos três caracteres, rw- neste exemplo, indicam as permissões para o dono do arquivo. Os próximos três caracteres, r--, indicam as permissões para o grupo ao qual o arquivo pertence. Os três caracteres finais, r--, indicam as permissões para o resto do mundo. Um hífen indica que a permissão está desligada. No caso deste arquivo, o dono pode ler e escrever neste arquivo, o grupo pode ler o arquivo e o resto do mundo pode também apenas ler o arquivo. De acordo com a tabela acima, as permissões para o arquivo seriam 644, onde cada dígito representa as três partes das permissões do arquivo.

Isso é muito bonito e legal, mas como o sistema controla as permissões nos dispositivos? O FreeBSD na verdade trata a maioria dos dispositivos de hardware como arquivos onde os programas podem ler, abrir, e escrever dados, como se fosse qualquer outro arquivo. Estes arquivos de dispositivos são armazenados no diretório /dev.

Diretórios também são tratados como arquivos comuns. Eles tem permissões de leitura, escrita e execussão. O bit de execussão em um diretório tem uma sutíl diferença quando comparado a um arquivo. Quando um diretório é definido como executável, significa que ele pode ser explorado, ou seja, que é possível entrar neste diretório ("cd"). Também significa que dentro do diretório, pode-se acessar arquivos cujos nomes são conhecidos (de acordo com as permissões dos próprios arquivos, é claro).

Em particular, para realizar a listagem de um diretório, é necessário ter permissões de leitura no mesmo, enquanto para apagar um arquivo cujo nome já é conhecido, é necessário ter permissões de escrita e execução no diretório onde está o arquivo.

Existem outros bits de permissões, mas eles são utilizados em circustâncias especiais como binários como setuid e diretórios com opção sticky. Se você deseja obter mais informações sobre as permissões de arquivo e como defini-las, dê uma olhada na página de manual do chmod(1).

3.3.1 Permissões Simbólicas

Contribução de Tom Rhodes.

Permissões simbólicas, as vezes referidas como expressões de permissões, usam caracteres em substituição aos valores octais que atribuem permissões aos arquivos e diretórios. Expressões simbólicas usam a sintaxe (quem) (ação) (permissões), onde os seguintes valores estão disponíveis:

Opção Letra Representação
(quem) u Usuário
(quem) g Grupo dono
(quem) o Outros
(quem) a Todos (``o mundo)
(ação) + Adicionar permissões
(ação) - Remover permissões
(ação) = Definir permissões explicitamente
(permissões) r Leitura
(permissões) w Escrita
(permissões) x Execução
(permissões) t Bit de sticky
(permissões) s Define UID ou GID

Estes valores são usados com o comando chmod(1) exatamente como da forma anterior, mas sem letras. Por exemplo, você pode usar o seguinte comando para impedir que outros usuários deixem de acessar determinado ARQUIVO:

% chmod go= ARQUIVO

Pode-se fazer uso de uma lista separado por vírgula, quando se desejar que mais de uma modificação seja realizada no arquivo. Por exemplo, o comando à seguir remove as permissões de escrita para o grupo e "todos" no ARQUIVO, e então adiciona permissões de execução à todos:

% chmod go-w,a+x ARQUIVO

3.3.2 Arquivos com Flags no FreeBSD

Contribução de Tom Rhodes.

Complementando o que foi dito anteriormente sobre permissões de arquivos, o FreeBSD suporta o uso de arquivos com flags. Esses flags adicionam um nível a mais de segurança e controle sobre os arquivos, mas não aos diretórios.

Esses flags adicionam um nível a mais de segurança e controle sobre os arquivos, ajudando a garantir que em alguns casos, nem mesmo o root pode apagar ou alterar arquivos.

As flags dos arquivos podem ser alteradas através do comando chflags(1), usando uma simples interface. Por exemplo, para habilitar o arquivo arquivo1 com a flag de "não-deleção", digite o seguinte comando:

# chflags sunlink arquivo1

E para desabilitar a flag de "não-deleção", simplesmente digite o comando anterior com um "no" na frente do sunlink. Observe:

# chflags nosunlink arquivo1

Para visualizar as flags do arquivo, use o comando ls(1)com a flag -lo:

# ls -lo arquivo1

O resultado deverá parecer com o seguinte:

-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 arquivo1

Várias flags somente podem ser adicionadas ou removidas pelo usuário root. Em outros casos, o dono do arquivo poderá alterar os flags. É recomendado que os administradores leiam as páginas de manual chflags(1) e chflags(2) para maiores informações.

3.3.3 Permissões setuid, setgid e sticky

Contribução de Tom Rhodes.

Além das permissões já discutidas, existem outras 3 permissões específicas que todos os administradores devem conhecer. São as permissões setuid, setgid e sticky.

Essas permissões são importantes para algumas operações UNIX, já que elas providenciam funcionalidades não garantidas para usuários normais. Para entendê-las, a diferença entre o ID do usuário real e o ID do usuário efetivo precisa também ser conhecida.

O ID do usuário real é o UID que inicia o processo ou é dono do processo. O UID efetivo é o ID do usuário onde o processo é rodado. Como um exemplo, o comando passwd(1) roda com o ID real do usuário que quer trocar sua senha; entretanto, para manipular o base de dados das senhas, ele roda com o ID efetivo do usuário root. Isso é o que permite que usuários normais possam trocar suas senhas sem receberem um erro de permissão negada ("Permission Denied").

Nota: The nosuid mount(8) option will cause these binaries to silently fail. That is, they will fail to execute without ever alerting the user. That option is also not completely reliable as a nosuid wrapper may be able to circumvent it; according to the mount(8) manual page.

A permissão setuid pode ser configurada prefixando uma permissão com o número quatro (4) como mostrado no seguinte exemplo:

# chmod 4755 suidexample.sh

As permissões no arquivo suidexample.sh agora devem aparecer assim:

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

O que pode ser observado deste exemplo é que um s é agora parte do conjunto de permissões designadas para o dono do arquivo, substituindo o bit executável. Isso permitirá comandos que precisem de elevadas permissões, assim como o passwd.

Para visualizar isso em tempo real, abra dois consoles. Em um, inicie o processo passwd como um usuário normal. Enquanto o processo espera a nova senha, verifique a tabela de processos e veja a informação do usuário para o comando passwd.

No terminal A:

Changing local password for trhodes
Old Password:

No terminal B:

# ps aux | grep passwd

trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

Como demonstrado acima, o processo passwd é rodado por um usuário normal, mas está utilizando o UID efetido do usuário root.

A permissão setgid apresenta a mesma função que a permissão setuid; exceto por alterar as configurações do grupo. Quando um aplicativo ou comando é rodado com esta configuração, serão concedidas as permissões baseadas no grupo que é dono do arquivo, e não o usuário que iniciou o processo.

Para configurar a permissão setgid em um arquivo, forneça o comando chmod com um dois (2) no início, como no exemplo a seguir:

# chmod 2755 sgidexample.sh

A nova configuração poderá ser visualizada como antes, repare que um s está agora no campo designado para as configurações de permissões de grupo.

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh
Nota: Nestes exemplos, mesmo que o shell script em questão seja um arquivo executável, ele não irá rodar com um diferente EUID ou ID de usuário efetivo. Isso porque shell scripts não podem acessar a chamada de sistema setuid(2).

As duas primeiras permissões especiais que demonstramos (as permissões setuid e setgrid) podem diminuir a segurança do sistema, considerando permissões elevadas. Existe uma terceira permissão que pode fortalecer a segurança do sistema: a sticky.

A permissão sticky, quando definida para um diretório, permite a deleção de arquivos apenas para os seus donos. Essa permissão é útil para prevenir a deleção em diretórios publicos, como o /tmp, por usuários que não são donos dos arquivos. Para utilizar esta permissão, inicie a permissão com o um (1). Por exemplo:

# chmod 1777 /tmp

Agora, é possível visualizar o efeito utilizando o comando ls:

# ls -al / | grep tmp

drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

A permissão sticky pode ser percebida pelo t no final do conjunto de permissões.


Anterior Índice Próxima
UNIX Básico Topo Estrutura de Diretórios
Última edição desta página: 10/03/2013 (20130310233232)