Luciano Siqueira

lcnsqr.com



Tópico 5: Segurança e Permissões de Arquivos

Peso: 7

5.1: Segurança Básica e Identificação de Tipos de Usuários

Peso: 2

O Linux é um sistema operacional multiusuário. Como o nome sugere, esse tipo de sistema operacional permite que diferentes usuários utilizem o sistema de modo independente. Ou seja, diferentes pessoas podem utilizar o mesmo sistema operacional sem que seus arquivos e personalizações estejam acessíveis a outros usuários.

Diferentes usuários podem utilizar o sistema operacional ao mesmo tempo. Apesar de não ser comum um mesmo computador possuir mais de um teclado e monitor, é bastante comum que diversos usuários utilizem o mesmo sistema via rede.

Outra vantagem em manter os usuários em contas distintas é poder controlar seus privilégios dentro do sistema. Um usuário deve poder trabalhar com seus arquivos e ter acesso restrito a certos recursos do computador, mas não deve ter acesso a arquivos de terceiros ou a recursos que podem prejudicar o funcionamento do sistema operacional. O único usuário que possui acesso irrestrito dentro do sistema operacional é o usuário root.

O usuário root

O principal usuário de um sistema Unix é o usuário chamado root. Ele é criado por padrão e é utilizado para configurar o sistema operacional e corrigir eventuais problemas. Também é o único usuário cujo diretório pessoal não está no diretório padrão de usuários, /home, mas na raiz do sistema de arquivos, em /root.

Senha de root

A senha do usuário root normalmente é definida durante a instalação do sistema operacional. Em alguns casos, não é atribuída uma senha ao usuário root, e será necessário utilizar o comando sudo para realizar operações de root.

Devido ao seu poder irrestrito no sistema operacional, é importante ter muito cuidado quando utilizando o usuário root. Mesmo tratando-se de um computador pessoal utilizado por apenas uma pessoa, é recomendável operar o computador com um usuário convencional.

Usuários convencionais e de sistema

É o usuário root o responsável por criar usuários no sistema local. Todas as contas de usuário são armazenadas no arquivo de configuração /etc/passwd. O usuário root também pode associar um usuário a um grupo para lhe conferir privilégios extras. Os grupos do sistema e os usuários a eles associados são armazenados no arquivo /etc/group.

Todo usuário está associado a pelo menos um grupo, chamado seu grupo principal. O grupo principal é único, mas o usuário pode estar associado e diversos outros grupos.

Cada usuário e grupo possuem um número único associado, chamado respectivamente UID e GID. O único usuário com um número padrão é o root, com número UID 0. Os números de um usuário e de seus grupos podem ser observados com o comando id. Sem argumento, o comando id exibe o número do usuário atual e os grupos aos quais pertence:

$ id
uid=13130(lcnsqr) gid=207(bmac) groups=207(bmac)

Neste exemplo, o número (uid) do usuário lcnsqr é 13130, o número de seu grupo principal (bmac) é 207 e está associado somente a este grupo. Os números são gerados automaticamente, geralmente sendo atribuídos números a partir de 1000 para usuários convencionais.

Usuários comuns podem executar tarefas normalmente reservadas ao root com o comando sudo. Por exemplo, para utilizar o comando administrativo apt-get dist-upgrade com o sudo:

$ sudo apt-get dist-upgrade

O sudo pode ser configurado para restringir diferentes tipos de ação a usuário específicos, solicitando ou não uma senha. Ele também pode ser usado com o comando su para iniciar uma nova sessão do shell como outro usuário, com o comando sudo su usuário, onde usuário é o nome de login do outro usuário. Caso a conta do root tenha uma senha definida, pode ser utilizado o comando su diretamente:

$ su -

Nesse caso será necessário fornecer a senha do root para prosseguir.

Além dos usuários convencionais, existem usuários especiais chamados usuários de sistema. Estes usuários não correspondem a uma pessoa, mas a alguma tarefa do sistema operacional. Essa abordagem oferece uma camada adicional de segurança, pois programas executados por um usuário não podem interferir com arquivos e processos que não lhe pertencem.

Inspeção de usuários

O usuário root pode interferir em processos de outros usuários e modificar seus arquivos. O root pode até checar quem está usando o sistema com o comando who. Com o comando w o usuário root pode verificar quem está utilizando o sistema e sua atividade no momento.

O comando lastlog exibe quando foi a última vez que cada usuário entrou no sistema:

