Bitcoin em uma gaiola?

Aconteceu que eu sou um administrador profissional de sistemas e redes de computadores (em resumo: sysadmin) e, por acaso, contei ao prof. a atividade de uma ampla variedade de sistemas, incluindo aqueles que exigem [por causa] das medidas de segurança acima. E aconteceu que, há algum tempo, achei o Bitcoin interessante para mim, e não apenas o usei, mas também lançou vários microsserviços para aprender a trabalhar independentemente com a rede Bitcoin (afinal, é p2p) do ponto de vista do desenvolvimento. (Eu, é claro, sou um desenvolvedor, então, deixei passar). Mas não estou falando de desenvolvimento, mas de um ambiente seguro e eficaz para aplicativos.


As tecnologias financeiras ( fintech ) acompanham a segurança da informação ( infosec ) e a primeira pode funcionar sem a segunda, mas não por muito tempo. É por isso que quero compartilhar minha experiência e o conjunto de ferramentas que eu uso, que inclui fintech e infosec , e, ao mesmo tempo, também pode ser usado para um propósito mais amplo ou completamente diferente. Neste artigo, falarei pouco sobre Bitcoin, mas sobre o modelo de infraestrutura para desenvolver e operar serviços financeiros (e não apenas) - em uma palavra, os serviços em que "B" é importante. Isso se aplica tanto à troca de Bitcoin quanto ao zoológico corporativo mais típico dos serviços de uma pequena empresa sem bitcoin de forma alguma.


Quero observar que sou um defensor dos princípios de "mantenha as coisas estúpidas simples" e "menos é mais" ; portanto, tanto o artigo como o descrito nele terão as propriedades sobre as quais esses princípios são.


Cenário imaginário: vamos dar uma olhada em um exemplo de trocador de bitcoin. Decidimos começar a trocar rublos, dólares, euros por bitcoins e vice-versa, e já temos uma solução funcional, mas por outro dinheiro digital como kiwi e webmoney, ou seja, encerramos todas as questões legais, existe um aplicativo pronto que funciona como um gateway de pagamento para rublos, dólares e euros e outros sistemas de pagamento. Ele está vinculado às nossas contas bancárias e possui algum tipo de API para nossos aplicativos finais. Também temos um aplicativo da web que atua como um trocador de usuários, como uma conta típica de kiwi ou webmoney - abra uma conta, adicione um cartão e assim por diante. Ele se comunica com nosso aplicativo de gateway, embora use a API REST na LAN. Por isso, decidimos conectar bitcoins e, ao mesmo tempo, atualizar a infraestrutura, porque inicialmente tudo foi levado às caixas virtuais no escritório embaixo da mesa ... eles começaram a usar o site e começamos a nos preocupar com tempo de atividade e desempenho.


Então, vamos começar com a seleção principal de um servidor. Porque como a empresa em nosso exemplo é pequena e confiamos no hoster (OVH), escolheremos uma opção de orçamento na qual você não pode instalar o sistema a partir da imagem .iso original, mas isso não importa, o departamento de segurança de TI analisará definitivamente a imagem instalada. E quando crescermos, geralmente alugamos nosso armário com chave e acesso físico limitado, ou talvez construamos nosso próprio CD. De qualquer forma, vale lembrar que, ao alugar ferro e instalar imagens prontas, é possível que seu sistema tenha um “cavalo de troia do host”, que na maioria dos casos não se destina a rastrear você, mas a oferecer ferramentas de gerenciamento mais convenientes servidor.


Instalação do servidor


Tudo é simples aqui. Nós escolhemos o ferro que se adapte às nossas necessidades. Depois selecione a imagem do FreeBSD. Bem, nós nos conectamos (no caso de outro hoster e nosso próprio hardware) via IPMI ou com um monitor e alimentamos a imagem .iso FreeBSD para o download. Para instalações orquestrais, uso Ansible e mfsbsd . A única coisa, no nosso caso com o kimsufi, escolhemos a instalação personalizada para que os dois discos no espelho tivessem apenas as "partições de inicialização" e / home "abertas", o restante do espaço em disco será criptografado, mas mais sobre isso posteriormente.



