RaizeSwapCriptografados

Instalando Ubuntu 6.06 com / e swap criptografados

Eis o procedimento que segui para fazer uma instalação criptografada do Ubuntu Dapper 6.06. Seguindo este procedimento, você terá um sistema com 1 partição / e 1 partição swap ambos criptografados totalmente. O processo não é tão simples como uma instalação normal pois o instalador do Ubuntu ainda não suporta criptografia, então temos que fazer uma instalação em dois estágios. Este tipo de instalação é especialmente recomendada para notebooks, pois os mesmos podem ser roubados e com eles todos os seus dados importantes (mas se seu notebook for roubado enquanto estiver em uso, ligado, toda a criptografia do mundo não fará diferença pois seus dados já estarão expostos. O mesmo vale para acessos externos via rede).

Prefácio

Este documento não se propõe a explicar o valor da sua privacidade e da criptografia. Para mais sobre este assunto, recomendo "The Eternal Value of Privacy" por Bruce Schneier e "Why I wrote PGP" por Philip Zimmermann. Tampouco entra em detalhes sobre os diferentes algoritimos e tipos de cifras, para isso, nada como Wikipedia (veja mais nas referências abaixo).

Além disso, o procedimento mostrado aqui não lhe dará o sistema mais seguro do mundo. Há que se fazer um compromisso entre segurança (ou paranóia) e usabilidade, então este texto relata o que é aceitável para mim no momento. Para mais informações sobre os níveis de segurança de um sistema Linux encriptado, leia aqui.

Tenha em mente também que um sistema de arquivos criptografado terá uma performance pior do que um normal. Nos meus testes notei que a perda de performance é pequena, em torno de 5% para um processador moderno (Pentium 4, Athlon 64) com discos rápidos, piorando apenas quando se trabalha com arquivos muito grandes. No meu entender vale a pena, é um bom compromisso pela segurança, e com o poder de processamento continuamente aumentando, isto se torna irrelevante.

Começando

Para fazer minha instalação, tive como base estes dois tutoriais: aqui e aqui.

Assumiremos neste texto que nosso HD está em /dev/sda e, ao final do processo, ficaremos com a seguinte estrutura de partições:

/dev/sda1

montada em /boot

100mb

ext3 (não encriptada)

/dev/sda2

swap

512mb

(encriptada)

/dev/sda3

montada em /

todo o resto do HD

ext3 (encriptada)

Precisaremos de 2 CDs do Ubuntu 6.06: a versão "server" e a versão "alternate" ou a "desktop". Estes últimos são apenas para não termos que baixar 600+ megas de arquivos quando passarmos do terminal para um desktop gráfico completo.

Comece a instalação com o CD "server", e faça a instalação normal. Na etapa de particionamento do disco, crie a partição /dev/sda1 montada em /boot, conforme acima, porém monte o / na partição /dev/sda2 de 512mb como ext3 (não se preocupe, alteraremos depois). Crie também a partição /dev/sda3 como ext3 com o tamanho máximo restante porém não a monte em nenhum lugar. Ignore o aviso do instalador de que você não tem nenhuma partição swap, tudo bem, por ora não precisamos dela.

Instalando o software criptográfico e configurando a inicialização

Habilite o repositório Universe (e mais qualquer outro que quiser) e atualize o banco de dados de pacotes com um sudo aptitude update. Em seguida instale os pacotes: cryptsetup, hashalot e initramfs-tools (sudo aptitude install cryptsetup hashalot initramfs-tools).

Edite o arquivo /etc/kernel-img.conf, adicionando a linha abaixo ao final do mesmo:

ramdisk = /usr/sbin/mkinitramfs 

Edite o arquivo /etc/mkinitramfs/modules, e inclua as seguintes linhas ao final:

dm_mod
dm_crypt
sha256
aes_i586 

Crie o arquivo /etc/mkinitramfs/hooks/cryptoroot com o conteúdo:

PREREQ=""

prereqs()
{
        echo "$PREREQ"
}

case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac

if [ ! -x /sbin/cryptsetup ]; then
        exit 0
fi

. /usr/share/initramfs-tools/hook-functions

mkdir ${DESTDIR}/etc/console
cp /etc/console/boottime.kmap.gz ${DESTDIR}/etc/console
copy_exec /bin/loadkeys /bin
copy_exec /usr/bin/chvt /bin
copy_exec /sbin/cryptsetup /sbin