$ lastlog -t 2
Nome de Usuário         Porta     De             Último
guilherme        pts/1    143.107.45.1     Qua Fev 27 09:14:45 -0300 2019
lucas            pts/1    143.107.45.1     Ter Fev 26 10:23:34 -0300 2019
gustavo          pts/1    143.107.45.1     Ter Fev 26 19:47:28 -0300 2019
afranio          pts/2    143.107.45.1     Ter Fev 26 19:17:22 -0300 2019
filipe           pts/1    c-73-208-7-86.hs Ter Fev 26 15:39:21 -0300 2019
willian          pts/1    179.225.189.179  Qua Fev 27 08:57:10 -0300 2019
lcnsqr           pts/2    189.79.126.38    Qua Fev 27 09:57:19 -0300 2019

A opção -t 2 foi utilizada para limitar a inspeção aos últimos dois dias. É possível verificar a partir de onde o usuário ingressou no sistema e qual foi a data e hora exatas do login.

O comando last possui finalidade semelhante, mas exibindo os últimos ingressos de usuários no sistema. Para verificar os últimos ingressos de um usuário específico, basta fornecer seu nome de usuário como argumento:

$ last lcnsqr
lcnsqr   pts/2        189.79.126.38    Wed Feb 27 09:57   still logged in
lcnsqr   pts/1        189.79.126.38    Tue Feb 26 17:27 - 17:32  (00:04)
lcnsqr   pts/1        189.79.126.38    Tue Feb 26 16:29 - 17:15  (00:46)
lcnsqr   pts/0        189.79.126.38    Wed Feb 20 16:24 - 16:27  (00:02)
lcnsqr   pts/0        189.79.126.38    Wed Feb 20 16:24 - 16:24  (00:00)

wtmp begins Fri Feb  1 13:48:21 2019

O comando last reboot mostra quando o sistema foi ligado pela última vez, ou seja, desde quando está ligado. O usuário root pode verificar também se houveram tentativas mal sucedidas de ingresso no sistema com o comando lastb.

5.2: Criação de Usuários e Grupos

Peso: 2

Em ambientes onde mais de uma pessoa utiliza o computador ou utiliza os recursos fornecidos por ele via rede, é muito importante que cada uma delas possua restrições para que não comprometa dados sensíveis, sejam eles pertinentes ao próprio sistema, sejam pertinentes a outros usuários. Para isso, para cada usuário é criada uma conta com a qual ele acessará o sistema.

Cabe ao usuário root administrar as contas e grupos de usuários. Contudo, o próprio usuário pode modificar alguns aspectos de sua própria conta no sistema.

Conta de usuário

O comando useradd é usado pelo usuário root para criar uma nova conta no sistema. As principais opções do useradd são:

Com a opção -k /etc/skel novos diretórios pessoais podem ser criados a partir de um conteúdo padrão armazenado em /etc/skel. Esse procedimento facilita a criação de várias contas de usuário a partir de um perfil pré-definido.

Para que o usuário possa acessar sua conta, o administrador precisará definir uma senha para ele. Isso pode ser feito por meio do comando passwd usuário. Usado sem argumentos, passwd altera a senha para o usuário atual, o que pode ser feito por um usuário comum. O passwd também pode ser utilizado pelo usuário root para bloquer a conta de um usuário. Por exemplo, a conta do usuário luciano pode ser bloqueada com o comando passwd -l luciano. A conta poderá ser desbloqueada com o comando passwd -u luciano.

O campo de descrição pode ser alterado com o comando chfn e o shell principal pode ser alterado com chsh. Usuários comuns podem usar estes comandos para alterar exclusivamente suas próprias contas.

Uma conta de usuário pode ser apagada com o comando userdel. A opção -r assegura que o diretório pessoal do usuário também seja apagado.

As informações de conta dos usuários do sistema são armazenadas no arquivo /etc/passwd, no formato:

root:x:0:0::/root:/bin/bash
luciano:x:1000:1000:Luciano Antonio Siqueira:/home/luciano:/bin/bash

Cada usuário é definido em uma linha, em campos separados por “:” representando, respectivamente:

Para editar diretamente o arquivo /etc/passwd, é recomendado usar o comando vipw, que bloqueia o arquivo /etc/passwd contra possíveis alterações concorrentes, evitando corrupção do arquivo. A edição será feita com o editor padrão, via de regra o editor vi. Usado com a opção -s, vipw abrirá para edição o arquivo /etc/shadow.