O sistema é instalado da maneira padrão, não vou parar por aí, só observo que, antes de iniciar a operação, vale a pena prestar atenção nas opções de proteção que o bsdinstaller oferece no final da instalação (se você mesmo instalar o sistema):



Há um bom material sobre esse tópico, resumindo, repetirei aqui.


É possível ativar os parâmetros acima da mesma maneira em um sistema já instalado. Para fazer isso, edite o arquivo do carregador de inicialização e ative os parâmetros do kernel. * ee é um editor como este no BSD


# ee /etc/rc.conf


 ... #sec hard clear_tmp_enable="YES" syslogd_flags="-ss" sendmail_enable="NONE" 

# ee /etc/sysctl.conf


 ... #sec hard security.bsd.see_other_uids=0 security.bsd.see_other_gids=0 security.bsd.unprivileged_read_msgbuf=0 security.bsd.unprivileged_proc_debug=0 kern.randompid=$(jot -r 1 9999) security.bsd.stack_guard_page=1 

Também vale a pena garantir que você tenha a versão mais recente do sistema instalada e concluir todas as atualizações e atualizações . No nosso caso, por exemplo, é necessária uma atualização para a versão mais recente, porque as imagens de pré-instalação ficam seis meses a um ano atrasadas. Bem, lá mudamos a porta SSH para outra por padrão, adicionamos autenticação de chave e desabilitamos com uma senha.


Em seguida, configuramos o aide , monitorando o estado dos arquivos de configuração do sistema. Mais mastigado pode ser lido aqui .


pkg install aide


e edite nosso crontab


crontab -e


06 01 * * 0-6 /root/chkaide.sh


 #! /bin/sh #chkaide.sh MYDATE=`date +%Y-%m-%d` MYFILENAME="Aide-"$MYDATE.txt /bin/echo "Aide check !! `date`" > /tmp/$MYFILENAME /usr/local/bin/aide --check > /tmp/myAide.txt /bin/cat /tmp/myAide.txt|/usr/bin/grep -v failed >> /tmp/$MYFILENAME /bin/echo "**************************************" >> /tmp/$MYFILENAME /usr/bin/tail -20 /tmp/myAide.txt >> /tmp/$MYFILENAME /bin/echo "****************DONE******************" >> /tmp/$MYFILENAME 

Ativar a auditoria do sistema


sysrc auditd_enable=YES


# service auditd start


Como administrar esse negócio está bem descrito no manual .


Agora reinicializamos e prosseguimos com o software no servidor. Cada servidor é um hypervisor para contêineres ou máquinas virtuais completas. Portanto, é importante que o processador ofereça suporte a VT-x e EPT se planejamos usar a virtualização completa.


Como um gerenciamento de contêiner e máquina virtual, eu uso o clevd da olevole , desejo a ele mais saúde e benefícios por esse maravilhoso utilitário!


Containers? Novamente janela de encaixe ou o quê?


Mas não. O FreeBSD Jails é uma ótima ferramenta de contêiner, mas o cbsd mencionado cbsd para orquestrar esses contêineres, cujo nome é células.


Uma célula é uma solução extremamente eficaz para a construção de infraestrutura para uma variedade de propósitos, o que requer o isolamento completo de serviços ou processos individuais. Este é essencialmente um clone do sistema host, mas não requer virtualização completa do hardware. E os recursos resultantes disso não são gastos em um "SO convidado", mas apenas no trabalho realizado. Quando as células são usadas para necessidades internas, essa é uma solução muito conveniente para o uso ideal do recurso - várias células em um servidor de ferro podem usar individualmente todo o recurso do servidor, se necessário. Dado que sub-serviços geralmente diferentes precisam de mais. recursos em momentos diferentes, você pode extrair o desempenho máximo de um servidor, se planejar e desequilibrar as células entre os servidores corretamente. Se necessário, as células também podem definir limites para o recurso usado.


