Permissões modo hardcore: Entendendo o umask

O conceito de permissões de arquivos no Linux é algo relativamente simples, no entanto, a medida que sua estrutura de armazenamento e compartilhamento de dados cresce, implementar este conceito de forma efetiva e segura deixa de ser tão trivial. Então, vou começar com três perguntas que serão respondidas no artigo:

1: Se você digitar o comando: “mkdir teste” no seu terminal agora, quais serão as permissões da nova pasta criada?

2: E se o comando digitado for: “nano receita.txt”. Quais serão as permissões do arquivo receita.txt?

3: De que importa saber disso?

E já vamos seguir, respondendo as duas primeiras questões apresentadas.

Referente a configuração da minha distribuição, que uso neste momento, o que tenho é:

$ ls -lh
total 4,0K
-rw-rw-r-- 1 wbraga wbraga 8 abr 1 11:43 receita.txt
drwxrwxr-x 1 wbraga wbraga 0 abr 1 11:43 teste

Diretório “teste” – Permissão rwxrwxr-x (775, em modo octal)
Arquivo “receita.txt” – Permissão rw-rw-rw- (664, em modo octal)

Talvez na sua máquina o resultado seja diferente isso, mas surge uma quarta questão que gostaria de responder antes da questão 3 apresentada no começo do texto:

Por que o arquivo e a pasta foram criados com estas permissões?

Quando o seu sistema cria um arquivo ou uma pasta ele calcula as permissões iniciais com base no chamado “umask”. Esta é a máscara, ou a permissão padrão para criação de itens no seu filesystem, na sessão atual do seu usuário.

Valores comuns de umask costumam ser 0022 ou 0002, sendo o primeiro valor o padrão em sistemas Debian-Like, como (Debian, Mint, Ubuntu etc).

Consultando o umask da sua sessão

Para saber qual é o umask exato no seu sistema, você pode usar o comando umask sem parâmetros no seu terminal, como abaixo:

$ umask
0002

Definindo o umask da sua sessão

Para definir um novo umask e assim poder criar arquivos e pastas com as permissões corretas, você usa o mesmo comando umask seguido do valor desejado, como abaixo:

$ umask 0022

Neste comando, se estiver tudo certo, nada é retornado porém você pode consultar o umask como mostrado antes para validar.

Agora vem a parte importante, porém chata, de se entender.

Álgebra de Boole e sistemas de numeração

Se você achou que o valor retornado pelo comando umask não tem qualquer relação com as permissões 775 e 664 que resultou na criação da pasta e do arquivo anteriormente, é porque, as permissões são calculadas com álgebra booleana, no sistema de numeração octal.

Ficou difícil? Não vou me aprofundar nestes dois temas visto que não é o propósito e o assunto é tão complexo e extenso a ponto de haver uma disciplina especifica só para tratar disso quando se faz uma graduação em Ciência da Computação ou algum curso similar.

Mas para resumir e ninguém ficar [muito] perdido, sistema octal é aquele que nós contamos de 0-7, ao invés de contarmos de 0-9 (nosso tradicional sistema decimal). Trata-se de mais um sistema numérico muito usado na computação, tal como é o sistema hexadecimal, onde contamos de 0-F e o sistema binário (0-1).

E álgebra de Boole, ou álgebra booleana, embora possa ser usada em qualquer destes sistemas de numeração, fica mais simples a entendermos no sistema binário, então as seguintes expressões de exemplo, são válidas nesta “parte louca da matemática” (considere que os números estão no sistema binário):

1 E 1 = 1
1 E 0 = 0
0 E 1 = 0
NÃO 1 = 0
NÃO 0 = 1

Para não bugar o cérebro de ninguém, nós vamos recorrer ao auxílio da calculadora do Gnome em modo “Programável” e usando a base octal (lembre-se que as permissões são octais e não decimais) para fazer os cálculos e vamos voltar as nossas permissões e umask.

Calculando as permissões com Umask (na calculadora, claro)