Senhas shadow

O arquivo /etc/passwd pode ser lido por qualquer usuário, o que pode tornar as senhas criptografadas passíveis de decodificação. Para evitar essa possibilidade, é usado um segundo arquivo, acessível apenas ao usuário root, o arquivo /etc/shadow. As senhas dos usuários são armazenadas num hash criptografado que não pode ser facilmente decodificado.

Como no arquivo /etc/passwd, os campos no arquivo /etc/shadow são separados por “:”, correspondendo a:

As informações referentes à validade da senha também podem ser modificadas por meio do programa chage, com as seguintes opções:

Para usuários comuns, o chage só pode ser usado com a opção -l usuário, que mostra as restrições referentes ao usuário em questão. O comando usermod agrega as funções de alteração de conta de usuário por meio das opções:

Os arquivos /etc/passwd e /etc/shadow armazenam somente as informações diretamente relacionadas a cada conta de usuários. Grupos de usuários são configurados em seus próprios arquivos de configuração.

Grupos de usuários

Para criar um grupo de usuários, é usado o comando groupadd:

# groupadd estudo_c

O número de identificação do grupo (GID) pode ser especificado com a opção -g. Para excluir um grupo, é usado o comando groupdel:

# groupdel estudo_c

Um usuário poderá ser incluído/excluído de um grupo com o comando gpasswd, utilizando o argumento adequado. As opções mais comuns do gpasswd são:

Um usuário pode pertencer a mais de um grupo, mas apenas um grupo pode ser o principal. Para mostrar os grupos aos quais um usuário pertence, pode ser usado o comando groups usuário. Usado sem argumentos, o comando groups mostra os grupos do usuário atual.

As informações sobre os grupos existentes no sistema são armazenadas no arquivo /etc/group. Neste arquivo, cada grupo é definido em uma linha, em campos separados por :, representando:

Para editar diretamente o arquivo /etc/group, é altamente indicado usar o comando vigr, que bloqueia o arquivo /etc/group contra possíveis alterações externas, evitando corrupção do arquivo.

O comando groupmod agrega algumas funções de alteração de grupos. Suas opções mais comuns são:

A principal finalidade dos grupos é permitir que usuários executem atividades que não são permitidas fora do grupo em questão. Essas atividades estão relacionadas principalmente à leitura e escrita em arquivos e diretórios restritos. Portanto, é importante compreender como funciona o sistema de permissões de arquivos em ambientes Unix.

5.3: Controle de Permissões e Propriedade de Arquivos

Peso: 2

Em sistemas de arquivos do padrão Unix, existem regras de permissões que determinam a quem pertence um determinado arquivo ou diretório e quais usuários ou grupos podem utilizá-los. Para arquivos e diretórios há três níveis de permissão:

O diretório /var/run contém arquivos com diferentes tipos de permissões, identificadas na primeira coluna:

drwx------  2 root           root             40 fev 26 10:08 cryptsetup
drwxr-xr-x  3 root           lp               80 fev 26 10:08 cups
srw-rw-rw-  1 root           root              0 fev 26 10:08 .heim_org.h5l.kcm-socket
drwxrwxr-x  2 lightdm        lightdm          40 fev 26 10:08 lightdm
drwxr-x---  2 root           root             40 fev 26 10:08 pptp
-rw-r--r--  1 root           root              4 fev 26 10:08 crond.pid
drwx------  2 root           root             40 fev 26 10:51 udisks2
srw-rw-rw-  1 root           root              0 fev 26 10:08 secrets.socket
drwxr-x---  2 chrony         chrony           80 fev 27 09:00 chrony
prw-------  1 root           root              0 fev 26 10:08 dmeventd-server
drwx------  2 rpc            rpc              60 fev 26 10:08 rpcbind
drwxrwxr-x  2 root           root             40 fev 26 10:08 netreport
-rw-r--r--  1 root           root              5 fev 27 09:00 dhclient6-enp0s25.pid
prw-------  1 root           root              0 fev 26 10:08 initctl

A primeira letra representa o tipo do arquivo, podendo ser:

As demais letras são divididas em grupos de três, determinando as permissões para o dono do arquivo, o grupo do arquivo e demais usuários, respectivamente. O arquivo crond.pid, por exemplo, possui permissão rw- para o dono do arquivo (o usuário root), permissão r-- para o grupo (o grupo root) e permissão r-- para os demais usuários.

Alterando permissões