imagem


E a virtualização completa?


Até onde eu sei, o cbsd apóia o trabalho dos hipervisores bhyve e XEN. Eu nunca usei o segundo, mas o primeiro é um hypervisor relativamente jovem do FreeBSD . Veremos um exemplo de uso de bhyve no exemplo abaixo.


Instale e configure o ambiente do host


Nós usamos o FS ZFS . Esta é uma ferramenta extremamente poderosa para gerenciar o espaço no servidor. Graças ao ZFS, você pode criar diretamente matrizes de várias configurações diretamente de discos, expandir dinamicamente o espaço "quente", alterar discos mortos, gerenciar instantâneos e muito, muito mais, que pode ser descrito em uma série de artigos. Vamos voltar ao nosso servidor e seus discos. No início da instalação em discos, deixamos espaço livre para partições criptografadas. Porque Isso é para que o sistema suba automaticamente e ouça no SSH.


gpart add -t freebsd-zfs /dev/ada0


/dev/ada0p4 added!


adicione a partição do disco ao espaço restante


geli init /dev/ada0p4


dirigir nossa senha de criptografia


geli attach /dev/ada0p4


digite novamente a senha e temos o dispositivo /dev/ada0p4.eli - este é o nosso espaço criptografado. Em seguida, repetimos o mesmo para / dev / ada1 e outros discos na matriz. E crie um novo pool do ZFS .


zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - bem, agora temos o conjunto mínimo de combate pronto. Uma matriz de disco espelhada no caso de uma das três falhar.


Crie um conjunto de dados no novo "pool"


zfs create vms/jails


pkg install cbsd - execute o comando e instale o gerenciamento para nossas células.


Após a instalação do cbsd , ele precisa ser inicializado:


# env workdir="/vms/jails" /usr/local/cbsd/sudoexec/initenv


Bem, respondemos a várias perguntas, principalmente respostas por padrão.


* Se você usar criptografia, é importante que o daemon cbsdd seja iniciado automaticamente até que você descriptografe os discos manual ou automaticamente (em nosso exemplo, o zabbix faz isso)


** Além disso, eu não uso o NAT do cbsd , mas configuro-o pessoalmente no pf .


# sysrc pf_enable=YES


# ee /etc/pf.conf


 IF_PUBLIC="em0" IP_PUBLIC="1.23.34.56" JAIL_IP_POOL="192.168.0.0/24" #WHITE_CL="{ 127.0.0.1 }" icmp_types="echoreq" set limit { states 20000, frags 20000, src-nodes 20000 } set skip on lo0 scrub in all #NAT for jails nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC ## Bitcoin network port forward IP_JAIL="192.168.0.1" PORT_JAIL="{8333}" rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL 

# service pf start


# pfctl -f /etc/pf.conf


A configuração de políticas de firewall também é um tópico separado, por isso não vou me aprofundar na configuração de políticas de BLOCK ALL e na definição de listas de permissões; você pode fazer isso lendo a documentação oficial ou qualquer grande número de artigos disponíveis no Google.


Bem ... temos o cbsd instalado, é hora de criar nosso primeiro cavalo de trabalho - um demônio bitcoin em uma gaiola!


cbsd jconstruct-tui



Aqui vemos o diálogo de criação de células. Depois que todos os valores estiverem definidos, crie!


Ao criar a primeira célula, você deve escolher o que usar como base para as células. Eu seleciono o kit de distribuição no repositório do FreeBSD com o comando repo . Essa escolha é feita apenas ao criar a primeira célula de uma versão específica (você pode hospedar células de qualquer versão anterior à versão do host).


Depois que tudo estiver instalado - execute a célula!


# cbsd jstart bitcoind


Mas precisamos instalar o software na gaiola.


# jls


  JID IP Address Hostname Path 1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind 

jexec bitcoind para entrar no console da célula


e já dentro da célula, instalamos o software com suas dependências (nosso sistema host permanece limpo)