Em uma definição matemática, o valor da permissão de um arquivo é dado pela expressão 666 AND ( NOT UMASK) e para diretórios é 777 E ( NOT UMASK).

AND e NOT são operações booleanas usadas em cada bit que correspondem as nossas permissões. O 666 e o 777 são as permissões máximas dadas a um arquivo ou diretório, o que significa que é impossível definir um umask com permissão “x’ (de execução) para arquivos.

Exemplo 1

Suponhamos que eu tenha definido o umask do meu sistema para 0022. Pra isso eu digitaria na linha de comandos  “umask 22” (os zeros a esquerda sempre podem ser desprezados), ou então este seria o padrão do meu sistema.

Ao criar um arquivo, neste sistema, qual seria a sua permissão?

Já sabendo que o umask foi definido para “22”, basta aplicar a fórmula abaixo, onde o 666 é a permissão máxima que se pode definir para os arquivos, & é a operação booleana AND e ! é a operação booleana NOT.

666 & (!22)

Na calculadora em modo programável, eu teclaria [6][6][6] [AND] [(][NOT] 22[)] [=] e o resultado será 644.

644 é a permissão que será atribuída a tal arquivo (ou rw-r–r– em modo literal). Ou seja, o dono do arquivo pode ler e alterar o conteúdo do arquivo, enquanto membros do mesmo grupo onde está o arquivo e demais usuários somente poderão fazer a leitura dele.

Vamos ver um outro exemplo. Se eu criar um diretório após ter definido o mesmo umask 22, qual seria a sua permissão?

Da mesma forma, aplicamosa fórmula, onde 777 é a permissão máxima dada a um diretório, & é a operação AND, ! é a operação NOT e no final temos que:

777 & (!22) = 755

O resultado 755 em modo literal seria o mesmo que rwxr-xr-x. Ou seja, o dono do diretório pode listar, alterar e entrar no diretório, enquanto membros do mesmo grupo onde está o diretório e demais usuários somente poderão listar o seu conteúdo ou entrar nele.

Observe os resultados dos dois cálculos na calculadora do Gnome em modo programável, mas fique a vontade para usar a ferramenta de sua preferência para repetir os cálculos, caso queira.

Calculando as permissões de um arquivo e uma pasta com o umask definido em 0022, usando a calculadora do Gnome

Vamos conferir isso na prática. Abra um terminal e digite os comandos abaixo:

umask 22
touch arquivo1
mkdir diretorio1
stat -c "%n - %a %A" arquivo1 diretorio1
arquivo1 - 644 -rw-r--r--
diretorio1 - 755 drwxr-xr-x

Ai eu defini o umask para “22”, conforme os exemplos. Criei um arquivo e um diretório. Ao invés do comando “ls” para listar o arquivo e o diretório criados, eu optei pelo comando “stat” apenas por comodidade, para simplificar a visualização das permissões. Observe que as permissões são exatamente as previstas.

Exemplo 2

Para termos um outro referencial, vamos considerar que o umask do meu sistema seja 0002. Vamos aplicar a fórmula para descobrir quais seriam as permissões para um arquivo e para uma pasta criadas em meu sistema.

Para diretórios:

777 & (!2) = 775

Para arquivos:

666 & (!2) = 664

O resultado 775 (que em modo literal é o mesmo que rwxrwxr-x). Indica que tanto o dono do diretório quando os membros do grupo poderão listar, alterar e entrar no diretório, enquanto os demais usuários somente poderão listar o seu conteúdo ou entrar nele.

No caso do arquivo, o resultado 664 (que em modo literal é o mesmo que rw-rw-r–). Indica que tanto o dono do arquivo quando os membros do grupo poderão ler ou alterar o seu conteúdo, enquanto os demais usuários somente poderão ler o seu conteúdo.

Agora, acho que já podemos voltar a nossa terceira pergunta inicial.

De que me importa saber disso?

