Bitcoin dalam sangkar?

Kebetulan secara profesion saya adalah pentadbir sistem komputer dan rangkaian (pendek kata: pentadbir sistem), dan saya berpeluang untuk memberitahu prof selama lebih sedikit daripada 10 tahun. aktiviti pelbagai jenis sistem, termasuk yang memerlukan langkah keselamatan [melampau]. Ia juga berlaku bahawa beberapa ketika dahulu saya mendapati ia menarik bitcoin, dan bukan sahaja menggunakannya, tetapi juga melancarkan beberapa perkhidmatan mikro untuk belajar bagaimana untuk bekerja secara bebas dengan rangkaian Bitcoin (aka p2p selepas semua) dari sudut pandangan pemaju (saya sudah tentu salah seorang daripada mereka dev, jadi, saya sedang lalu lalang). Tetapi saya tidak bercakap tentang pembangunan, saya bercakap tentang persekitaran yang selamat dan cekap untuk aplikasi.

teknologi kewangan (FinTech) pergi di sebelah keselamatan maklumat (infosec) dan yang pertama boleh berfungsi tanpa yang kedua, tetapi tidak lama. Itulah sebabnya saya ingin berkongsi pengalaman saya dan set alat yang saya gunakan, yang merangkumi kedua-duanya FinTechDan infosec, dan pada masa yang sama, dan juga boleh digunakan untuk tujuan yang lebih luas atau berbeza sama sekali. Dalam artikel ini, saya tidak akan memberitahu anda banyak tentang Bitcoin, tetapi mengenai model infrastruktur untuk pembangunan dan operasi perkhidmatan kewangan (dan bukan sahaja) - secara ringkasnya, perkhidmatan yang "B" penting. Ini terpakai kepada kedua-dua pertukaran Bitcoin dan perkhidmatan zoo korporat yang paling tipikal bagi sebuah syarikat kecil yang tidak berkaitan dengan Bitcoin dalam apa jua cara.

Saya ingin ambil perhatian bahawa saya adalah penyokong prinsip "permudahkan perkara bodoh" ΠΈ "sedikit tetapi lebih dari cukup", oleh itu, kedua-dua artikel dan apa yang diterangkan di dalamnya akan mempunyai ciri-ciri yang berkaitan dengan prinsip ini.

Senario khayalan: Mari kita lihat semuanya menggunakan contoh penukar bitcoin. Kami memutuskan untuk melancarkan pertukaran rubel, dolar, euro untuk bitcoin dan kembali, dan kami sudah mempunyai penyelesaian yang berkesan, tetapi untuk wang digital lain seperti qiwi dan webmoney, i.e. Kami telah menutup semua isu undang-undang, kami mempunyai aplikasi siap sedia yang berfungsi sebagai pintu masuk pembayaran untuk rubel, dolar dan euro dan sistem pembayaran lain. Ia disambungkan ke akaun bank kami dan mempunyai beberapa jenis API untuk aplikasi akhir kami. Kami juga mempunyai aplikasi web yang bertindak sebagai penukar untuk pengguna, seperti akaun qiwi atau webmoney biasa - buat akaun, tambah kad dan sebagainya. Ia berkomunikasi dengan aplikasi gerbang kami, walaupun melalui API REST di kawasan setempat. Oleh itu, kami memutuskan untuk menyambung bitcoin dan pada masa yang sama menaik taraf infrastruktur, kerana... Pada mulanya, segala-galanya diletakkan dengan tergesa-gesa pada kotak maya di pejabat di bawah meja... tapak mula digunakan, dan kami mula bimbang tentang masa operasi dan prestasi.

Jadi, mari kita mulakan dengan perkara utama - memilih pelayan. Kerana perniagaan dalam contoh kami adalah kecil dan kami mempercayai hoster (OVH) yang akan kami pilih pilihan bajet di mana adalah mustahil untuk memasang sistem daripada imej .iso asal, tetapi tidak mengapa, jabatan keselamatan IT pasti akan menganalisis imej yang dipasang. Dan apabila kami dewasa, kami akan menyewa almari kami sendiri di bawah kunci dan kunci dengan akses fizikal yang terhad, dan mungkin kami akan membina DC kami sendiri. Walau apa pun, perlu diingat bahawa apabila menyewa perkakasan dan memasang imej siap sedia, terdapat kemungkinan anda akan mempunyai "Trojan dari hoster" yang tergantung pada sistem anda, yang dalam kebanyakan kes tidak bertujuan untuk mengintip anda tetapi untuk menawarkan pelayan alat pengurusan yang lebih mudah.

