\documentclass{article}
\usepackage[brazilian]{babel}
\usepackage[latin1]{inputenc}
\usepackage[dvips]{graphics}
\usepackage{hyperref}
\usepackage{html,makeid}

\title{Home criptografado no Slackware e Slamd64}
\author{Silvio Rhatto}

\begin{document}\label{start}
\maketitle

\begin{abstract}
Tratarei aqui de como deixar seu diretório home num arquivo criptografado que é montado/desmontado quando você loga ou desloga. Existe o módulo \htmladdnormallink{pam\_mount}{http://pam-mount.sourceforge.net/} do \htmladdnormallink{PAM}{http://www.kernel.org/pub/linux/libs/pam/} que faz algo semelhante, mas por questão de segurança o Slack não suporta o PAM. Usaremos o \htmladdnormallink{dm-crypt}{http://www.saout.de/misc/dm-crypt}, substituto do \htmladdnormallink{cryptoloop}{http://www.tldp.org/HOWTO/Cryptoloop-HOWTO/} incluído na série 2.6 do kernel. 
\end{abstract}

\section{Introdução}

O procedimento a seguir foi efetuado em máquinas rodando Slackware e Slamd64. Efetue todos os passos a seguir como root e certifique-se que seu usuário normal esteja deslogado. Antes de começar, dê uma lida no site do \emph{dm-crypt} e faça um backup das suas coisas.

Se você usa Debian ou outro sistema que suporte o PAM, experimente primeiro usar o pam\_mount, conforme descrito no \htmladdnormallink{Debian Grimoire}{http://deb.riseup.net/storage/encryption/dmcrypt/}.

\section{Instalação de pacotes}

Você precisará dos programas device-mapper, cryptsetup-luks e as respectivas dependências. O device-mapper já vem no \emph{/testing} desde o slack 10.1.0. Para o cryptsetup-luks e dependências, você terá de compilar ou então utilizar os pacotes existentes em \htmladdnormallink{http://slack.sarava.org/packages}{http://slack.sarava.org/packages} ou em outro repositório.

A montagem/desmontagem do volume criptografado no home do usuário quando esse se loga/desloga é feita através de dois scripts, \emph{cryptcreate} e \emph{homecrypt}, ambos presentes na suíte \htmladdnormallink{homecrypt}{http://svn.sarava.org/homecrypt} e cujo pacote se encontra disponível em \htmladdnormallink{http://slack.sarava.org/packages/noarch}{http://slack.sarava.org/packages/noarch/}.

Para prosseguir, instale todos esses pacotes utilizando seu método preferido (installpkg, \htmladdnormallink{createpkg}{http://slack.sarava.org/doc/simplepkg}, \htmladdnormallink{simplaret}{http://slack.sarava.org/doc/simplaret}, etc).

\section{Kernel com dm-crypt e Crypto API}

Se você não usa um kernel padrão da sua distribuição Slackware, certifique-se de que ele esteja compilado com as seguintes opções:

\begin{verbatim}
CONFIG_BLK_DEV_DM=m
CONFIG_DM_CRYPT=m
\end{verbatim}

Certifique-se também que a opção \emph{CONFIG\_BLK\_DEV\_LOOP} (loop device) esteja como módulo ou built-in. Para que o módulo seja carregado ao iniciar o sistem, adicione em seu \emph{/etc/rc.d/rc.modules}, caso não exista, a linha

\begin{verbatim}
/sbin/modprobe dm_crypt
\end{verbatim}

\section{Crie um dispositivo de loop}

O kernel 2.6 suporta até 256 loop devices. Para prevenir muitos problemas e simplificar nossos scripts, criaremos um loop device específico para cada usuário que usar home criptografado.

\begin{verbatim}
ls -l /dev/loop*

brw-rw----  1 root disk 7,  0 1996-06-03 22:47 loop0
brw-rw----  1 root disk 7,  1 1996-06-03 22:47 loop1
brw-rw----  1 root disk 7, 10 2002-03-19 22:13 loop10
brw-rw----  1 root disk 7, 11 2002-03-19 22:13 loop11
brw-rw----  1 root disk 7, 12 2002-03-19 22:13 loop12
brw-rw----  1 root disk 7, 13 2002-03-19 22:13 loop13
brw-rw----  1 root disk 7, 14 2002-03-19 22:13 loop14
brw-rw----  1 root disk 7, 15 2002-03-19 22:13 loop15
brw-rw----  1 root disk 7,  2 1996-06-03 22:47 loop2
brw-rw----  1 root disk 7,  3 1996-06-03 22:47 loop3
brw-rw----  1 root disk 7,  4 1996-06-03 22:47 loop4
brw-rw----  1 root disk 7,  5 1996-06-03 22:47 loop5
brw-rw----  1 root disk 7,  6 1996-06-03 22:47 loop6
brw-rw----  1 root disk 7,  7 1996-06-03 22:47 loop7
brw-rw----  1 root disk 7,  8 1996-06-03 22:48 loop8
brw-rw----  1 root disk 7,  9 2002-03-19 22:13 loop9
\end{verbatim}

O próximo dispositivo de loop usaria o minor number 16, então vamos criar o 17o loop-device:

\begin{verbatim}
export USUARIO="nome-do-seu-usuario"
mknod /dev/loop-$USUARIO b 7 16
chown root.disk /dev/loop-$USUARIO
chmod 660 /dev/loop-$USUARIO
\end{verbatim}

Se você estiver usando udev, talvez seja uma boa idéia colocar esses dispositivos nas suas regras ou então adicionar sua criação no rc.local.

Substitua usuario pelo nome do seu usuário. Se você usa o losetup como módulo, adicione no seu \emph{/etc/modprobe.conf}

\begin{verbatim}
options loop max_loop=17
\end{verbatim}

Reinicie seu sistema pra ver se está tudo ok. É importante que exista o dispositivo \emph{/dev/mapper/control} depois da reinicialização.

\section{Crie um arquivo com o tamanho igual ou maior que o seu home}

\begin{verbatim}
export USUARIO="nome-do-seu-usuario"
dd if=/dev/urandom of=$USUARIO.img bs=100M count=5
\end{verbatim}

\section{Agora vamos criar um sistema criptografado nesse arquivo}

\begin{verbatim}
losetup /dev/loop-$USUARIO usuario.img
cryptsetup --verbose --verify-passphrase luksFormat /dev/loop-$USUARIO
cryptsetup luksOpen /dev/loop-$USUARIO $USUARIO
\end{verbatim}

Nesse ponto você deve escolher qual será a senha para acessar sua "partição". Agora crie um sistema de arquivos:

\begin{verbatim}
mkfs.ext2 /dev/mapper/$USUARIO
\end{verbatim}

Não crie sistemas com journaling no topo de um loopfile, vide \htmladdnormallink{este comentário}{http://article.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/392}.

\section{Mova seu home pra home.old, monte o novo sistema e copie seus arquivos}

\begin{verbatim}
mv /home/$USUARIO /home/$USUARIO.old
mkdir -p /mnt/crypt/home/$USUARIO
ln -s /mnt/crypt/home/$USUARIO /home/$USUARIO
chown $USUARIO.users /home/$USUARIO
chmod 700 /home/$USUARIO
mount /dev/mapper/$USUARIO /home/$USUARIO
rsync -Cav /home/$USUARIO.old/ /home/$USUARIO/
umount /home/$USUARIO
cryptsetup luksClose $USUARIO
losetup -d /dev/loop0
\end{verbatim}

Futuramente, quando você já estiver acostumado/a com sua pasta pessoal criptografada, apague a pasta \emph{/home/\$USUARIO.old} usando algum método de remoção segura.

\section{Sudoers}

É necessário ainda que o usuário possa rodar o cryptsetup para seu dispositivo com permissão de root e sem a necessidade de senha. Pra isso, adicione o seguinte no seu \emph{sudoers}:

\begin{verbatim}
usuario  ALL=NOPASSWD: /usr/bin/homecrypt
\end{verbatim}

onde \emph{usuario} é o nome do seu usuário.

\section{Login/logout gráfico}

Se você usa KDM como login gráfico, adicione no arquivo \emph{/etc/kde/kdm/Xstartup} a linha

\begin{verbatim}
/usr/bin/cryptcreate $USER
\end{verbatim}

Se você usa GDM, adicione a linha anterior em \emph{/etc/X11/gdm/PreSession/Default}. Também adicione no arquivo \emph{/etc/kde/kdm/Xreset} (se você usa KDM) a linha

\begin{verbatim}
/usr/bin/homecrypt off $USER 
\end{verbatim}

No caso do GDM, você deve adicionar a linha anterior no arquivo \emph{/etc/X11/gdm/PostSession/Default}.

\section{Logout via shell}

Adicionar no seu .profile as linhas 

\begin{verbatim}
alias logout="sudo /usr/bin/homecrypt off $(whoami); logout"
alias exit="sudo /usr/bin/homecrypt off $(whoami); exit"
\end{verbatim}

\section{Adicione a seguinte linha no \emph{/etc/fstab}}

\begin{verbatim}
/dev/mapper/usuario /mnt/crypt/home/usuario ext2 user,noauto,exec 0 0
\end{verbatim}

\section{Pronto}

Agora experimente logar com seu usuário. Após digitar a senha do arquivo criptografado, seu home será automaticamente montado. Quando você se deslogar pela última vez, seu home será desmontado. Funciona inclusive com logins via ssh, mas para que funcione sempre procure sempre se deslogar usando "logout" ao invés de Ctrl-D. No caso do X11, evite encerrar sua sessão usando Ctrl+Alt+Backspace. Nesses casos é possível que você seja deslogado mas sem que o script de desmontagem do home criptografado sja chamado.

\section{Finalizando processos}

Antes de desmontar um volume criptografado, o \emph{homecrypt} pode ainda matar alguns processos do/a usuário cujos nomes dos programas estiverem listados no arquivo \emph{/home/usuario/logout.kill}, como por exemplo
 
\begin{verbatim}
gpg-agent ssh-agent
\end{verbatim}

Se esse arquivo existir, então o \emph{homecrypt} o executará automaticamente toda vez que seu usuário de deslogar.

\section{Conclusões}

Esse esquema garante apenas que quando você não estiver logado ninguém conseguirá acessar seu home. Quando ele estiver montado, o superusuário pode tranquilamente acessá-lo (experimente).

Ao invés de usar um arquivo, você pode utilizar uma partição inteira, algo que aumenta muito a performance e elimina o uso do losetup. A grande vantagem de usar um arquivo é a facilidade para gravar backups ou manter seu home em dispositivos como canivetes usb ou cd-rw para backups.

A desvantagem de usar o dm\_crypt dessa forma em relação ao PAM é que você precisará de duas senhas para se logar. Isso também pode ser encarado como uma vantagem, já que um ataque no shadow (mesmo atualmente ainda sendo algo bem remoto) do seu sistema possibilitaria o acesso irrestrito aos seus dados.
 
Além disso, é interessante criptografar também sua swap. Existe um ótimo tutorial a respeito \htmladdnormallink{aqui}{/node/4}.

\section{Sobre}

Este mini-howto foi escrito por Rhatto (rhatto at riseup.net) na esperança de que seja útil. Ele pode ser distribuído de acordo com a \htmladdnormallink{http://slack.sarava.org/copyleft}{Licença do Projeto Slack}.

\end{document}
