Aprenda comandos de permissões, controle de acesso Linux
Este artigo faz parte do projeto #LTCode
Os sistemas Linux possuem um sistema de permissões profundamente embutida no design do sistema, organizado em três categorias:
- Dono
- Grupo
- Outros
- Ser dono significa que o usuário é responsável pelo controle de acesso dos arquivos e diretórios.
- Pertencer a um grupo, o qual pode ter mais de um usuário, significa que o grupo é responsável pelos arquivos e diretórios dado pelo seu dono.
- Todos os outros usuários que não sejam o dono ou não pertencem ao grupo do arquivo ou diretório.
No Linux quando uma conta de usuário é criada, é atribuído um número chamado de identificador do usuário (UID) que é mapeado para um nome de usuário. Também é atribuído um identificador de grupo primário (GID) e possíveis grupos adicionais. Você pode usar o comando "id" (sem aspas) para obter informações sobre a identidade de seu usuário:
A gerência das permissões é feitas por arquivos de texto simples:
- /etc/passwd contém nome de login, uid, gid, nome real, diretório pessoal e a shell de login
- /etc/shadow contém as senhas
- /etc/group contém os grupos
Analisemos os direitos de acesso à arquivos e diretórios. Crie um arquivo vazio com o comando "touch" e consulte o comando ls (com opção –l).
Os dez primeiros caracteres da listagem (-rw-r--r--) são atributos de arquivos:
- O primeiro caractere é o tipo do arquivo que pode ser:
- Caractere "-" significando um arquivo regular
- Caractere "d" significando um diretório
- Caractere "l" um link simbólico, mas note que o resto dos atributos será sempre rwxrwxrwx que são valores fictícios
- Caractere "c" um arquivo de caractere especial, dispositivos que lidam com dados como um fluxo de bytes.
- Caractere "b" um arquivo de bloco especial, dispositivos que lidam com dados como blocos, como discos rígidos ou drive de CD-ROM.
- Caractere "s" soquete
- Caractere "=" pipe
- Os nove caracteres restantes são o modo do arquivo e representam as permissões de leitura, escrita e execução para o dono do arquivo, grupo e todo o mundo (outros).
- Os atributos de arquivos são:
- read (r): permite que um arquivo seja aberto e lido.
- write (w): Permite que um arquivo seja escrito ou truncado; mas não permite renomear ou remover arquivos (isso depende das permissões do diretório).
- execute (x): Permite que um arquivo seja tratado como um programa executável; programas escritos em linguagens de scripts devem também ser legíveis para que sejam executados.
- Já os atributos de diretórios são:
- read (r): permite que o conteúdo de um diretório seja listado se o atributo de execução também estiver definido.
- write (w): permite que arquivos dentro de um diretório sejam criados, removidos e renomeados se o atributo de execução também estiver definido.
- execute (x): permite entrar em um diretório (ex.: cd dir).
Então analisando as permissões do nosso arquivo file.txt temos as seguintes informações:
-rw-r--r--
- é um arquivo
rw- o dono possui permissões de leitura e escrita..
r-- o grupo possui permissões apenas de leitura.
r-- os outros possuem apenas permissões de leitura.
Como alterar permissões de um arquivo ou diretório? Simples, utilize o comando chmod para alterar seu modo (permissão). Mas note que somente o dono do arquivo ou super-usuário podem alterar o modo de um arquivo ou diretório.
O comando chmod suporta duas formas distintas para especificar mudanças de modo, a representação octal e a representação simbólica.
A representação octal usa-se números na base octal para definir o padrão de permissão desejado. Como cada digito em octal representa três dígitos em binário, esse mapeamento casa perfeitamente com o esquema usado para armazenar o modo do arquivo. Confira:
Octal Binário Modo
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwx
Agora você entende porque muitos scripts o pessoal apenas falam dê um "chmod 777" . Assim você está definindo permissão de leitura, escrita e execução do script para o dono, grupo e outros (todos).
Dica: se você decorar os modos de leitura (octal 4), escrita (octal 2) e execução (octal 1), basta somá-los para criar as combinações desejadas. Exemplo:
Dê permissão de leitura e escrita para o dono, leitura e execução para o grupo e escrita e execução para os outros:
leitura + escrita = 4 + 2 = 6
leitura + execução = 4 + 1 = 5
escrita + execução = 2 + 1 = 3
Então: chmod 653 file.txt
Nos fornece: -rw-r-x-wx
E claro caso não deseja dar ou remover permissão apenas coloque 0. Exemplo:
Dê permissão de leitura e escrita para o dono enquanto se remove todas as permissões para o grupo e outros.
Então: chmod 600 file.txt
Nos fornece: -rw-------
O comando chmod também suporta a notação simbólica para especificar modos de arquivos. A notação simbólica (mais humana) é dividida em três partes:
- Quem a mudança irá afetar
- Qual operação será realizada
- Qual permissão será definida
1. A combinação dos caracteres "u" de usuário (dono), "g" de grupo e "o" de outros são utilizados, mas se não for especificado assume-se "a" (todos).
2. As operações podem:
- indicar que uma permissão será adicionada "+";
- indicar que uma operação será retirada "-";
- indicar que somente as permissões especificadas serão aplicadas "=",
- todas as outras permissões não especificadas serão removidas;
3. As permissões são especificadas usando letras:
- r para leitura
- w para escrita
- x para execução
Confira alguns exemplos de permissões utilizando a notação simbólica:
Notação Significado
u+x Adicionar permissão de execução para o dono.
u-x Remover permissão de execução do dono.
+x Adicionar permissão de execução para o dono, grupo e outros.
o-rw Remover a permissão de leitura e escrita de outros, exceto dono e grupo.
go=rw Definir a permissão de leitura e escrita para o grupo e outros.
Note que no caso de "go=rw" caso o grupo ou outros tivessem a permissão de execução, essa seria removida. Também é possível realizar múltiplas especificações, basta separar por vírgulas. Exemplo: u+x,go=rx
Então agora você compreende que quando alguém diz para você dar o comando "chmod +x" no script você está definindo permissão de execução para o dono, grupo e outros.
É possível definir permissões padrões com o comando umask que controla as permissões padrões dadas a um arquivo no momento que é criado.
Para isso usa-se notação octal para expressar uma máscara de bits a serem removidos dos atributos de modo do arquivo. Se você digitar no terminal "umask" (sem aspas) e der enter verá que por padrão o valor da máscara de criação de arquivos do Linux é 022, ou seja: 000 010 010 em octal.
Quando um arquivo ou diretório é criado eles são criados baseados nos seguintes valores: 0666 para arquivos e 0777 para diretórios.
Então por padrão qualquer arquivos e diretório criado terá as seguintes permissões:
- A permissão para criação de arquivos é 666 - 022 = 644
- rw- r-- r--
- A permissão para criação de diretórios é 777 - 022 = 744
- rwx r-- r--
Assim se você definir uma máscara 777 observa o que acontece:
No Linux é possível definir permissões especiais, sendo elas:
- SUID (set user ID): 4000 ou u+s
- SGID (set group ID): 2000 ou g+s
- Sticky bit: 1000 ou +t
Note que foi apenas adicionado o número 1, 2 ou 4 antes da permissão no formato octal. Então por exemplo uma permissão de leitura, escrita e execução (777) para dono, grupo e outros com uma permissão especial SUID seria: 4777.
A permissão especial SUID informa ao processo resultante assumir o identificador efetivo do dono do arquivo. Por exemplo o comando para trocar a senha no Linux precisa acessar o arquivo de senha que você como usuário comum não tem permissão de lê e escrever, observe a imagem:
Aquele "s" em -rwsr-xr-x significa que o programa passwd será executado no contexto do dono do arquivo, que no caso é o root. Assim possibilitando você utilizar o programa para mudar a senha. Representado pela letra "s" e encontra-se no final do campo dono.
Já a permissão especial SGID, quando um arquivo com setgid é executado, o processo resultante irá assumir o identificador efetivo do grupo do arquivo. Se for um diretório novos arquivos criados nele receberão o grupo do diretório ao invés do grupo do usuário que o criou. Representado pela letra "s" e encontra-se no final do campo "grupos".
E por ultimo a permissão especial Sticky bit antigamente para arquivos permitia que um executável não fosse paginado (swapped). Já para diretórios, previne que um usuário remova ou renomeie um arquivo a não ser que seja o dono do diretório, dono do arquivo ou o super-usuário. O Sticky bit é representado pela letra "t" e encontra-se no final do campo "outros".
Além do chmod você pode utilizar o comando chown, com ele você consegue alterar o dono e grupo de determinado arquivo. Exemplo:
Outro comando interessante é o chgrp que modifica o grupo proprietário, uma alternativa ao comando chown mas que funciona somente para o grupo.
No Linux no gerenciamento básico não é possível negar acesso a determinado usuário de determinado grupo caso o grupo possua permissão ao diretório que se deseja negar acesso. Para isso é necessário usar lista de controle de acesso (ACL). ACL é utilizada para arquivos/diretórios para determinar controle específico sobre um arquivo.
O comando getfacl permite você consultar a lista de controle. Enquanto que o comando setfacl permite você configurar a lista de controle. Consulte o manual de cada comando para mais informações. É importante saber que os arquivos/diretórios que estiverem dentro de um diretório irão herdar as regras de ACL desse diretório.
É possível limitar o tamanho do disco para cada usuário e grupo, independente do tamanho total da partição do disco rígido. O sistema de cotas de disco divide a cota em:
- Soft Limit
- Capacidade máxima que um usuário/grupo pode alocar do disco e também o número máximo de arquivos que podem criar.
- Usuários/grupos podem ultrapassar esse limite por período limitado de tempo.
- Hard Limit
- Mesmo que Soft Limit mas com a diferença que um usuário ou grupo não pode ultrapassar o limite definido.
O período limitado de tempo é chamado de Grace period (período de tolerância), período de tempo em que ainda é possível realizar gravações no disco quando o usuário/grupo ultrapassar o soft limit. Após esse tempo (ou atingindo o hard limit), o disco não alocará mais espaço.
Para utilizar o sistema de cotas, instale as ferramentas necessárias com o comando: apt-get install quota quotatool
Consulte o manual da ferramenta para conhecer os comandos para gerenciamento de cotas. Alguns conceitos importantes:
- Blocks: número de blocos ocupados no sistema.
- Soft: Limite em kbytes que um usuário ou grupo pode alocar no disco.
- Hard: Limite máximo em kbytes que um usuário ou grupo pode alocar no disco.
- Inodes: número de arquivos.
Próxima aula, clique aqui.
COMENTÁRIOS