Permissões - Linux

No Linux, cada arquivo e diretório possui permissões que regulam o acesso. Essas permissões determinam quem pode ler ou escrever arquivos e executar aplicações. As permissões são divididas em três grupos:

  • Permissões para o usuário proprietário

  • Permissões para o grupo proprietário

  • Permissões para os demais usuários e grupos

Para determinar se você possui direitos de acesso a um arquivo ou diretório, o sistema verifica as permissões. Primeiro, verifica se você é o usuário proprietário do arquivo. Se for, você recebe as permissões definidas para o usuário proprietário. Se não for, o sistema verifica se você é membro do grupo proprietário do arquivo. Se for membro do grupo, você recebe as permissões desse grupo. Se não for nem o usuário proprietário nem membro do grupo proprietário, você recebe as permissões definidas para todos os demais usuários. Note que as permissões não se somam; você recebe apenas um conjunto de permissões por vez.

Formato das Permissões

Cada permissão indica se o usuário pode realizar três operações básicas: ler, escrever e executar o arquivo. A funcionalidade das permissões pode ser resumida da seguinte forma:

PermissãoArquivoDiretório
LeituraPode abrir o arquivoPode listar o conteúdo do diretório
EscritaPode alterar o conteúdo do arquivoPode criar e deletar arquivos no diretório
ExecuçãoPode executar o arquivo Pode acessar o diretório (ex., usando cd)

Cada permissão é representada por 3 bits (um para cada operação) no formato:

[read][write][execute]

O primeiro bit (read) indica se o arquivo/diretório pode ser lido. O segundo bit (write) indica se o arquivo/diretório pode ser escrito. O terceiro bit (execute) indica se o arquivo pode ser executado. Um valor 1 significa que a operação é permitida, enquanto um 0 significa que não é permitida.

Por exemplo:

  • 100: Aqui, apenas o primeiro bit (read) está definido, então o arquivo/diretório está disponível apenas para leitura.

  • 111: Aqui, todos os três bits estão definidos, então o arquivo/diretório está disponível para leitura, escrita e execução.

Para definir permissões, usamos números octais. Por exemplo, a permissão "100" em formato octal é 4. Portanto, o número 4 significa acesso apenas para leitura. A permissão "111" em octal é 7. Portanto, para acesso de leitura, escrita e execução, usamos o número 7.

Cada arquivo/diretório possui três tipos de permissões: para o usuário proprietário, para o grupo proprietário e para todos os demais. Portanto, ao definir permissões, fornecemos três grupos de bits para cada um desses grupos. Por exemplo:

  • 100_100_100: Aqui, cada grupo tem permissões iguais a 100 ou 4 (apenas leitura). Para definir essas permissões, usamos três quatros: 444.

  • 111_111_111: Aqui, cada grupo tem permissões iguais a 111 ou 7 (leitura, escrita e execução). Para definir essas permissões, usamos três setes: 777.

  • 111_111_100: Para o usuário e o grupo proprietários, as permissões são iguais a 111 ou 7 (leitura, escrita e execução). Para todos os demais, as permissões são 100 ou 4 (apenas leitura). Para definir essas permissões, usamos 774.

Além dos bits em formato binário, no Linux frequentemente usamos marcadores simbólicos. Se um bit está definido, aplicam-se os seguintes símbolos:

  • r: read

  • w: write

  • x: execute

Se um bit não está definido, usamos um traço "-". Por exemplo, para a permissão "100", usamos a seguinte representação:

r--: O primeiro bit está definido, então usamos r. Os outros bits não estão definidos, então usamos traços -.

Outro exemplo é a permissão "111":

rwx: Todos os bits estão definidos, então usamos os símbolos correspondentes.

Como cada arquivo possui três conjuntos de permissões (para o usuário proprietário, para o grupo proprietário e para todos os demais), usamos três grupos de símbolos. Por exemplo:

rwxrwxrwx: Os primeiros três símbolos definem as permissões para o usuário proprietário, os segundos três para o grupo proprietário e os últimos três para todos os demais.

Visualizando Permissões

Para visualizar as permissões de arquivos e diretórios, usamos o comando ls -l. Por exemplo, para listar os arquivos e diretórios no diretório de Documentos com suas permissões, podemos usar:

programicio@programicio:~$ ls -l ~/Documents
total 56
drwxrwxr-x 3 programicio programicio 4096 Mar  5 15:13 work
-rw-rw-r-- 1 programicio programicio   67 Feb 23 23:07 somefile
drwxrwxr-x 2 programicio programicio 4096 Mar  6 16:03 test

As permissões são mostradas a partir do segundo caractere (o primeiro caractere indica o tipo de arquivo, se é um diretório, por exemplo). Aqui vemos que as pastas "work" e "test" possuem a permissão rwxrwxr-x ou 775. Isso significa que o usuário proprietário e o grupo proprietário têm permissão para ler, escrever e executar, enquanto os demais têm permissão apenas para leitura e execução.

