Bitcoin di dalam sangkar?

Kebetulan saya berprofesi sebagai administrator sistem dan jaringan komputer (singkatnya: administrator sistem), dan saya memiliki kesempatan untuk memberi tahu Prof selama lebih dari 10 tahun. aktivitas berbagai sistem, termasuk sistem yang memerlukan langkah-langkah keamanan [ekstrim]. Kebetulan beberapa waktu lalu saya menganggapnya menarik bitcoin, dan tidak hanya menggunakannya, tetapi juga meluncurkan beberapa layanan mikro untuk mempelajari cara bekerja secara mandiri dengan jaringan Bitcoin (alias p2p) dari sudut pandang seorang pengembang (tentu saja saya salah satunya dev, jadi, saya sedang lewat). Namun saya tidak berbicara tentang pengembangan, saya berbicara tentang lingkungan aplikasi yang aman dan efisien.

Teknologi keuangan (fintech) pergi ke sebelah keamanan informasi (infosec) dan yang pertama bisa berfungsi tanpa yang kedua, tapi tidak lama. Itu sebabnya saya ingin berbagi pengalaman dan seperangkat alat yang saya gunakan, termasuk keduanya fintechDan infosec, dan pada saat yang sama, dan juga dapat digunakan untuk tujuan yang lebih luas atau sama sekali berbeda. Dalam artikel ini saya tidak akan memberi tahu Anda banyak tentang Bitcoin, tetapi tentang model infrastruktur untuk pengembangan dan pengoperasian layanan keuangan (dan tidak hanya) - dengan kata lain, layanan yang “B” penting. Hal ini berlaku baik untuk pertukaran Bitcoin maupun untuk layanan perusahaan yang paling umum dari sebuah perusahaan kecil yang tidak terhubung dengan Bitcoin dengan cara apa pun.

Saya ingin mencatat bahwa saya adalah pendukung prinsip-prinsip tersebut "biarkan hal bodoh itu tetap sederhana" и "kurang itu lebih", oleh karena itu, baik artikel maupun apa yang dijelaskan di dalamnya akan memiliki sifat-sifat yang sesuai dengan prinsip-prinsip ini.

Skenario imajiner: Mari kita lihat semuanya menggunakan contoh penukar bitcoin. Kami memutuskan untuk meluncurkan pertukaran rubel, dolar, euro untuk bitcoin dan sebaliknya, dan kami sudah memiliki solusi yang berfungsi, tetapi untuk uang digital lainnya seperti qiwi dan webmoney, mis. Kami telah menutup semua masalah hukum, kami memiliki aplikasi siap pakai yang berfungsi sebagai gerbang pembayaran untuk rubel, dolar dan euro serta sistem pembayaran lainnya. Itu terhubung ke rekening bank kami dan memiliki semacam API untuk aplikasi akhir kami. Kami juga memiliki aplikasi web yang bertindak sebagai penukar bagi pengguna, seperti akun qiwi atau webmoney pada umumnya - membuat akun, menambahkan kartu, dan sebagainya. Itu berkomunikasi dengan aplikasi gateway kami, meskipun melalui REST API di area lokal. Jadi kami memutuskan untuk menghubungkan bitcoin dan pada saat yang sama meningkatkan infrastruktur, karena... Awalnya, semuanya disiapkan dengan tergesa-gesa di kotak virtual di kantor di bawah meja... situs mulai digunakan, dan kami mulai khawatir tentang waktu aktif dan kinerja.

Jadi, mari kita mulai dengan hal utama - memilih server. Karena bisnis dalam contoh kami kecil dan kami mempercayai hoster (OVH) yang akan kami pilih pilihan anggaran di mana tidak mungkin menginstal sistem dari image .iso asli, tetapi tidak masalah, departemen keamanan TI pasti akan menganalisis image yang diinstal. Dan ketika kita besar nanti, kita akan menyewa lemari kita sendiri dengan akses fisik terbatas, dan mungkin kita akan membangun DC kita sendiri. Bagaimanapun, perlu diingat bahwa ketika menyewa perangkat keras dan memasang gambar yang sudah jadi, ada kemungkinan Anda akan memiliki "Trojan dari hoster" yang tergantung di sistem Anda, yang dalam banyak kasus tidak dimaksudkan untuk memata-matai Anda. tetapi untuk menawarkan server alat manajemen yang lebih nyaman.