As permissões são alteradas com o comando chmod e podem ser de leitura (r), escrita (w) e execução (x). Por exemplo, o grupo ao qual pertence um arquivo chamado documentos.tar.gz terá apenas acesso de leitura a este e para os demais usuários será retirada a permissão de leitura:

$ chmod g=r,o-r documentos.tar.gz

Para incluir permissão de escrita para o grupo do arquivo documentos.tar.gz:

$ chmod g+w documentos.tar.gz

Apesar de possuírem o mesmo modelo de permissões, arquivos e diretórios comportam-se de maneiras diferentes tendo as mesmas permissões. Em diretórios, a permissão r possibilita ler o conteúdo do diretório, a permissão w permite criar arquivos dentro do diretório e x permite listar o conteúdo do diretório.

Permissões numéricas (octais)

Permissões podem ser manejadas de modo mais sucinto através de um formato numérico, chamado octal. O número octal consiste em uma sequencia de quatro dígitos. O primeiro dígito representa uma permissão especial, abordada adiante. Os demais representam as permissões para o usuário, grupo e outros, nessa ordem.

Cada dígito indica a presença de uma permissão a partir da soma dos valores 4, 2 e 1. Esses valores correspondem à leitura, escrita e execução. A tabela a seguir mostra todas permissões possíveis, desde 0 (nenhuma permissão) até 7 (todas as permissões).

Dígito Leitura (valor 4) Escrita (valor 2) Execução (valor 1)
0
1 Sim
2 Sim
3 Sim Sim
4 Sim
5 Sim Sim
6 Sim Sim
7 Sim Sim Sim

Dessa forma, o comando chmod 0664 arquivos.tar.gz mudará as permissões do arquivo documentos.tar.gz para -rw-rw-r--, ou seja, leitura e escrita para o usuário, leitura e escrita para o grupo e somente leitura para os demais.

Para mudar recursivamente todos os arquivos dentro de um diretório especificado, utiliza-se o chmod com a opção -R.

Modificar donos e grupos de arquivos

Para alterar dono e grupo de arquivos e diretórios, utiliza-se os comandos chown e chgrp. O primeiro argumento é um nome válido de usuário ou grupo e o segundo é o arquivo ou diretório a ser alterado. Apenas o usuário root pode usar o comando chown, mas qualquer usuário pode usar o comando chgrp em seus arquivos e diretórios, desde que faça parte do grupo que será atribuído.

Mudar dono de arquivo usando o chown:

# chown luciano documentos.tar.gz

Mudar grupo de arquivo:

$ chgrp users documentos.tar.gz

Para alterar usuário e grupo simultaneamente:

# chown luciano.users documentos.tar.gz

ou

chown luciano:users documentos.tar.gz

Tanto chown quanto chgrp possuem a opção -R para alterar conteúdos de diretórios recursivamente.

5.4: Arquivos e Diretórios Especiais

Peso: 1

Permissões suid e sgid

Num ambiente Unix, todos os processos são vinculados ao usuário que os iniciou. Dessa forma, o programa herdará as mesmas permissões de leitura e escrita do usuário que o executou. Algumas tarefas, no entanto, exigem que o processo altere ou acesse arquivos para os quais o usuário não tem a permissão necessária. Por exemplo, alterar a própria senha exige que o arquivo /etc/shadow seja alterado, mas as permissões de /etc/shadow limitam a escrita ao usuário dono deste arquivo (o usuário root):

$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1172 Mai 15  2017 /etc/shadow

Para contornar essa condição, existe um tipo de permissão especial, chamada suid (set user id). Arquivos executáveis que possuam a permissão suid serão executados com as mesmas permissões do dono do comando e não com as permissões do usuário que o executou. A permissão suid é representada pela letra s no lugar do x na porção referente ao dono do arquivo:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54192 Fev 24  2017 /usr/bin/passwd

Para incluir a permissão suid em um arquivo executável, utiliza-se:

# chmod u+s comando

De maneira semelhante, a permissão sgid atua em diretórios. Ela é uma permissão de grupo, portanto aparece no campo de permissões referente ao grupo. Num diretório com a permissão sgid, todos os arquivos ali criados pertencerão ao grupo do diretório em questão, o que é especialmente útil em diretórios onde trabalham usuários pertencentes ao mesmo grupo.