bitcoind:/@[15:25] # pkg install bitcoin-daemon bitcoin-utils


bitcoind:/@[15:30] # sysrc bitcoind_enable=YES


bitcoind:/@[15:30] # service bitcoind start


Há bitcoin na célula, mas precisamos de anonimato, porque queremos conectar-se a algumas células através da rede TOP. Em geral, temos planos de transformar a maioria das células com software suspeito apenas por meio de um proxy. Graças ao pf você pode desativar o NAT para um intervalo específico de endereços IP na rede local e permitir o NAT apenas para o nosso nó TOR. Portanto, mesmo que o malware entre na célula, ele provavelmente não entrará em contato com o mundo exterior e, se o fizer, não revelará o IP do nosso servidor. portanto, criamos mais uma célula, para serviços de "encaminhamento" como um serviço ".onion" e como um proxy para acessar a Internet em células individuais.


# cbsd jsconstruct-tui


# cbsd jstart tor


# jexec tor


tor:/@[15:38] # pkg install tor


tor:/@[15:38] # sysrc tor_enable=YES


tor:/@[15:38] # ee /usr/local/etc/tor/torrc


Colocamos listen no endereço local (disponível para todas as células)


SOCKSPort 192.168.0.2:9050


O que ainda falta para a felicidade completa. Sim, precisamos de um serviço para a nossa web, talvez não um. Execute o nginx, que atuará como proxy reverso e cuidará da renovação dos certificados Let's Encrypt


# cbsd jsconstruct-tui


# cbsd jstart nginx-rev


# jexec nginx-rev


nginx-rev:/@[15:47] # pkg install nginx py36-certbot


E agora colocamos 150 MB de dependências em uma gaiola. E o anfitrião ainda está limpo.


voltemos a configurar o nginx posteriormente, precisamos criar mais duas células para o nosso gateway de pagamento para nodejs e rust e um aplicativo da web, que por algum motivo está no apache e no pkhp, e o banco de dados MySQL também é necessário para o último.


# cbsd jsconstruct-tui


# cbsd jstart paygw


# jexec paygw


paygw:/@[15:55] # pkg install git node npm


paygw:/@[15:55] # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh


... e outros 380 MB de pacotes isolados


Em seguida, aumentamos nosso aplicativo com git e o executamos.


# cbsd jsconstruct-tui


# cbsd jstart webapp


# jexec webapp


webapp:/@[16:02] # pkg install mariadb104-server apache24 php74 mod_php74 php74-pdo_mysql


Pacotes de 450 MB. na gaiola.


aqui, damos ao desenvolvedor acesso via SSH diretamente à célula, eles farão tudo sozinhos:


webapp:/@[16:02] # ee /etc/ssh/sshd_config


Port 2267 - altere a porta da célula SSH para qualquer


webapp:/@[16:02] # sysrc sshd_enable=YES


webapp:/@[16:02] # service sshd start


Bem, o serviço está em execução, resta adicionar uma regra no firewall pf


Vamos ver qual IP temos nas células e como é o nosso "lokalka"


# jls


  JID IP Address Hostname Path 1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind 2 192.168.0.2 tor.space.com /zroot/jails/jails/tor 3 192.168.0.3 nginx-rev.space.com /zroot/jails/jails/nginx-rev 4 192.168.0.4 paygw.space.com /zroot/jails/jails/paygw 5 192.168.0.5 webapp.my.domain /zroot/jails/jails/webapp 

e adicione uma regra


# ee /etc/pf.conf


 ## SSH for web-Devs IP_JAIL="192.168.0.5" PORT_JAIL="{ 2267 }" rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL 

Bem, como estamos aqui, adicionaremos a mesma regra no proxy reverso:


 ## web-ports for nginx-rev IP_JAIL="192.168.0.3" PORT_JAIL="{ 80, 443 }" rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL 

# pfctl -f /etc/pf.conf


Bem, agora um pouco sobre bitcoins


