Mostrando postagens com marcador diretório. Mostrar todas as postagens
Mostrando postagens com marcador diretório. Mostrar todas as postagens

domingo, 26 de maio de 2013

Atualizando o caminho dos arquivos numa listagem de hash

Recentemente, eu estava com uma estrutura de arquivos em diversos diretórios e subdiretórios e todos eles já estavam com os respectivos hashes MD5 armazenados em um arquivo texto (hash.md5) no diretório raiz. Bastava executar o comando "md5sum -c hash.md5" na raiz para a ferramenta verificar a integridade de todos os arquivos.

Entretanto, resolvi reorganizar a localização dos arquivos, mudando os arquivos de subdiretórios, criando diretórios novos etc. Eram os mesmos arquivos só que agora estavam em caminhos de diretórios diferentes. Com isso, após estas mudanças, o arquivo texto com os hashes MD5 também precisava ser atualizado para os novos caminhos dos arquivos.

Algumas soluções poderiam ser aplicadas. Uma seria recalcular todas as somas MD5, gerando novamente os hash de todos os arquivos, mas esta solução iria expor novamente o disco rígido em um uso intenso. Eram muitos gigabytes de dados armazenados. Outra solução seria editar o arquivo texto com os hashes, alterando cada linha para o novo caminho do respectivo arquivo. Mas era um arquivo com 1650 linhas e fazer isso manualmente torna impraticável, levaria uma eternidade.

Contudo a segunda era a solução que deveria ser aplicada, afinal os hashes dos arquivos já estavam gerados e só precisava atualizar os caminhos. O que poderia executar esta tarefa rapidamente? Simples, um script no interpretador de comandos.

A seguir, está o código do script que realizou a atualização dos caminhos, de cada arquivo, nas linhas do arquivo texto com os hashes MD5. É um script para o interpretador de comandos Bash, do Linux.

O que ele faz é, primeiramente, uma cópia de segurança do arquivo texto com os hashes. Depois será lida cada linha deste arquivo, onde serão armazenados em variáveis o hash (incluindo os espaços) que está no início da linha e o nome do respectivo arquivo, ignorando o caminho antigo. Então será realizada uma busca pelo arquivo e seu caminho atual é armazenado em outra variável. Por fim, as strings com o hash e o caminho atual são concatenadas e direcionadas para um novo arquivo texto com os hashes MD5.


#!/bin/bash
#

cp -f hash.md5 hashantigo.md5

while read LINHA
do

  HASH=`echo "$LINHA" | cut -c 1-34`
  ARQUIVO=`echo "$LINHA" | sed 's/^.\{34\}//' - | sed 's/.*\///' -`
  NOVODIR=`find */ -iname "$ARQUIVO" -type f -print`
  if [[ $NOVODIR ]]
  then
    echo "$HASH""$NOVODIR" >> novohash.md5
  fi

done < hashantigo.md5

mv -f novohash.md5 hash.md5

echo "Feito!"



Este script torna o processo muito mais rápido e menos traumático no acesso ao disco. Nesta reorganização, eu também separei os arquivos em volumes de aproximadamente 4.4 GB (capacidade de DVDs) pois foram gravados em mídias óticas. Cada volume tinha o seu "diretório raiz" com uma cópia do arquivo texto original com os hashes e o script. O script foi executado para cada volume. Por isso a necessidade do if no script, alguns arquivos não estavam no respectivo volume.

São diversos comandos do Bash, internos e externos, utilizados neste script. As páginas manuais de cada um deles podem ajudar no entendimento de sua execução.

sábado, 22 de dezembro de 2012

Atributos de arquivo e diretório no Linux

Os sistemas de arquivos da família Second Extended, disponíveis para o sistema operacional Linux, suportam alguns atributos para os arquivos e diretórios. Estes atributos possibilitam um controle no acesso. Por exemplo, alguns controles de:

- não atualizar a hora de acesso
- somente gravação incremental
- imutável
- remoção segura

Dois comandos são usados para listar ou alterar os atributos, respectivamente 'lsattr' e 'chattr'. Alguns atributos só podem ser alterados pelo superusuário. O atributo imutável é um deles. Estes comandos são similares ao comando 'attrib' dos sistemas DOS e Windows.

