[[!meta title="Bootless: anti-tampering bootloader"]] **WARNING** - this pre-alpha software with portuguese-only docs! * Bootless é uma integração tecnológica que permite um computador criptografado a permanecer sem gerenciador de partida (bootloader), de modo que grampos em software sejam difícies de serem instalados. * O Bootless é um gerenciador de partida em software livre instalado numa mídia removível e utilizado para inicializar computadores. * É previsto suporte inicial para o sistema operacional Debian. * O Bootless atualmente usa a [Hydra Suite](https://git.sarava.org/?p=hydra.git;a=summary). TODO ---- - Cleanup and translate docs. - Setup issue tracker. - Add contact information. - Setup git-annex into the repository. - Split bootless script from hidra suite but preserve integration. - Add pre-built and signed images. Construindo um volume bootless ------------------------------ Primeiro, prepare o dispositivo: export device=/dev/nome_do_dispositivo export partition=numero_da_particao mkfs.ext3 "$device""$partition" mkdir /tmp/bootless mount "$device""$partition" /tmp/bootless Clone o repositório bootless: git clone ssh://exemplo.org/bootless.git /tmp/bootless/boot Se você já tiver uma cópia de trabalho na sua máquina, pode ser mais interessante clonar direto dela para economizar tempo e banda, mas certifique-se de atualizá-la antes. Se houver pouco espaço na pasta de destino, faça o clone usando a opção `--depth=1`. Em seguida, instale o GRUB no MBR do dispositivo, rodando `grub` e digitando em seu shell, substituindo o nome do dispositivo e da partição conforme apropriado: root (hd1,1) setup (hd1) Limpe a casa: umount /tmp/bootless rmdir /tmp/bootless Agora seu pendrive está pronto para reinicializar os nodos físicos :) Mantendo o repositório compacto ------------------------------- Apesar de ser um repositório `git` e portanto de fácil manutenção de uma árvore distribuída, o `bootless` sofre de um problema de espaço: a cada imagem binária adicionada ou removida, o histórico do repositório cresce muito. Para evitar que o repositório cresça muito e não caiba numa pequena partição de um pendrive, é preciso reconstruir sua história. Aqui segue um exemplo usando o `git-rebase` para agregar commits. Primeiramente, faça o rebase, juntando commits com 'squash' (vide referências): git rebase -i COMMIT No caso, `COMMIT` é o commit inicial do repositório `bootless` que estamos usando. Em seguida, é preciso que o seu repositório local seja clonado pois só assim (!) é possível salvar espaço: cd .. mv bootless bootless.old git clone bootless.old bootless cd - git gc --aggressive git prune cp ../bootless.old/.git/config .git/ Dependendo da situação anterior, após esse processo o repositório pode diminuir bastante de tamanho. Um grande inconveniente desse processo é que ele agride a história de modo que as outras cópias do repositório precisam de uma força para serem atualizadas: git push --force GRUB2 ----- Adaptei o bootless para o GRUB2 utilizando o mesmo repositório. Isso significa que: * É possível utilizar o repositório do bootless tanto com o grub-legacy quanto com o grub2. * O grub-legacy utiliza o arquivo `menu.lst` enquanto que o grub2 usa o `grub.cfg`. Ambos arquivos precisam ser mantidos atualizados enquanto ambas as versões do grub forem suportadas. No caso da instalação de um pendrive usando grub2, é necessário utilizar o seguinte comando de instalação ao invés de simplesmente invocar o `grub`: grub-install --root-directory=/tmp/bootless $device --force Procedimento completo de exemplo: export device=/dev/nome_do_dispositivo export partition=numero_da_particao mkfs.ext3 "$device""$partition" mkdir /tmp/bootless mount "$device""$partition" /tmp/bootless git clone --depth=1 ssh://gitosis@exemplo.org/bootless.git /tmp/bootless/boot grub-install --root-directory=/tmp/bootless $device umount /tmp/bootless rmdir /tmp/bootless Em casos emergencias pode ser muito útil usar o seguinte comando para gerar uma imagem bootavel: grub-mkrescue -o bootless.img bootless/ Versões específicas de kernel ----------------------------- Às vezes pode ser necessário criar manualmente a initramfs após uma atualização de kernel (reparei isso em máquinas rodando Ubuntu). Abaixo, comando para atualizar o initramfs para uma versão específica de kernel: update-initramfs -v -u -k 2.6.32-26-generic Hydra Suite ----------- Criando o repositório: hydra exemplo bootless init ssh://gitosis@exemplo.org/bootless.git hydra exemplo bootless make /dev/sdb1 hydra exemplo bootless git pull hydra exemplo bootless git commit -a Criando uma imagem: hydra exemplo bootless image Isso criará o arquivo bootless.img na pasta atual. Para especificar um nome de arquivo distinto, use hydra exemplo bootless image arquivo.img Para gerar a imagem e gravá-la simultaneamente numa mídia removível localizada em `/dev/sdb`, use hydra exemplo bootless image arquivo.img /dev/sdb Se você quiser gerar uma imagem apenas para ser gravada em `/dev/sdb`, isto é, sem um arquivo.img sobrando, use hydra exemplo bootless image /dev/sdb Customização ------------ Algo que vale a pena pensar para possíveis mudanças futuras no `bootless`: atualmente utilizamos uma nomenclatura única no `LVM` de todas as máquinas, o que permite compartilharmos a `initrd` entre os sistemas. Se utilizássemos nomes distintos para cada máquina, precisaríamos de uma `initrd` por sistema -- o que aumentaria muito o tamanho do repositório -- ou então ter alguma forma de customizar a imagem de inicialização para suportar esse esquema. Usar uma nomenclatura única simplifica a manutenção do bootless, porém pode complicar o gerenciamento de volumes, por exemplo quando quisermos abrir o disco de um servidor em outro. Temos [duas alternativas](http://wiki.debian.org/InitrdReplacementOptions): * [initramfs-tools](http://packages.debian.org/stable/initramfs-tools), que é utilizado atualmente. * [yaird](http://packages.debian.org/sid/yaird), supostamente a ser utilizado no futuro. É preciso fuçar na documentação desses softwares para saber como a montagem de volumes pode ser customizada. O arquivo conf.d/cryptroot das initrds usadas atualmente contém o seguinte: target=root,source=/dev/mapper/vg-root,key=none,rootdev,cipher=aes-cbc-essiv:sha256 O ideal seria ter várias entradas nesse arquivo. Talvez seja o caso de estudar também o `/usr/share/initramfs-tools/hooks/cryptroot`. Referências ----------- Git: * http://kerneltrap.org/mailarchive/git/2007/10/7/331471 * http://stackoverflow.com/questions/37219/how-do-you-remove-a-specific-revision-in-the-git-history * http://www.alexrothenberg.com/2009/06/changing-history-with-git-rebase-how-to.html * http://stackoverflow.com/questions/250238/collapsing-a-git-repositorys-history Grub: * [Grub2](https://help.ubuntu.com/community/Grub2) (Ubuntu Help). * [GRUB2 Manual](http://grub.enbug.org/Manual) (Wiki). * [Using GRUB to Set Up the Boot Process](http://www.linuxfromscratch.org/lfs/view/development/chapter08/grub.html). * [GNU Grub Manual](http://www.gnu.org/software/grub/manual/grub.html). Boot: - [Auto-booting and Securing a Linux Server with an Encrypted Filesystem](http://serverfault.com/questions/34794/auto-booting-and-securing-a-linux-server-with-an-encrypted-filesystem). - [Smartmonster](https://github.com/ioerror/smartmonster). Imagens: * [How can I mount a disk image?](http://superuser.com/questions/344899/how-can-i-mount-a-disk-image). * [GRUB 2 - OSDev](http://wiki.osdev.org/GRUB_2): instalando o grub em várias mídias distintas. * [Disk mounting](http://www.noah.org/wiki/Disk_mounting). * [Loop-mounting partitions from a disk image](http://madduck.net/blog/2006.10.20:loop-mounting-partitions-from-a-disk-image/ Loop-mounting partitions from a disk image).