O que temos - temos um aplicativo da web que é acessível de fora e se comunica localmente com nosso gateway de pagamento. Agora precisamos preparar um ambiente de trabalho para interação com a própria rede bitcoin - o nó bitcoind é apenas um daemon que suporta uma cópia local da blockchain atual. Este daemon possui funcionalidade RPC e carteira, mas existem "wrappers" mais convenientes para o desenvolvimento de aplicativos. Para começar, decidimos colocar electrum - esta é uma carteira CLI. Usaremos essa carteira como um "armazenamento a frio" para nossos bitcoins - em geral, aqueles que precisarão ser armazenados "fora" do sistema, acessíveis aos usuários e geralmente afastados de todos. Ele também tem uma interface gráfica, então vamos usar a mesma carteira no nosso
laptops. Enquanto usaremos o electrum com servidores públicos, e posteriormente em outra célula, criaremos o ElectrumX , para que não dependa de ninguém.


# cbsd jsconstruct-tui


# cbsd jstart electrum


# jexec electrum


electrum:/@[8:45] # pkg install py36-electrum


outros 700 MB de software em nossa gaiola


electrum:/@[8:53] # adduser


 Username: wallet Full name: Uid (Leave empty for default): Login group [wallet]: Login group is wallet. Invite wallet into other groups? []: Login class [default]: Shell (sh csh tcsh nologin) [sh]: tcsh Home directory [/home/wallet]: Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: no Lock out the account after creation? [no]: Username : wallet Password : <disabled> Full Name : Uid : 1001 Class : Groups : wallet Home : /home/wallet Home Mode : Shell : /bin/tcsh Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (wallet) to the user database. Add another user? (yes/no): no Goodbye! electrum:/@[8:53] # su wallet 

electrum:/@[8:53] # su wallet


wallet@electrum:/ % electrum-3.6 create


 { "msg": "Please keep your seed in a safe place; if you lose it, you will not be able to restore your wallet.", "path": "/usr/home/wallet/.electrum/wallets/default_wallet", "seed": "jealous win pig material ribbon young punch visual okay cactus random bird" } 

Agora criamos uma carteira.


wallet@electrum:/ % electrum-3.6 listaddresses


 [ "18WEhbjvMLGRMfwudzUrUd25U5C7uZYkzE", "14XHSejhxsZNDRtk4eFbqAX3L8rftzwQQU", "1KQXaN8RXiCN1ne9iYngUWAr6KJ6d4pPas", ... "1KeVcAwEYhk29qEyAfPwcBgF5mMMoy4qjw", "18VaUuSeBr6T2GwpSHYF3XyNgLyLCt1SWk" ] 

wallet@electrum:/ % electrum-3.6 help


A partir de agora, apenas um círculo limitado de pessoas poderá se conectar à nossa carteira na cadeia . Para não abrir o acesso externo a esta célula, as conexões SSH ocorrerão através do TOR (uma versão descentralizada da VPN). Iniciamos o SSH na célula, mas não tocamos em nosso pf.conf no host.


electrum:/@[9:00] # sysrc sshd_enable=YES


electrum:/@[9:00] # service sshd start


Agora desligue o acesso à Internet da célula com a carteira. Daremos a ele um endereço IP de outro espaço de sub-rede que não seja baseado em NAT. Primeiro, altere /etc/pf.conf no host


# ee /etc/pf.conf


JAIL_IP_POOL="192.168.0.0/24" mude para JAIL_IP_POOL="192.168.0.0/25" , portanto, todos os endereços 192.168.0.126-255 não terão acesso direto à Internet. Uma espécie de software "air-gap" da rede. E a regra da NAT permanece como era


nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC


Sobrecarregando as regras


# pfctl -f /etc/pf.conf


Agora pegue nossa gaiola


# cbsd jconfig jname=electrum




 jset mode=quiet jname=electrum ip4_addr="192.168.0.200" Remove old IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias Setup new IP: /sbin/ifconfig em0 inet 192.168.0.200 alias ip4_addr: 192.168.0.200 

