Decrediton no Tails

14 minutos de leitura

1. Introdução

Tails é um sistema operacional baseado em Debian Linux que pode ser executado diretamente a partir de um USB flash drive.

It aims at preserving your privacy and anonymity, and helps you to:

  • use the Internet anonymously and circumvent censorship;
  • all connections to the Internet are forced to go through the Tor network;
  • leave no trace on the computer you are using unless you ask it explicitly; use state-of-the-art cryptographic tools to encrypt your files, emails and instant messaging.

O Tails vem com o Electrum instalado, que é uma das mais conhecidas carteiras para Bitcoin. Todo o sistema operacional já vem pronto para o uso. Só é necessário instalar o Decrediton (e mais algumas coisas).

Figura 1 - Um esquema o mais próximo possível do anonimato, sem uso de dcrd remoto
Figura 1 - Um esquema o mais próximo possível do anonimato

Figura 2 - Um esquema o mais próximo possível do anonimato, com uso do dcrd remoto
Figura 2 - Um esquema o mais próximo possível do anonimato, com uso do dcrd remoto

2. Instalação do Tails no USB flash drive

A instalação dessa solução pode ser dividida nas seguintes etapas:

  • Instalação do Tails no USB flash drive (seção 2)
  • Criação do armazenamento permanente criptografado no USB, onde ficará armazenada a blockchain e os arquivos de configuração do Decrediton (seção 3)
  • Criação da regra de firewall para comunicação do Decrediton com o dcrd interno (seção 4)
  • Instalação e configuração do Decrediton (seção 5)

A seção 6 traz dois scripts para ajudar com todas essas tarefas, praticamente automatizando todo o processo explicado nas três seções anteriores. Esses scripts são fundamentais porque o Tails é um sistema amnésico, que não guarda nenhuma configuração após o reboot.

Dito de outra forma, o que permanece após o reboot é:

  • a instalação do Tails no USB flash drive na seção 2
  • o mapeamento das pastas do Decrediton na seção 3
  • a extração e configuração do Decrediton nas seções 5.2, 5.3 e 5.4 e o download da blockchain

O resto da configuração será perdido, mais especificamente:

  • a inclusão do Decred como item do aplicativo de configuração de volume persistente na seção 3
  • a criação da regra de firewall na seção 4
  • a instalação das dependências do Decrediton na seção 5.1

Os scripts da seção 6 tornam essas tarefas instantâneas e o uso do Decrediton no Tails viável. Esses scripts apenas não instalam o Tails e não particionam o USB drive criando o armazenamento persistente criptografado.

As instruções completas de instalação do Tails podem ser vistas em https://tails.boum.org/install/index.en.html

Os passos descritos nessa seção foram executados em um Debian 9 64-bit para criar uma instalação do Tails 3.7 em um USB flash drive de 16GB. Os outros passos descritos nesse artigo foram executados em um Tails 3.7 para a execução do Decrediton 1.2.1.

Pré-requisitos

Para criação de um USB com Tails é necessário ter um outro Tails já instalado em um USB ou iniciar o processo de instalação a partir de um Linux.

2.1. Considerações de segurança

Running Tails inside a virtual machine has various security implications. Depending on the host operating system and your security needs, running Tails in a virtual machine might be dangerous.

Only run Tails in a virtual machine if both the host operating system and the virtualization software are trustworthy.

Por questões de segurança, o Tails será instalado no USB a partir de um Debian instalado no host. Conforme escrito nas instruções do Tails, seria necessário possuir software confiável para executar o Tails (ou qualquer outro sistema) na máquina virtual. Isso inclui o sistema operacional ser código aberto e o virtualizador também.

Para saber mais sobre o risco de virtualização, leia https://tails.boum.org/doc/advanced_topics/virtualization/index.en.html

2.2. Download direto