Pemasangan pelayan

Semuanya mudah di sini. Kami memilih perkakasan yang sesuai dengan keperluan kami. Kemudian pilih imej FreeBSD. Baik, atau kami menyambung (dalam kes hoster lain dan perkakasan kami sendiri) melalui IPMI atau dengan monitor dan suapkan imej .iso FreeBSD ke dalam muat turun. Untuk persediaan orkestra saya gunakan Ansible ΠΈ mfsbsd. Satu-satunya perkara, dalam kes kami dengan kimsufi, kami memilih pemasangan tersuai agar dua cakera dalam cermin hanya mempunyai partition but dan /home "terbuka", ruang cakera yang selebihnya akan disulitkan, tetapi lebih lanjut mengenainya kemudian.

Bitcoin dalam sangkar?

Pemasangan sistem berlaku dengan cara yang standard, saya tidak akan memikirkan perkara ini, saya hanya akan ambil perhatian bahawa sebelum memulakan operasi ia patut diberi perhatian pengerasan pilihan yang ditawarkannya bsdinstaller pada akhir pemasangan (jika anda memasang sistem sendiri):

Bitcoin dalam sangkar?

Terdapat benda baik mengenai topik ini, saya akan mengulanginya secara ringkas di sini.

Ia juga mungkin untuk mendayakan parameter yang disebutkan di atas pada sistem yang telah dipasang. Untuk melakukan ini, anda perlu mengedit fail pemuat but dan dayakan parameter kernel. *ee ialah editor seperti ini di 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

Anda juga harus memastikan bahawa anda telah memasang versi terbaharu sistem, dan melaksanakan semua kemas kini dan naik taraf. Dalam kes kami, sebagai contoh, peningkatan kepada versi terkini diperlukan, kerana... imej prapemasangan ketinggalan enam bulan hingga setahun. Nah, di sana kita menukar port SSH kepada sesuatu yang berbeza daripada yang lalai, menambah pengesahan kunci dan melumpuhkan pengesahan kata laluan.

Kemudian kami setelkan aide, memantau status fail konfigurasi sistem. Anda boleh membaca dengan lebih terperinci di sini.

pkg install aide

dan edit crontab kami

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

Kami merangkumi pengauditan sistem

sysrc auditd_enable=YES

# service auditd start

Cara mentadbir perkara ini diterangkan dengan sempurna dalam kepimpinan.

Sekarang kita but semula dan teruskan ke perisian pada pelayan. Setiap pelayan adalah hipervisor untuk bekas atau mesin maya penuh. Oleh itu, adalah penting bahawa pemproses menyokong VT-x dan EPT jika kami merancang untuk menggunakan virtualisasi penuh.

Untuk menguruskan bekas dan mesin maya yang saya gunakan cbsd daripada olevole, Saya mendoakan beliau lebih kesihatan dan berkat untuk utiliti yang indah ini!

Bekas? Docker lagi atau apa?

Tetapi tidak. Penjara FreeBSD adalah alat yang sangat baik untuk kontena, tetapi yang disebutkan cbsd untuk mengatur bekas ini, yang dipanggil sel.

Sangkar adalah penyelesaian yang sangat berkesan untuk membina infrastruktur untuk pelbagai tujuan, di mana pengasingan lengkap perkhidmatan atau proses individu akhirnya diperlukan. Pada asasnya, ia adalah klon sistem hos, tetapi ia tidak memerlukan virtualisasi perkakasan penuh. Dan terima kasih kepada ini, sumber tidak dibelanjakan untuk "OS tetamu", tetapi hanya untuk kerja yang dilakukan. Apabila sel digunakan untuk keperluan dalaman, ini adalah penyelesaian yang sangat mudah untuk penggunaan sumber yang optimum - sekumpulan sel pada satu pelayan perkakasan setiap satu boleh menggunakan keseluruhan sumber pelayan secara individu jika perlu. Memandangkan subperkhidmatan yang berbeza biasanya memerlukan tambahan. sumber pada masa yang berbeza, anda boleh mengekstrak prestasi maksimum daripada satu pelayan jika anda merancang dan mengimbangi sel antara pelayan dengan betul. Jika perlu, sel juga boleh diberi sekatan ke atas sumber yang digunakan.