Instalasi server

Semuanya sederhana di sini. Kami memilih perangkat keras yang sesuai dengan kebutuhan kami. Kemudian pilih gambar FreeBSD. Ya, atau kita terhubung (dalam kasus hoster lain dan perangkat keras kita sendiri) melalui IPMI atau dengan monitor dan memasukkan gambar .iso FreeBSD ke dalam unduhan. Untuk pengaturan orkestra saya menggunakan Mungkin и mfsbsd. Satu-satunya hal, dalam kasus kami dengan kimsufi, kami memilih instalasi khusus agar dua disk di cermin hanya memiliki partisi boot dan /home yang "terbuka", sisa ruang disk akan dienkripsi, tetapi akan dibahas lebih lanjut nanti.

Bitcoin di dalam sangkar?

Instalasi sistem terjadi dengan cara standar, saya tidak akan memikirkan hal ini, saya hanya akan mencatat bahwa sebelum memulai operasi, perlu diperhatikan pengerasan pilihan yang ditawarkannya bsdinstaller di akhir instalasi (jika Anda menginstal sistem sendiri):

Bitcoin di dalam sangkar?

Ada bahan bagus mengenai topik ini, saya akan mengulanginya secara singkat di sini.

Dimungkinkan juga untuk mengaktifkan parameter yang disebutkan di atas pada sistem yang sudah diinstal. Untuk melakukan ini, Anda perlu mengedit file bootloader dan mengaktifkan parameter kernel. *ee adalah 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 bahwa Anda telah menginstal sistem versi terbaru, dan melakukan semua pembaruan dan peningkatan. Dalam kasus kami, misalnya, diperlukan peningkatan ke versi terbaru, karena... gambar pra-instalasi tertinggal enam bulan hingga satu tahun. Nah, disana kita ubah port SSH menjadi berbeda dari default, tambahkan otentikasi kunci dan nonaktifkan otentikasi kata sandi.

Lalu kita konfigurasi aide, memantau status file konfigurasi sistem. Anda dapat membaca lebih detail 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 termasuk audit sistem

sysrc auditd_enable=YES

# service auditd start

Cara menangani masalah ini dijelaskan dengan sempurna di kepemimpinan.

Sekarang kita reboot dan melanjutkan ke perangkat lunak di server. Setiap server adalah hypervisor untuk container atau mesin virtual lengkap. Oleh karena itu, penting agar prosesor mendukung VT-x dan EPT jika kita berencana menggunakan virtualisasi penuh.

Untuk mengelola kontainer dan mesin virtual yang saya gunakan cbsd dari olevole, Saya mendoakan dia lebih banyak kesehatan dan berkah atas utilitas luar biasa ini!

Kontainer? Docker lagi atau apa?

Dan di sini tidak. Penjara FreeBSD adalah alat yang sangat baik untuk containerisasi, tetapi disebutkan cbsd untuk mengatur wadah ini, yang disebut sel.

Kandang ini merupakan solusi yang sangat efektif untuk membangun infrastruktur untuk berbagai tujuan, yang pada akhirnya memerlukan isolasi menyeluruh terhadap layanan atau proses individual. Pada dasarnya, ini adalah tiruan dari sistem host, tetapi tidak memerlukan virtualisasi perangkat keras penuh. Dan berkat ini, sumber daya tidak dihabiskan untuk "OS tamu", tetapi hanya untuk pekerjaan yang sedang dilakukan. Ketika sel digunakan untuk kebutuhan internal, ini adalah solusi yang sangat nyaman untuk penggunaan sumber daya yang optimal - sekumpulan sel di satu server perangkat keras masing-masing dapat menggunakan seluruh sumber daya server secara individual jika diperlukan. Mengingat biasanya sublayanan yang berbeda memerlukan tambahan. sumber daya pada waktu yang berbeda, Anda dapat mengekstrak kinerja maksimum dari satu server jika Anda merencanakan dan menyeimbangkan sel antar server dengan benar. Jika perlu, sel juga dapat diberikan batasan terhadap sumber daya yang digunakan.

