Uma das primeiras ações de um invasor costuma ser substituir arquivos e programas do sistema com o intuito de mascarar sua visita atual e, principalmente, facilitar as visitas futuras. Portanto, se houver a possibilidade de verificar a integridade de arquivos do sistema, haverá uma grande possibilidade de detectar uma invasão. E o melhor é que este recurso permite que se saiba quais arquivos foram modificados, possibilitando que o administrador decida entre reinstalar o sistema ou apenas substituir o arquivos alterados pelos originais.
Após perceber que a máquina foi invadida, o administrador costuma analisar o sistema utilizando programas como ps, ls, netstat e who. Ocorre que estes programas são os primeiros a serem substituídos, ocultando, assim, a invasão e o invasor propriamente dito. Mesmo que se tenha a informação de data e tamanho dos arquivos originais, estas informações, sozinhas, não podem ser utilizadas como parâmetro, pois podem ser facilmente modificadas. Contudo, se além destas informações estiver disponível algo como o checksum MD5 dos arquivos, torna-se bem mais simples encontrar arquivos indevidamente modificados.
O AIDE (Advanced Intrusion Detection Environment) é um programa que tem justamente a finalidade de verificar a integridade dos arquivos do sistema. Ele constrói uma base de dados com várias informações dos arquivos especificados em seu arquivo de configuração. Esta base de dados pode conter vários atributos dos arquivos, como:
permissões;
número do inode;
dono;
grupo;
tamanho;
data e hora de criação, último acesso e última modificação.
Além disso, o AIDE também pode gerar e armazenar nesta base de dados o checksum criptográfico dos arquivos, utilizando um ou uma combinação dos seguintes algoritmos: md5, sha1, rmd160 e tiger.
O procedimento recomendado é que você crie esta base de dados em um sistema recém-instalado, antes de conectá-lo a uma rede. Esta base de dados será a fotografia do sistema em seu estado normal e o parâmetro a ser utilizado para medir alterações no sistema de arquivos. Obviamente, sempre que você modificar o seu sistema, como por exemplo através da instalação, atualização ou remoção de programas, uma nova base de dados deve ser gerada. Esta nova base de dados é que deve ser utilizada como parâmetro. A base de dados deve conter informações sobre binários, bibliotecas e arquivos de cabeçalhos importantes do sistema, já que estes não costumam ser alterados durante o uso normal do sistema. Informações sobre arquivos de log, filas de correio eletrônico e de impressão, diretórios temporários e de usuários não devem ser armazenados na base de dados, já que são arquivos e diretórios freqüentemente alterados.
Para instalar o AIDE, utilize o apt-get, digitando o seguinte comando em um terminal:
# apt-get install aide |
A configuração do AIDE reside no arquivo /etc/aide.conf. Este arquivo tem três tipos de linhas:
linhas de configuração: utilizadas para definir parâmetros de configuração do AIDE.
linhas de seleção: utilizadas para indicar quais arquivos terão suas informações adicionados à base de dados.
linhas de macro: utilizadas para definir variáveis no arquivo de configuração.
Apenas as linhas de seleção são essenciais ao funcionamento do AIDE. Existem, por sua vez, três tipos de linhas de seleção. Estas linhas são interpretadas como expressões regulares. Linhas que começam com uma barra “/” indicam que os arquivos que casarem com o padrão terão suas informações adicionadas ao banco de dados. Se a linha iniciar com um ponto de exclamação “!”, ocorre o contrário: os arquivos que casam com o padrão são desconsiderados. Linhas iniciadas por um sinal de igualdade “=” informam ao AIDE que somente arquivos que sejam exatamente iguais ao padrão devem ser considerados.
Através das linhas de configuração é possível definir alguns parâmetros de funcionamento do AIDE. Estas linhas têm o formato parâmetro=valor. Os parâmetros de configuração estão descritos a seguir:
A URL do arquivo de banco de dados de onde as informações são lidas. Pode haver somente uma linha destas. Se houver mais de uma, apenas a primeira será considerada. O valor padrão é ./aide.db.
A URL do arquivo de banco de dados onde são escritas as informações. Assim como database, deve haver apenas uma linha destas. No caso de haver várias, somente a primeira ocorrência será considerada. O valor padrão é ./aide.db.new.
A URL onde a saída do comando é escrita. Se existirem várias instâncias deste parâmetro, a saída será escrita em todas as URLs. Se você não definir este parâmetro, a saída será enviada para a saída padrão (stdout).
Define o nível de mensagens que é enviado à saída. Este valor pode estar na faixa entre 0 e 255 (inclusive) e somente a primeira ocorrência deste parâmetro será considerada. É possível sobrescrever este valor através das opções --version ou -V na linha de comando.
Informa se o banco de dados deve ser compactado ou não. Valores válidos para esta opção são yes, true, no e false.
Se o parâmetro não for nenhum dos anteriores então ele é considerado uma definição de grupo. Embora existam alguns grupos predefinidos que informam ao AIDE quais as informações do arquivo que devem ser armazenadas na base de dados, você pode criar suas próprias definições. A Tabela 15.3. Grupos Predefinidos mostra os grupos predefinidos.
Tabela 15.3. Grupos Predefinidos
| p | permissões |
| i | inode |
| n | número de links |
| u | dono |
| g | grupo |
| s | tamanho |
| m | data e hora da última modificação |
| a | data e hora do último acesso |
| c | data e hora da criação do arquivo |
| S | verifica o aumento do tamanho do arquivo |
| md5 | checksum md5 |
| sha1 | checksum sha1 |
| rmd160 | checksum rmd160 |
| tiger | checksum tiger |
| R | p+i+n+u+g+s+m+c+md5 |
| L | p+i+n+u+g |
| E | grupo vazio |
| > | arquivo de log (aumenta o tamanho) - p+u+g+i+n+S |
Você poderia definir um grupo que verifica apenas o dono e o grupo do arquivo, da seguinte maneira:
trivial=u+g |
As linhas de macro podem ser utilizadas para definir variáveis e tomar decisões baseadas no valor destas. Informações detalhadas podem ser encontradas na página de manual do arquivo de configuração (man aide.conf).
O termo URL, utilizado na configuração dos parâmetros database, database_out e report_url, pode assumir um dos seguintes valores:
stdout: a saída é enviada para a saída padrão.
stderr: a saída é enviada para a saída padrão de erros.
stdin: a entrada é lida da entrada padrão.
file:/arquivo: a entrada é lida de arquivo ou a saída é escrita em arquivo.
fd:número: a entrada é lida do filedescriptor número ou a saída é escrita no filedescriptor número.
Note que URLs de entrada não podem ser utilizadas como saídas e vice-versa.
O Exemplo 15.3. Arquivo de Configuração do AIDE ilustra uma configuração básica para o AIDE.
Exemplo 15.3. Arquivo de Configuração do AIDE
# Localização da base de dados database=file:/var/aide/aide.db # Local onde é criada uma base de dados nova database_out=file:/var/aide/aide.db.new # Arquivo onde será salva a saída do programa report_url=/var/aide/report.aide # Grupo para verificação de dono, grupo e permissões trivial=u+g+p /bin R /sbin R /boot R /etc R # Verifica apenas dono, grupo e permissões /etc/passwd trivial /etc/shadow trivial # Ignora o diretório /etc/X11 !/etc/X11 /lib R # Incluindo /var /var R # Ignora /var/log, /var/spool e /var/lock !/var/log/.* !/var/spool/.* !/var/lock/.* # Ignora o arquivo /var/run/utmp !/var/run/utmp$ |
O ideal é ignorar diretórios que são modificados com muita freqüência, a não ser que você goste de logs gigantescos. É um procedimento recomendado excluir diretórios temporários, filas de impressão, diretórios de logs e quaisquer outras áreas freqüentemente modificadas. Por outro lado, é recomendado que sejam incluídos todos os binários, bibliotecas e arquivos de cabeçalhos do sistema. Muitas vezes é interessante incluir diretórios que você não costuma observar, como o /dev/.
![]() | Atenção |
|---|---|
Se sua idéia é referir-se a um único arquivo, você deve colocar um $ no final da expressão regular. Com isto, o padrão casará apenas com o nome exato do arquivo, desconsiderando arquivos que tenham o início do nome similar. | |
O pacote do AIDE que acompanha o Conectiva Linux tem um arquivo de configuração padrão funcional, mas nada o impede de modificá-lo para refletir suas necessidades.
Como o arquivo de configuração padrão deverá servir para a maioria dos casos, para gerar o banco de dados basta executar os comandos:
# /usr/bin/aide -i # mv /var/aide/aide.db.new /var/aide/aide.db |
Após esta operação, você deve executar o comando:
# /usr/bin/aide-md5 [dispositivo de boot] |
O parâmetro [dispositivo de boot] é opcional, e corresponde ao dispositivo de armazenamento utilizado para inicialização do sistema (/dev/hda, por exemplo).
O aide-md5 foi desenvolvido pela Conectiva e supre a falta de assinatura do banco de dados do AIDE. Ele informa os somatórios MD5 de alguns componentes críticos ao funcionamento do AIDE, inclusive do próprio banco de dados recém-gerado. Você deve tomar nota desses somatórios para verificação posterior.
Se o dispositivo de boot for informado ao aide-md5, o MD5 do setor de boot também será calculado, portanto é interessante informar esse parâmetro.
Para verificar a integridade do sistema, execute o próprio AIDE, desta forma:
# /usr/bin/aide -C |
Os arquivos que sofreram qualquer mudança, seja no tamanho, conteúdo, permissões ou data de criação, serão listados.
É provável que, na maioria das vezes que o AIDE apontar diferenças em arquivos, elas tenham sido provocadas por atos legítimos, por exemplo, atualização de pacotes ou intervenção do administrador do sistema. Nesses casos, o administrador deve, após uma conferência, reconstruir o banco de dados.
Para verificar a integridade do próprio AIDE, deve-se novamente utilizar o programa aide-md5, mas desta vez, de uma mídia removível, como, por exemplo, de um disquete:
# /mnt/floppy/aide-md5 /dev/hda |
Se algum dos códigos MD5 não bater com aqueles gerados anteriormente, o(s) respectivo(s) componente(s) pode(m) estar comprometido(s), e isto é um problema muito sério.
Obviamente que, se você alterou as configurações do AIDE, regerou o banco de dados ou atualizou o kernel, os códigos serão diferentes. Logo após efetuar quaisquer destas alterações, você deve executar novamente o aide-md5 e anotar os códigos.
![]() | Atenção |
|---|---|
É altamente recomendável copiar o aide-md5 para um meio removível, protegido contra gravação, e uma vez que o sistema tenha entrado em produção, deve-se executá-lo sempre a partir daquele meio, eventualmente removendo o aide-md5 original do disco rígido. Pois, se você fizer uso do aide-md5 do disco rígido, e este for comprometido, o invasor pode forjar somatórios MD5 falsamente perfeitos. | |
O pacote do BIND, no Conectiva Linux, está ajustado para ser executado no modo "enjaulado". Será utilizado o termo "enjaular" aqui para indicar que o aplicativo está executando num diretório chroot, que torna o diretório especificado o diretório raiz do sistema (/) para aquela sessão, impossibilitando o acesso aos diretórios que estão acima na estrutura. Essa característica garante que, caso o bind seja atacado e forneça acesso à máquina, o invasor não terá acesso aos diretórios externos àquele utilizado pelo bind.
![]() | Nota |
|---|---|
Ao contrário das versões anteriores do Conectiva Linux, o pacote bind agora, por padrão, já utiliza o chroot em /var/named. Isto não é mais uma opção de configuração e, portanto, o pacote de nome bind-chroot não existe mais, tendo sua funcionalidade sido transferida para o pacote bind. | |
A seguir serão vistas algumas das vantagens de se "enjaular" o bind num diretório específico:
Caso um invasor consiga, durante um ataque, acesso à sua máquina, ele não poderá navegar na estrutura de diretórios acima do diretório no qual o bind foi "enjaulado".
Dentro do diretório onde o bind estiver "enjaulado", existirão apenas os arquivos necessários para a utilização do bind, não deixando brechas para a execução de, por exemplo, um shell (/bin/sh) caso sua máquina seja atacada.
Para instalar o bind, basta selecionar o pacote bind no Synaptic, ou utilizar o apt-get.
O arquivo de configuração do bind está localizado em /var/named/etc/named.conf em vez de estar no /etc/named.conf, que é o local padrão do arquivo de configuração do bind. Para a compatibilidade com versões antigas, é criado um link simbólico.
Observe que toda a estrutura de arquivos do bind é idêntica à utilizada pelo bind, porém relativa à /var/named/, que é o diretório raiz para o bind.
Para testar se o bind está executando "enjaulado", no terminal digite:
# ps auxwww | grep named |
O comando acima deverá mostrar uma saída semelhante a esta:
named 1805 0.0 2.7 11652 3460 ? S Mar05 0:00 named -u named\ -t /var/named named 1806 0.0 2.7 11652 3460 ? S Mar05 0:00 named -u named\ -t /var/named named 1807 0.0 2.7 11652 3460 ? S Mar05 0:00 named -u named\ -t /var/named named 1808 0.0 2.7 11652 3460 ? S Mar05 0:00 named -u named\ -t /var/named named 1809 0.0 2.7 11652 3460 ? S Mar05 0:00 named -u named\ -t /var/named root 2002 0.0 0.4 1364 592 ? S Mar05 0:00 syslogd -m 0 -a\ /var/named/dev/log |
Observe nas linhas acima a opção -t /var/named na linha de execução do bind; essa opção indica que o bind será executado "enjaulado" no diretório /var/named/. Outra maneira de verificar se o bind está rodando "enjaulado" é listar o conteúdo do diretório /proc/pid/, onde pid é o número do processo do bind que está executando. Tomando como exemplo o processo 1805, veja a saída do comando a seguir:
# l /proc/1805 total 0 dr-xr-xr-x 3 named named 0 ./ dr-xr-xr-x 100 root root 0 Apr 5 ../ -r--r--r-- 1 root root 0 Apr 6 cmdline lrwxrwxrwx 1 root root 0 Apr 6 cwd -> /var/named/var/named/ -r-------- 1 root root 0 Apr 6 environ lrwxrwxrwx 1 root root 0 Apr 6 exe -> /usr/sbin/named* dr-x------ 2 root root 0 Apr 6 fd/ -r--r--r-- 1 root root 0 Apr 6 maps -rw------- 1 root root 0 Apr 6 mem lrwxrwxrwx 1 root root 0 Apr 6 root -> /var/named/ -r--r--r-- 1 root root 0 Apr 6 stat -r--r--r-- 1 root root 0 Apr 6 statm -r--r--r-- 1 root root 0 Apr 6 status |
Observe a quarta linha de baixo para cima, onde está indicada a opção root. Note que esse arquivo é um link para /var/named/, indicando que o diretório raiz desse processo é /var/named/. Dessa maneira, verifica-se que o bind está executando "enjaulado".