Bitcoin dalam sangkar?

Bagaimana dengan virtualisasi penuh?

Sejauh yang saya tahu cbsd menyokong kerja bhyve dan hipervisor XEN. Saya tidak pernah menggunakan yang kedua, tetapi yang pertama agak baru hypervisor daripada FreeBSD. Kami akan melihat contoh penggunaan bhyve dalam contoh di bawah.

Memasang dan Mengkonfigurasi Persekitaran Hos

Kami menggunakan FS ZFS. Ini adalah alat yang sangat berkuasa untuk menguruskan ruang pelayan. Terima kasih kepada ZFS, anda boleh terus membina tatasusunan pelbagai konfigurasi daripada cakera, mengembangkan ruang secara dinamik "panas", menukar cakera mati, mengurus syot kilat, dan banyak lagi, yang boleh diterangkan dalam keseluruhan siri artikel. Mari kembali ke pelayan kami dan cakeranya. Pada permulaan pemasangan, kami meninggalkan ruang kosong pada cakera untuk partition yang disulitkan. Kenapa begitu? Ini supaya sistem bangun secara automatik dan mendengar melalui SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

tambah partition cakera pada ruang yang tinggal

geli init /dev/ada0p4

masukkan kata laluan penyulitan kami

geli attach /dev/ada0p4

Kami memasukkan kata laluan sekali lagi dan kami mempunyai peranti /dev/ada0p4.eli - ini adalah ruang kami yang disulitkan. Kemudian kami mengulangi perkara yang sama untuk /dev/ada1 dan seluruh cakera dalam tatasusunan. Dan kami mencipta yang baru kolam ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Nah, kami mempunyai kit tempur minimum sedia. Susunan cakera bercermin sekiranya salah satu daripada tiga gagal.

Mencipta set data pada "kolam" baharu

zfs create vms/jails

pkg install cbsd β€” kami melancarkan pasukan dan menyediakan pengurusan untuk sel kami.

Selepas itu cbsd dipasang, ia perlu dimulakan:

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

Nah, kami menjawab banyak soalan, kebanyakannya dengan jawapan lalai.

*Jika anda menggunakan penyulitan, adalah penting bahawa daemon cbsdd tidak bermula secara automatik sehingga anda menyahsulit cakera secara manual atau automatik (dalam contoh kami ini dilakukan oleh zabbix)

**Saya juga tidak menggunakan NAT dari cbsd, dan saya mengkonfigurasinya sendiri 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

Menyediakan dasar tembok api juga merupakan topik yang berasingan, jadi saya tidak akan pergi lebih jauh ke dalam menyediakan dasar BLOK SEMUA dan menyediakan senarai putih, anda boleh melakukannya dengan membaca dokumentasi rasmi atau mana-mana jumlah besar artikel yang tersedia di Google.

Nah... kami telah memasang cbsd, sudah tiba masanya untuk mencipta kuda kerja pertama kami - syaitan Bitcoin yang dikurung!

cbsd jconstruct-tui

Bitcoin dalam sangkar?

Di sini kita melihat dialog penciptaan sel. Selepas semua nilai telah ditetapkan, mari buat!

Apabila mencipta sel pertama anda, anda harus memilih apa yang hendak digunakan sebagai asas untuk sel tersebut. Saya memilih pengedaran daripada repositori FreeBSD dengan arahan repo. Pilihan ini dibuat hanya apabila mencipta sel pertama versi tertentu (anda boleh mengehoskan sel mana-mana versi yang lebih lama daripada versi hos).

Selepas semuanya dipasang, kami melancarkan sangkar!

# cbsd jstart bitcoind

Tetapi kita perlu memasang perisian dalam sangkar.

# jls

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

jexec bitcoind untuk masuk ke konsol sel

dan sudah berada di dalam sel kami memasang perisian dengan kebergantungannya (sistem hos kami kekal bersih)

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

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

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