Hmm, mas agora o sistema em si vai parar de funcionar para nós. No entanto, podemos especificar um proxy do sistema. Mas há uma coisa, mas, no TOR, é um proxy SOCKS5 e, por conveniência, também teríamos um proxy HTTP.


# cbsd jsconstruct-tui


# cbsd jstart polipo


# jexec polipo


polipo:/@[9:28] # pkg install polipo


polipo:/@[9:28] # ee /usr/local/etc/polipo/config


 socksParentProxy = "192.168.0.2:9050" socksProxyType = socks5 

polipo:/@[9:42] # sysrc polipo_enable=YES


polipo:/@[9:43] # service polipo start


Bem, agora em nosso sistema existem dois proxies, e ambos saem via TOR: socks5: //192.168.0.2: 9050 e http://192.168.0.6:8123


Agora você pode personalizar o ambiente da nossa carteira


# jexec electrum


electrum:/@[9:45] # su wallet


wallet@electrum:/ % ee ~/.cshrc


 #in the end of file proxy config setenv http_proxy http://192.168.0.6:8123 setenv https_proxy http://192.168.0.6:8123 

Bem, agora o shell funcionará sob um proxy. Se você deseja instalar pacotes, adicione /usr/local/etc/pkg.conf abaixo da raiz


 pkg_env: { http_proxy: "http://my_proxy_ip:8123", } 

Bem, agora é hora de adicionar o serviço oculto TOR como o endereço do nosso serviço SSH na célula da carteira.


# jexec tor


tor:/@[9:59] # ee /usr/local/etc/tor/torrc


 HiddenServiceDir /var/db/tor/electrum/ HiddenServicePort 22 192.168.0.200:22 

tor:/@[10:01] # mkdir /var/db/tor/electrum


tor:/@[10:01] # chown -R _tor:_tor /var/db/tor/electrum


tor:/@[10:01] # chmod 700 /var/db/tor/electrum


tor:/@[10:03] # service tor restart


tor:/@[10:04] # cat /var/db/tor/electrum/hostname


 mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion 

Aqui está o nosso endereço de conexão. Vamos verificar na máquina local. Mas primeiro você precisa adicionar nossa chave SSH:


wallet@electrum:/ % mkdir ~/.ssh


wallet@electrum:/ % ee ~/.ssh/authorized_keys


 ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAG9Fk2Lqi4GQ8EXZrsH3EgSrVIQPQaAlS38MmJLBabihv9KHIDGXH7r018hxqLNNGbaJWO/wrWk7sG4T0yLHAbdQAFsMYof9kjoyuG56z0XZ8qaD/X/AjrhLMsIoBbUNj0AzxjKNlPJL4NbHsFwbmxGulKS0PdAD5oLcTQi/VnNdU7iFw== user@local 

Bem, a partir da máquina Linux cliente


user@local ~$ nano ~/.ssh/config


 #remote electrum wallet Host remotebtc User wallet Port 22 Hostname mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion ProxyCommand /bin/ncat --proxy localhost:9050 --proxy-type socks5 %h %p 

Conectar (Para que isso funcione, você precisa de um daemon TOR local que escute no 9050)


user@local ~$ ssh remotebtc


 The authenticity of host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<no hostip for proxy command>)' can't be established. ECDSA key fingerprint is SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) to the list of known hosts. FreeBSD 12.1-RELEASE-p1 GENERIC To save disk space in your home directory, compress files you rarely use with "gzip filename". -- Dru <genesis@istar.ca> wallet@electrum:~ % logout 

Sucesso!


Para trabalhar com pagamentos instantâneos e micropagamentos, também precisamos do nó Lightning Network ; de fato, essa será nossa principal ferramenta de trabalho com bitcoin. * O C-lightning , que vamos usar como daemon, possui um plugin Sparko , que é uma interface HTTP (REST) ​​completa e permite trabalhar com transações fora da cadeia e transações na cadeia. c-lightning requer um nó bitcoind para funcionar.


