chmod 777
chmod 777 define rwxrwxrwx: o dono, o grupo e qualquer outra conta da máquina podem ler, alterar e executar o arquivo, ou listar, criar e apagar itens dentro do diretório.
Matriz de permissões
| Quem | Leitura (4) | Escrita (2) | Execução (1) | Dígito |
|---|---|---|---|---|
| Dono (u) | Sim | Sim | Sim | 7 |
| Grupo (g) | Sim | Sim | Sim | 7 |
| Outros (o) | Sim | Sim | Sim | 7 |
Execução muda de sentido conforme o tipo. Num arquivo, deixa o kernel rodá-lo como programa. Num diretório, é a permissão de busca: entrar (cd) e alcançar os arquivos de dentro pelo nome. Leitura num diretório só lista os nomes.
| Quem | Num arquivo | Num diretório |
|---|---|---|
| Dono (u) | Ler, alterar e executar | Listar, entrar, criar, apagar e renomear itens |
| Grupo (g) | Ler, alterar e executar | Listar, entrar, criar, apagar e renomear itens |
| Outros (o) | Ler, alterar e executar | Listar, entrar, criar, apagar e renomear itens |
Dados
| Octal | 777 (0777) |
|---|---|
| Simbólico | rwxrwxrwx |
| ls -l, arquivo | -rwxrwxrwx |
| ls -l, diretório | drwxrwxrwx |
| Comando simbólico equivalente | chmod a=rwx |
| umask padrão que gera esse modo | umask 000 para diretórios novos |
| Como o Git registra um arquivo assim | 100755 (executável) |
| Bits especiais | Nenhum |
Quando usar
- Diretórios descartáveis numa máquina de um único usuário ou dentro de um contêiner temporário, onde não existe outra conta para abusar do acesso.
- Por um minuto, para confirmar que um erro é mesmo de permissão. Depois volte para o modo mais restrito que funcione.
Quando não usar
- Raiz de sites e pastas de upload. Qualquer processo do servidor, inclusive um script comprometido de outro site na mesma hospedagem, pode criar ou reescrever seus arquivos. O guia de segurança do WordPress diz que nenhum diretório deve ser 777, nem o de uploads.
- Diretórios compartilhados sem o sticky bit: qualquer usuário apaga ou renomeia arquivos dos outros. Use 1777 (o modo do /tmp) ou um grupo compartilhado com 2775.
- Qualquer coisa dentro de ~/.ssh. O ssh ignora chaves privadas acessíveis por outros, e o sshd com StrictModes (padrão) recusa o login se a home, o ~/.ssh ou o authorized_keys tiver escrita para outros.
Por que o 777 faz o erro sumir, e a correção de verdade
Quando uma aplicação web não consegue gravar numa pasta, o 777 parece resolver porque dá escrita para a classe outros, que inclui a conta do servidor web ou do PHP-FPM (www-data no Debian e Ubuntu, nginx ou apache no Fedora e RHEL). Só que dá a mesma escrita para todas as outras contas da máquina.
Dê o acesso só para essa conta: torne-a dona da pasta, ou coloque ela e o seu usuário de deploy num grupo comum e use 775 nos diretórios e 664 nos arquivos.
ps -o user= -C nginx,php-fpm,apache2,httpd | sort -u # com qual usuário o servidor roda
sudo chown -R www-data:www-data /var/www/site/uploads
sudo chmod 755 /var/www/site/uploadsComandos
chmod 777 shared
chmod a=rwx shared # mesmo resultadostat -c '%a %A %n' shared # Linux (stat do GNU): 777 drwxrwxrwx
stat -f '%Lp %Sp %N' shared # macOS e BSDAplicando numa árvore inteira
Não rode chmod -R 777. Isso deixa todo arquivo da árvore gravável e executável por qualquer conta. Se já aconteceu, restaure uma base sensata com os dois comandos find abaixo e devolva a execução só aos scripts que precisam.
find . -type d -exec chmod 755 {} +
find . -type f -exec chmod 644 {} +Git e o bit de execução
O Git guarda um único dado de permissão por arquivo: 100755 se o bit de execução do dono estiver ligado, 100644 caso contrário. Um arquivo com este modo entra no commit como 100755; os bits de grupo e outros nunca chegam ao repositório. No Windows, ou com core.fileMode false, ligue o bit com git update-index --chmod=+x.
Perguntas frequentes
- chmod 777 é seguro?
- Só onde nenhuma conta ou processo não confiável alcança o caminho. Num servidor com vários usuários ou num servidor web, qualquer conta pode alterar ou substituir os arquivos, então a invasão de qualquer outro serviço vira a invasão do seu.
- O que o chmod 777 faz em um diretório?
- Qualquer um pode listar, entrar e criar, apagar ou renomear qualquer arquivo dentro dele, inclusive de outros usuários, porque apagar depende da escrita no diretório, não no arquivo. Com o sticky bit (chmod 1777) só o dono de cada arquivo pode apagá-lo.
- Como desfazer um chmod -R 777?
- Corrija diretórios e arquivos separadamente: find . -type d -exec chmod 755 {} + e find . -type f -exec chmod 644 {} +. Depois devolva a execução só aos scripts que precisam, com chmod +x.
- chmod 777 é igual a chmod a+rwx?
- Os nove bits de permissão ficam iguais. A diferença é que o 777 numérico também zera setuid, setgid e sticky em arquivos comuns, enquanto o a+rwx mantém esses bits especiais como estavam.
Revisado em por Arielton Oberek.