Terdapat Bitcoin dalam sangkar, tetapi kami memerlukan tanpa nama kerana kami ingin menyambung ke beberapa sangkar melalui rangkaian TOP. Secara umum, kami merancang untuk menjalankan kebanyakan sel dengan perisian yang mencurigakan hanya melalui proksi. Terima kasih kepada pf Anda boleh melumpuhkan NAT untuk julat alamat IP tertentu pada rangkaian tempatan dan membenarkan NAT hanya untuk nod TOR kami. Oleh itu, walaupun perisian hasad masuk ke dalam sel, kemungkinan besar ia tidak akan berkomunikasi dengan dunia luar, dan jika ia berlaku, ia tidak akan mendedahkan IP pelayan kami. Oleh itu, kami mencipta sel lain untuk "memajukan" perkhidmatan sebagai perkhidmatan ".onion" dan sebagai proksi untuk mengakses Internet ke sel individu.

# 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

Tetapkan untuk mendengar di alamat setempat (tersedia untuk semua sel)

SOCKSPort 192.168.0.2:9050

Apa lagi yang kita perlukan untuk kebahagiaan yang lengkap? Ya, kami memerlukan perkhidmatan untuk web kami, mungkin lebih daripada satu. Mari lancarkan nginx, yang akan bertindak sebagai proksi terbalik dan mengurus memperbaharui sijil Let's Encrypt

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Oleh itu, kami meletakkan 150 MB tanggungan dalam sangkar. Dan tuan rumah masih bersih.

Mari kita kembali untuk menyediakan nginx kemudian, kita perlu menaikkan dua lagi sel untuk gerbang pembayaran kami pada nodejs dan karat dan aplikasi web, yang atas sebab tertentu berada dalam Apache dan PHP, dan yang kedua juga memerlukan pangkalan data MySQL.

# 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

...dan 380 MB lagi pakej diasingkan

Seterusnya, kami memuat turun aplikasi kami dengan git dan melancarkannya.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

Pakej 450 MB. dalam sangkar.

di sini kami memberikan akses pembangun melalui SSH terus ke sel, mereka akan melakukan segala-galanya di sana sendiri:

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

Port 2267 β€” tukar port SSH sel kepada mana-mana port sewenang-wenangnya

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

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

Nah, perkhidmatan sedang berjalan, yang tinggal hanyalah menambah peraturan pf firewall

Mari lihat IP yang ada pada sel kita dan rupa "kawasan setempat" kita secara amnya.

# 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

dan tambah peraturan

# 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

Oleh kerana kita berada di sini, mari kita tambahkan juga peraturan untuk proksi terbalik:

## 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

Nah, sekarang sedikit tentang bitcoin

Apa yang kami ada ialah kami mempunyai aplikasi web yang terdedah secara luaran dan ia bercakap secara tempatan dengan gerbang pembayaran kami. Sekarang kita perlu menyediakan persekitaran kerja untuk berinteraksi dengan rangkaian Bitcoin itu sendiri - nod bitcoind ia hanyalah daemon yang memastikan salinan tempatan blockchain dikemas kini. Daemon ini mempunyai fungsi RPC dan dompet, tetapi terdapat "pembungkus" yang lebih mudah untuk pembangunan aplikasi. Sebagai permulaan, kami memutuskan untuk meletakkan electrum ialah dompet CLI. dompet ini kami akan menggunakannya sebagai "penyimpanan sejuk" untuk bitcoin kami - secara amnya, bitcoin yang perlu disimpan "di luar" sistem yang boleh diakses oleh pengguna dan secara amnya jauh dari semua orang. Ia juga mempunyai GUI, jadi kami akan menggunakan dompet yang sama pada kami
komputer riba. Buat masa ini kami akan menggunakan Electrum dengan pelayan awam, dan kemudian kami akan menaikkannya dalam sel lain ElectrumXsupaya tidak bergantung pada sesiapa pun.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

700 MB lagi perisian dalam sangkar kami

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"
}

Kini kami telah mencipta dompet.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Kepada kita di rantai Hanya bilangan orang yang terhad akan dapat menyambung ke dompet mulai sekarang. Untuk tidak membuka akses kepada sel ini dari luar, sambungan melalui SSH akan berlaku melalui TOP (versi VPN terdesentralisasi). Kami melancarkan SSH dalam sel, tetapi jangan sentuh pf.conf kami pada hos.

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

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