* Existem implementações diferentes em diferentes PLs do protocolo Lightning Network. Aqueles que testamos o c-lightning (escrito em C) pareciam os mais estáveis ​​e eficientes em termos de recursos


# cbsd jsconstruct-tui


# cbsd jstart cln


# jexec cln


lightning:/@[10:23] # adduser


 Username: lightning ... 

lightning:/@[10:24] # pkg install git


lightning:/@[10:23] # su lightning


cd ~ && git clone https://github.com/ElementsProject/lightning


lightning@lightning:~ % exit


lightning:/@[10:30] # cd /home/lightning/lightning/


lightning:/home/lightning/lightning@[10:31] # pkg install autoconf automake gettext git gmp gmake libtool python python3 sqlite3 libsodium py36-mako bash bitcoin-utils


lightning:/home/lightning/lightning@[10:34] # ./configure && gmake && gmake install


Enquanto tudo o que você precisa é compilado e instalado, crie o usuário RPC para lightningd no bitcoind


# jexec bitcoind


bitcoind:/@[10:36] # ee /usr/local/etc/bitcoin.conf


 rpcbind=192.168.0.1 rpcuser=test rpcpassword=test #allow only c-lightning rpcallowip=192.168.0.7/32 

bitcoind:/@[10:39] # service bitcoind restart


Minha troca caótica entre células não é tão caótica se você observar o utilitário tmux , que permite criar muitas sub-sessões de terminais dentro de uma sessão. Analógico: screen



Dachshunds, não queremos exibir o IP real de nosso nó e queremos realizar todas as transações financeiras através do TOP. Portanto, você precisa de mais um .onion.


# jexec tor


tor:/@[9:59] # ee /usr/local/etc/tor/torrc


 HiddenServiceDir /var/db/tor/cln/ HiddenServicePort 9735 192.168.0.7:9735 

tor:/@[10:01] # mkdir /var/db/tor/cln


tor:/@[10:01] # chown -R _tor:_tor /var/db/tor/cln


tor:/@[10:01] # chmod 700 /var/db/tor/cln


tor:/@[10:03] # service tor restart


tor:/@[10:04] # cat /var/db/tor/cln/hostname


 en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion 

agora crie uma configuração para o c-lightning


lightning:/home/lightning/lightning@[10:31] # su lightning


lightning@lightning:~ % mkdir .lightning


lightning@lightning:~ % ee .lightning/config


 alias=My-LN-Node bind-addr=192.168.0.7:9735 rgb=ff0000 announce-addr=en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion:9735 network=bitcoin log-level=info fee-base=0 fee-per-satoshi=1 proxy=192.168.0.2:9050 log-file=/home/lightning/.lightning/c-lightning.log min-capacity-sat=200000 # sparko plugin # https://github.com/fiatjaf/lightningd-gjson-rpc/tree/master/cmd/sparko sparko-host=192.168.0.7 sparko-port=9737 sparko-tls-path=sparko-tls #sparko-login=mywalletusername:mywalletpassword #sparko-keys=masterkey;secretread:+listchannels,+listnodes;secretwrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice sparko-keys=masterkey;secretread:+listchannels,+listnodes;ultrawrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice # for the example above the initialization logs (mixed with lightningd logs) should print something like 

lightning@lightning:~ % mkdir .lightning/plugins


lightning@lightning:~ % cd .lightning/plugins/


lightning@lightning:~/.lightning/plugins:% fetch https://github.com/fiatjaf/sparko/releases/download/v0.2.1/sparko_full_freebsd_amd64


lightning@lightning:~/.lightning/plugins % mkdir ~/.lightning/sparko-tls


lightning@lightning:~/.lightning/sparko-tls % cd ~/.lightning/sparko-tls


lightning@lightning:~/.lightning/sparko-tls % openssl genrsa -out key.pem 2048


lightning@lightning:~/.lightning/sparko-tls % openssl req -new -x509 -sha256 -key key.pem -out cert.pem -days 3650