O comando 'lsattr' lista os atributos do arquivo em um sistema de arquivos Second Extended. Sua sinopse é:

lsattr [opção]... [arquivo]...

As principais opções são:

-R  lista recursivamente os diretórios e seus conteúdos
-a  lista todos os arquivos, incluindo arquivos que começam com '.'
-d  lista os diretórios como arquivos, ao invés de listar seus conteúdos


Exemplo de linha de comando:

# lsattr -R /home/usuario

O comando 'chattr' altera os atributos do arquivo em um sistema de arquivos Second Extended. Sua sinopse é:

chattr [opção]... +-=[acdeijstuADST] arquivo...

A principal opção é:

-R  altera recursivamente os diretórios e seus conteúdos

O operador '+' adiciona o atributo especificado aos atributos existentes no arquivo. O operador '-' remove o atributo e o operador '=' torna o atributo especificado sendo o único no arquivo.

As letras 'acdisuADS' especificam os novos atributos para os arquivos e diretórios:

a - somente gravação incremental
c - compactados
d - sem backup pelo dump
i - imutável
s - remoção segura
u - não removível (recuperável)
A - não atualiza a hora de acesso
D - atualização sincronizada em diretórios
S - atualização sincronizada (não tem efeito em diretórios)


O exemplo a seguir adiciona o atributo imutável, que protege o arquivo contra escrita e remoção:

# chattr +i arquivo

Este último atributo já foi demonstrado em um outro artigo neste blog, em uma dica de proteção de arquivos, veja em: http://dan-scientia.blogspot.com.br/2009/07/protegendo-arquivos-importantes-no.html

domingo, 12 de agosto de 2012

Curingas nas operações com arquivos e diretórios no Linux

Curingas são caracteres especiais, ou metacaracteres, usados para especificar, em uma única linha de comando, um conjunto de arquivos ou diretórios de uma única vez. Com o uso dos curingas, o interpretador de comandos realiza a expansão para todos os caracteres possíveis, montando todas as combinações para os nomes dos arquivos ou diretórios.

Existem os seguintes tipos de curingas no Linux:

*          equivale a um conjunto de zero ou mais caracteres

?          equivale a um único caractere

[padrão]
  [ ]      equivale a qualquer um dos caracteres especificados
           dentro dos colchetes
  [^]      equivale a qualquer outro caractere menos os caracteres
           especificados
  [-]      equivale a qualquer um dos caracteres da lista

{padrões}
  {,}      equivale a qualquer padrão da lista


Exemplos:

arq*.txt           (todos iniciados com arq)

arq?.txt           (todos iniciados com arq + 1 caractere)

arq[134].txt       (arq1.txt, arq3.txt, arq4.txt)

arq[13][24].txt    (arq12.txt, arq14.txt, arq32.txt, arq34.txt)

arq[^25].txt       (exclui arq2*.txt e arq5*.txt)

arq[1-3].txt       (arq1.txt, arq2.txt, arq3.txt)

arq{[1-3],6}.txt   (arq1.txt, arq2.txt, arq3.txt, arq6.txt)

arq.{doc,xls,txt}  (arq.doc, arq.xls, arq.txt)


O curinga é um recurso que permite a filtragem do que será manipulado pela linha de comando. E como visto em alguns exemplos, os tipos de curingas podem ser usados em conjunto.

As chaves {} possuem um recurso a mais, a geração de caracteres para ser usada na criação de arquivos ou diretórios. Por exemplo, o comando "mkdir aula{1,2,3}" cria os diretórios aula1, aula2 e aula3 de uma só vez.

Os curingas dão vantagem a interface em modo texto quando na seleção de muitos arquivos ou diretórios, pois este procedimento em uma interface gráfica pode ser cansativo.

quinta-feira, 17 de novembro de 2011

Computação forense em Linux: arquivos e diretórios importantes

Muitos arquivos armazenados pelo sistema Linux podem fornecer informações valiosas sobre o perfil, propósito e uso do computador. Tais como arquivos de configuração de ambiente, configuração dos programas, arquivos gerados pelo sistema etc.