Sabemos que as permissões são assim chamadas porque são elas quem definem quem pode ou não acessar determinado diretório ou arquivo de seu sistema.

Junte a isso que sabemos ainda que quando se trata de segurança qualquer segundo que você esteja vulnerável pode ser um convite para o desastre.

Se você precisa criar um diretório que deve ter restrições de acesso, ao invés de primeiro criar o seu diretório para depois definir as permissões, o ideal seria fazer o inverso, ou seja, primeiro define as permissões e depois cria-se o diretório ou arquivo.

Compartilhando arquivos com outros usuários

Se você já tentou criar uma pasta para compartilhar alguns arquivos com outros usuários, é muito provável que você tenha se frustrado ao notar que quando alguém cria um determinado arquivo, outras pessoas até poderão ler, mas não alterar aquele arquivo.

Isso ocorre porque geralmente a permissão padrão do sistema que está configurada desde modo. Se lembra que eu disse que algumas distribuições usam o umask 0022 (permissão 755 e 664) ou 0027 (permissão 750 e 640) ?

Com estas umasks, observe que de fato qualquer usuário, que não o dono estará impossibilitado de alterar ou criar itens dentro desta pasta ou arquivo até que o dono use o comando chmod para corrigir a permissão, dando direito aos membros do grupo para gravarem seu conteúdo.

Uma forma de evitar isso em sistemas com vários usuários é … adivinha… definir um umask mais permissivo para estes usuários (digamos, 0002). Assim todas as vezes que criarem um arquivo eles serão graváveis não apenas pelos donos, mas também pelos membros do grupo.

Calculando o umask certo

Eu mostrei, como calcular a permissão a partir de um umask, mas vamos supor que você queira fazer o inverso, ou seja, você quer definir a permissão de um arquivo ou diretório a partir do umask, então qual valor usar para umask?

Para não deixar ninguém traumatizado, ao invés de mais cálculos booleanos eu vou deixar duas regras simples:

Para arquivos subtraia 6-OCTAL já para diretórios subtraia 7-OCTAL.

Sendo assim, qual deve ser o valor do umask para que ao criar um arquivo, sua permissão seja exatamente 600?

Vamos fazer os cálculos bem rápido, como abaixo:

6-6 = 0
6-0 = 6
6-0 = 6

Agora é só criar o arquivo:

$ umask 66
$ nano meuarquivosecreto.conf
$ umask 22

Após criar o arquivo com a permissão desejada eu voltei o umask para o valor original, e assim evitar que outros arquivos sejam criados com esta permissão, mas dependendo da situação isso é opcional.

Como definir o umask de forma permanente?

Agora que sabemos como definir as permissões para uma pasta ou arquivo compartilhado de forma correta, só nos falta colocar esta configuração de forma permanente.

Uma forma de se fazer isso para um conjunto de usuários seria colocar o comando “umask 0002” ou “umask 2”, como preferir, dentro de algum arquivo de inicialização da sessão dos usuários. Por exemplo dentro de ~/.bashrc ou ~/.profile.

Se quiser definir de forma global, para todos os usuários sem exceção, você pode fazê-lo no arquivo /etc/login.def (perdoem-me minha ignorância, mas não tenho certeza se em distribuições que não as baseadas em Debian possuem este mesmo arquivo, mas certamente há algum outro equivalente).

Um outro caso a ser considerado também seria de arquivos que devem ser acessados por mais de um sistema. Digamos que os arquivos do seu servidor web (apache) é também acessado pelos usuários a partir de uma conexão FTP (proftpd). O Apache é iniciado com um usuário especifico (www-data, no Debian ou httpd, no Redhat), enquanto que no FTP eles serão acessados pelo usuário “proftpd” ou pelo próprio usuário que fez o login (dependendo da configuração feita). Caso não queira definir o umask de forma global como dito no parágrafo anterior, você deverá procurar qual arquivo de inicialização destes serviços será mais adequado e lá definir o umask permissivo para estes dois serviços.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.