Bitcoin di dalam sangkar?

Bagaimana dengan virtualisasi penuh?

Sejauh yang saya tahu cbsd mendukung pekerjaan bhyve dan hypervisor XEN. Saya belum pernah menggunakan yang kedua, tapi yang pertama relatif baru hypervisor dari FreeBSD. Kita akan melihat contoh penggunaannya bhyve pada contoh di bawah ini.

Menginstal dan Mengonfigurasi Lingkungan Host

Kami menggunakan FS ZFS. Ini adalah alat yang sangat ampuh untuk mengelola ruang server. Berkat ZFS, Anda dapat langsung membuat array dengan berbagai konfigurasi dari disk, memperluas ruang secara "panas" secara dinamis, mengubah disk yang mati, mengelola snapshot, dan masih banyak lagi, yang dapat dijelaskan dalam serangkaian artikel. Mari kembali ke server kita dan disknya. Pada awal instalasi, kami meninggalkan ruang kosong pada disk untuk partisi terenkripsi. Mengapa demikian? Hal ini agar sistem bangun secara otomatis dan mendengarkan melalui SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

tambahkan partisi disk ke ruang yang tersisa

geli init /dev/ada0p4

masukkan kata sandi enkripsi kami

geli attach /dev/ada0p4

Kami memasukkan kata sandi lagi dan kami memiliki perangkat /dev/ada0p4.eli - ini adalah ruang terenkripsi kami. Kemudian kami ulangi hal yang sama untuk /dev/ada1 dan disk lainnya dalam array. Dan kami membuat yang baru kumpulan ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Ya, kami sudah menyiapkan perlengkapan tempur minimum. Array disk yang dicerminkan jika salah satu dari ketiganya gagal.

Membuat kumpulan data pada “kumpulan” baru

zfs create vms/jails

pkg install cbsd — kami meluncurkan tim dan menyiapkan manajemen untuk sel kami.

Setelah cbsd diinstal, perlu diinisialisasi:

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

Ya, kami menjawab banyak pertanyaan, sebagian besar dengan jawaban default.

*Jika Anda menggunakan enkripsi, yang penting daemonnya cbsdd tidak dimulai secara otomatis sampai Anda mendekripsi disk secara manual atau otomatis (dalam contoh kami ini dilakukan oleh zabbix)

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

Menyiapkan kebijakan firewall juga merupakan topik terpisah, jadi saya tidak akan membahas lebih dalam tentang menyiapkan kebijakan BLOKIR SEMUA dan menyiapkan daftar putih, Anda dapat melakukannya dengan membaca dokumentasi resmi atau salah satu dari sejumlah besar artikel yang tersedia di Google.

Baiklah... kita telah menginstal cbsd, saatnya membuat pekerja keras pertama kita - iblis Bitcoin yang dikurung!

cbsd jconstruct-tui

Bitcoin di dalam sangkar?

Di sini kita melihat dialog pembuatan sel. Setelah semua nilai ditetapkan, mari berkreasi!

Saat membuat sel pertama, Anda harus memilih apa yang akan digunakan sebagai dasar sel. Saya memilih distribusi dari repositori FreeBSD dengan perintah repo. Pilihan ini dibuat hanya saat membuat sel pertama dari versi tertentu (Anda dapat menghosting sel versi apa pun yang lebih lama dari versi host).

Setelah semuanya terinstal, kami meluncurkan sangkar!

# cbsd jstart bitcoind

Tapi kita perlu menginstal perangkat lunak di dalam kandang.

# 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 di dalam sel kami menginstal perangkat lunak dengan dependensinya (sistem host kami tetap bersih)

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

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

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

