drwxr-xr-x: permissões Linux explicadas
Entenda drwxr-xr-x caractere a caractere e converta para 755. Veja por que x em diretórios permite atravessar e por que chmod 777 não corrige o problema.
O que significa drwxr-xr-x
drwxr-xr-x descreve um diretório que o proprietário pode alterar e que todos os outros utilizadores podem ler e atravessar sem o alterar. Em octal, esse modo é 755. O Linux apresenta estes dez caracteres no início de cada linha da saída de ls -l, e eles significam sempre o mesmo, na mesma ordem. Por isso, aprender uma cadeia permite interpretar todas.
Há uma regra que vem antes das restantes, porque determina se os seus próprios testes produzem alguma informação. O utilizador root ignora os bits de permissões. O kernel concede a root a capacidade CAP_DAC_OVERRIDE (substituição do controlo de acesso discricionário), permitindo-lhe abrir ficheiros cujo modo o impediria. Todos os exemplos desta página têm êxito para root, independentemente dos bits. Inicie sessão como um utilizador normal quando quiser observar as regras em funcionamento.
Os dez caracteres, um de cada vez
Crie um diretório e um ficheiro para analisar. Nada aqui altera qualquer coisa fora do novo diretório.
mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txtCom o umask predefinido comum de 022, as duas linhas dos diretórios começam por drwxr-xr-x e a linha do ficheiro começa por -rw-r--r--.
O caractere 1 indica o tipo de ficheiro, não uma permissão. d é um diretório. - é um ficheiro regular. l é uma ligação simbólica. c e b são nós de dispositivo de caracteres e de blocos. s é um socket e p é um named pipe. Este caractere fica fora do valor octal. Por isso, drwxr-xr-x torna-se 755, em vez de começar por d.
Os nove caracteres seguintes formam três grupos de três e nunca mudam de ordem.
- Os caracteres 2 a 4 formam a tríade do proprietário, os bits aplicáveis ao utilizador proprietário do ficheiro.
- Os caracteres 5 a 7 formam a tríade do grupo, os bits aplicáveis ao grupo do ficheiro.
- Os caracteres 8 a 10 formam a tríade dos outros, os bits aplicáveis a todos os restantes utilizadores.
Dentro de uma tríade, as posições são sempre r, depois w e depois x. Um traço significa que esse bit está desativado. As letras nunca mudam de posição. r-x significa leitura sem escrita. -w- significa escrita sem leitura, o que é permitido, mas raro.
Assim, drwxr-xr-x divide-se da seguinte forma: d para o diretório, depois rwx para o proprietário, depois r-x para o grupo e depois r-x para os outros.
Alguns sistemas apresentam um décimo primeiro caractere. Um ponto final, drwxr-xr-x., significa que o ficheiro tem um contexto SELinux (security enhanced Linux), que distribuições com SELinux, como Fedora e Rocky, apresentam por predefinição. Um sinal de mais no final, drwxr-xr-x+, significa que o ficheiro tem uma ACL POSIX (access control list), um conjunto adicional de regras além destes nove bits. Consulte essas regras adicionais com getfacl <path>.
r, w e x desempenham funções diferentes num diretório
Esta é a primeira regra que os iniciantes costumam interpretar mal. As letras são iguais num ficheiro e num diretório. As permissões que concedem não são.
rnum ficheiro lê o conteúdo.rnum diretório lista os nomes existentes nele, que é o que umlssimples precisa.wnum ficheiro altera o conteúdo.wnum diretório adiciona e remove entradas nele. Apagar um ficheiro altera o diretório. Por isso, é a permissão de escrita no diretório que decide essa operação. O modo do próprio ficheiro não interfere.xnum ficheiro executa-o como programa.xnum diretório permite atravessá-lo. Isso significa que o kernel pode resolver um nome dentro dele durante a procura de um caminho.
O atravessamento é a parte que mais surpreende. x num diretório não executa nada. Abrir /srv/site/index.html precisa de x em /, depois de x em /srv, depois de x em /srv/site e, por fim, de r no ficheiro. Se um diretório dessa cadeia não tiver x para si, a procura para nesse ponto. O chamador recebe Permission denied para todo o caminho, mesmo quando o ficheiro no fim tem leitura para todos. namei -l /srv/site/index.html mostra cada passo da cadeia com o respetivo modo e proprietário, para indicar qual ligação interrompe a procura.
Um diretório com r e sem x é um estado intermédio invulgar que é importante reconhecer. Um utilizador normal pode listar os nomes, porque é isso que r concede, mas não pode obter os metadados de nenhuma entrada. Por isso, ls -l preenche as colunas de tamanho e modo com pontos de interrogação e mostra ls: cannot access ...: Permission denied para cada entrada.
Transformar as letras em 755
Cada tríade é um número de três bits. r vale 4, w vale 2 e x vale 1. Some os bits que estão ativos.
rwxvale 4 + 2 + 1 = 7rw-vale 4 + 2 = 6r-xvale 4 + 1 = 5r--vale 4---vale 0
drwxr-xr-x é, portanto, 7 para o proprietário, 5 para o grupo e 5 para outros: 755. -rw-r--r-- é 6, 4, 4: 644. drwxrwxr-x é 7, 7, 5: 775, que corresponde a 755 com a permissão de escrita adicionada ao grupo. Nunca é necessário contar os caracteres manualmente, porque stat mostra as duas formas ao mesmo tempo.
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt%A é a forma com letras, %a é a forma octal, e %U e %G indicam o utilizador proprietário e o grupo proprietário.
As cadeias de permissões que as pessoas procuram
Estes são os modos encontrados num servidor real, com o valor octal e os locais onde cada um aparece.
-rw-r--r--é 644. Ficheiros comuns que um serviço apenas lê, como um ficheiro de configuração ou uma página HTML.-rw-------é 600. Segredos: uma chave privada SSH ou o ficheiro.envde uma aplicação.-rw-rw-r--é 664. Um ficheiro num diretório partilhado por um grupo, onde os membros da equipa precisam de permissões de escrita.-rwxr-xr-xé 755. Scripts e binários, como/usr/local/bin/backup.she a maioria de/usr/bin.-rwx------é 700. Um script privado que apenas o proprietário pode executar.drwxr-xr-xé 755. Quase todos os diretórios do sistema e o document root de um website.drwx------é 700.~/.sshe os diretórios home num sistema com permissões restritas.drwxrwxr-xé 775. Um diretório no qual o grupo do proprietário pode escrever.drwxrwsr-xé 2775. O mesmo, com o bit setgid, para que os novos ficheiros dentro do diretório herdem o grupo do diretório.drwxrwxrwté 1777./tmp. Otfinal é o sticky bit, por isso um utilizador só pode apagar os próprios ficheiros.-rwsr-xr-xé 4755. Um binário setuid que é executado com as permissões do proprietário, como/usr/bin/passwde/usr/bin/sudo.-rw-rw-rw-é 666 edrwxrwxrwxé 777. Permissões de escrita para todos, o que num servidor é quase sempre um erro.lrwxrwxrwxé o que todas as ligações simbólicas mostram. O Linux ignora os bits de modo de uma ligação e verifica o destino, por isso esta cadeia não tem qualquer significado.
Qual tríade se aplica a si
Esta é a segunda regra que os principiantes entendem mal. O kernel escolhe exatamente uma tríade e para aí.
Se o seu ID de utilizador corresponder ao proprietário do ficheiro, recebe a tríade do proprietário. Os bits do grupo e de outros utilizadores nunca são consultados. Caso contrário, se o grupo do ficheiro for um dos seus grupos, recebe a tríade do grupo. Caso contrário, recebe a tríade de outros utilizadores.
Daqui resultam duas consequências. A tríade do proprietário aplica-se mesmo quando é a mais restritiva. Um ficheiro com o modo 0466, apresentado como -r--rw-rw-, dá ao proprietário apenas permissão de leitura, enquanto todas as outras pessoas podem escrever, porque a verificação do proprietário correspondeu primeiro e nada depois foi consultado. Isto é válido e confunde toda a gente quando se depara com este caso pela primeira vez.
A tríade do grupo é escolhida pelo grupo do ficheiro, não pela lista de grupos a que pertence. ls -l apresenta dois nomes em cada linha: primeiro o proprietário e depois o grupo. Apenas esse segundo grupo tem efeito sobre o ficheiro. Pertencer a vinte grupos só ajuda quando o ficheiro tem um deles.
id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txtid apresenta o seu utilizador e todos os grupos a que pertence. stat apresenta o proprietário e o grupo do ficheiro. Compare os dois resultados para saber qual a tríade que o kernel usará consigo.
É por isso que um diretório partilhado normalmente recebe um grupo e o bit setgid. sudo chmod 2775 /srv/shared é apresentado como drwxrwsr-x, e os ficheiros criados dentro dele herdam o grupo do diretório em vez do grupo pessoal do criador. Assim, a pessoa seguinte pode continuar a escrever neles. Atribuir uma conta própria a cada serviço é a outra parte desta abordagem e é explicado em um utilizador Linux por serviço num VPS.
o umask determina o modo de todos os ficheiros novos
Um ficheiro novo não obtém o modo a partir de si. Obtém-no do programa que o criou, menos os bits que o umask limpa. O umask é uma máscara de bits a remover, por isso um umask maior produz ficheiros mais privados.
A maioria das distribuições fornece 022. Um programa que cria um ficheiro normal pede 0666. Um programa que cria um diretório pede 0777. O umask limpa 022 de ambos os pedidos, por isso obtém 644 nos ficheiros e 755 nos diretórios. Este é exatamente o par que aparece em todo o lado num VPS novo.
umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdirumask -S imprime o mesmo valor como letras, o que é mais fácil de ler do que 0022. Defina umask 027 em ~/.profile para obter um padrão mais restritivo: 640 nos ficheiros e 750 nos diretórios, para que o seu grupo possa ler o seu trabalho e mais ninguém possa.
Há dois limites importantes. O umask só pode limpar bits, nunca adicioná-los, por isso um ficheiro recém-criado nunca é executável, independentemente do valor definido. Além disso, um serviço systemd nunca lê o seu perfil da shell, por isso defina o valor no ficheiro da unidade.
[Service]
UMask=0027Por que os ficheiros web têm permissões 644 e os diretórios web têm permissões 755
Um servidor web é executado com a sua própria conta: www-data no Debian e Ubuntu, nginx no Rocky e Alma. Esse processo precisa de ler os ficheiros que serve e de atravessar os diretórios acima deles. Não tem motivo para os alterar, e um site estático nunca deve permitir isso.
A permissão 644 num ficheiro dá escrita ao proprietário e leitura a todos, permitindo ao utilizador de deployment publicar e ao utilizador web servir. A permissão 755 num diretório dá escrita ao proprietário e permissão de travessia a todos, permitindo ao utilizador web percorrer o caminho sem poder adicionar ou apagar nada. Assim, um erro na aplicação não consegue reescrever as páginas que está a servir.
A regra de travessia é aplicada exatamente aqui. Se o site estiver em /home/deploy/site e /home/deploy tiver a permissão 750, o utilizador web não consegue entrar no diretório pessoal, e o pedido termina com HTTP 403 e uma linha semelhante a esta em /var/log/nginx/error.log:
open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5Esse 13 é EACCES, a recusa de permissões pelo kernel. Não há nenhum problema na rede: a porta está à escuta e o pedido chegou, o que torna este caso confuso enquanto ainda está a aprender como funcionam as portas à escuta no Linux. Execute namei -l /home/deploy/site/index.html e percorra a cadeia até encontrar o primeiro diretório sem x para outros.
Um diretório onde a aplicação escreve, como um caminho de uploads, é uma exceção. Conceda esse acesso através do proprietário, em vez de usar um modo mais permissivo: sudo chown -R www-data:www-data /srv/site/uploads e mantenha o modo em 755. Mantenha o acesso de escrita apenas no diretório que precisa dele.
chmod sem alterar toda a árvore
chmod aceita as duas formas. O modo octal define os nove bits de uma só vez: chmod 644 notes.txt. O modo simbólico altera apenas o que é especificado e mantém o restante inalterado: chmod u+x deploy.sh adiciona a permissão de execução ao proprietário, e chmod go-w notes.txt remove a permissão de escrita do grupo e de outros utilizadores.
A recursão é o ponto em que as árvores de diretórios ficam danificadas. chmod -R 755 . torna executáveis todas as imagens e todos os ficheiros de configuração, porque chmod não consegue distinguir um script de um JPEG. Em vez disso, use o X em maiúsculas.
chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txtX em maiúsculas aplica a permissão de execução aos diretórios e aos ficheiros que já tinham algum bit de execução definido. Os diretórios ficam com 755, os ficheiros comuns ficam com 644 e os scripts que já eram executáveis mantêm essa permissão. Quando um ficheiro já tem um modo de permissões de confiança, chmod --reference=good.sh other.sh copia esse modo para os restantes.
As mensagens apresentadas quando algo está errado
bash: ./deploy.sh: Permission denied significa que o script não tem o bit x na tríade aplicável ao seu caso, ou que um diretório no seu caminho não tem x. chmod u+x deploy.sh corrige o primeiro caso.
bash: ./deploy.sh: cannot execute: required file not found é uma falha diferente, com um nome confuso. O bit x está correto, mas falta o interpretador indicado na primeira linha. A causa habitual são terminações de linha do Windows, fazendo com que o kernel procure um interpretador chamado /bin/bash\r. Corrija com sed -i 's/\r$//' deploy.sh.
Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. vem do cliente SSH, que se recusa a usar uma chave privada que possa ser lida por outras contas. A chave deve ter 600 e ~/.ssh deve ter 700. O tratamento completo das chaves está em gerir chaves SSH e as respetivas permissões de ficheiro.
Authentication refused: bad ownership or modes for directory /home/deploy/.ssh aparece no journal do servidor quando um diretório pessoal ou o seu .ssh permite escrita pelo grupo. A configuração StrictModes do sshd rejeita a chave. Do lado do cliente, isto aparece como um pedido inesperado de palavra-passe, sem explicação.
sudo: /etc/sudoers is world writable, seguido de sudo: no valid sudoers sources found, quitting, significa que o sudo verificou o modo da sua própria configuração e recusou-se a executar. Esse ficheiro deve ter 0440. Esta é a consequência clássica de um chmod recursivo demasiado abrangente. Também pode ocorrer juntamente com a mensagem do sshd acima, deixando a consola do fornecedor como a única forma de recuperar o acesso.
Por que 777 não é uma correção
777 concede acesso de escrita a todas as contas da máquina e a todos os processos executados por essas contas. Um servidor executa os serviços com utilizadores próprios, por isso “todos” inclui muito mais contas num VPS do que num computador portátil. Um serviço comprometido pode escrever em qualquer local onde 777 permita.
Num diretório raiz de um site, o risco é direto. Um diretório com permissão de escrita para todos, que também seja servido pelo servidor, transforma uma falha no carregamento de ficheiros numa forma de instalar um script e depois solicitá-lo.
777 quase nunca é a resposta correta para um problema de propriedade. O sintoma é “a aplicação não consegue escrever neste diretório”. A causa é que o diretório pertence ao utilizador errado. sudo chown -R appuser:appuser /srv/app/storage com o modo 755 resolve o problema e impede o acesso de todas as outras contas. A criação dessas contas antes de qualquer implementação faz parte de os primeiros dez minutos num VPS novo.
A escrita para todos é legítima num local conhecido, /tmp, e escreve-se drwxrwxrwt. O t final é o sticky bit: o diretório permite escrita a todos, mas cada utilizador só pode apagar os ficheiros que lhe pertencem. Sem esse bit, qualquer conta poderia apagar os ficheiros temporários de outra conta.
Leia o modo antes de o alterar
Estes comandos apenas consultam o estado, por isso são seguros para executar em qualquer local.
id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002find <path> -perm -0002 lista tudo sob um caminho cujo bit de escrita para outros utilizadores está definido. É a forma mais rápida de auditar um servidor depois de alguém ter corrigido ficheiros com chmod 777.
Para verificar se uma determinada conta de serviço pode entrar num diretório, faça a consulta com essa conta. sudo -u www-data test -x /srv/site && echo yes || echo no imprime yes quando esse utilizador tem permissão de travessia no diretório e no quando não tem. Fazer a consulta como root não prova nada, porque root ignora essa verificação e a resposta é sempre yes.
FAQ
O que significa drwxr-xr-x no Linux?
É um diretório, indicado pelo d inicial, com o modo 755. A tríade do proprietário é rwx, portanto o proprietário tem todas as permissões. A tríade do grupo é r-x e a tríade dos outros utilizadores é r-x, portanto todos os restantes podem listar os nomes existentes e atravessar o diretório, mas apenas o proprietário pode adicionar ou remover conteúdos. Confirme qualquer caminho com stat -c '%A %a %U %G %n' <path>, que apresenta a forma textual e a forma octal lado a lado.
Por que os ficheiros Web têm 644 e os diretórios Web têm 755?
O servidor Web é executado com uma conta diferente, www-data no Ubuntu. Precisa de ler os ficheiros que serve e de atravessar todos os diretórios acima deles, mas não precisa de escrever em nenhum dos dois. O modo 644 dá escrita ao proprietário e leitura a todos os restantes. O modo 755 dá escrita ao proprietário e permite que todos os restantes atravessem o diretório. Um diretório em que a aplicação precise efetivamente de escrever deve ser atribuído com chown ao utilizador dessa aplicação, em vez de alargar o modo para todos.
O bit x significa que posso executar um diretório?
Não. Num diretório, x significa atravessar. É o direito de resolver um nome dentro dele enquanto o kernel percorre um caminho. cd precisa dessa permissão, tal como qualquer abertura de um ficheiro abaixo desse diretório. Cada diretório no caminho precisa de x. Por isso, um ficheiro com o modo 644 continua inacessível quando um diretório acima dele não tem x para si. namei -l /path/to/file apresenta o modo de todos os diretórios na cadeia e mostra onde a resolução do caminho para.
chmod 777 é alguma vez a solução correta?
Quase nunca num servidor. Concede escrita a todas as contas da máquina, incluindo as contas usadas pelos serviços. Assim, um serviço comprometido pode reescrever o ficheiro. Quando uma aplicação não consegue escrever num diretório, o problema real costuma ser o proprietário: sudo chown -R appuser:appuser /srv/app/storage com o modo 755 dá à aplicação o que precisa e impede o acesso dos restantes. A exceção conhecida é /tmp com 1777. Isto só funciona porque o sticky bit impede os utilizadores de eliminar os ficheiros uns dos outros.
Por que o ls apresenta um ponto ou um sinal de mais depois das permissões?
Esse décimo primeiro caráter descreve regras além dos nove bits de permissão. Um ponto, como em drwxr-xr-x., significa que está associado um contexto de segurança SELinux, o que é normal no Fedora e no Rocky. Um sinal de mais, como em drwxr-xr-x+, significa que está definida uma ACL POSIX (lista de controlo de acesso), pelo que algum utilizador ou grupo tem permissões que as três tríades não apresentam. Execute getfacl <path> para listar essas entradas adicionais.