Também alguns locais específicos podem conter arquivos de interesse forense, como diretórios de arquivos temporários, de log, de uso da rede etc.

Configuração do sistema:

/etc/

O diretório '/etc/' contém todos os arquivos de configuração do sistema operacional. Também existe o subdiretório '/etc/skel/' que contém os arquivos que irão popular inicialmente o '/home/usuario' de um usuário recém criado. O diretório '/etc/' é um diretório importante pois contém todas as configurações realizadas pelo administrador do sistema.

Contas de usuários e grupos:

/etc/passwd

O arquivo '/etc/passwd' contém as contas dos usuários configurados no sistema. Cada definição de conta fica em uma linha e o conteúdo das linhas estão separados em campos.

/etc/shadow

O arquivo '/etc/shadow' armazena as senhas em um formato criptografado, com algumas informações adicionais relacionadas as senhas dos usuários. Contém uma entrada por linha, separada em campos, para cada usuário definido no '/etc/passwd'.

/etc/group

O arquivo '/etc/group' define os grupos os quais os usuários pertencem. Cada grupo é definido em uma linha separada por campos.

/etc/gshadow

O arquivo '/etc/gshadow' armazena as senhas dos grupos em um formato criptografado. Contém uma entrada por linha, separada em campos, para cada grupo definido no '/etc/group'.

Ambiente dos usuários:

/etc/bashrc

O arquivo '/etc/bashrc' é um arquivo de inicialização do shell de alcance em todo o sistema. É executado por todos os usuários quando um novo shell é aberto. É usado para definir funções e apelidos.

/etc/profile

O arquivo '/etc/profile' contém configurações de ambiente e chamadas de inicialização de programas de alcance em todo o sistema. É usado por todos os usuários. Este arquivo somente é executado durante o login do usuário. Configurações complexas devem ser definidas no diretório '/etc/profile.d/'.

/etc/profile.d/

Todas as configurações complexas de ambiente são colocadas em arquivos neste diretório. Os scripts deste diretório são acionados por um laço "for" no arquivo '/etc/profile'.

Os arquivos '/etc/bashrc' e '/etc/profile' possuem arquivos equivalentes para o diretório pessoal do usuário. São os arquivos '~/.bashrc' e '~/.bash_profile'. Existe também o arquivo '~/.bash_logout' que é lido e executado toda vez que o usuário sai de um shell. Estes arquivos funcionam apenas para a sessão do próprio usuário.

Serviços em execução:

Os serviços são programas (daemons) que são iniciados e mantidos em execução em segundo plano, ficam monitorando o computador e respondem às mudanças.

Para organizar o controle dos serviços, muitas variantes do Unix System V, e isto inclui diversas distribuições do Linux, usam scripts nos diretórios '/etc/rcN.d/' para controlar quais serviços serão iniciados dentre os níveis de execução.

Se um serviço deve ser iniciado no nível de execução 5 então é colocado o seu script em '/etc/rc5.d/'.

Existe também o script '/etc/rc.d/rc.local', que é executado após os outros scripts de inicialização de serviço.

Para evitar múltiplas cópias do mesmo script, foi adotado o padrão de colocar todos os scripts de controle dos serviços no diretório '/etc/init.d/' e usar links simbólicos para estes scripts nos diretórios '/etc/rcN.d/'.

Na distribuição Fedora os links e os scripts estão nos diretórios '/etc/rc.d/rcN.d/' e '/etc/rc.d/init.d/', porém é mantido no diretório '/etc/' os links simbólicos para estes diretórios.

Outras distros adotam uma estrutura distinta: No Slackware os scripts ficam em '/etc/rc.d/' e são executados se estiverem com permissão de execução. No Debian os scripts ficam em '/etc/init.d/' e são executados se tiverem links em '/etc/rcN.d/'. E no openSUSE os scripts ficam em '/etc/init.d/' e são executados se tiverem links em '/etc/init.d/rcN.d/'.

Configuração de rede:

Alguns arquivos, localizados a partir do diretório '/etc/', são para armazenar as configurações de rede. (estrutura Red Hat/Fedora)