Ada Bitcoin di dalam sangkar, tetapi kami memerlukan anonimitas karena kami ingin terhubung ke beberapa sangkar melalui jaringan TOP. Secara umum, kami berencana menjalankan sebagian besar sel dengan perangkat lunak mencurigakan hanya melalui proxy. Terimakasih untuk pf Anda dapat menonaktifkan NAT untuk rentang alamat IP tertentu di jaringan lokal, dan mengizinkan NAT hanya untuk node TOR kami. Jadi, meskipun malware masuk ke dalam sel, kemungkinan besar malware tersebut tidak akan berkomunikasi dengan dunia luar, dan jika berhasil, malware tersebut tidak akan mengungkapkan IP server kami. Oleh karena itu, kami membuat sel lain untuk “meneruskan” layanan sebagai layanan “.onion” dan sebagai proxy untuk mengakses Internet ke sel individual.

# 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

Atur untuk mendengarkan di alamat lokal (tersedia untuk semua sel)

SOCKSPort 192.168.0.2:9050

Apa lagi yang kita butuhkan untuk kebahagiaan seutuhnya? Ya, kita membutuhkan layanan untuk web kita, mungkin lebih dari satu. Mari kita luncurkan nginx, yang akan bertindak sebagai proxy terbalik dan mengurus pembaruan sertifikat Let's Encrypt

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Jadi kami menempatkan 150 MB dependensi di dalam sangkar. Dan tuan rumah masih bersih.

Mari kita kembali ke pengaturan nginx nanti, kita perlu menambah dua sel lagi untuk gateway pembayaran kita di nodejs dan karat dan aplikasi web, yang karena alasan tertentu ada di Apache dan PHP, dan yang terakhir juga memerlukan database 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 paket 380 MB lainnya diisolasi

Selanjutnya, kita unduh aplikasi kita dengan git dan luncurkan.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

Paket 450 MB. didalam sangkar.

di sini kami memberikan akses pengembang melalui SSH langsung ke sel, mereka akan melakukan semuanya sendiri di sana:

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

Port 2267 — ubah port SSH sel ke port sembarang

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

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

Nah, layanan sudah berjalan, yang tersisa hanyalah menambahkan aturannya pf firewall

Mari kita lihat IP apa yang dimiliki sel kita dan seperti apa “area lokal” kita secara umum.

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

# 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

Nah, karena kita sudah sampai di sini, mari kita tambahkan juga aturan untuk reverse-proxy:

## 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 miliki adalah kami memiliki aplikasi web yang diekspos secara eksternal dan berkomunikasi secara lokal ke gateway pembayaran kami. Sekarang kita perlu menyiapkan lingkungan kerja untuk berinteraksi dengan jaringan Bitcoin itu sendiri - nodenya bitcoind ini hanyalah daemon yang menjaga salinan lokal dari blockchain tetap mutakhir. Daemon ini memiliki fungsionalitas RPC dan dompet, tetapi ada “pembungkus” yang lebih nyaman untuk pengembangan aplikasi. Untuk memulainya, kami memutuskan untuk memasang electrum adalah dompet CLI. Dompet ini kami akan menggunakannya sebagai “penyimpanan dingin” untuk bitcoin kami - secara umum, bitcoin yang perlu disimpan “di luar” sistem dapat diakses oleh pengguna dan umumnya jauh dari semua orang. Ini juga memiliki GUI, jadi kami akan menggunakan dompet yang sama di dompet kami
laptop. Untuk saat ini kami akan menggunakan Electrum dengan server publik, dan nanti kami akan meningkatkannya di sel lain ElektrumXagar tidak bergantung pada siapapun sama sekali.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

perangkat lunak 700 MB lainnya di kandang 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"
}

Sekarang kita telah membuat dompet.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Untuk kami di rantai Mulai sekarang, hanya sejumlah orang yang dapat terhubung ke dompet tersebut. Agar tidak membuka akses ke sel ini dari luar, koneksi melalui SSH akan dilakukan melalui TOP (versi VPN terdesentralisasi). Kami meluncurkan SSH di sel, tetapi jangan sentuh pf.conf kami di host.

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

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