Para o arquivo "somefile", a permissão é -rw-rw-r-- ou 664. Isso significa que o usuário proprietário e o grupo proprietário podem ler e escrever, enquanto os demais podem apenas ler.

É importante notar que as permissões dos arquivos dentro de uma pasta não são necessariamente as mesmas permissões definidas para a própria pasta. Por exemplo, um usuário pode ter permissão para abrir uma pasta e listar seu conteúdo, mas não para abrir arquivos dentro dela, se as permissões dos arquivos forem diferentes.

Modificando Permissões com chmod

O comando chmod é usado para alterar as permissões de acesso a um arquivo ou diretório. Passamos as permissões desejadas para o usuário proprietário, grupo proprietário e todos os demais:

chmod [opções] permissões arquivo/diretório

Por exemplo, para tornar a pasta /Documents/test acessível apenas ao usuário proprietário e inacessível para os demais:

chmod 700 ~/Documents/test

Aqui, passamos a permissão 700 para chmod. Isso define as permissões do usuário proprietário como 7 (ou 111 em binário, permitindo leitura, escrita e execução). As permissões para o grupo proprietário e todos os demais são definidas como 0, indicando que eles não têm permissões.

Visualizando as permissões após a alteração:

programicio@programicio:~$ ls -l ~/Documents
total 56
drwxrwxr-x 3 programicio programicio 4096 Mar  5 15:13 work
drwx------ 2 programicio programicio 4096 Mar  6 16:03 test

Aqui, vemos que as permissões da pasta test foram alteradas conforme esperado.

Por padrão, chmod altera as permissões apenas do arquivo ou diretório especificado. Se o diretório contém arquivos e subdiretórios, as permissões não são aplicadas automaticamente a eles. Para alterar recursivamente as permissões de todos os arquivos e subdiretórios dentro de um diretório, usamos a opção -R:

chmod 700 -R ~/Documents/test

Também podemos usar chmod em modo relativo, especificando explicitamente as permissões para o usuário proprietário (u), grupo proprietário (g) e todos os demais (o). Por exemplo:

chmod u=rwx,g=rwx,o=- ~/Documents/test

Aqui, definimos as permissões de leitura, escrita e execução para o usuário proprietário e o grupo proprietário, e removemos todas as permissões para os demais.

Podemos adicionar ou remover permissões para todos os objetos. Por exemplo, para adicionar permissão de execução para todos os usuários e grupos:

chmod +x somefile

Usando o modo relativo, podemos construir comandos mais complexos. Por exemplo, para adicionar permissão de escrita ao grupo proprietário e remover permissão de leitura para todos os demais:

chmod g+w,o-r somefile

O sinal + adiciona permissões e o sinal - remove permissões. No exemplo acima, g+w adiciona permissão de escrita ao grupo proprietário, enquanto o-r remove a permissão de leitura de todos os demais.

Comando chown

O comando chown é usada para alterar o proprietário e o grupo de um arquivo ou diretório. Para alterar ambos, passamos os dois argumentos separados por dois pontos. Por exemplo, para definir o usuário programicio como proprietário e o grupo users como grupo proprietário da pasta /Documents/test:

sudo chown programicio:users ~/Documents/test

Assim como chmod, o comando chown pode ser usado de forma recursiva para alterar o proprietário e grupo de todos os arquivos e subdiretórios dentro de um diretório, usando a opção -R:

sudo chown -R programicio:users ~/Documents/test

Comando chgrp

O comando chgrp altera apenas o grupo proprietário de um arquivo ou diretório, sem alterar o proprietário. Para isso, passamos o nome do grupo e o caminho para o arquivo ou diretório. Por exemplo, para definir o grupo root como grupo proprietário da pasta /Documents/test:

sudo chgrp root ~/Documents/test

Para alterar o grupo de todos os arquivos e subdiretórios dentro de um diretório, usamos a opção -R:

sudo chgrp -R root ~/Documents/test

Permissões Padrão

Quando um usuário cria um arquivo, a propriedade padrão é aplicada. O usuário que cria o arquivo torna-se automaticamente o proprietário, e o grupo principal do usuário torna-se o grupo proprietário. Este grupo principal é definido no arquivo /etc/passwd.

Se o usuário pertence a vários grupos, ele pode alterar o grupo principal em uso com o comando newgrp, passando o nome do grupo que deseja definir como principal. Por exemplo, para listar os grupos do usuário atual e alterar o grupo principal para users:

programicio@Programicio:~$ groups
programicio adm cdrom sudo dip plugdev users lpadmin

programicio@Programicio:~$ newgrp users

programicio@Programicio:~$ groups
users adm cdrom sudo dip plugdev lpadmin programicio

programicio@Programicio:~$ touch test1.txt

programicio@Programicio:~$ ls -l
total 72
-rw-rw-r--  1 programicio users      0 Mar 15 07:57 test1.txt