/etc/hosts                       Lista de endereços IP e os nomes do host
/etc/host.conf                   Especifica como o sistema determina os nomes do host
/etc/resolv.conf                 Especifica o servidor do serviço de DNS
/etc/networks                    Lista de endereços IP e os nomes das redes
/etc/sysconfig/network           Ativa a rede, especifica nomes do host e do gateway
/etc/sysconfig/network-scripts/  Configurações e scripts do serviço "network"
/etc/sysconfig/networking/       Configurações geradas pela ferramenta gráfica de rede
/etc/sysconfig/iptables          Regras do firewall

Servidores de rede:

Uma máquina com sistema Linux pode estar preparada para prestar diversos serviços de rede. Cada servidor possui diretórios específicos para configuração do serviço:

/etc/samba/                      Software para operar com máquinas Windows pela rede
/etc/httpd/                      Servidor HTTP Apache
/etc/vsftpd/                     Servidor FTP vsftpd
/etc/squid/                      Servidor proxy Squid
/etc/ssh/                        Servidor SSH
/etc/dhcp/                       Servidor DHCP
/etc/ltsp/                       Servidor LTSP (Linux Terminal Server)

Os servidores possuem também diretórios para armazenamento dos arquivos compartilhados:

/var/www/                        Páginas servidas pelo Apache
/var/ftp/                        Arquivos servidos por FTP
/var/spool/squid/                Cache do Squid
/var/lib/dhcpd/dhcpd.leases      IPs atribuídos por DHCP
/var/lib/tftpboot/ltsp/          Configuração dos terminais LTSP
/opt/ltsp/                       Imagens de sistema para LTSP

Arquivos temporários e log:

Um sistema ativo, com diversos processos em execução, armazena automaticamente muitas informações e dados dos processos. Arquivos de log registram o uso do sistema, de uma forma geral ou especificamente para determinada aplicação. Diversas aplicações armazenam cópias dos arquivos processados em cache ou geram arquivos temporários.

/var/log/                        Arquivos de log diversos
/var/log/messages                Arquivo de log geral do sistema
/var/spool/                      Dados que esperam por processamento
/var/run/                        Dados que descrevem o sistema desde sua inicialização
/var/cache/                      Cache de dados de aplicativos
/var/tmp/                        Arquivos temporários preservados entre reinicializações
/tmp/                            Arquivos temporários gerais

Aplicações para Internet:

Todos os aplicativos de Internet para acesso à web, e-mail, mensagens instantâneas, possuem diretórios e arquivos para armazenar o conteúdo gerenciado. Os navegadores podem armazenar o histórico das páginas visitadas e os respectivos arquivos baixados em cache. Os mensageiros instantâneos podem armazenar a lista de contatos e as mensagens trocadas. Os clientes de e-mail podem armazenar o catálogo de endereços e os e-mails enviados e recebidos. Até alguns plugins podem armazenar o conteúdo multimídia acessado. Cada usuário terá o seu conjunto de diretórios para estes aplicativos.

Navegador Firefox

~/.mozilla/firefox/xxxxxxxx.default/Cache/
~/.mozilla/firefox/xxxxxxxx.default/

Navegador Opera

~/.opera/cache/
~/.opera/

Navegador Google Chrome

~/.cache/google-chrome/Cache/
~/.config/google-chrome/Default/

Comunicador aMSN

~/.amsn/

Comunicador Kopete

~/.kde/share/apps/kopete
~/.kde/share/config/kopeterc

Comunicador Pidgin

~/.purple/

Cliente de e-mail Thunderbird

~/.thunderbird/xxxxxxxx.default/
~/.thunderbird/xxxxxxxx.default/Mail/
~/.thunderbird/xxxxxxxx.default/Cache/

Plugin Adobe Flash Player

~/.macromedia/Flash_Player/#SharedObjects/

Plugin Java

~/.java/deployment/cache/6.0/

Conhecer os locais das configurações e demais dados das diversas aplicações é muito importante para o examinador forense. O sistema é capaz de armazenar informações valiosas, muitas de forma automática e transparente para o administrador e usuário.

quarta-feira, 8 de julho de 2009

Criando um sistema de arquivo criptografado com o EncFS