a) Acesse https://tails.boum.org/install/vm-download/index.en.html. b) Escolha entre baixar diretamente do site ou através de torrent. No caso do download via torrent será necessário verificar a assinatura digital usando os passos mostrados na próxima seção. c) No caso do download direto, inicie o download mostrado no passo 1 do site. Em seguida, no passo 2 do site, instale a extensão Tails Verification, disponível para Firefox, Chrome e Tor Browser e que acessará apenas conteúdo enviado para o site do Tails. d) Quando a instalação terminar, selecione um botão no mesmo passo 2, que diz: “Verify Tails”. e) O navegador abrirá uma janela para que o arquivo .iso baixado na etapa b) seja selecionado. A verificação dura cerca de 10 segundos. f) Depois de verificar o download usando a extensão do navegador, remova a extensão. g) A verificação manual mostrada na próxima seção é opcional.

2.3. Verificação através do OpenPGP (opcional)

É possível fazer uma verificação manual da assinatura digital do Tails tanto para o download direto do site como para via torrent.

a) Acesse https://tails.boum.org/install/vm-download/index.en.html. b) No fim da página, na seção “Verify using OpenPGP (optional)”, baixe os arquivos dos links Tails signing key (a chave pública dos desenvolvedores do Tails) e Tails 3.7 OpenPGP signature (a assinatura digital, que deve ficar na mesma pasta que a imagem do Tails baixada na seção anterior). c) Verifique a assinatura digital (na verificação a seguir não foi necessário importar a chave manualmente porque o dirmngr intermediou o processo, buscando a chave no servidor HKPS via TCP/11371).

$ gpg --verify tails-amd64-3.7.iso.sig
gpg: assuming signed data in 'tails-amd64-3.7.iso'
gpg: Signature made Tue May  8 02:18:06 2018 WEST
gpg:                using RSA key 2FAF9BA0D65BB371F0BC2D463020A7A9C2B72733
gpg: requesting key 3020A7A9C2B72733 from hkps server hkps.pool.sks-keyservers.net
gpg: key DBB802B258ACD84F: 4 duplicate signatures removed
gpg: key DBB802B258ACD84F: 1770 signatures not checked due to missing keys
gpg: key DBB802B258ACD84F: 1 signature reordered
gpg: key DBB802B258ACD84F: public key "Tails developers <tails@boum.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
gpg: Good signature from "Tails developers <tails@boum.org>" [unknown]
gpg:                 aka "Tails developers (offline long-term identity key) <tails@boum.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: A490 D0F4 D311 A415 3E2B  B7CA DBB8 02B2 58AC D84F
     Subkey fingerprint: 2FAF 9BA0 D65B B371 F0BC  2D46 3020 A7A9 C2B7 2733

Se for necessário importar a chave pública (com a chave copiada a partir do site):

$ gpg --import tails-signing.key

Para mais informações sobre esse processo, leia sobre a Verificação de assinaturas digitais

2.4. Instalação através do tails-installer

A forma mais prática de instalação do Tails em um USB flash drive é a partir de um host Linux.

Figura 3 - Um host Linux com o tails-installer instala a imagem do Tails no USB
Figura 3 - Um host Linux com o tails-installer instala a imagem do Tails no USB

Para um cenário como esse, veja as instruções de instalação em https://tails.boum.org/install/debian/usb/index.en.html

Em um USB drive de 16GB foi criada uma partição de 8.6GB formatada com FAT32 e os 7.4GB restantes estão livres.

Figura 4 - O resultado do particionamento do USB flash driveFigura 4 - O resultado do particionamento do USB flash drive

Reinicie o dispositivo com o USB flash drive. Os próximos passos serão executados a partir do Tails.

3. Crie um armazenamento persistente criptografado (encrypted persistent storage)

The encrypted persistent storage is not hidden. An attacker in possession of the USB stick can know whether it has an encrypted persistent storage. Take into consideration that you can be forced or tricked to give out its passphrase.

Antes de usar volumes persistentes, veja os alertas no site do Tails em https://tails.boum.org/doc/first_steps/persistence/warnings/index.en.html.