Sekarang mari kita matikan sel dengan akses Internet dompet. Mari kita berikan alamat IP daripada ruang subnet lain yang bukan NATed. Mula-mula jom tukar /etc/pf.conf pada tuan rumah

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" jom tukar ke JAIL_IP_POOL="192.168.0.0/25", oleh itu semua alamat 192.168.0.126-255 tidak akan mempunyai akses terus ke Internet. Sejenis rangkaian "air-gap" perisian. Dan peraturan NAT kekal seperti sedia ada

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

Melebihkan peraturan

# pfctl -f /etc/pf.conf

Sekarang mari kita ambil alih sel kita

# cbsd jconfig jname=electrum

Bitcoin dalam sangkar?

Bitcoin dalam sangkar?

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, tetapi sekarang sistem itu sendiri akan berhenti berfungsi untuk kita. Walau bagaimanapun, kami boleh menentukan proksi sistem. Tetapi ada satu perkara, pada TOR ia adalah proksi SOCKS5, dan untuk kemudahan kami juga mahukan proksi 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

Nah, kini terdapat dua pelayan proksi dalam sistem kami, dan kedua-duanya dikeluarkan melalui TOR: socks5://192.168.0.2:9050 dan http://192.168.0.6:8123

Kini kami boleh mengkonfigurasi persekitaran dompet kami

# 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

Nah, sekarang shell akan berfungsi dari bawah proksi. Jika kita ingin memasang pakej, maka kita harus menambah /usr/local/etc/pkg.conf dari bawah akar sangkar

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

Nah, kini tiba masanya untuk menambah perkhidmatan tersembunyi TOR sebagai alamat perkhidmatan SSH kami dalam sangkar dompet.

# 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

Ini adalah alamat sambungan kami. Mari semak dari mesin tempatan. Tetapi pertama-tama kita perlu menambah kunci SSH kami:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Nah, dari mesin klien Linux

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

