Criptografando HD/HD externo/Pendrive

Já comentei em vários textos anteriores ferramentas que utilizo para o meu backup e chegou a vez da criptografia, processo que precisei refazer quando chegou meu novo HD externo. Na criptografia temos duas opções, a primeira é criptografar o arquivo, que depende do suporte do programa, ou que o mesmo seja descriptografado toda vez que for utilizado e criptografado novamente no final do processo. A segunda opção é criptografar o sistema de arquivos, que depende do suporte do sistema operacional, porém é transparente para os programas e os processos de criptografar e descriptografar é automático.

Minha opção foi criptografar o sistema de arquivos, e utilizar o recurso chamado dm-crypt, que no Debian existe um programa de configuração chamado cryptsetup, podendo ser instalado com um apt-get install cryptsetup.

Como este método de criptografia é baseado no sistema de arquivos, o particionamento ocorre da mesma forma, porém em vez de criar um sistema de arquivos Ext4, criei uma partição com o LUKS (Linux Unified Key Setup). Para explicar os comandos e quem tiver vontade poder executá-los também, em vez de criptografar uma partição, farei isso com um arquivo, já que em sistemas Unix tudo é arquivo, porém vale lembrar que todos os dados do arquivo ou partição serão perdidos.

Primeiro, para este exemplo, precisamos de um arquivo grande e existe uma forma de gerá-lo com o comando dd, exemplo: dd if=/dev/zero of=/tmp/arquivo bs=1M count=1024, se for fazer o procedimento numa partição, este comando não é necessário e troque sempre que vir o /tmp/arquivo pelo caminho da partição, exemeplo: /dev/sdb2. O parâmetro if=/dev/zero é um arquivo especial que possui zeros infinitos, então toda vez que for lido retornará “0”. O of=/tmp/arquivo é o caminho do arquivo que criarei, se for utilizado o caminho de um HD como /dev/sdb ou partição como /dev/sdb2 toda esta área será preenchida com zeros. Os parâmetros bs=1M e count=1024 representam o tamanho do bloco que será copiado e quantas vezes esse processo será repetido respectivamente, ou seja, serão copiados 1 MB 1024 vezes, gerando um arquivo de 1 GB em branco no HD.

Para formatarmos com o LUKS, podemos utilizar o comando cryptsetup luksFormat /tmp/arquivo e digitando a senha, lembrando que todos os dados do arquivo ou partição serão perdidos. Para conseguirmos utilizar a partição criptografada é preciso abri-la primeiro com o comando cryptsetup open /tmp/arquivo arquivo1, o primeiro é o caminho do arquivo o segundo é um nome para o mapeamento que será criado em /dev/mapper.

Próximo passo é a formatação do sistema de arquivos, porém em vez de formatar a partição diretamente, é preciso usar o mapeamento, no caso /dev/mapper/arquivo1. Um exemplo de formatação com Ext4 é mkfs.ext4 /dev/mapper/arquivo1. Agora podemos montar este mapeamento e gravar os arquivos normalmente que tudo salvo nesta partição será criptografada.

Na hora de remover a partição, basta fazer o procedimento na ordem inversa, primeiro desmonte o sistema de arquivo do /dev/mapper/arquivo1. Depois feche o mapeamento com o comando cryptsetup close /dev/mapper/arquivo1. Para abrir a partição novamente basta abrir o mapeamento e depois montar a partição.

Uma coisa legal do LUKS é que ele permite o uso de até 8 chaves diferentes, para adicionar uma chave nova basta executar o comando cryptsetup luksAddKey /tmp/arquivo, e agora qualquer uma das duas senhas poderão ser utilizadas para acessar a partição. Além de senhas também é possível utilizar um arquivo como chave o que pode ser um recurso interessante também. Caso deseje ver mais informações a respeito do LUKS ou chaves desta partição também é possível executar o comando cryptsetup luksDump /tmp/arquivo, um exemplo de saída é:

LUKS header information for /tmp/arquivo

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      81 e6 1f 37 b2 5c 8d 97 a4 a9 57 c1 2b 1b 89 49 35 0e 59 8f 
MK salt:        3b e4 4b bc 0d 09 b1 2a 5c 38 ea e2 a1 67 e6 5e 
                39 97 05 1d d5 73 cf 33 da 08 e1 bc 73 9f d5 95 
MK iterations:  146750
UUID:           2013f2e3-1d73-429a-818d-b4a182d8658e