Edite o arquivo /usr/share/perl5/Tails/Persistence/Configuration/Presets.pm com privilégios de root e inclua as duas seções a seguir após a seção do Electrum, por exemplo.

        {
            name        => $self->encoding->decode(gettext(q{Decred client})),
            description => $self->encoding->decode(gettext(
                q{Decrediton wallet and configuration}
            )),
            destination => '/home/amnesia/.config/decrediton',
            options     => [ 'source=decrediton' ],
            enabled     => 0,
            icon_name   => 'package-x-generic',
        },
        {
            name        => $self->encoding->decode(gettext(q{Decred server})),
            description => $self->encoding->decode(gettext(
                q{Decred's blockchain server}
            )),
            destination => '/home/amnesia/.dcrd',
            options     => [ 'source=dcrd' ],
            enabled     => 0,
            icon_name   => 'package-x-generic',
        },

Vá ao menu Applications, Tails, e inicie o aplicativo “Configure persistent volume”. Selecione os dois novos itens na lista: “Decred client” e “Decred server”. Clique no botão “Save”.

Figura 5 - O aplicativo que configura volumes persistentes
Figura 5 - O aplicativo que configura volumes persistentes

Figura 6 - Selecione os dois itens de configuração do Decred
Figura 6 - Selecione os dois itens de configuração do Decred

Reinicie o dispositivo com o USB drive que contém o Tails. Automaticamente serão criados mapeamentos para as pastas ~/.dcrd e ~/.config/decrediton, que passarão a residir no USB flash drive.

4. Firewall

O firewall do Tails tem um controle muito rígido sobre todo o tráfego, incluindo localhost. É necessário criar regras bem específicas para que programas possam se falar dentro do Tails. Isso é importante para evitar qualquer tráfego que possa sair sem passar pelo Tor.

O Tails usa iptables para controlar o acesso, mas as regras são gerenciadas por um front-end chamado ferm, um serviço que cria regras em uma linguagem própria e depois gera o arquivo de regras no formato do iptables.

Primeiro é necessário excluir o cache de regras gerado pelo ferm:

# mv /var/cache/ferm/start.sh /var/cache/ferm/start-oldrules.sh

Em seguida, edite o arquivo /etc/ferm/ferm.conf usando privilégios de root e procure pela regra:

                # White-list access to OnionShare
                daddr 127.0.0.1 proto tcp syn dport 17600:17650 {
                    mod owner uid-owner $amnesia_uid ACCEPT;
                }

Insira a regra de acesso ao dcrd e dcrwallet logo abaixo:

                # White-list access to dcrd and dcrwallet
                daddr 127.0.0.1 proto tcp dport 9109:9112 {
                    mod owner uid-owner $amnesia_uid ACCEPT;
                }

Essa regra permite o acesso localhost TCP às portas de destino 9109 até 9112, feitas por um processo executado pelo usuário amnesia.

Salve o arquivo, recarregue as regras do ferm e verifique no iptables que foi criada a entrada mostrada a seguir. Será necessário privilégios de root.

# service ferm reload
# iptables -L -v
(...)
    0     0 ACCEPT     tcp  --  any    lo      anywhere             localhost            tcp dpts:9109:9112 owner UID match amnesia
(...)

5. Instalação do Decrediton

5.1. Dependências

O Decrediton depende da libgconf2-4, que não vem instalada por padrão no Debian (Tails é baseado em Debian). Os comandos a seguir instalam a libgconf2-4 e suas dependências. O pacote net-tools foi incluído na instalação a seguir para que o netstat seja instalado.

$ sudo -i
# apt update
# apt install gconf2-common gconf-service libgconf-2-4 libgconf2-4 net-tools

5.2. Download e verificação da assinatura digital

a) Importe a chave pública dos desenvolvedores do Decred (conforme mostrado aqui):

amnesia@amnesia:~/Tor Browser$ gpg --keyserver pgp.mit.edu --recv-keys 0x518A031D
gpg: key 0x6DF634AA7608AF04: public key "Decred Release <release@decred.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1

b) Acesse https://github.com/decred/decred-binaries/releases/ e copie os arquivos decrediton-$VERSION.tar.gz, manifest-decrediton-$VERSION.txt e manifest-decrediton-$VERSION.txt.asc.