Sekarang mari kita matikan ponsel dengan akses Internet dompet. Mari kita berikan alamat IP dari ruang subnet lain yang bukan NAT. Pertama mari kita berubah /etc/pf.conf pada tuan rumah

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" mari kita ubah menjadi JAIL_IP_POOL="192.168.0.0/25", sehingga semua alamat 192.168.0.126-255 tidak akan memiliki akses langsung ke Internet. Semacam jaringan “celah udara” perangkat lunak. Dan aturan NAT tetap seperti semula

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

Membebani aturan secara berlebihan

# pfctl -f /etc/pf.conf

Sekarang mari kita ambil ponsel kita

# cbsd jconfig jname=electrum

Bitcoin di dalam sangkar?

Bitcoin di 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, tapi sekarang sistem itu sendiri akan berhenti bekerja untuk kita. Namun, kita dapat menentukan proxy sistem. Tapi ada satu hal, di TOR ini adalah proxy SOCKS5, dan untuk kenyamanan kami juga menginginkan 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

Nah, sekarang ada dua server proxy di sistem kami, dan keduanya dikeluarkan melalui TOR: kaus kaki5://192.168.0.2:9050 dan http://192.168.0.6:8123

Sekarang kita dapat mengkonfigurasi lingkungan dompet kita

# 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 bekerja dari bawah proxy. Jika kita ingin menginstal paket, maka kita harus menambahkannya /usr/local/etc/pkg.conf dari bawah akar sangkar

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

Nah, sekarang saatnya menambahkan layanan tersembunyi TOR sebagai alamat layanan SSH kita di 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 koneksi kami. Mari kita periksa dari mesin lokal. Tapi pertama-tama kita perlu menambahkan kunci SSH kita:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Ya, 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