O EncFS proporciona um sistema de arquivos criptografado no espaço de usuário de forma transparente. Oferecendo uma segurança contra ataques offline, como por exemplo um roubo do notebook. O EncFS é habilitado pelo FUSE, "Filesystem in Userspace", que é um módulo do kernel que permite criar sistemas de arquivos virtuais. A maioria das distribuições Linux possuem este recurso disponível.

O EncFS opera sobre os arquivos e diretórios, e não sobre um dispositivo de bloco. Os dados são guardados em um sistema de arquivos subjacente e os metadados são protegidos. O EncFS age como um tradutor entre o usuário e o sistema de arquivos, criptografando e descriptografando instantaneamente.

Dentre os benefícios estão facilidade de uso, facilidade de backup, não necessita de um tamanho de volume pré-fixado no disco e somente o usuário que montou o sistema de arquivos tem permissão de acesso, nem mesmo o administrador do sistema tem acesso.

Dois diretórios são envolvidos na criação de um sistema de arquivos criptografado: o diretório principal e o ponto de montagem. Cada arquivo no ponto de montagem corresponde a um arquivo específico no diretório principal, proporcionando um acesso não criptografado a somente este arquivo. Os nomes dos arquivos são criptografados neste diretório principal, mas os atributos, permissões, tamanho e número de arquivos podem ser vistos por todos.

Os arquivos são criptografados usando uma chave de volume que é armazenada de forma criptografada dentro do diretório principal. Uma senha é usada para descriptografar esta chave, que pode ter tamanho de até 256 bits.

Para que isto funcione é necessário que em seu sistema Linux estejam instalados os pacotes do FUSE e do EncFS, na distro Fedora são os pacotes "fuse", "fuse-encfs" e provavelmente algumas dependências.

Vou partir supondo que os usuários já estão com permissão de acesso aos recursos do FUSE, então primeiramente cria-se os diretórios que serão o principal e o ponto de montagem. Fica mais interessante deixar o diretório principal oculto pois ele não será utilizado diretamente pelo usuário:

mkdir ~/.dircripto ~/pontom

Agora vamos utilizar o programa EncFS para criar o novo volume criptografado. É necessário usar caminhos absolutos para os diretórios:

encfs ~/.dircripto ~/pontom

Na primeira vez que for executado este comando o EncFS vai mostrar o menu de configuração que contém três opções para escolher o modo e o nível da criptografia. No modo avançado o EncFS faz uma série de perguntas ao usuário para a escolha item a item, e nas outras opções uma configuração pré-estabelecida é utilizada. Nos três casos a última pergunta é para a escolha da senha de acesso.

Para começar a utilizar o sistema de arquivos criptografado basta executar novamente o comando anterior. Será realizada então a montagem do seu volume criptografado. A senha será pedida sempre nesta ação de montagem:

encfs ~/.dircripto ~/pontom

Copie ou crie os arquivos que desejar para dentro do ponto de montagem, é este diretório que será acessível ao usuário. Analisando o diretório principal percebe-se os nomes dos arquivos protegidos por caracteres aleatórios e seus conteúdos estão ilegíveis. Junto é acrescentado um arquivo semelhante a ".encfs6.xml", este arquivo contém as configurações do volume criptografado.

Para desmontar o volume usa-se o comando abaixo:

fusermount -u ~/pontom

Esta criptografia também pode ser útil para proteger os arquivos do diretório do leitor de e-mail, do navegador, do cliente de mensagens instantâneas etc. Para isto mova o diretório de configuração de cada aplicativo para dentro do volume criptografado e crie uma ligação simbólica para lá com o mesmo nome. Veja exemplo:

mv .thunderbird ~/pontom
ln -s ~/pontom/.thunderbird .

Os backups também são fáceis de realizar, bastando gerar uma cópia do diretório principal e sempre desmonte o volume antes de executar o backup para não correr riscos. O backup é feito a partir do conteúdo criptografado portanto também está protegido. Veja exemplo:

tar czvf ArquivosProtegidos.tgz ~/.dircripto

Observação: Os nomes dos diretórios são apenas exemplos, escolha o que melhor servir.