Crie o arquivo /etc/mkinitramfs/scripts/local-top/cryptoroot com o seguinte conteúdo:

PREREQ="udev"

prereqs()
{
        echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
        prereqs
        exit 0
        ;;
esac

/bin/loadkeys /etc/console/boottime.kmap.gz
modprobe -Qb dm_crypt
modprobe -Qb aes_i586
modprobe -Qb sha256
if grep -q splash /proc/cmdline; then
        /bin/chvt 1
fi
/sbin/cryptsetup luksOpen /dev/sda3 cryptoroot
if grep -q splash /proc/cmdline; then
        /sbin/usplash -c &
        sleep 1
fi

Torne os dois arquivos criados executáveis:

$ sudo chmod +x /etc/mkinitramfs/hooks/cryptoroot
$ sudo chmod +x /etc/mkinitramfs/scripts/local-top/cryptoroot

Por fim, atualize a imagem do initrd:

$ sudo update-initramfs -u ALL 

Criando o sistema de arquivos criptografado

Agora iremos criar o sistema de arquivos criptografado em /dev/sda3 (futuro /), usando LUKS e o algoritmo AES com hashs usando SHA-256. Digite os comandos abaixo:

Desmontamos a partição, para garantir

$ sudo umount /dev/sda3 

Opcional: verifique se a partição não tem erros (demorado)

$ sudo /sbin/badblocks -c 10240 -s -w -t random -v /dev/sda3 

Opcional (mas recomendado): preencha a partição inicialmente com dados aleatórios, para impedir análise magnética do disco (demorado)

$ sudo dd if=/dev/urandom of=/dev/sda3 

Vamos agora criar a partição LUKS criptografada e formatá-la. Estou usando uma chave de 256 bits para critografar a partição (--key-size=256), mas se você não for tão paranóico quanto eu pode relaxar isso um pouco para 192 ou 128 bits para ganhar performance. 128 bits é o que a Agência de Segurança Nacional (NSA) americana recomenda para documentos Classified. Para documentos Top-Secret ela recomenda chaves de 192 ou 256 bits.

Atenção! Escolha bem a senha (passphrase) para sua partição! Ela é o elo mais fraco da corrente, de nada adianta usar chaves de 256 bits e algoritmos avançadíssimos se sua senha é pequena ou estúpida. Minha recomendação é escolher a senha usando a metodologia Diceware (que proporciona uma boa combinação de passphrases fortes porém fáceis de lembrar), com 5 palavras no mínimo, o que lhe dará uma senha de aproximadamente 64.5 bits de entropia. Aumente o número de palavras e/ou adicione caracteres aleatórios para aumentar a força da senha.

$ sudo modprobe dm_crypt
$ sudo modprobe sha256
$ sudo modprobe aes_i586
$ sudo cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/sda3
$ sudo cryptsetup luksOpen /dev/sda3 cryptoroot 

Confirme que tudo correu bem:

$ sudo cryptsetup status cryptoroot
 /dev/mapper/cryptoroot is active:
   cipher:  aes-cbc-essiv:sha256
   keysize: 256 bits
   device:  /dev/.static/dev/sda3
   offset:  2056 sectors
   size:    20962706 sectors
   mode:    read/write

Agora criamos o sistema de arquivos (ext3 no caso):

$ sudo mkfs.ext3 /dev/mapper/cryptoroot 

E agora populamos a partição (um pouco demorado):

$ sudo mkdir /mnt/target
$ sudo mount /dev/mapper/cryptoroot /mnt/target
$ sudo cp -avx / /mnt/target
$ sudo chown -R $(whoami):$(whoami) /mnt/target/home/$(whoami) 

Edite /mnt/target/etc/fstab e troque:

/dev/sda2                      /               ext3    defaults,errors=remount-ro 0       1

Por:

/dev/mapper/cryptoroot        /               ext3    defaults,errors=remount-ro 0       1 

Configurando o GRUB e testando

Edite o arquivo /boot/grub/menu.lst e adicione o seguinte ao final do mesmo (após "### END DEBIAN AUTOMAGIC KERNELS LIST"):

title           Cryptotest
root            (hd0,0)
kernel          /vmlinuz-<sua versão do kernel> root=/dev/mapper/cryptoroot ro
initrd          /initrd.img-<sua versão do kernel>
savedefault
boot

PS.: você pode achar sua versão do kernel rodando uname -r ou copiando dos outros esquemas de boot no mesmo arquivo.

Agora vamos reiniciar e testar. Dê um sudo reboot e após reiniciar, quando aparecer:

GRUB Loading stage 1.5. 

GRUB Loading, please wait... Press ESC to enter the menu

Pressione ESC e escolha a última opção ("Cryptotest"). O kernel vai cuspir um monte de mensagems de debug, isso é normal por enquanto. Até que um momento tudo irá parar com a frase seguinte na tela:

Enter LUKS passphrase: 

Digite sua senha (passphrase) da partição / criptografada e dê Enter. O sistema deve continuar a bootar e chegaremos ao prompt de comando de novo. Agora falta pouco!

Finalizando

Faça login com seu usuário normalmente. Vamos agora habilitar a partição swap criptografada. Edite o arquivo /etc/crypttab e adicione a seguinte linha:

cryptoswap      /dev/sda2       /dev/urandom    swap 

Edite o arquivo /etc/fstab e adicione:

/dev/mapper/cryptoswap  none    swap    sw      0       0 

Rode:

$ sudo invoke-rc.d cryptdisks restart
$ sudo swapon /dev/mapper/cryptoswap 

Edite o arquivo /boot/grub/menu.lst e remova as linhas que adicionamos anteriormente (tudo após "## END DEBIAN AUTOMAGIC KERNELS LIST"). Em seguida ache a linha contendo:

# kopt=root=/dev/hda2 ro

E altere para:

# kopt=root=/dev/mapper/cryptoroot ro 

Salve o arquivo e rode:

$ sudo update-grub 

Pronto! Você já tem um sistema operacional com (quase) tudo encriptado. Só falta agora instalar o resto do Ubuntu.

Instalando o ambiente gráfico

Ponha o CD do Ubuntu versão "alternate" ou "desktop" no drive e digite:

$ sudo apt-cdrom add 

Agora, instale o meta-pacote do sistema gráfico e seus programas:

$ sudo aptitude install ubuntu-desktop

Ou substitua por kubuntu-desktop, ou xubuntu-desktop ou ainda edubuntu-desktop conforme desejar. Ao final, faça login pelo GDM e vá em Sistema -> Adminstração -> Suporte a Idiomas para terminar de instalar os pacotes de linguagem para português.

Pontos fracos

O modelo proposto tem um defeito: a partição /boot, onde ficam o kernel e o initrd, não é criptografada. Se fosse, não seria possível bootar o computador sem auxílio externo (disquetes, pen drives usb, cd-roms). Assim, um atacante muito avançado de posse de seu computador poderia, em tese , alterar o seu kernel e seu initrd de alguma maneira a tentar comprometer suas chaves criptográficas.

A solução para isso é um sistema bootando de um pen drive USB externo, que irá conter o kernel e tudo mais necessário para inicializar o sistema. Este pendrive deverá ser carregado com você sempre, deverá ser ele mesmo encriptado (para o caso de perda) e você não deve deixar que o mesmo seja roubado junto com o seu computador.

De qualquer maneira, se você precisa deste nível de segurança para seus dados, você tem outras preocupações mais importantes, como escolher uma fortíssima passphrase para suas partições e quão bem você está pagando o time de guardas fortemente armados que fazem a proteção de seu computador 24 horas por dia. Mais informações aquie aqui.

TO-DO

  • Inclusões, remoções e alterações de senhas (passphrases) no LUKS
  • Como fazer mais de uma partição criptografada com chaves e/ou algoritmos diferentes
  • Uso de pendrive USB com chave criptográfica como senha (passphrase) - como montar na inicialização?
  • /boot em pendrive USB encriptado com kernel e initrd, além das chaves criptográficas para as partições no HD (dando boot no computador pelo USB - modelo mais seguro possível)
  • Benchmarks de diferença de performance entre sistema normal e criptografado, com diferentes tamanhos de chave (128, 192 e 256 bits)

Referências e maiores informações

Créditos

Texto original escrito por RodrigoTassinari adaptado dos tutoriais mencionados do Wiki internacional do Ubuntu. Qualquer ajuda é apreciada, se puder contribuir, por favor faça! :o)

Wikifier: RodrigoTassinari

Data: 10/12/2006

Mantenedor: RodrigoTassinari



CategoryRevisada

RaizeSwapCriptografados (last edited 2011-09-19 23:22:39 by localhost)