Key Slot 0: ENABLED
        Iterations:             587155
        Salt:                   23 e7 e8 73 a0 a5 a9 58 a6 58 ba ec 81 41 49 d1 
                                75 a8 51 89 99 fb 8d a9 87 cc e7 23 eb bf 44 cb 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Para quem formatou uma partição em vez do arquivo, o navegador de arquivos pode simplificar o processo de acesso a partição, no meu caso no Thunar consigo acessar meu HD externo da mesma forma como se o mesmo não estivesse criptografado clicando no ícone do mesmo, porém aparece uma janela solicitando a chave de acesso.

Para quem quiser mais informações, ou desejar criptografar partições do sistema, recomendo dar uma olhada no texto da wiki do Arch Linux, que apesar de estar na wiki de uma distribuição específica, os programas são os mesmos para todas e a lógica é a mesma, só confirmar se os parâmetros da wiki existem na versão instalada no seu sistema, que as vezes um dos dois podem estar uma versão mais antiga.

Anúncios

Remover arquivos duplicados

Há algum tempo, escrevi sobre o método que utilizo para fazer backup do meu hd externo. Porém quando comecei a utilizá-lo, tinha pouco mais de 500 GB de arquivos e muitos backups antigos, diretórios que quando iria formatava o computador, simplesmente olhava que faltava fazer backup de um diretório apenas, copiava-o inteiro, recuperar os arquivos mais importantes ou utilizados, enquanto os demais ficavam perdidos e ocupando espaço, mesmo já vindo de outro backup.

A questão é que eu tinha, pelo menos, uns seis backups, envolvendo formatação e cópias de pendrivers. Muitos desses arquivos estavam repetidos, significando que eu poderia deixar apenas uma cópia, apagando as demais e mesmo assim ter todos os meus arquivos.

O primeiro método que pensei foi gerar hash de todos os arquivos, e depois compará-los para encontrar duplicados, porém gerar hash de 500 GB é extremamente demorado e muitos desses arquivos não sobrem alterações, então não seria necessário recalcular toda execução. Olhando no sistema de arquivos, temos a informação de última alteração no arquivo, então bastava gerar um cache com informações de arquivo, hash e data da última alteração, toda vez que o for executado, poderia comparar primeiro a data de alteração e calcular o hash apenas se necessário.

Com o script pronto, a primeira execução foi demorada, uma vez que teria que calcular o hash dos 500 GB, levando algumas horas, encontrando 5 GB de arquivos que poderiam ser apagados sem que eu perdesse qualquer informação. Uma próxima execução foi muito mais rápida, não levando mais de dois minutos, desde que com modificações em arquivos pequenos.

Consegui logo apagar uns 2 ou 3 GB, porém a lista de arquivos duplicados, apesar de auxiliar no processo, não era algo muito prática, uma vez que teria que buscar o arquivo manualmente para apagá-lo. Com arquivos grandes o processo ia rápido, e liberava mais espaço, porém em arquivos de texto puro não dava um rendimento satisfatório. Como sou programador web, logo montei uma página para listar esses arquivos, com um checkbox para selecionar os arquivos que desejava apagar, deixando o processo todo muito mais prático. Hoje tenho menos de 5 MB de pequenos arquivos duplicados, que comparados aos 5 GB representa menos de 0,1%.

