Diretórios Linux
Tabela de Conteúdo
Por que entender a estrutura de diretórios do Linux é essencial para a Segurança do Sistema?
Ao mergulhar no mundo do Linux, uma das primeiras coisas a entender é sua estrutura de diretórios específica. À primeira vista, pode parecer um labirinto de pastas obscuras. No entanto, cada diretório tem um propósito específico, e entender essa estrutura é vital, não apenas para tarefas eficientes de administração do sistema, mas também para manter uma segurança robusta.
Os diretórios do Linux eram um pouco diferentes no passado. Mas eles foram meticulosamente padronizados e refinados ao longo do tempo e ainda estão evoluindo. Neste artigo, vou me aprofundar nas decisões por trás dos principais diretórios raiz, explicar a iniciativa Filesystem Hierarchy Standard (FHS) e explorar como esse entendimento pode ajudar a fortalecer a segurança do seu sistema.
Contexto e Histórico
Como a estrutura de diretórios do Linux foi projetada?
A estrutura de diretórios do Linux está profundamente enraizada na história do Unix. Os primeiros sistemas Unix, desenvolvidos na década de 1970, tinham armazenamento e memória limitados. Isso levou à criação de um layout de diretório mínimo e eficiente que influenciou a organização do Linux até hoje. Com o tempo, conforme os sistemas operacionais e as tecnologias evoluíram, essa estrutura foi refinada para equilibrar simplicidade, escalabilidade e segurança.
No Linux, assim como nos sistemas Unix, existem basicamente dois tipos de objetos: Diretórios e Arquivos. Na verdade, o diretório em si também é um arquivo, mas destinado a conter um catálogo composto por nomes de outros arquivos. Os arquivos são organizados em diretórios, que também podem conter outros diretórios, permitindo expandir a estrutura de diretórios de forma semelhante aos ramos de uma árvore, mas de forma simples, escalável e organizada. Na natureza, a base da árvore é a raiz (“root” em Inglês). Em sistemas Linux a base de diretórios é o diretório “root”, na prática representado por “/”.
Não confunda o diretório raiz "/" com o diretório home do usuário root, geralmente montado em "/root".
Acabei de mencionar a palavra “montado”, uma palavra muito comum na terminologia Linux. No Linux, os dispositivos de armazenamento são acessíveis aos usuários por meio de diretórios. Por esse motivo, costumamos dizer, por exemplo, “o drive USB está montado em /mnt/external_drive”. Usarei esse termo novamente mais tarde para que você esteja familiarizado com ele.
Voltando aos arquivos e diretórios, aqui está um exemplo de como diretórios e arquivos regulares são diferenciados na saída do comando “ls -l”.
ls -l /tmp/directory
drwxr-xr-x. 1 user group 60 31. Dez 23:59 /tmp/directory
ls -l /tmp/regular_file
-rw-r--r--. 1 user group 1 31. Dez 23:59 /tmp/regular_file
Observe o prefixo “d” para diretório e “-” para um arquivo regular.
Os tipos de arquivos regulares no Linux podem ser arquivos de texto, arquivos binários, arquivos de imagem, arquivos de áudio, arquivos de vídeo, arquivos compactados, arquivos de dados, arquivos de banco de dados, arquivos de configuração, arquivos de metadados e arquivos de dados específicos do dispositivo.
Atualmente, temos discos rápidos e de alta capacidade acessíveis por preços razoavelmente pequenos. Portanto, nos dias atuais, se um servidor tem vários dispositivos de armazenamento, o motivo é mais provável para aumentar o desempenho e/ou redundância do que para aumentar o espaço. Não era o caso no passado. À medida que o sistema Unix estava evoluindo, mais programas e recursos foram incluídos. Naturalmente, o próprio sistema e também os usuários exigiam mais espaço para acomodar os dados . Portanto, novos dispositivos de armazenamento foram incluídos sob demanda e montados em diretórios específicos novos ou existentes. De fato, esse caso de uso de “demanda por mais espaço” teve uma influência fundamental na definição atual dos principais diretórios raiz, que descreverei melhor ao longo do artigo.
Sabemos que os dois tipos de objetos são Diretórios e Arquivos, e que um dispositivo de armazenamento pode ser montado em um diretório. É hora de falar sobre arquivos especiais.
O que são os arquivos especiais do Unix/Linux?
Em um escopo mais amplo de um Sistema, ele precisa interagir com o hardware. Ele também deve facilitar a interação dos processos entre si. Ele também deve fornecer flexibilidade aos usuários e processos para organizar suas informações de forma eficiente, por exemplo, evitando a duplicação de dados. Todos esses e outros casos de uso são resolvidos de uma forma justa no Linux por meio de arquivos especiais. Existem 6 tipos de arquivos especiais no Linux.
1. Arquivos Especiais de Bloco
Arquivos de bloco fornecem acesso em buffer (ou orientado a bloco) a dispositivos
de hardware como discos rígidos, SSDs ou unidades USB. Eles permitem ler e gravar dados em blocos.
ls -l /dev/sda1
brw-rw----. 1 root disk 259, 1 31. Dez 23:59 /dev/sda1
O arquivo /dev/sda1 representa a primeira partição (1) do primeiro (a) disco (d) rígido SATA (s). Este arquivo permite que o sistema leia e grave dados na partição em blocos.
Observe a primeira letra na linha retornada pelo comando "ls -l" aqui e nos próximos exemplos. Neste caso, a letra "b" significa que /dev/sda1 é um arquivo de bloco.
Exemplo Prático
Quando você formata ou monta um disco rígido, você está interagindo com um arquivo de bloco:
sudo mkfs.ext4 /dev/sda1 # Formata a partição como ext4. Qualquer informação existente em /dev/sda1 será perdida após este comando.
sudo mount /dev/sda1 /mnt # Monta a partição no diretório /mnt.
2. Arquivos Especiais de Caracteres
Dispositivos de caracteres permitem acesso sem buffer a dispositivos
de hardware, o que significa que eles leem e gravam dados byte por byte. Eles são usados para dispositivos como teclados, mouses e portas seriais.
ls -l /dev/ttyUSB0
crw-rw----. 1 root dialout 4, 64 31. Dez 23:59 /dev/ttyUSB0
Este arquivo representa uma porta serial no sistema, usada para comunicação serial com dispositivos externos.
Exemplo Prático
Você pode interagir com um dispositivo serial assim:
sudo screen /dev/ttyUSB0 9600 # Abra uma comunicação serial a uma taxa de transmissão de 9600
3. Pipes Nomeados (FIFO)
Um pipe nomeado, também conhecido como FIFO (First In, First Out), é usado para Comunicação entre Processos (IPC). Ele permite que um processo grave dados e outro os leia.
ls -l /home/user/.steam/steam.pipe
prw-------. 1 user group 0 31. Dez 23:59 /home/user/.steam/steam.pipe
Exemplo Prático
Um pipe nomeado pode ser criado usando o comando mkfifo:
mkfifo /tmp/my_fifo
Um processo grava no pipe:
echo "Hello" > /tmp/my_fifo
Outro processo lê dele:
cat /tmp/my_fifo
4. Arquivos de Socket
Os arquivos de socket são usados para Comunicação entre Processos (IPC), geralmente em rede. Eles permitem comunicação bidirecional entre processos, localmente ou em uma rede.
ls -l /var/run/docker.sock
srw-rw-rw-. 1 user group 0 31. Dez 23:59 /var/run/docker.sock
Este é um arquivo de socket de domínio Unix usado pelo Docker para permitir que o Docker CLI e o serviço do Docker se comuniquem.
Exemplo Prático
Ao se conectar a este socket, você pode enviar comandos para o serviço do Docker:
sudo docker ps # Comunica-se com o daemon do Docker por meio do soquete
5. Links Simbólicos (symlinks)
Links simbólicos são arquivos especiais que apontam para outro arquivo ou diretório. Eles agem como atalhos para o arquivo ou diretório de destino.
ls -l /bin
lrwxrwxrwx. 1 root root 7 31. Dez 23:59 /bin -> usr/bin
Exemplo Prático
Um link simbólico pode ser criado assim:
ln -s /srv/www /var/www
Agora, /var/www irá se referir a /srv/www.
6. Arquivos Especiais de Dispositivo
Estas são interfaces abstratas para dispositivos de hardware como discos rígidos, terminais, impressoras, etc. O Linux usa esses arquivos, geralmente no diretório /dev, para fazer interface com o hardware.
ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 31. Dez 23:59 /dev/null
Este arquivo especial descarta todos os dados gravados nele e não retorna nada quando lido.
Exemplo Prático
É frequentemente usado para descartar saída indesejada:
some_command > /dev/null # Redirecione a saída para /dev/null para descartá-la
Visão geral dos principais diretórios raiz e suas implicações de segurança
Depois de saber sobre diretórios, arquivos regulares e arquivos especiais, e também o diretório raiz “/”, é hora de organizar as informações do sistema. Isso é feito por meio dos diretórios raiz principais, que são explicados abaixo.
/bin
, /sbin
, /usr/bin
e /usr/sbin
: binários do sistema
Esses diretórios armazenam binários do sistema. Embora todos contenham programas executáveis, eles diferem em propósito:
/bin
e/usr/bin
: contêm binários necessários durante a inicialização e no modo de usuário único./sbin
e/usr/sbin
: contêm binários essenciais para a administração do sistema, normalmente reservados para o superusuário.
A separação desses binários aumenta a segurança controlando o acesso e limitando danos potenciais se um diretório for comprometido. Definir permissões rigorosas nesses diretórios é crucial para evitar que usuários não autorizados alterem ou adicionem binários maliciosos.
Fatos Históricos
Curiosamente, a existência de /usr/bin
, assim como /usr/sbin
, /usr/lib
e /usr/tmp
foi para resolver um problema de falta de espaço, como mencionado por Rob Landley
. Quando o disco do sistema de arquivos raiz estava cheio, para liberar mais espaço, alguns programas “não essenciais” eram movidos para o mesmo disco onde as informações do usuário eram armazenadas, que era montado em /usr
. Mais tarde, um terceiro disco foi incluído e montado em /home
. Consequentemente, os dados do usuário eram movidos de /usr
para /home
. É por isso que os diretórios home do usuário são atualmente armazenados em /home
e a razão pela qual /usr
nos lembra de “usuário”, mas não tem dados de “usuário” como intuitivamente esperado.
Desde então, por algum tempo o conteúdo de /bin
, /sbin
, /lib
e /lib64
era independente de seus equivalentes em /usr
. Mas ao longo do tempo essa separação de binários criou problemas de compatibilidade entre distros e também criou alguma complexidade evitável para manter scripts e ferramentas. Essa foi a motivação para a Iniciativa USB Merge
que garantiu que /bin
, /sbin
, /lib
e /lib64
são atualmente links simbólicos para seus equivalentes em /usr
.
/etc
: Arquivos de Configuração
O diretório /etc
é o centro nervoso da configuração do seu sistema. Ele contém arquivos de configuração para o sistema operacional e o software instalado. Proteger /etc
é essencial, pois alterações não autorizadas nos arquivos de configuração podem levar a violações ou interrupções do sistema. As melhores práticas incluem usar permissões de arquivo adequadas e garantir que apenas usuários confiáveis possam modificar arquivos de configuração confidenciais.
Fatos Históricos
O nome “etc” no sistema de arquivos Linux se origina do UNIX e significa “et cetera”, que é uma frase to Latim que significa “e outras coisas”. Historicamente, o diretório /etc tinha a intenção de armazenar arquivos diversos, principalmente arquivos de configuração, que não se encaixavam em nenhum outro lugar do sistema de arquivos. Com o tempo, sua função se tornou mais formalizada e agora é especificamente designada para arquivos de configuração de todo o sistema. Apesar dessa evolução, o nome original permaneceu como um aceno às suas raízes históricas.
Há também uma alegação de que /etc significa “extensive text configuration” (configuração de texto extensiva) ou mesmo “edit to configure” (edite para configurar), mas estes são acrônimos modernos (uma criação retroativa de um significado para um termo existente) e não são historicamente precisos. Os pioneiros do UNIX e a documentação da época não fazem menção a “configuração de texto extensiva” ou outros backronyms possíveis. Em vez disso, eles descrevem claramente /etc como “et cetera” .
/var
: Arquivos de Dados Variáveis
O diretório /var
é o lar de arquivos de log, arquivos de spool e outros dados transitórios. Os logs armazenados em /var/log
são particularmente importantes para fins de monitoramento e auditoria. Proteger a integridade do log é essencial para rastrear atividades suspeitas. As medidas de segurança incluem definir permissões de acesso adequadas, configurar a rotação de log e proteger os logs contra exclusão ou adulteração não autorizada.
/home
: Dados dos Usuários
O diretório /home
abriga arquivos pessoais de cada usuário. Ao manter os dados dos usuários separados dos arquivos do sistema, o Linux minimiza o risco de um usuário comprometer inadvertidamente áreas críticas do sistema. O controle de acesso adequado e as permissões de arquivo em /home
garantem que os usuários possam acessar apenas seus próprios dados, protegendo sua privacidade e a segurança do sistema como um todo.
/tmp
: Arquivos Temporários
O diretório /tmp
é usado para armazenamento temporário de arquivos, acessível a todos os usuários. Como pode ser escrito por qualquer pessoa, /tmp
é um alvo potencial para riscos de segurança como condições de corrida
e ataques de link simbólico
. Implementar medidas como o sticky bit (que restringe a exclusão de arquivos ao proprietário do arquivo) e limpar regularmente o diretório pode ajudar a mitigar esses riscos.
A Iniciativa Filesystem Hierarchy Standard (FHS)
Havia uma estrutura básica de diretórios desde o início do Unix, mas a história também mostra que alguns diretórios foram criados sob demanda e esse também foi o caso depois de um longo tempo (talvez ainda válido). Como mais distribuições foram criadas e novas tecnologias foram introduzidas, houve uma demanda para criar um padrão pelo menos entre os principais diretórios raiz para manter a consistência entre diferentes distribuições Linux.
O Filesystem Hierarchy Standard (FHS) foi introduzido e já atualizado algumas vezes para alinhar-se às mudanças de contexto. O FHS é um conjunto de diretrizes que dita como os diretórios e seus conteúdos devem ser organizados. Essa padronização não apenas torna mais fácil para os usuários alternar entre distribuições, mas também garante caminhos e permissões previsíveis, que são essenciais para proteger um sistema Linux.
Uma documentação menos técnica e mais objetiva sobre o FHS também pode ser conferida aqui .
Melhores práticas de segurança vinculadas à estrutura de diretórios
Com esse contexto sobre como os diretórios e arquivos do Linux foram projetados, implementados, usados, evoluídos e padronizados, podemos falar sobre as melhores práticas de segurança mais básicas vinculadas aos diretórios do Linux.
Implementando o controle de acesso baseado em função (RBAC)
Entender a estrutura de diretórios é essencial para implementar o controle de acesso baseado em função (RBAC). O RBAC ajuda a definir funções de usuário e restringir permissões de acordo com o Princípio do Menor Privilégio. Ao atribuir cuidadosamente permissões a diretórios e arquivos específicos, você pode impedir o acesso não autorizado a áreas críticas do sistema.
Hardening de diretórios específicos
Certos diretórios, como /usr
e /etc
, são essenciais para a integridade do sistema. O hardening desses diretórios envolve limitar as permissões de gravação e usar ferramentas como SELinux ou AppArmor para impor políticas de segurança adicionais. Por exemplo, garantir que os usuários não possam gravar em binários do sistema em /usr
ajuda a evitar ataques de elevação de privilégios.
Auditoria e monitoramento de diretórios críticos
Auditoria regular de diretórios como /etc
, /var
e /usr
é crucial para manter a segurança. Monitorar esses diretórios para alterações inesperadas, acesso não autorizado ou modificações incomuns de arquivos pode ajudar a detectar possíveis violações antecipadamente. Implementar sistemas de detecção de intrusão (IDS) e configurar estratégias-chave de monitoramento de log.
DICA: Algumas ferramentas interessantes para começar a explorar são audit e ossec.
Conclusão: O papel do conhecimento na segurança do sistema
Entender a estrutura de diretórios do Linux é mais do que apenas uma habilidade fundamental - é um elemento crucial para manter um sistema seguro e confiável. Ao compreender o propósito dos diretórios principais e implementar medidas de segurança apropriadas, você pode reduzir significativamente o risco de comprometimento do sistema. No final, a segurança começa com conhecimento, e saber como seu sistema está organizado é o primeiro passo para uma proteção robusta.
Espero que minha pesquisa e vários anos de experiência trabalhando com Linux (e algumas aventuras com outros sistemas operacionais do tipo Unix) tenham ajudado você a aprender os conceitos mais importantes muito mais rápido do que eu. : )