lightning@lightning:~/.lightning/plugins % chmod +x sparko_full_freebsd_amd64


lightning@lightning:~/.lightning/plugins % mv sparko_full_freebsd_amd64 sparko


lightning@lightning:~/.lightning/plugins % cd ~


você também precisa criar um arquivo de configuração para o bitcoin-cli, um utilitário que se comunica com o bitcoind


lightning@lightning:~ % mkdir .bitcoin


lightning@lightning:~ % ee .bitcoin/bitcoin.conf


 rpcconnect=192.168.0.1 rpcuser=test rpcpassword=test 

verificar


lightning@lightning:~ % bitcoin-cli echo "test"


 [ "test" ] 

correr lightningd


lightning@lightning:~ % lightningd --daemon


lightning-cli próprio lightning-cli pode ser controlado pelo lightning-cli , por exemplo:


lightning-cli newaddr obter endereço para nova entrada de pagamento


 { "address": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv", "bech32": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv" } 

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all enviam para o endereço todo o dinheiro da carteira (todos os endereços na cadeia)


Além disso, comandos para operações fora da cadeia de lightning-cli invoice lightning-cli listinvoices , lightning-cli invoice lightning-cli listinvoices , lightning-cli listinvoices lightning-cli pay etc.


Bem, para comunicação com o aplicativo, temos o REST Api


curl -k https://192.168.0.7:9737/rpc -d '{"method": "pay", "params": ["lnbc..."]}' -H 'X-Access masterkey'


Resumir


# jls


  JID IP Address Hostname Path 1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind 2 192.168.0.2 tor.space.com /zroot/jails/jails/tor 3 192.168.0.3 nginx-rev.space.com /zroot/jails/jails/nginx-rev 4 192.168.0.4 paygw.space.com /zroot/jails/jails/paygw 5 192.168.0.5 webapp.my.domain /zroot/jails/jails/webapp 7 192.168.0.200 electrum.space.com /zroot/jails/jails/electrum 8 192.168.0.6 polipo.space.com /zroot/jails/jails/polipo 9 192.168.0.7 lightning.space.com /zroot/jails/jails/cln 


, .


# zfs list


 NAME USED AVAIL REFER MOUNTPOINT zroot 279G 1.48T 88K /zroot zroot/ROOT 1.89G 1.48T 88K none zroot/ROOT/default 1.89G 17.6G 1.89G / zroot/home 88K 1.48T 88K /home zroot/jails 277G 1.48T 404M /zroot/jails zroot/jails/bitcoind 190G 1.48T 190G /zroot/jails/jails-data/bitcoind-data zroot/jails/cln 653M 1.48T 653M /zroot/jails/jails-data/cln-data zroot/jails/electrum 703M 1.48T 703M /zroot/jails/jails-data/electrum-data zroot/jails/nginx-rev 190M 1.48T 190M /zroot/jails/jails-data/nginx-rev-data zroot/jails/paygw 82.4G 1.48T 82.4G /zroot/jails/jails-data/paygw-data zroot/jails/polipo 57.6M 1.48T 57.6M /zroot/jails/jails-data/polipo-data zroot/jails/tor 81.5M 1.48T 81.5M /zroot/jails/jails-data/tor-data zroot/jails/webapp 360M 1.48T 360M /zroot/jails/jails-data/webapp-data 

, bitcoind 190 . ? ZFS . cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com . , ( 190 )


ZFS, . ZFS , SSH. , .


, Zabbix .



, :


— UNIX- . — . . . . -, .


— . - , ECC , ZFS " " . . - .


— . . . ( ). , .


— , . , .


, , , .


?


cbsd . , bhyve .


# cat /etc/rc.conf


 ... kld_list="vmm if_tap if_bridge nmdm" ... 

# cat /boot/loader.conf


 ... vmm_load="YES" ... 

, - debian !




. — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc . , pet-project .

Source: https://habr.com/ru/post/pt477124/


All Articles