Entendendo as permissões no Linux
Introdução: permissões Linux
Estou trabalhando em um projeto PHP. Só que quando tento acessá-lo pelo navegador vejo o seguinte erro:
Os arquivos estão hospedados na minha máquina local e mesmo assim não tenho acesso a eles pelo navegador. O que pode estar causando isso?
Se analisarmos a mensagem de erro, conseguimos obter algumas informações como:
Proibido Você não tem permissão para acessar loja/index.php
neste servidor.
Mas como assim não temos permissão? Precisamos, antes, entender o que são essas permissões…
Entendendo as permissões no Linux
No Linux, quando um arquivo ou diretório é criado, algumas permissões são atribuídas a ele automaticamente.
Essas permissões são divididas em três grupos: O usuário que criou o arquivo (usuário dono), o grupo dono do arquivo (que pode conter vários usuários), e as dos demais usuários que não pertencem ao grupo dono.
Essas permissões podem ser de leitura (r
, read), escrita (w
, write) e execução (x
, execute).
A permissão de leitura (r
) permite visualizar o conteúdo de um arquivo ou diretório, já a permissão de escrita (w
) serve para alterar o conteúdo de um arquivo e diretório.
A opção de execução serve para tornar o arquivo um executável, ou, em caso de diretórios, para poder acessá-lo e usar comandos, como o cd
.
Certo, já sabemos o que são e quais são as permissões, mas como podemos saber quais estão sendo usadas neste arquivo?
Visualizando as permissões no Linux
Para visualizar a permissão de um diretório, podemos ir até o local onde esse diretório se encontra.
O comando cd
(change directory) pode nos levar até esse local, que no meu caso fica em /var/www/html
. Portanto:
$ cd /var/www/html/
Agora podemos falar para o terminal listar (ls
, list) o conteúdo deste diretório:
Hum… Ainda não conseguimos visualizar as permissões.
A lista retornada pelo comando ls
é uma lista normal. Para visualizar os arquivos e suas permissões temos que dizer para o ls
que queremos uma lista longa (-l
).
$ ls -l
Agora temos algumas informações a mais, porém, como queremos saber apenas das permissões, vamos nos concentrar na primeira coluna.
A primeira coluna é dividida em dez caracteres. O primeiro nos mostra se o objeto listado é um arquivo (-
) ou um diretório (d
).
Os nove caracteres restantes nos mostram as permissões do usuário dono, grupo dono e outros usuários respectivamente:
Caso tenham alguma permissão, é mostrado a letra correspondente a permissão, senão um traço (-
) é apresentado.
Sabendo disso, já conseguimos dizer qual a permissão do nosso projeto loja. O usuário dono tem todas as permissões (rwx
), enquanto o grupo dono e o demais usuários não possuem nenhuma permissão (---
).
Mas, se eu criei os arquivos e tenho todas as permissões, por que não consigo acessar a página pelo navegador?
Quando acessamos uma página pelo navegador, por padrão, o servidor não sabe quem é o usuário, ou seja, quem acessa a página web utiliza a permissão outros.
Como o diretório do projeto não possui permissões disponíveis para o grupo de usuários outros não conseguimos acessar a página pelo navegador.
Logo, precisamos alterar as permissões desse diretório para conseguir ter acesso pelo navegador. Mas como podemos fazer isso?
Alterando permissões no Linux
Para alterar as permissões de um arquivo ou diretório, temos que alterar o modo (chmod
, change mode) que elas estão organizadas.
Queremos que os outros usuários (o
) tenham acesso de leitura (r
) no diretório, assim conseguirão visualizar os arquivos neles. Então podemos dizer para o terminal:
$ chmod o=r loja/
Vamos listar com a opção de lista longa para ver se ocorreu a mudança nas permissões:
Permissão atribuída! Vamos conferir se agora conseguimos nossa página pelo navegador:
Ainda não obtivemos sucesso. Nós atribuímos a opção para a leitura, que no caso de diretórios serve para conseguirmos visualizar seu conteúdo. Porém não temos permissão para acessar esses diretórios. Para isso, precisamos da permissão de execução (x
).
Já sabemos como alterar a permissão de uma pasta, então basta dizer que queremos adicionar (+
), a permissão de execução (x
):
$ chmod o+x loja/
Vamos tentar acessar novamente nosso projeto pelo navegador e ver se conseguimos visualizar nossa página:
Bem a página foi carregada, mas cadê o CSS? Por que será que ele não foi carregado?
Vamos checar as permissões dos arquivos do projeto e ver se temos permissão para acessá-los.
Para isso, podemos entrar no diretório como fizemos antes com o comando cd
, ou então, podemos pedir para o ls
listar o conteúdo do diretório loja:
$ ls -l loja/
Veja que nem os arquivos ou diretórios tem permissão para outros usuários. Ou seja, não conseguimos acessar o conteúdo dos diretórios. Para resolver esses problemas basta alterar a permissão de todas as pastas e diretórios.
“Mas temos que alterar a permissão de todos os arquivos, diretórios e subdiretórios um por um?”
Não precisamos! O chmod
tem uma opção que faz isso para a gente. Essa opção muda a permissão dos arquivos recursivamente. Isto é, ela muda a permissão de todos os arquivos em todo o diretório e subdiretórios.
Vamos então falar para o chmod
mudar a permissão de maneira recursiva (-R
) no diretório loja/
:
$ chmod -R o=rx loja/
Vamos checar com o comando ls
se a mudança ocorreu de fato:
Tudo certo! Agora se acessarmos pelo navegador devemos ver o site completo:
Sucesso! O site carregou, assim como todos os seus componentes.
Conseguimos alterar as permissões dos nossos arquivos, mas usamos apenas a opção para outros usuários (o
). O que fazer caso eu queira alterar as permissões do usuário e do grupo dono do arquivo?
Alterando a permissão do usuário e do grupo dono no Linux
Antes de mostrar como alterar a permissão do usuário e grupo dono de um arquivo ou diretório, vamos criar um arquivo de texto em qualquer lugar do sistema para ser usado como teste. No meu caso vou criar esse arquivo na área de trabalho:
Esse arquivo já contém algumas permissões que foram atribuídas por padrão no momento em que ele foi criado.
Vamos dizer para o chmod
que queremos que o usuário dono do arquivo (u
) tenha, além dessas permissões, a permissão de executar o arquivo.
Então eu posso falar para o chmod
acrescentar (+
) a permissão de execução para o usuário dono (u
):
$ chmod u+x teste.txt
Também podemos falar para o chmod
retirar (-
) a permissão de escrita do grupo dono (g
):
$ chmod g-w teste.txt
Se pedimos para listar esse arquivo e suas permissões, podemos ver as mudanças:
$ ls -l
“Hum… mas se eu quiser mudar a permissão de todos os usuários em um único comando, como posso fazer?”
Nós podemos, por exemplo, falar para o chmod
remover a permissão de execução do usuário dono do arquivo (u-x
), acrescentar as opções de escrita e execução para o grupo dono (g+wx
) e deixar os demais usuários apenas com a permissão de execução (o=x
):
$ chmod u-x,g+wx,o=x teste.txt
Pronto! Alteramos todas as permissões em apenas uma linha com um único comando. Se visualizarmos as permissões agora, veremos as mudanças:
Mas precisamos digitar muito para alterar todas as permissões. Existe alguma forma de ser mais direto na digitação?
Além de utilizar letras, chamado de modo simbólico, ou UGO (User, Group, Others), o chmod
aceita também alguns números. Quando utilizamos números para alterar as permissões, dizemos que estamos utilizando o modo octal.
Entendendo o modo octal
O modo octal recebe este nome, pois utilizamos oito números, de 0 à 7, cada um desses números correspondem a uma letra, ou a um conjunto de letras, no modo simbólico:
- 1 → Representa a opção de execução (
x
) no modo simbólico; - 2 → A opção de escrita (
w
); - 4 → A opção de leitura (
r
).
Quando utilizamos o modo octal, podemos passar o modo de permissões de cada grupo de usuários. A ordem é sempre: usuário dono, grupo dono e outros usuários.
Então eu posso falar para o chmod
, por exemplo, colocar a permissão de leitura para o usuário dono (4
), para o grupo dono a de escrita (2
) e a de execução para os demais usuários (1
):
$ chmod 421 teste.txt
Esso comando equivale a chmod u=r,g=w,o=x teste.txt
no modo simbólico.
Mas só podemos utilizar essas opções com o modo octal?
Nós também conseguimos combinar essas permissões no modo octal. Por exemplo, se desejamos que o usuário dono do arquivo tenha a permissão de leitura (4
) e escrita (2
), basta somar o valor dessas permissões. Portanto teríamos 6
.
Já se queremos tirar todas as permissões, basta colocar 0
.
Para fazer o usuário dono ter todas as permissões (7
) no arquivo, o grupo dono ter as permissões de leitura e escrita (6
) e os demais usuários não tenham nenhuma permissão (0
). Basta dizer isso ao chmod
:
$ chmod 760 teste.txt
Se listarmos as permissões, podemos checar se as mudanças funcionaram:
Nossas permissões foram atribuídas corretamente. :)
Para saber mais sobre permissões
Além do chmod
, outro comando muito utilizado quando é o chown (change owner). Esse comando consegue mudar o usuário e grupo dono de um arquivo ou diretório e só pode ser executado pelo superusuário, ou pelo usuário administrador utilizando o comando sudo
.
Devemos ter muito cuidado em dar permissões para os usuários que não fazem parte do grupo dono, ou não são donos dos arquivos ou pastas. Pois, dependendo da permissão, esses usuários conseguem ter acesso a um diretório ou arquivo no sistema. Conseguindo visualizar, alterar, ou até mesmo excluir seu conteúdo.
Tem permissão de prosseguir?
Permissões fazem parte do sistema. Sem elas não conseguimos visualizar, alterar ou executar arquivos, entrar em diretórios ou listar seu conteúdo. Até mesmo para acessar um site na internet precisamos de permissões.
No Linux, conseguimos alterar a permissão de arquivos e diretórios usando um comando próprio para isso, o chmod
. Esse comando nos permite alterar as permissões do usuário e grupo dono do arquivo ou diretório e dos demais usuários.
Mas antes de alterar, temos que entender quais são essas permissões e como podem ser representadas.
Gosta de Linux? Aqui na Alura temos uma formação completa no sistema. Nela, você aprenderá comandos do sistema, sobre a árvore de diretórios, alguns comandos de rede, como adicionar usuários e grupos, além de muito outras coisas.