Depois de criar o arquivo test1.txt no diretório atual, vemos que seu grupo proprietário é users.

Observe que essa mudança no grupo principal é temporária e só se aplica à sessão atual do terminal. Ao fechar e reabrir o terminal, o grupo principal volta ao original.

SUID, SGID e Sticky Bit

Além das permissões padrão de leitura, escrita e execução, o Linux possui permissões especiais: SUID (Set User ID), SGID (Set Group ID) e sticky bit.

SUID (Set User ID)

As permissões SUID permitem que os usuários executem um arquivo com os privilégios do proprietário do arquivo. Por padrão, ao executar um arquivo, o usuário usa suas próprias permissões. Isso geralmente limita o uso de programas. No entanto, em alguns casos, o usuário precisa executar comandos com privilégios de root. Por exemplo, ao mudar sua senha, o usuário precisa gravar no arquivo /etc/shadow, que não é acessível para escrita sem privilégios de root. O SUID resolve esse problema. Para o arquivo /usr/bin/passwd, essa permissão é aplicada por padrão. Você pode visualizar a permissão SUID com o comando ls -l, onde o s aparece no lugar da permissão x para o usuário:

programicio@Programicio:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 64152 Feb  6 15:53 /usr/bin/passwd

SGID (Set Group ID)

A permissão SGID permite que um usuário execute um arquivo com as permissões do grupo proprietário do arquivo ou diretório. Isso é útil em diretórios compartilhados. Normalmente, quando um usuário cria um arquivo, o grupo proprietário é definido como o grupo principal do usuário. Isso pode ser problemático, pois outros membros do grupo podem não conseguir modificar esses arquivos. Com a permissão SGID, o grupo proprietário do diretório é automaticamente aplicado a todos os arquivos e subdiretórios criados nele, permitindo que todos os membros desse grupo modifiquem os arquivos.

Sticky Bit

O sticky bit é útil para proteger arquivos de exclusão acidental em ambientes onde vários usuários podem criar arquivos em um diretório compartilhado. É aplicado por padrão ao diretório /tmp:

programicio@Programicio:~$ ls -l /
total 8388696
lrwxrwxrwx   1 root root          7 Oct 16 13:36 bin -> usr/bin
drwxr-xr-x   4 root root       4096 Mar  8 07:08 boot
...
drwxrwxrwt  22 root root      12288 Mar 15 11:10 tmp

Aqui, o t no final das permissões indica o sticky bit. Sem essa permissão, um usuário poderia deletar arquivos de outros usuários no mesmo diretório. Com o sticky bit, um usuário só pode deletar arquivos se for o proprietário do arquivo ou do diretório.

Utilizando chmod para Permissões Especiais

Para aplicar SUID, SGID e sticky bit, usamos o comando chmod com um argumento de quatro dígitos, onde o primeiro dígito refere-se às permissões especiais: SUID tem valor 4, SGID tem valor 2 e sticky bit tem valor 1. Por exemplo, para adicionar SGID a um diretório e definir rwx para o usuário e rx para o grupo e outros:

chmod 2755 /somedir

Aqui, o primeiro dígito é 2, indicando SGID. O segundo dígito é 7, indicando rwx para o usuário. O terceiro dígito é 5, indicando rx para o grupo. O quarto dígito é 5, indicando rx para os demais.

Para adicionar SUID, SGID e sticky bit ao mesmo tempo, somamos os valores.

Por exemplo, para adicionar SGID e sticky bit a um arquivo e definir rwx para o usuário e rx para o grupo e outros:

chmod 3755 /somefile

Modos Relativos para Permissões Especiais

Podemos também usar modos relativos com chmod. Para SUID, usamos chmod u+s; para SGID, chmod g+s; e para sticky bit, chmod +t. A tabela abaixo resume esses comandos:

Valor NuméricoValor RelativoEfeito para ArquivosEfeito para Diretórios
SUID: 4u+sExecutar arquivo com permissões do proprietárioNão aplicável
SGID: 2g+sExecutar arquivo com permissões do grupoTodos os arquivos no diretório herdam o grupo proprietário
Sticky Bit: 1+tNão aplicávelPrevine a exclusão de arquivos de outros usuários

Por exemplo, para criar um diretório data na raiz e definir SGID e sticky bit:

programicio@Programicio:~$ sudo mkdir /data
[sudo] password for programicio: 
programicio@Programicio:~$ sudo touch /data/test

programicio@Programicio:~$ sudo chmod g+s /data
programicio@Programicio:~$ sudo chmod +t /data

programicio@Programicio:~$ ls -l /
total 8388700
lrwxrwxrwx   1 root root          7 Oct 16 13:36 bin -> usr/bin
drwxr-xr-x   4 root root       4096 Mar  8 07:08 boot
dr-xr-xr-x   2 root root       4096 Oct 16 14:29 cdrom
drwxr-sr-t   2 root root       4096 Mar 15 12:08 data
........................

programicio@Programicio:~$ sudo rm -r /data
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com