O que vocë precisa saber para controlar quem acessa o que no seu sistema Linux.
Permissões de Acesso
Todo arquivo ou diretório tem, além de seu nome e conteúdo, propriedades que restringem o seu uso. Como o Linux é um sistema operacional multi-usuário, arquivos e diretórios têm de pertencer à um certo usuário e grupo. O diretório /root por exemplo pertence ao usuário root e grupo root. Devido às permissões deste diretório, apenas o usuário dono (root) pode entrar e mexer nele.
Este tipo de funcionalidade é essencial em um sistema multi-usuário real. O comando ls -l mostra uma listagem detalhada dos arquivos do diretório atual e isso inclui suas permissões. Vejamos um exemplo:
$ ls -l drwxr-xr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila
Na parte do comando ls aprendemos que depois do primeiro caracter (tipo de arquivo), os próximos 9 caracteres são uma sequência de permissões. Podemos dizer que temos 3 variações de letras:
- Letra r – leitura (read)
- Letra w – escrita (write)
- Letra x – execução (execute)
Estas três letras se encaixam em 3 campos:
{rwx}{rwx}{rwx}
- Campo 1: Permissões do usuário dono
- Campo 2: Permissões do grupo dono
- Campo 3: Permissões para todos os outros
Sendo assim, o exemplo rwxrwxrwx significa literalmente: O usuário dono pode ler, escrever e executar o arquivo. O grupo dono pode ler, escrever e executar o arquivo. Todos os outros podem ler, escrever e executar o arquivo. Em outras palavras, todos podem fazer tudo no arquivo. O oposto disto seria a combinação “———”.
Vejamos agora o exemplo do diretório apostila:
drwxr-xr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila
Neste caso, quando há um “-” no lugar da letra, significa que não há essa permissão. Então podemos ler a linha da seguinte forma: O usuário dono (coletivo) pode ler, escrever e executar. O grupo dono (coletivo) pode ler e executar, mas não pode escrever. Todos os outros podem ler e executar, mas não podem escrever.
Outro exemplo:
$ ls -l /dev/dsp crw-rw---- 1 root audio 14, 3 2008-08-29 07:57 /dev/dsp
O arquivo /dev/dsp é do tipo “arquivo especial de caracter” (c). O usuário dono (root) pode ler e escrever neste arquivo, mas não pode executá-lo. O grupo dono (audio) pode ler e escrever no arquivo, mas não pode executá-lo. Os outros não podem ler, não podem escrever e nem executá-lo.
Um outro exemplo:
$ ls -l /dev/cdrom lrwxrwxrwx 1 root root 3 2008-08-29 07:57 /dev/cdrom -> hda
A primeira letra indica que o arquivo /dev/cdrom é um link simbólico para /dev/hda. Isto quer dizer que as permissões estarão sempre rwxrwxrwx e o que vale na verdade são as permissões do arquivo hda:
$ ls -l /dev/hda brw-rw---- 1 root cdrom 3, 0 2008-08-29 07:57 /dev/hda
Ou seja, tanto para o arquivo /dev/cdrom, quanto para o arquivo /dev/hda: O usuário dono (root) pode ler e escrever, mas não pode executar. O grupo dono (cdrom) pode ler e escrever, mas não pode executar. Todos os outros não podem ler, não podem escrever e nem executá-los.
Modificando os donos
Ao utilizar o ls -l, podemos ver o usuário dono e o grupo dono dos arquivos e diretórios. Se criarmos um arquivo com o usuário coletivo, o usuário dono e o grupo dono serão os do usuário coletivo. Podemos modificar quem é o dono do arquivo através dos comandos chown (change ownership – mudar o usuário dono) e chgrp (change group – mudar o grupo dono), lembrando que apenas o usuário root pode fazer isto.
Utilizando o comando chown para modificar usuário dono e grupo dono:
# ls -l drwxr-xr-x 4 coletivo coletivo 4096 2008-08-29 13:35 coletivo # chown root coletivo # chgrp root coletivo # ls -l drwxr-xr-x 4 root root 4096 2008-08-29 13:35 coletivo
Um jeito mais simples de fazer a mesma coisa, em um comando só, seria:
# chown root.root coletivo
O comando chown também modifica o grupo dono, especificado no comando através do grupo precedido por um ponto.
Modificando as permissões
Existem duas maneiras de se modificar as permissões com o comando chmod: a forma extendida e a forma octal. A modificação de permissões pode ser feita contanto que o usuário seja o dono do arquivo. Apenas o usuário root pode modificar as permissões de outros usuários.
Na forma extendida, especificamos u para usuário, g para grupo e o para outros. Exemplo:
$ chmod u=rw,g=rw,o= arquivo $ ls -l arquivo -rw-rw---- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo
Desta forma especificamos que o usuário dono (coletivo) pode ler e escrever (u=rw), o grupo dono pode ler e escrever (g=rw) e os outros não podem fazer nada (o=). Podemos também utilizar ao invés do sinal “=”, os sinais de “+” e “-”, para atribuir permissões relativamente. Exemplo:
$ chmod o+r arquivo $ ls -l arquivo -rw-rw-r-- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo
Ao invés de especificarmos cada campo (usuário, grupo, outros), pedimos ao chmod que adicionasse apenas a permissão de leitura para os outros (o+r). Agora vamos remover apenas o bit de escrita do grupo dono (g-r):
$ chmod g-w arquivo $ ls -l arquivo -rw-r--r-- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo
A forma octal de representação das permissões, apesar de ser mais rápida, requer um pouco mais de raciocínio. Nesta forma, cada tipo de permissão (leitura, escrita e execução) é representado por um número, na seguinte ordem:
- Número 1 – Execução
- Número 2 – Escrita
- Número 4 – Leitura
Pensando em forma binária, a soma dos números nos dará a combinação de atributos desejada. Por exemplo, o número 3 significa permissão de escrita e execução (1 + 2 = 3). O número 5 significa permissão de leitura e execução (1 + 4 = 5).
Sabendo disto, utilizamos 3 números junto ao comando chmod, cada um especificando os campos de usuário dono, grupo dono e outros:
$ chmod 755 arquivo $ ls -l arquivo -rwxr-xr-x 1 coletivo coletivo 0 2008-08-29 14:14 arquivo
O usuário dono (coletivo) pode ler, escrever e executar (1 + 2 + 4 = 7). O grupo dono (coletivo) pode ler e executar (1 + 4 = 5). Os outros podem ler e executar (1 + 4 = 5). Outro exemplo:
$ chmod 644 arquivo $ ls -l arquivo -rw-r--r-- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo
O usuário dono (coletivo) pode ler e escrever (2 + 4 = 6). O grupo dono (coletivo) pode apenas ler (4). Os outros podem apenas ler (4). Outro exemplo:
$ chmod 600 arquivo $ ls -l arquivo -rw------- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo
Apenas o usuário dono (coletivo) pode ler e escrever (2 + 4 = 6).
Bits especiais
Além das permissões de leitura, escrita e execução, temos também três outros bits especiais de permissões que podemos usar:
SUID
Quando utilizado em um arquivo, faz com que todo usuário que executar este arquivo se transforme no usuário dono do arquivo durante a execução. Isto quer dizer que se um programa estiver com permissão de root e com o SUID ativado, qualquer usuário ao executar este programa, terá privilégios de root.
Este tipo de permissão deve ser sempre evitado. Use apenas quando realmente precisar, pois se um programa do root tiver alguma falha de segurança e estiver com o SUID habilitado, qualquer usuário poderia se tornar o root e conseguir poder total no sistema.
Um exemplo de aplicação que possui (e precisa) de SUID é o /usr/bin/passwd: o comando que muda a senha dos usuários. O arquivo de usuários e senhas do sistema tem permissões para que apenas o root possa ler, mas se um usuário normal quiser mudar a sua senha diretamente, sem a intervenção do usuário root, como ele poderia ler e modificar o arquivo de senhas se as permissões não deixam?
Quando o usuário executa o /usr/bin/passwd, o comando está com permissão de SUID, então é como se o usuário virasse o root temporariamente e por isso ele poderá ler o arquivo de senhas. Neste caso, o usuário estaria limitado a fazer apenas o que o programa /usr/bin/passwd permite: mudar senhas.
Vejamos as permissões do exemplo:
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 30968 2008-04-02 20:57 /usr/bin/passwd
Podemos ver que há uma letra incomum nas permissões: o s. Quando o s está no campo de permissões ao usuário dono, quer dizer que está com SUID. Quando o s está minúsculo, indica que além do SUID, o programa também tem permissão de executável (x). Quando em maiúsculo, indica que apenas o SUID está ativo.
Adicionando e removendo o SUID de um arquivo:
$ ls -l arquivo -rwxr-xr-x 1 coletivo coletivo 0 2008-08-30 12:42 arquivo $ chmod u+s arquivo $ ls -l arquivo -rwsr-xr-x 1 coletivo coletivo 0 2008-08-30 12:42 arquivo $ chmod u-s arquivo $ ls -l arquivo -rwxr-xr-x 1 coletivo coletivo 0 2008-08-30 12:42 arquivo
O SUID funciona apenas em executáveis, não funcionando em scripts shell. Em um script shell, o executável na verdade é o interpretador de comandos (a shell) e não o script. O SUID precisaria ser colocado na shell (o que não é nem um pouco recomendável).
SGID
Para arquivos, funciona como o SUID: quando executado por qualquer usuário, a execução acontece como se o grupo dono fosse o mesmo do arquivo, independente do usuário que estiver executando. Quando utilizado em diretórios, o SGID faz com que todos os arquivos criados tenham como grupo dono o grupo do diretório com o SGID. Isto é bastante usado em diretórios compartilhados.
Quando um arquivo ou diretório está com SGID, o ls -l irá mostrar a letra s (em maiúsculo ou minúsculo, que nem o SUID) na posição do campo do grupo.
Exemplo:
$ ls -ld apostila drwxr-xr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila $ chmod g+s apostila $ ls -ld apostila drwxr-sr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila # cd apostila # touch teste # ls -l teste -rw-r--r-- 1 root coletivo 0 2008-08-30 12:50 teste
Ao configurar o SGID no diretório apostila, o usuário coletivo forçou que qualquer usuário que criasse um arquivo dentro deste diretório o criaria como grupo-dono coletivo. Quando o root criou um arquivo vazio chamado teste, podemos ver que realmente o grupo deste arquivo ficou como coletivo.
O SGID, assim como o SUID, também não funciona diretamente em scripts, apenas em executáveis.
Sticky
Em tempos passados, quando aplicado em um arquivo, dizia ao sistema operacional que a execução deste arquivo não poderia utilizar a memória RAM do sistema, mas isto hoje em dia é completamente ignorado. Quando aplicado em um diretório, faz com que apenas o dono do arquivo e o dono do diretório possam remover o seu conteúdo. Isto é utilizado em diretórios temporários como o /tmp, onde qualquer pessoa pode criar arquivos, mas só podem remover seus próprios arquivos e não os dos outros usuários também.
O Sticky é representado pela letra t no terceiro campo de permissões: outros, no lugar do x. Exemplo:
$ ls -ld /tmp drwxrwxrwt 11 root root 4096 2008-08-30 07:35 /tmp
Todos os usuários do sistema podem listar o conteúdo, criar, apagar arquivos e entrar no diretório. Porém, como existe o Sticky bit, estes usuários só poderão apagar seus próprios arquivos.
Forma Octal dos Bits Especiais
Vimos as formas extendidas de se configurar os bits especiais. Mas também há a forma octal, que funciona da mesma maneira que os bits de leitura, escrita e execução: cada bit é representado por um número e a soma destes números permite uma combinação de permissões especiais:
- Número 1 – Sticky
- Número 2 – SGID
- Número 4 – SUID
O resultado destes números precedem os outros três números no comando chmod. Exemplo:
$ chmod 4755 arquivo $ ls -l arquivo -rwsr-xr-x 1 coletivo coletivo 0 2008-08-30 13:05 arquivo
Além das permissões normais (755), o SUID foi adicionado neste arquivo através do número 4.
$ chmod 6755 arquivo $ ls -l arquivo -rwsr-sr-x 1 coletivo coletivo 0 2008-08-30 13:05 arquivo
Os bits de SUID e SGID foram adicionados neste arquivo (2 + 4 = 6).
$ chmod 3755 apostila $ ls -ld apostila drwxr-sr-t 2 coletivo coletivo 4096 2008-08-30 13:05 apostila
Os bits de Sticky e SGID foram adicionados neste diretório (1 + 2 = 3).
Máscara padrão de permissões
Toda vez que criamos um arquivo, não precisamos configurar suas permissões. Esta característica é conhecida pela definição “umask”, a máscara de permissões. O umask é um comando e funciona especificando uma máscara de permissões tanto em uma forma extendida quanto na forma octal, parecido com o comportamento do comando chmod.
Por ser um comando da shell, o umask é definido nos scripts de inicialização dessa shell. No caso do bash, sabemos que o umask é geralmente definido no arquivo /etc/profile. Para visualizar a atual configuração do umask, digite:
$ umask 0022
Agora comece com os valores: 666 para arquivos e 777 para diretórios. O valor das permissões normais (leitura, escrita e execução) do umask subtrai destes valores. Então no caso da umask 0022, os arquivos terão permissão padrão 644 e os diretórios terão 755.
Outra forma mais fácil de entender é utilizando o parâmetro -S:
$ umask -S u=rwx,g=rx,o=rx
Que significa 755, ou no caso de um arquivo, todos os números -1: 644.