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ão | Arquivo | Diretório |
---|---|---|
Leitura | Pode abrir o arquivo | Pode listar o conteúdo do diretório |
Escrita | Pode alterar o conteúdo do arquivo | Pode criar e deletar arquivos no diretório |
Execução | Pode 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:
: Aqui, apenas o primeiro bit (read) está definido, então o arquivo/diretório está disponível apenas para leitura.100
: Aqui, todos os três bits estão definidos, então o arquivo/diretório está disponível para leitura, escrita e execução.111
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:
: Aqui, cada grupo tem permissões iguais a 100 ou 4 (apenas leitura). Para definir essas permissões, usamos três quatros:100_100_100
.444
: 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:111_111_111
.777
: 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, usamos111_111_100
.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:
: readr
: writew
: executex
Se um bit não está definido, usamos um traço "-". Por exemplo, para a permissão "100", usamos a seguinte representação:
r--
r
-
Outro exemplo é a permissão "111":
rwx
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
Visualizando Permissões
Para visualizar as permissões de arquivos e diretórios, usamos o comando ls -l
Documentos
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
775
Para o arquivo "somefile", a permissão é -rw-rw-r--
664
É 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
chmod [opções] permissões arquivo/diretório
Por exemplo, para tornar a pasta /Documents/test
chmod 700 ~/Documents/test
Aqui, passamos a permissão 700 para chmod
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
Por padrão, chmod
-R
chmod 700 -R ~/Documents/test
Também podemos usar chmod
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 +
-
g+w
o-r
Comando chown
O comando chown
programicio
users
/Documents/test
sudo chown programicio:users ~/Documents/test
Assim como chmod
chown
-R
sudo chown -R programicio:users ~/Documents/test
Comando chgrp
O comando chgrp
root
/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
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
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
/usr/bin/passwd
ls -l
s
x
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
Utilizando chmod para Permissões Especiais
Para aplicar SUID, SGID e sticky bit, usamos o comando chmod
rwx
rx
chmod 2755 /somedir
Aqui, o primeiro dígito é 2, indicando SGID. O segundo dígito é 7, indicando rwx
rx
rx
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
rx
chmod 3755 /somefile
Modos Relativos para Permissões Especiais
Podemos também usar modos relativos com chmod
u+s
chmod g+s
chmod +t
Valor Numérico | Valor Relativo | Efeito para Arquivos | Efeito para Diretórios |
---|---|---|---|
SUID: 4 | u+s | Executar arquivo com permissões do proprietário | Não aplicável |
SGID: 2 | g+s | Executar arquivo com permissões do grupo | Todos os arquivos no diretório herdam o grupo proprietário |
Sticky Bit: 1 | +t | Não aplicável | Previne a exclusão de arquivos de outros usuários |
Por exemplo, para criar um diretório data
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