c) Verifique a integridade do arquivo manifest-decrediton-$VERSION.txt através da assinatura digital contida em manifest-decrediton-$VERSION.txt.asc. Em seguida, verifique que o hash do arquivo decrediton-$VERSION.tar.gz é igual ao hash contido em manifest-decrediton-$VERSION.txt:

amnesia@amnesia:~/Tor Browser$ gpg --verify manifest-decrediton-v1.2.1.txt.asc 
gpg: assuming signed data in 'manifest-decrediton-v1.2.1.txt'
gpg: Signature made Tue 01 May 2018 06:41:34 PM UTC
gpg:                using RSA key 0x6D897EDF518A031D
gpg: Good signature from "Decred Release <release@decred.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: FD13 B683 5E24 8FAF 4BD1  838D 6DF6 34AA 7608 AF04
     Subkey fingerprint: F516 ADB7 A069 852C 7C28  A02D 6D89 7EDF 518A 031D
amnesia@amnesia:~/Tor Browser$ sha256sum decrediton-v1.2.1.tar.gz 
a2535fc4d789486850ac66b1de3b45a013c937bfd8509e0396f1863fe41ed535  decrediton-v1.2.1.tar.gz
amnesia@amnesia:~/Tor Browser$ grep tar.gz manifest-decrediton-v1.2.1.txt
a2535fc4d789486850ac66b1de3b45a013c937bfd8509e0396f1863fe41ed535 decrediton-v1.2.1.tar.gz

Para mais informações sobre esse processo, leia sobre a Verificação de assinaturas digitais

Extraia o Decrediton para a pasta ~/Persistent e faça a primeira execução para que os arquivos de configuração sejam criados. O Decrediton não se comunicará com hosts externos porque ainda não foi configurado para usar o proxy Tor (qualquer outro tráfego é proibido pelo firewall).

amnesia@amnesia:~/Tor Browser$ tar -xzf decrediton-v1.2.1.tar.gz 
amnesia@amnesia:~/Tor Browser$ mv decrediton-1.2.1/ ../Persistent/
amnesia@amnesia:~/Tor Browser$ cd ../Persistent/decrediton-1.2.1/
amnesia@amnesia:~/Persistent/decrediton-1.2.1$ ./decrediton -d

Feche a janela ou encerre a execução através de [Ctrl+C].

5.3. Configuração do Tor como proxy

Edite o arquivo de configuração $HOME/.config/decrediton/dcrd.conf. Inclua ao fim do arquivo a linha a seguir e salve o arquivo.

proxy=127.0.0.1:9150

5.4. Configuração do dcrwallet

Inicie o Decrediton.

$ ./decrediton -d

Crie uma carteira usando uma nova seed ou uma seed já existente. A carteira será criada na estrutura ~/.config/decrediton/wallets/mainnet/$WALLET_NAME/mainnet/wallet.db.

Ocorrerá um erro de conexão com o dcrwallet. Encerre a execução do Decrediton fechando a janela ou através de [Ctrl+C] no terminal.

Para que o Decrediton possa se conectar ao dcrwallet é necessário especificar uma porta TCP onde o dcrwallet aguardará por conexões, caso contrário seria necessário permitir todas as portas no firewall, na regra criada anteriormente na seção 4.

Edite o arquivo ~/.config/decrediton/wallets/mainnet/$WALLET_NAME/dcrwallet.conf e altere a porta do parâmetro grpclisten para 9112.

grpclisten=127.0.0.1:9112

Inicie o Decrediton novamente.

Verifique as conexões usando netstat.

$ netstat -atp

6. Scripts

Para não travar essa guerra todas as vezes que for usar o Tails, eu criei dois shell scripts. O primeiro só precisa ser executado uma vez após a criação do persistent storage. O segundo precisará ser executado sempre que o Tails for reinicializado.

Copie os dois snippets de código para o diretório ~/Persistent no USB flash drive e marque o atributo de execução:

$ chmod +x decrediton-dep.sh decrediton-persistence.sh

6.1. decrediton-persistence.sh