Mari terhubung (Agar ini berfungsi, Anda memerlukan daemon TOR lokal yang mendengarkan 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

ех!

Untuk bekerja dengan pembayaran instan dan mikro, kita juga memerlukan sebuah node Jaringan Petir, sebenarnya, ini akan menjadi alat kerja utama kami dengan Bitcoin. kamu*c-petiryang akan kita gunakan sebagai daemon plugin percikan, yang merupakan antarmuka HTTP (REST) ​​​​lengkap dan memungkinkan Anda bekerja dengan transaksi off-chain dan on-chain. c-lightning diperlukan untuk berfungsi bitcoind tapi ya.

*Ada implementasi berbeda dari protokol Lightning Network dalam berbagai bahasa. Dari yang kami uji, c-lightning (ditulis dalam C) tampaknya paling stabil dan hemat sumber daya

# 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

Sementara semua yang diperlukan telah dikompilasi dan diinstal, mari buat pengguna RPC untuknya 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

Peralihan saya yang kacau antar sel ternyata tidak begitu semrawut jika Anda memperhatikan utilitasnya tmux, yang memungkinkan Anda membuat beberapa sub-sesi terminal dalam satu sesi. Analog: screen

Bitcoin di dalam sangkar?

Jadi, kami tidak ingin mengungkapkan IP sebenarnya dari node kami, dan kami ingin melakukan semua transaksi keuangan melalui TOP. Oleh karena itu, .onion lainnya 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 membuat file konfigurasi untuk bitcoin-cli, sebuah utilitas yang berkomunikasi dengannya bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

memeriksa

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

[
  "test"
]

meluncurkan lightningd

lightning@lightning:~ % lightningd --daemon

Diri lightningd Anda dapat mengontrol utilitas lightning-cli, misalnya:

lightning-cli newaddr mendapatkan alamat untuk pembayaran masuk baru

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all kirim semua uang di dompet ke alamat (semua alamat on-chain)

Juga perintah untuk operasi off-chain lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay dan seterusnya.

Nah, untuk komunikasi dengan aplikasi tersebut kami memiliki REST Api

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

Menyimpulkan

# 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 di dalam sangkar?

Kami memiliki sekumpulan container, masing-masing dengan tingkat aksesnya sendiri baik dari dan ke jaringan lokal.

# 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 menghabiskan seluruh ruang sebesar 190 GB. Bagaimana jika kita memerlukan node lain untuk pengujian? Di sinilah ZFS berguna. Dengan bantuan cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Anda dapat membuat snapshot dan melampirkan sel baru ke snapshot ini. Sel baru akan memiliki ruangnya sendiri, tetapi hanya perbedaan antara keadaan saat ini dan keadaan asli yang akan diperhitungkan dalam sistem file (kami akan menghemat setidaknya 190 GB)

Setiap sel adalah kumpulan data ZFS tersendiri, dan ini sangat memudahkan. ZFS juga memungkinkan melakukan berbagai hal keren lainnya, seperti mengirim snapshot melalui SSH. Kami tidak akan menjelaskannya, sudah banyak.

Perlu juga dicatat perlunya pemantauan jarak jauh terhadap host, untuk tujuan ini kami memilikinya Zabbix.

B - keamanan

Mengenai keamanan, mari kita mulai dari prinsip-prinsip utama dalam konteks infrastruktur:

Конфиденциальность - Alat standar sistem mirip UNIX memastikan penerapan prinsip ini. Kami secara logis memisahkan akses ke setiap elemen sistem yang terpisah secara logis - sebuah sel. Akses diberikan melalui otentikasi pengguna standar menggunakan kunci pribadi pengguna. Semua komunikasi antara dan ke sel akhir terjadi dalam bentuk terenkripsi. Berkat enkripsi disk, kami tidak perlu mengkhawatirkan keamanan data saat mengganti disk atau bermigrasi ke server lain. Satu-satunya akses penting adalah akses ke sistem host, karena akses tersebut umumnya menyediakan akses ke data di dalam container.

Integritas “Penerapan prinsip ini terjadi pada beberapa tingkatan yang berbeda. Pertama, penting untuk dicatat bahwa dalam kasus perangkat keras server, memori ECC, ZFS sudah “out of the box” menjaga integritas data pada tingkat bit informasi. Snapshot instan memungkinkan Anda membuat cadangan kapan saja dengan cepat. Alat ekspor/impor sel yang mudah digunakan membuat replikasi sel menjadi sederhana.

Ketersediaan - Ini sudah opsional. Tergantung pada tingkat ketenaran Anda dan fakta bahwa Anda memiliki pembenci. Dalam contoh kami, kami memastikan bahwa dompet dapat diakses secara eksklusif dari jaringan TOP. Jika perlu, Anda dapat memblokir semua yang ada di firewall dan mengizinkan akses ke server secara eksklusif melalui terowongan (TOR atau VPN adalah masalah lain). Dengan demikian, server akan terputus dari dunia luar sebanyak mungkin, dan hanya kita sendiri yang dapat mempengaruhi ketersediaannya.

Ketidakmungkinan penolakan - Dan ini tergantung pada pengoperasian lebih lanjut dan kepatuhan terhadap kebijakan yang benar mengenai hak pengguna, akses, dll. Namun dengan pendekatan yang tepat, semua tindakan pengguna diaudit, dan berkat solusi kriptografi, dimungkinkan untuk mengidentifikasi dengan jelas siapa yang melakukan tindakan tertentu dan kapan.

Tentu saja, konfigurasi yang dijelaskan bukanlah contoh mutlak tentang bagaimana seharusnya hal tersebut selalu terjadi, melainkan merupakan salah satu contoh bagaimana hal tersebut dapat terjadi, dengan tetap mempertahankan kemampuan penskalaan dan penyesuaian yang sangat fleksibel.

Bagaimana dengan virtualisasi penuh?

Tentang virtualisasi penuh menggunakan cbsd Anda bisa baca di sini. Saya hanya akan menambahkannya untuk pekerjaan bhyve Anda perlu mengaktifkan beberapa opsi 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 memulai buruh pelabuhan, instal debian dan mulai!

Bitcoin di dalam sangkar?

Itu saja

Saya rasa hanya itu yang ingin saya bagikan. Jika Anda menyukai artikel ini, Anda dapat mengirimi saya beberapa bitcoin - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Jika Anda ingin mencoba sel beraksi dan mendapatkan bitcoin, Anda dapat mengunjungi situs saya proyek hewan peliharaan.

Sumber: www.habr.com