Jom sambung (Untuk ini berfungsi, anda memerlukan daemon TOR tempatan yang mendengar pada 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 <[email protected]>
wallet@electrum:~ % logout

Berjaya!

Untuk bekerja dengan pembayaran segera dan mikro, kami juga memerlukan nod Rangkaian Lightning, sebenarnya, ini akan menjadi alat kerja utama kami dengan Bitcoin. U*c-kilatyang akan kita gunakan sebagai daemon Plugin Sparko, yang merupakan antara muka HTTP (REST) ​​lengkap dan membolehkan anda bekerja dengan transaksi luar rantaian dan dalam rantaian. c-lightning diperlukan untuk berfungsi bitcoind tetapi ya.

*Terdapat pelbagai pelaksanaan protokol Rangkaian Lightning dalam bahasa yang berbeza. Daripada yang kami uji, c-lightning (ditulis dalam C) nampaknya paling stabil dan cekap sumber

# 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

Walaupun semua yang diperlukan disusun dan dipasang, mari buat pengguna RPC untuk lightningd Π² 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

Pertukaran saya yang huru-hara antara sel ternyata tidak begitu huru-hara jika anda perhatikan utiliti itu tmux, yang membolehkan anda membuat berbilang sub-sesi terminal dalam satu sesi. Analog: screen

Bitcoin dalam sangkar?

Jadi, kami tidak mahu mendedahkan IP sebenar nod kami, dan kami mahu menjalankan semua transaksi kewangan melalui TOP. Oleh itu, satu lagi .bawang tidak diperlukan.

# 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

Sekarang mari kita buat konfigurasi untuk 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 ~

anda juga perlu mencipta fail konfigurasi untuk bitcoin-cli, utiliti yang berkomunikasi dengan bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

periksa

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

[
  "test"
]

pelancaran lightningd

lightning@lightning:~ % lightningd --daemon

Dirinya lightningd anda boleh mengawal utiliti lightning-cli, sebagai contoh:

lightning-cli newaddr dapatkan alamat untuk pembayaran masuk baharu

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all hantar semua wang dalam dompet ke alamat (semua alamat rantaian)

Juga arahan untuk operasi luar rantaian lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay dan lain-lain.

Nah, untuk komunikasi dengan aplikasi kami mempunyai REST Api

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

Meringkaskannya

# 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

Bitcoin dalam sangkar?

Kami mempunyai satu set bekas, masing-masing mempunyai tahap akses sendiri dari dan ke rangkaian tempatan.

# 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

Seperti yang anda lihat, bitcoind menggunakan semua 190 GB ruang. Bagaimana jika kita memerlukan satu lagi nod untuk ujian? Di sinilah ZFS berguna. Dengan bantuan cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com anda boleh membuat syot kilat dan melampirkan sel baharu pada syot kilat ini. Sel baharu akan mempunyai ruang sendiri, tetapi hanya perbezaan antara keadaan semasa dan asal akan diambil kira dalam sistem fail (kami akan menjimatkan sekurang-kurangnya 190 GB)

Setiap sel ialah set data ZFS tersendiri, dan ini sangat mudah. ZFS juga membenarkan melakukan pelbagai perkara menarik lain, seperti menghantar syot kilat melalui SSH. Kami tidak akan menerangkannya, sudah banyak.

Ia juga perlu diperhatikan keperluan untuk pemantauan jarak jauh terhadap hos, untuk tujuan ini yang kami ada Zabbix.

B - keselamatan

Mengenai keselamatan, mari kita mulakan daripada prinsip utama dalam konteks infrastruktur:

Kerahsiaan - Alat standard sistem seperti UNIX memastikan pelaksanaan prinsip ini. Kami secara logik memisahkan akses kepada setiap elemen sistem yang berasingan secara logik - sel. Akses disediakan melalui pengesahan pengguna standard menggunakan kunci peribadi pengguna. Semua komunikasi antara dan ke sel akhir berlaku dalam bentuk yang disulitkan. Terima kasih kepada penyulitan cakera, kami tidak perlu risau tentang keselamatan data apabila menggantikan cakera atau berhijrah ke pelayan lain. Satu-satunya akses kritikal ialah akses kepada sistem hos, kerana akses sedemikian secara amnya menyediakan akses kepada data di dalam bekas.

Integriti β€œPelaksanaan prinsip ini berlaku pada beberapa peringkat berbeza. Pertama sekali, adalah penting untuk ambil perhatian bahawa dalam kes perkakasan pelayan, memori ECC, ZFS sudah "di luar kotak" menjaga integriti data pada tahap bit maklumat. Syot kilat segera membolehkan anda membuat sandaran pada bila-bila masa dengan cepat. Alat eksport/import sel yang mudah menjadikan replikasi sel mudah.

Ketersediaan - Ini sudah menjadi pilihan. Bergantung pada tahap kemasyhuran anda dan hakikat bahawa anda mempunyai pembenci. Dalam contoh kami, kami memastikan bahawa dompet itu boleh diakses secara eksklusif daripada rangkaian TOP. Jika perlu, anda boleh menyekat segala-galanya pada tembok api dan membenarkan akses kepada pelayan secara eksklusif melalui terowong (TOR atau VPN adalah perkara lain). Oleh itu, pelayan akan terputus dari dunia luar sebanyak mungkin, dan hanya kita sendiri yang dapat mempengaruhi ketersediaannya.

Kemustahilan penolakan - Dan ini bergantung pada operasi selanjutnya dan pematuhan dengan dasar yang betul untuk hak pengguna, akses, dsb. Tetapi dengan pendekatan yang betul, semua tindakan pengguna diaudit, dan terima kasih kepada penyelesaian kriptografi adalah mungkin untuk mengenal pasti dengan jelas siapa yang melakukan tindakan tertentu dan bila.

Sudah tentu, konfigurasi yang diterangkan bukanlah contoh mutlak tentang bagaimana ia harus sentiasa berlaku, ia lebih merupakan satu contoh bagaimana ia boleh berlaku, sambil mengekalkan penskalaan dan keupayaan penyesuaian yang sangat fleksibel.

Bagaimana dengan virtualisasi penuh?

Mengenai virtualisasi penuh menggunakan cbsd anda boleh baca di sini. Saya hanya akan menambah itu untuk kerja bhyve Anda perlu mendayakan beberapa pilihan kernel.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Jadi jika anda tiba-tiba perlu memulakan docker, kemudian pasang beberapa debian dan pergi!

Bitcoin dalam sangkar?

Itu sahaja

Saya rasa itu sahaja yang saya ingin kongsikan. Jika anda menyukai artikel itu, maka anda boleh menghantar saya beberapa bitcoin - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Jika anda ingin mencuba sel dalam tindakan dan mempunyai beberapa bitcoin, anda boleh pergi ke saya projek haiwan peliharaan.

Sumber: www.habr.com