Entre no diretório onde está localizado o script e execute através do comando sudo -E ./decrediton-persistence.sh.

#!/bin/bash
# Decrediton-persistence
# Author: Marcelo Martins
# Written for Tails 3.7
# Persistence configuration for dcrd and Decrediton on Tails 3.7
# Requires root privileges (sudo)
# Ref: https://gist.github.com/mc2pw/aeb4ca3972fea54d4858

if [[ $EUID -ne 0 ]]; then
  echo "$0: Please run as root: sudo -E $0."
  exit 1
fi

if [ $HOME = "/root" ]; then
  echo $HOME
  echo "$0: Use sudo with option -E to keep amnesia profile."
  exit 1
fi

PERSIST_PRESET="/usr/share/perl5/Tails/Persistence/Configuration/Presets.pm"
GREP_RESULT=`grep -c Decred $PERSIST_PRESET`
if [ $GREP_RESULT -gt 0 ]; then
  echo "$0: Persistence configured. Now open menu Applications -> Tails -> Configure persistent volume."
  exit 0
fi

# Make sure you check /usr/share/perl5/Tails/Persistence/Configuration/Presets.pm for the correct position to insert the rule.
# Then change number 146 below inside `sed` to reflect the correct position.
sed -i "146 a #\n\t{\n\t    name        => \$self->encoding->decode(gettext(q{Decred client})),\n\t    description => \$self->encoding->decode(gettext(\n\t        q{Decrediton wallet and configuration}\n\t    )),\n\t    destination => '/home/amnesia/.config/decrediton\',\n\t    options     => [ \'source=decrediton\' ],\n\t    enabled     => 0,\n\t    icon_name   => \'package-x-generic\',\n\t},\n\t{\n\t    name        => \$self->encoding->decode(gettext(q{Decred server})),\n\t    description => \$self->encoding->decode(gettext(\n\t        q{Decred\'s blockchain server}\n\t    )),\n\t    destination => \'/home/amnesia/.dcrd\',\n\t    options     => [ \'source=dcrd\' ],\n\t    enabled     => 0,\n\t    icon_name   => \'package-x-generic\',\n\t}," $PERSIST_PRESET

GREP_RESULT=`grep -c Decred $PERSIST_PRESET`
if [ $GREP_RESULT -gt 0 ]; then
  echo "$0: Persistence configured. Now open menu Applications -> Tails -> Configure persistent volume."
  exit 0
fi

# End of script

6.2. decrediton-dep.sh

Entre no diretório onde está localizado o script e execute através do comando sudo -E ./decrediton-dep.sh.

#!/bin/bash
# Decrediton-dep
# Author: Marcelo Martins
# Written for Tails 3.7
# Read all the comments before running this script.
# Reconfigures Tails after inicialization and
# must be run after every reboot to prepare the environment for Decrediton.
# Requires root privileges (sudo)

if [[ $EUID -ne 0 ]]; then
  echo "$0: Please run as root: sudo -E $0."
  exit 1
fi

if [ $HOME = "/root" ]; then
  echo "$0: Use sudo with option -E to keep amnesia user environment."
  exit 1
fi

GREP_RESULT=`grep -c Decred /usr/share/perl5/Tails/Persistence/Configuration/Presets.pm`
if [[ $GREP_RESULT -lt 2 && (! -d $HOME/.dcrd || ! -d $HOME/.config/decrediton) ]]; then
  echo "$0: decrediton-persistence.sh must be run to configure persistent storage."
  exit 1
fi

if [ ! -f $HOME/.config/decrediton/dcrd.conf ]; then
  echo "$0: There is no dcrd.conf. Open Decrediton to create config files. Then close it and run this script again."
  exit 1
fi

