Decrediton no Tails
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
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 Linux 10 64-bit para criar uma instalação do Tails 4.0 em um USB flash drive de 16GB. Os outros passos descritos nesse artigo foram executados em um Tails 4.0 para a execução do Decrediton 1.4.0.
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/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 .img 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 e recomendada se a extensão do navegador não foi usada.
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/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 4.0 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-4.0.img.sig
gpg: assuming signed data in 'tails-amd64-4.0.img'
gpg: Signature made Mon Oct 21 12:30:06 2019 WEST
gpg: using EDDSA key CD4D4351AFA6933F574A9AFB90B2B4BD7AED235F
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: CD4D 4351 AFA6 933F 574A 9AFB 90B2 B4BD 7AED 235F
Se for necessário importar a chave pública (com a chave copiada a partir do site):
$ gpg --import tails-signing.key
gpg: key DBB802B258ACD84F: 2170 signatures not checked due to missing keys
gpg: key DBB802B258ACD84F: public key "Tails developers <tails@boum.org>" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2029-06-06
Para mais informações sobre esse processo, leia sobre a Verificação de assinaturas digitais
2.4. Instalação através do Linux
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 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/linux/usb/index.en.html
Em um USB drive de 16GB foi criada uma partição de 8.6GB para o Tails e os 7.4GB restantes estão livres.
Figura 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 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 keyserver.ubuntu.com --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
:
$ gpg --verify manifest-decrediton-v1.4.0.txt.asc
gpg: assuming signed data in 'manifest-decrediton-v1.4.0.txt'
gpg: Signature made Tue Feb 5 22:07:04 2019 WET
gpg: using RSA key 6D897EDF518A031D
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
$ grep `sha256sum decrediton-v1.4.0.tar.gz` manifest-decrediton-v1.4.0.txt
2e70094600731cbddc7261f3c6095edca525d1f87030d4a7d3bf1720cefb548c decrediton-v1.4.0.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.4.0.tar.gz
amnesia@amnesia:~/Tor Browser$ mv decrediton-1.4.0/ ../Persistent/
amnesia@amnesia:~/Tor Browser$ cd ../Persistent/decrediton-1.4.0/
amnesia@amnesia:~/Persistent/decrediton-1.4.0$ ./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
# This script includes persistence configuration for dcrd and Decrediton on Tails 3.7
# Author: Marcelo Martins (stakey.club)
# Must be run as root (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 read /etc/ferm/ferm.conf and check the correct position to insert the rule.
# Otherwise, change number 91 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 (stakey.club)
# Written for Tails 3.7
# Read all the comments before running this script.
# 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 $HOME
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 then 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
DPKG_RESULT=$?
[[ $DPKG_RESULT -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 read /etc/ferm/ferm.conf and check the correct position to insert the rule.
# Otherwise, change 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