Quando ativas, as permissões suid e sgid fazem aparecer a letra s no lugar da letra x nas permissões de dono do arquivo e grupo do arquivo, respectivamente. Se a permissão de execução também existir, aparecerá a letra s minúscula. Se apenas as permissões suid e sgid existirem, aparecerá a letra S maiúscula.

A permissão sticky

O inconveniente em usar diretórios compartilhados é que um usuário poderia apagar algum ou todo o conteúdo inadvertidamente. Para evitar que isso aconteça, existe o a permissão sticky, que impede usuários de apagar arquivos não criados por eles mesmos. É o caso do diretório /tmp, cujas propriedades podem ser verificadas com o comando ls -l mais a opção -d, que permite obter informações do próprio diretório em questão e não de seu conteúdo:

$ ls -ld /tmp
drwxrwxrwt 17 root root 36864 Fev 27 11:32 /tmp

A letra t nas permissões para demais usuários demonstra o uso da permissão sticky. Se apenas a permissão sticky existir, aparecerá a letra T maiúscula.

Para atribuir a permissão sticky num diretório chamado trabalho, portanto, pode ser utilizado um comando como chmod o+t trabalho.

Permissões especiais em formato numérico

Como as opções convencionais, as permissões especiais também podem ser manipuladas em formato octal (numérico). A permissão especial é o primeiro dos quatro dígitos da opção no formato octal. A tabela a seguir detalha essa correspondência.

Dígito suid (valor 4) sgid (valor 2) sticky (valor 1)
0
1 Sim
2 Sim
3 Sim Sim
4 Sim
5 Sim Sim
6 Sim Sim
7 Sim Sim Sim

Links são arquivos especiais que têm finalidade de atalho para outros arquivos, facilitando a maneira como são acessados. Existem dois tipos de links: o softlink (link simbólico) e o hardlink (link físico).

Hardlinks são um ou mais nomes que um inode do sistema de arquivos pode ter. Todo arquivo criado é, necessariamente, um hardlink para seu inode correspondente. Novos hardlinks são criados usando o comando ln:

$ ln documentos.tar.gz docs.tar.gz

O que é um inode?

Um inode é o elemento básico que identifica o arquivo no sistema de arquivos. O primeiro inode de um arquivo guarda suas propriedades e indica em quais outros inodes do sistema de arquivos os dados deste arquivo estão localizados.

A opção -i do comando ls mostra o número dos inodes dos arquivos:

$ ls -i
6534 documentos.tar.gz  6534 docs.tar.gz

Ambos documentos.tar.gz e docs.tar.gz são hardlinks para o mesmo inode 6534. Hardlinks para o mesmo inode possuem mesma permissão, donos, tamanho e data, pois esses atributos são registrados diretamente nos inodes.

$ ls -l documentos.tar.gz
-rw-r--r-- 2 luciano luciano 188 Oct 16 22:10 documentos.tar.gz

O número 2 na segunda coluna de informações demonstra que há dois hardlinks para o inode correspondente ao arquivo documentos.tar.gz. Um arquivo só é de fato apagado do sistema de arquivos quando o último hardlink remanescente é excluído.

Hardlinks só podem ser criados dentro de um mesmo sistema de arquivos. Não é possível criar hardlinks para diretórios. Os arquivos especiais . e .. são hardlinks para diretório criados exclusivamente pelo próprio sistema.

Links simbólicos podem apontar para qualquer alvo, inclusive em sistemas de arquivos diferentes. Para criar um link simbólico, usa-se ln com a opção -s:

$ ln -s documentos.tar.gz atalho.tar.gz

Detalhes do link:

$ ls -l atalho.tar.gz
lrwxrwxrwx 1 lcnsqr bmac 17 Fev 27 11:40 atalho.tar.gz -> documentos.tar.gz

Um link simbólico é indicado pela letra l no início das permissões que, nesse caso, são sempre rwxrwxrwx. O tamanho do arquivo de link é exatamente a quantidade de bytes (caracteres) do caminho alvo. A seta ao lado do nome do link simbólico indica o caminho até o alvo.

Um link simbólico para um caminho relativo será quebrado se o alvo ou o próprio link for movido. Um link simbólico para um caminho absoluto só será quebrado se o alvo for movido ou apagado. Para atualizar a informação de alvo de um link simbólico existente, mas “quebrado”, pode-se redefinir o alvo do link com a opção -f.

Funções comuns para links simbólicos são indicar caminhos longos frequentemente usados, criar nomes mais simples para arquivos executáveis e nomes adicionais para bibliotecas de sistema.