# Download all packages locally to persistent storage
# so we won't waste time with apt update and download more than once
# Why net-tools? Because I like to verify the connections with netstat before using a service via Tor.
if [ ! -f gconf-service*.deb ]; then
  apt update
  echo "Downloading gconf2-common..."
  GCONF2=`apt-get download gconf2-common | awk '{print $5"_"$7"_"$6".deb"}' | head -1`
  echo "Downloading gconf-service..."
  GCONFSVC=`apt-get download gconf-service | awk '{print $5"_"$7"_"$6".deb"}' | head -1`
  echo "Downloading libgconf-2-4..."
  LIBGCONF=`apt-get download libgconf-2-4 | awk '{print $5"_"$7"_"$6".deb"}' | head -1`
  echo "Downloading libgconf2-4..."
  LIBGCONF2=`apt-get download libgconf2-4 | awk '{print $5"_"$7"_"$6".deb"}' | head -1`
  echo "Downloading net-tools..."
  NETTOOLS=`apt-get download net-tools | awk '{print $5"_"$7"_"$6".deb"}' | head -1`
else
  GCONF2=`find . -name gconf2* | awk -F "/" '{ print $2 }'`
  GCONFSVC=`find . -name gconf-service* | awk -F "/" '{ print $2 }'`
  LIBGCONF=`find . -name libgconf-2-4* | awk -F "/" '{ print $2 }'`
  LIBGCONF2=`find . -name libgconf2-4* | awk -F "/" '{ print $2 }'`
  NETTOOLS=`find . -name net-tools* | awk -F "/" '{ print $2 }'`
fi

# Install the packages
dpkg -i $GCONF2 $GCONFSVC $LIBGCONF $LIBGCONF2 $NETTOOLS > /dev/null 2>&1
[ $? -eq 0 ] && echo "$0: Dependencies were successfully installed."

# Because of the way dcrwallet was setup to allow multiple simultaneous wallets,
# I had to change a setting in dcrwallet.conf to be able to narrow down TCP port range.
# Ref: https://github.com/decred/decrediton/pull/1163

# Make sure you check /etc/ferm/ferm.conf for the correct position to insert the rule.
# Then change the number 91 below inside `sed` to reflect the correct position.
if [ `grep -c 9109:9112 /etc/ferm/ferm.conf` -eq 0 ]; then
  sed -i '91 a #\n\t\t# White-list access to dcrd and dcrwallet\n\t\tdaddr 127.0.0.1 proto tcp dport 9109:9112 {\n\t\t    mod owner uid-owner $amnesia_uid ACCEPT;\n\t\t}' /etc/ferm/ferm.conf
  [ -f /var/cache/ferm/start.sh ] && mv /var/cache/ferm/start.sh /var/cache/ferm/start.sh.old
  service ferm reload
fi

IPT_RESULT=`iptables -L -v | grep -c 9109:9112`
[ $IPT_RESULT -gt 0 ] && echo "$0: Firewall rules were set."

# Check dcrwallet.conf for TCP port configuration.
# The problem here is, now dcrwallet.conf resides inside the wallet directory.
# I'm assuming there is only one wallet in this Persistent storage.
WALLET_FULLPATH=`find $HOME/.config/decrediton/ -name dcrwallet.conf`
DCRW_RESULT=`grep -c grpclisten=127.0.0.1:9112 $WALLET_FULLPATH`
if [ $DCRW_RESULT -eq 0 ]; then
  sed -i "s/grpclisten=127.0.0.1:0/grpclisten=127.0.0.1:9112/" $WALLET_FULLPATH
  DCRW_RESULT=`grep -c grpclisten=127.0.0.1:9112 $WALLET_FULLPATH`
fi
[ $DCRW_RESULT -gt 0 ] && echo "$0: dcrwallet is configured to use a single TCP port."

# Check dcrd is configured to proxy the traffic through Tor.
DCRD_RESULT=`grep -c proxy=127.0.0.1:9150 $HOME/.config/decrediton/dcrd.conf`
if [ $DCRD_RESULT -eq 0 ]; then
  echo "proxy=127.0.0.1:9150" >> $HOME/.config/decrediton/dcrd.conf
  DCRD_RESULT=`grep -c proxy=127.0.0.1:9150 $HOME/.config/decrediton/dcrd.conf`
fi
[ $DCRD_RESULT -gt 0 ] && echo "$0: dcrd is configured to proxy through Tor."

# End of script