Reorganizei todo o código, aproveitando para montar uma interface web mais completa, e publiquei o código no github sobre licença MIT (https://github.com/eduardoklosowski/deduplicated), então quem quiser dar uma olhada, utilizar, ou até contribuir com o desenvolvimento do mesmo fique à vontade.

Uma explicação rápida para quem deseja utilizá-lo. Por ser escrito em Python, recomendo a instalação via pip com o comando pip install git+https://github.com/eduardoklosowski/deduplicated.git ou pip install git+https://github.com/eduardoklosowski/deduplicated.git#egg=deduplicated[web] caso deseje instalar as dependências da interface web. Com isto você terá o comando deduplicated, bastando utilizar os parâmetros update para atualizar o cache dos arquivos, duplicated para listar os arquivos duplicados ou check para atualizar o cache e exibir os arquivos duplicados, seguido de um ou mais diretórios que deseja verificar, exemplo deduplicated check /home/eduardo. Caso tenha instalado a interface web, basta executar o comando deduplicated-web e abrir o endereço http://127.0.0.1:5050/.

Também existe uma opção para verificar se um arquivo está no cache com o comando indir, exemplo deduplicated indir meuarquivo.txt /home/eduardo. A vantagem é que você não precisa ter os arquivos para fazer essa verificação, eu verificava se os arquivos do meu notebook estavam no hd externo desta forma, sem precisar estar com ele ligado.

Recentemente tive um problema com o meu hd externo, essa história está no hack ‘n’ cast (quando for publicado disponibilizo o link aqui). Como eu tinha o cache do meu hd externo, pude compará-lo com o meu backup, descobrindo o que não estava atualizado e se eu tinha perdido algo. Esse procedimento se resumiu a executar as funções de atualização do cache na manualmente para adaptar certas partes e listar determinados valores. Caso alguém deseje posso até montar o script como uma função extra.

Eu fiquei extremamente feliz ao conseguir economizar o espaço do meu hd externo, o que já valeu o programa. Quando tive problemas no hd externo, percebi que ter as coisas organizadas e automatizadas, podendo consultar alguns logs, torna tudo mais fácil e tranquilo, bastando efetuar o RMA e depois executar um rsync para resolver todo o problema, obviamente teve a parte de formatação e criptografia também.

Backup HD Externo

Hoje vou compartilhar como faço meu backup com vocês. Comprei um HD externo a algum tempo e todos meus dados que quero guardar, gravo no mesmo, porém se ocorresse alguma falha, perderia todas as minhas informações, então precisava de uma cópia de segurança. Como ainda tenho o meu primeiro computador, o qual não utilizo mais, porém ainda funciona perfeitamente, além de um HD razoável, decidi utilizar o mesmo como backup. Agora o desafio foi como fazer e manter uma cópia atualiza dos arquivos, uma vez que o computador de backup não está ligado todo o tempo, não depender de procedimentos manuais ou fazer a cópia integral dos arquivos toda vez que demoraria muito.

A solução foi extremamente simples, no GNU/Linux temos um programa chamado “rsync”, que é uma ferramenta para fazer cópia de arquivos, a parte interessante é justamente por fazer todo esse controle que eu preciso, a primeira vez que sincronizar, todos os dados serão copiados, nas próximas, apenas as diferenças (arquivos alterados, adicionados e excluídos) serão transmitidas. Outra vantagem é que ele funciona via rede, então posso utilizar o meu HD externo no meu notebook e utilizar o SSH para fazer o sincronismo.

Na prática o funcionamento foi assim, com os HDs devidamente funcionando e acessíveis pelo sistema operacional, rsync instalado no notebook e computador (apt-get install rsync no Debian ou Ubuntu), copiei para o HD externo meus arquivos e executei rsync -av --progress --delete --exclude lost+found /media/HDEXTERNO user@192.168.0.100:/media/HDVELHO/(reparem na barra no final do diretório de destino, ela é importante). Com esse comando mando o meu notebook fazer uma cópia de todo o conteúdo do HD externo (/media/HDEXTERNO) para o diretório /media/HDVELHO/HDEXTERNO no meu computador via SSH (usuário user no IP 192.168.0.100), deixando de fora o diretório “lost+found” que é do Ext4 e não desejo incluir no backup. Depois de fazer alterações no HD externo, posso executar esse mesmo comando novamente que será feito o sincronismo dos arquivos, sem mistérios. Porém vale lembrar que mudanças feitas no HD do computador serão sobrescritas, então utilizo o mesmo para visualizar arquivos, existem opções do rsync para copiar apenas arquivos que forem mais novos na origem e ignorar arquivos mais novos no destino, porém para o meu caso não foi necessário.

Para quem prefere uma interface gráfica, existe o Grsync. Extremamente simples de instalar (apt-get install grsync no Debian e Ubuntu). A princípio pode ser um pouco assustador a quantidade de opções, porém é só olhar com calma e escolher o que desejar ou utilizar a padrão mesmo. Depois de configurar as opções é possível salvar a configuração para reutilizá-la depois. Quando for executar será chamado o rsync em brackground, a sincronização ocorrerá como na linha de comando.

Hoje utilizo o Grsync para fazer backup de alguns diretórios para o HD externo e o rsync na linha de comando (através de um alias do Bash) para fazer o backup do HD para o computador. Se algum dia tiver problemas com o HD no computador, simplesmente substituo-o e executo o rsync, se tiver problema com o HD externo, compro outro, executo o rsync com os diretórios invertidos para copiar tudo para o HD externo e volto a utilizá-lo normalmente.

Também o possível utilizar esse mesmo esquema invertendo o diretório de gravação, você pode gravar seus arquivos em algum diretório e fazer o backup no HD externo, acredito que seria um caso até mais comum, porém preferi deixar esse espaço livre no notebook, já que tinha o computador disponível.