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 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
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
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):
Ada
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
Lalu kita konfigurasi aide
, memantau status file konfigurasi sistem. Anda dapat membaca lebih detail
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
sysrc auditd_enable=YES
# service auditd start
Cara menangani masalah ini dijelaskan dengan sempurna di
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
Kontainer? Docker lagi atau apa?
Dan di sini tidak. 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.
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 bhyve
pada contoh di bawah ini.
Menginstal dan Mengonfigurasi Lingkungan Host
Kami menggunakan FS
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
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
Baiklah... kita telah menginstal cbsd, saatnya membuat pekerja keras pertama kita - iblis Bitcoin yang dikurung!
cbsd jconstruct-tui
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.
laptop. Untuk saat ini kami akan menggunakan Electrum dengan server publik, dan nanti kami akan meningkatkannya di sel lain
# 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
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
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 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
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
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.
Perlu juga dicatat perlunya pemantauan jarak jauh terhadap host, untuk tujuan ini kami memilikinya
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 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!
Itu saja
Saya rasa hanya itu yang ingin saya bagikan. Jika Anda menyukai artikel ini, Anda dapat mengirimi saya beberapa bitcoin -
Sumber: www.habr.com