Bitcoin վանդակում.

Այնպես ստացվեց, որ մասնագիտությամբ համակարգչային համակարգերի և ցանցերի ադմինիստրատոր եմ (կարճ ասած՝ համակարգի ադմինիստրատոր), և 10 տարուց մի փոքր ավելի հնարավորություն ունեցա ասելու պրոֆ. մի շարք համակարգերի գործունեությունը, ներառյալ նրանք, որոնք պահանջում են անվտանգության [ծայրահեղ] միջոցներ: Պատահել է նաև, որ որոշ ժամանակ առաջ ինձ հետաքրքիր է համարել բիտկոին, և ոչ միայն օգտագործեց այն, այլև գործարկեց մի քանի միկրո ծառայություններ, որպեսզի սովորեն, թե ինչպես ինքնուրույն աշխատել Bitcoin ցանցի հետ (ի վերջո, p2p) ծրագրավորողի տեսանկյունից (ես իհարկե դրանցից մեկն եմ dev, ուրեմն, անցնում էի): Բայց ես չեմ խոսում զարգացման մասին, ես խոսում եմ հավելվածների համար անվտանգ և արդյունավետ միջավայրի մասին:

Ֆինանսական տեխնոլոգիա (ՖԻՆՏԵԽ) անցեք տեղեկատվական անվտանգության կողքին (ինֆոսեկ) իսկ առաջինը կարող է աշխատել առանց երկրորդի, բայց ոչ երկար։ Այդ իսկ պատճառով ես ուզում եմ կիսվել իմ փորձով և իմ օգտագործած գործիքների հավաքածուով, որը ներառում է երկուսն էլ ՖԻՆՏԵԽԻսկ ինֆոսեկ, և միևնույն ժամանակ, և կարող է օգտագործվել նաև ավելի լայն կամ բոլորովին այլ նպատակով: Այս հոդվածում ես ձեզ կպատմեմ ոչ այնքան բիթքոյնի, որքան ֆինանսական (և ոչ միայն) ծառայությունների մշակման և շահագործման ենթակառուցվածքի մոդելի մասին, մի խոսքով, այն ծառայությունները, որտեղ «B»-ն կարևոր է: Սա վերաբերում է ինչպես բիթքոյն բորսային, այնպես էլ փոքր ընկերության ծառայությունների առավել բնորոշ կորպորատիվ կենդանաբանական այգուն, որը որևէ կերպ կապված չէ բիթքոյնի հետ։

Նշեմ, որ ես սկզբունքների կողմնակից եմ «Պարզի՛ր հիմարությունը» и «Քիչն ավելին է», հետևաբար, և՛ հոդվածը, և՛ դրանում նկարագրվածը կունենան այն հատկությունները, որոնց մասին են այս սկզբունքները։

Երևակայական սցենար. Եկեք ամեն ինչ նայենք՝ օգտագործելով բիթքոյն փոխանակողի օրինակը: Մենք որոշեցինք սկսել ռուբլու, դոլարի, եվրոյի փոխանակումը բիթքոյններով և հետադարձ կապով, և մենք արդեն ունենք աշխատանքային լուծում, բայց այլ թվային փողերի համար, ինչպիսիք են qiwi-ն և webmoney-ը, այսինքն. Մենք փակել ենք բոլոր իրավական հարցերը, ունենք պատրաստի հավելված, որը ծառայում է որպես ռուբլու, դոլարի և եվրոյի և այլ վճարային համակարգերի վճարման դարպաս։ Այն միացված է մեր բանկային հաշիվներին և ունի որոշակի API մեր վերջնական հավելվածների համար: Մենք նաև ունենք վեբ հավելված, որը հանդես է գալիս որպես օգտատերերի փոխանակիչ, լավ, ինչպես սովորական qiwi կամ webmoney հաշիվ՝ ստեղծել հաշիվ, ավելացնել քարտ և այլն: Այն շփվում է մեր gateway հավելվածի հետ, թեև REST API-ի միջոցով տեղական տարածքում: Եվ այսպես, մենք որոշեցինք միացնել բիթքոյնները և միևնույն ժամանակ թարմացնել ենթակառուցվածքը, քանի որ... Սկզբում ամեն ինչ հապճեպ դրվում էր սեղանի տակ գտնվող գրասենյակի վիրտուալ տուփերի վրա... կայքը սկսեց օգտագործվել, և մենք սկսեցինք անհանգստանալ աշխատանքի ժամանակի և կատարողականի համար:

Այսպիսով, եկեք սկսենք գլխավորից՝ սերվերի ընտրությունից: Որովհետեւ մեր օրինակի բիզնեսը փոքր է, և մենք վստահում ենք մեր ընտրած հյուրընկալողին (OVH): բյուջեի տարբերակ որում անհնար է համակարգը տեղադրել սկզբնական .iso պատկերից, բայց դա կարևոր չէ, ՏՏ անվտանգության բաժինը անպայման կվերլուծի տեղադրված պատկերը։ Եվ երբ մենք մեծանանք, մենք կվարձակալենք մեր սեփական առանձնասենյակը կողպեքի և բանալիի տակ՝ սահմանափակ ֆիզիկական հասանելիությամբ, և գուցե մենք կառուցենք մեր սեփական DC-ն: Ամեն դեպքում, հարկ է հիշել, որ սարքավորումներ վարձելիս և պատրաստի պատկերներ տեղադրելիս հնարավորություն կա, որ ձեր համակարգում կախված լինի «տրոյան հոսթերից», որը շատ դեպքերում նախատեսված չէ ձեզ լրտեսելու համար։ այլ ավելի հարմար կառավարման գործիքների սերվեր առաջարկելու համար:

Սերվերի տեղադրում

Այստեղ ամեն ինչ պարզ է. Մենք ընտրում ենք այն սարքաշարը, որը համապատասխանում է մեր կարիքներին: Այնուհետև ընտրեք FreeBSD պատկերը: Դե, կամ մենք միանում ենք (այլ հոսթերի և մեր սեփական սարքաշարի դեպքում) IPMI-ի կամ մոնիտորի միջոցով և ներբեռնում ենք .iso FreeBSD պատկերը: Նվագախմբի համար ես օգտագործում եմ Հղիություն и mfsbsd. Միակ բանը, մեր դեպքում քիմսուֆիի դեպքում, մենք ընտրեցինք մաքսային տեղադրում Որպեսզի հայելու երկու սկավառակների վրա բացվեն միայն boot և /home միջնորմները, մնացած սկավառակի տարածքը կգաղտնագրվի, բայց դրա մասին ավելի ուշ:

Bitcoin վանդակում.

Համակարգի տեղադրումը տեղի է ունենում ստանդարտ ձևով, ես չեմ անդրադառնա դրա վրա, ես միայն նշեմ, որ նախքան շահագործումը սկսելը, արժե ուշադրություն դարձնել. hardening տարբերակներ, որոնք նա առաջարկում է bsdinstaller տեղադրման վերջում (եթե դուք ինքներդ եք տեղադրել համակարգը).

Bitcoin վանդակում.

Կա լավ նյութ այս թեմայի շուրջ հակիրճ կկրկնեմ այստեղ.

Հնարավոր է նաև միացնել վերը նշված պարամետրերը արդեն տեղադրված համակարգում: Դա անելու համար անհրաժեշտ է խմբագրել bootloader ֆայլը և միացնել միջուկի պարամետրերը: *ee-ն նման խմբագիր է 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

Դուք նաև պետք է համոզվեք, որ դուք ունեք տեղադրված համակարգի վերջին տարբերակը և կատարել բոլոր թարմացումներն ու բարելավումները. Մեր դեպքում, օրինակ, պահանջվում է թարմացում մինչև վերջին տարբերակի, քանի որ... նախնական տեղադրման պատկերները հետ են մնում վեց ամսից մինչև մեկ տարի: Դե, այնտեղ մենք փոխում ենք SSH պորտը լռելյայնից տարբերվող մի բանի, ավելացնում ենք բանալիների իսկությունը և անջատում ենք գաղտնաբառի նույնականացումը:

Հետո մենք ստեղծեցինք aide, համակարգի կազմաձևման ֆայլերի կարգավիճակի մոնիտորինգ: Մանրամասն կարող եք կարդալ այստեղ.

pkg install aide

և խմբագրել մեր քրոնտաբը

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

Միացնել համակարգի աուդիտ

sysrc auditd_enable=YES

# service auditd start

Ինչպես կառավարել այս հարցը, հիանալի նկարագրված է ղեկավարությունը.

Այժմ մենք վերաբեռնում ենք և անցնում սերվերի ծրագրակազմին: Յուրաքանչյուր սերվեր կոնտեյներների կամ ամբողջական վիրտուալ մեքենաների հիպերվիզոր է: Հետևաբար, կարևոր է, որ պրոցեսորն աջակցի VT-x և EPT, եթե մենք նախատեսում ենք օգտագործել ամբողջական վիրտուալացում:

Ես օգտագործում եմ կոնտեյներներ և վիրտուալ մեքենաներ կառավարելու համար cbsd - ից olevole, Մաղթում եմ նրան ավելի շատ առողջություն և օրհնություններ այս հրաշալի օգտակարության համար:

Տարաներ. Դոկեր նորից, թե՞ ինչ:

Բայց ոչ. FreeBSD բանտեր հիանալի գործիք է կոնտեյներացման համար, սակայն նշված cbsd կազմակերպել այս տարաները, որոնք կոչվում են բջիջներ:

Վանդակը չափազանց արդյունավետ լուծում է տարբեր նպատակների համար ենթակառուցվածքներ կառուցելու համար, որտեղ, ի վերջո, պահանջվում է առանձին ծառայությունների կամ գործընթացների ամբողջական մեկուսացում: Ըստ էության, դա հյուրընկալող համակարգի կլոն է, բայց այն չի պահանջում ամբողջական ապարատային վիրտուալացում: Եվ դրա շնորհիվ ռեսուրսները ծախսվում են ոչ թե «հյուր OS»-ի վրա, այլ միայն կատարվող աշխատանքի վրա։ Երբ բջիջներն օգտագործվում են ներքին կարիքների համար, սա շատ հարմար լուծում է ռեսուրսների օպտիմալ օգտագործման համար. անհրաժեշտության դեպքում մեկ ապարատային սերվերի վրա բջիջների մի խումբ կարող է յուրաքանչյուրն առանձին օգտագործել ամբողջ սերվերի ռեսուրսը: Հաշվի առնելով, որ սովորաբար տարբեր ենթածառայություններ լրացուցիչ կարիք ունեն: ռեսուրսներ տարբեր ժամանակներում, դուք կարող եք առավելագույն արդյունավետություն ստանալ մեկ սերվերից, եթե ճիշտ պլանավորեք և հավասարակշռեք բջիջները սերվերների միջև: Անհրաժեշտության դեպքում բջիջներին կարող են նաև սահմանափակումներ տալ օգտագործվող ռեսուրսի վրա:

Bitcoin վանդակում.

Ինչ վերաբերում է ամբողջական վիրտուալացմանը:

Քանի որ ես գիտեմ, cbsd աջակցում է աշխատանքին bhyve և XEN հիպերվիզորներ: Երկրորդը երբեք չեմ օգտագործել, բայց առաջինը համեմատաբար նոր է Hypervisor FreeBSD-ից. Մենք կանդրադառնանք օգտագործման օրինակին bhyve ստորև բերված օրինակում:

Հյուրընկալող միջավայրի տեղադրում և կարգավորում

Մենք օգտագործում ենք FS ZFS. Սա չափազանց հզոր գործիք է սերվերի տարածքը կառավարելու համար: ZFS-ի շնորհիվ դուք կարող եք ուղղակիորեն սկավառակներից ստեղծել տարբեր կոնֆիգուրացիաների զանգվածներ, դինամիկորեն «տաք» ընդլայնել տարածությունը, փոխել մեռած սկավառակները, կառավարել snapshot-ները և շատ ու շատ ավելին, որոնք կարելի է նկարագրել մի ամբողջ շարք հոդվածներում: Եկեք վերադառնանք մեր սերվերին և նրա սկավառակներին: Տեղադրման սկզբում մենք սկավառակների վրա ազատ տարածություն ենք թողել կոդավորված միջնորմների համար: Ինչո՞ւ է այդպես։ Դա այնպես է, որ համակարգը ավտոմատ կերպով արթնանա և լսի SSH-ի միջոցով:

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

ավելացրեք սկավառակի միջնորմ մնացած տարածության մեջ

geli init /dev/ada0p4

մուտքագրեք մեր ծածկագրման գաղտնաբառը

geli attach /dev/ada0p4

Մենք նորից մուտքագրում ենք գաղտնաբառը և ունենք սարք /dev/ada0p4.eli. սա մեր կոդավորված տարածքն է: Հետո նույնը կրկնում ենք /dev/ada1-ի և զանգվածի մնացած սկավառակների համար։ Եվ մենք ստեղծում ենք նորը ZFS լողավազան.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli -Դե, մենք նվազագույն մարտական ​​հանդերձանքը պատրաստ ունենք։ Սկավառակների հայելային զանգված երեքից մեկի ձախողման դեպքում:

Նոր «լողավազանի» վրա տվյալների բազայի ստեղծում

zfs create vms/jails

pkg install cbsd — մենք գործարկեցինք թիմ և ստեղծեցինք կառավարում մեր բջիջների համար:

Հետո cbsd տեղադրված է, այն պետք է նախաստորագրվի.

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

Դե, մենք պատասխանում ենք մի շարք հարցերի, հիմնականում՝ լռելյայն պատասխաններով:

*Եթե դուք օգտագործում եք գաղտնագրում, ապա կարևոր է, որ դաեմոնը cbsdd չի սկսվել ինքնաբերաբար, քանի դեռ չեք վերծանել սկավառակները ձեռքով կամ ավտոմատ կերպով (մեր օրինակում դա արվում է zabbix-ի կողմից)

**Ես նույնպես չեմ օգտագործում NAT-ից cbsd, և ես ինքս այն կարգավորում եմ 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

Firewall-ի կանոնների կարգավորումը նույնպես առանձին թեմա է, այնպես որ ես չեմ խորանա BLOCK ALL քաղաքականության ստեղծման և սպիտակ ցուցակների տեղադրման մեջ, դուք կարող եք դա անել կարդալով: պաշտոնական փաստաթղթեր կամ Google-ում հասանելի հսկայական քանակությամբ հոդվածներից որևէ մեկը:

Դե... մենք տեղադրել ենք cbsd, ժամանակն է ստեղծելու մեր առաջին աշխատանքային ձիը՝ վանդակի մեջ գտնվող բիթքոյն դևը:

cbsd jconstruct-tui

Bitcoin վանդակում.

Այստեղ մենք տեսնում ենք բջիջների ստեղծման երկխոսությունը: Բոլոր արժեքները սահմանելուց հետո եկեք ստեղծենք:

Ձեր առաջին բջիջը ստեղծելիս դուք պետք է ընտրեք, թե ինչ օգտագործել որպես հիմք բջիջների համար: Հրամանով ընտրում եմ բաշխում FreeBSD պահոցից repo. Այս ընտրությունը կատարվում է միայն կոնկրետ տարբերակի առաջին բջիջը ստեղծելիս (կարող եք հյուրընկալել ցանկացած տարբերակի բջիջ, որն ավելի հին է, քան հոսթ տարբերակը):

Ամեն ինչ տեղադրվելուց հետո մենք գործարկում ենք վանդակը:

# cbsd jstart bitcoind

Բայց մենք պետք է ծրագրակազմ տեղադրենք վանդակում:

# jls

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

jexec bitcoind մտնել բջջային վահանակ

և արդեն բջջի ներսում մենք տեղադրում ենք ծրագրակազմն իր կախվածությամբ (մեր հյուրընկալող համակարգը մնում է մաքուր)

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

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

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

Վանդակում կա բիթքոյն, բայց մեզ անհրաժեշտ է անանունություն, քանի որ մենք ցանկանում ենք միանալ որոշ վանդակների TOP ցանցի միջոցով: Ընդհանուր առմամբ, մենք նախատեսում ենք կասկածելի ծրագրերով բջիջների մեծ մասը գործարկել միայն վստահված անձի միջոցով: Շնորհիվ pf Դուք կարող եք անջատել NAT-ը տեղական ցանցի IP հասցեների որոշակի տիրույթի համար և թույլատրել NAT-ը միայն մեր TOR հանգույցի համար: Այսպիսով, եթե նույնիսկ չարամիտ ծրագրերը մտնեն բջիջ, այն, ամենայն հավանականությամբ, չի շփվի արտաքին աշխարհի հետ, իսկ եթե շփվի, չի բացահայտի մեր սերվերի IP-ն։ Հետևաբար, մենք ստեղծում ենք մեկ այլ բջիջ՝ ծառայությունները «փոխանցելու» համար որպես «.onion» ծառայություն և որպես առանձին բջիջներ ինտերնետ մուտք գործելու վստահված անձ:

# 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

Սահմանել լսել տեղական հասցեով (հասանելի է բոլոր բջիջների համար)

SOCKSPort 192.168.0.2:9050

Էլ ի՞նչ է մեզ անհրաժեշտ լիակատար երջանկության համար: Այո, մեզ պետք է ծառայություն մեր վեբի համար, գուցե մեկից ավելի: Եկեք գործարկենք nginx-ը, որը հանդես կգա որպես հակադարձ պրոքսի և հոգ կտանի Let's Encrypt վկայականների թարմացման մասին:

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Եվ այսպես, մենք վանդակում տեղադրեցինք 150 ՄԲ կախվածություն: Իսկ տանտերը դեռ մաքուր է։

Եկեք ավելի ուշ վերադառնանք nginx-ի տեղադրմանը, մենք պետք է բարձրացնենք ևս երկու բջիջ մեր վճարային դարպասի համար nodejs-ի և rust-ի և վեբ հավելվածի համար, որը ինչ-ինչ պատճառներով գտնվում է Apache-ում և PHP-ում, և վերջինս պահանջում է նաև 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

...և ևս 380 ՄԲ մեկուսացված փաթեթներ

Հաջորդը, մենք ներբեռնում ենք մեր հավելվածը git-ով և գործարկում այն:

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 ՄԲ փաթեթներ: վանդակի մեջ։

այստեղ մենք SSH-ի միջոցով ծրագրավորողին մուտք ենք տալիս անմիջապես բջիջ, նրանք այնտեղ ամեն ինչ կանեն իրենք.

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

Port 2267 — փոխել բջիջի SSH պորտը ցանկացած կամայականի

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

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

Դե, ծառայությունն աշխատում է, մնում է կանոնն ավելացնել pf firewall

Եկեք տեսնենք, թե ինչ IP ունեն մեր բջիջները և ինչպիսին է ընդհանուր առմամբ մեր «տեղական տարածքը»:

# 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

և ավելացրեք կանոն

# 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

Դե, քանի որ մենք այստեղ ենք, եկեք նաև կանոն ավելացնենք հակադարձ վստահված անձի համար.

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

Դե, հիմա մի փոքր բիթքոյնների մասին

Այն, ինչ մենք ունենք, այն է, որ մենք ունենք վեբ հավելված, որը ցուցադրվում է արտաքինից, և այն տեղականորեն խոսում է մեր վճարային դարպասի հետ: Այժմ մենք պետք է աշխատանքային միջավայր պատրաստենք բիթքոյնի ցանցի հետ շփվելու համար՝ հանգույցը bitcoind դա պարզապես դևոն է, որը թարմացնում է բլոկչեյնի տեղական պատճենը: Այս դեյմոնն ունի RPC և դրամապանակի ֆունկցիոնալություն, սակայն հավելվածների մշակման համար կան ավելի հարմար «փաթաթիչներ»: Սկզբից մենք որոշեցինք դնել electrum CLI դրամապանակ է: Այս դրամապանակը մենք այն կօգտագործենք որպես «սառը պահեստ» մեր բիթքոյնների համար. ընդհանուր առմամբ, այն բիթքոյնները, որոնք պետք է պահվեն օգտատերերի համար հասանելի համակարգի «դուրս» և ընդհանրապես բոլորից հեռու: Այն ունի նաև GUI, ուստի մենք պատրաստվում ենք օգտագործել նույն դրամապանակը մեր վրա
դյուրակիր համակարգիչներ. Առայժմ մենք կօգտագործենք Electrum-ը հանրային սերվերների հետ, իսկ ավելի ուշ այն կբարձրացնենք մեկ այլ բջիջում ElectrumXորպեսզի ընդհանրապես որևէ մեկից կախված չլինեմ:

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

ևս 700 ՄԲ ծրագրակազմ մեր վանդակում

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

Այժմ մենք ստեղծել ենք դրամապանակ:

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Մեր ցանցի վրա Միայն սահմանափակ թվով մարդիկ կկարողանան միանալ դրամապանակին այսուհետ։ Որպեսզի մուտքը դեպի այս բջիջը դրսից չբացվի, SSH-ի միջոցով կապերը տեղի կունենան TOP-ի միջոցով (VPN-ի ապակենտրոնացված տարբերակ): Մենք գործարկում ենք SSH-ը բջիջում, բայց մի հպեք մեր pf.conf-ին հոսթին:

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

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

Այժմ եկեք անջատենք բջիջը դրամապանակի ինտերնետ հասանելիությամբ: Եկեք դրան IP հասցե տանք մեկ այլ ենթացանցային տարածությունից, որը NATed չէ: Նախ փոխենք /etc/pf.conf հյուրընկալողի վրա

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" եկեք փոխենք այն JAIL_IP_POOL="192.168.0.0/25", այսպիսով բոլոր 192.168.0.126-255 հասցեները ուղղակի մուտք չեն ունենա ինտերնետ: Մի տեսակ ծրագրային «օդային բաց» ցանց: Իսկ NAT կանոնը մնում է այնպես, ինչպես եղել է

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

Կանոնների գերբեռնում

# pfctl -f /etc/pf.conf

Հիմա եկեք վերցնենք մեր բջիջը

# cbsd jconfig jname=electrum

Bitcoin վանդակում.

Bitcoin վանդակում.

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

Հմմ, բայց հիմա ինքնին համակարգը կդադարի աշխատել մեզ մոտ։ Այնուամենայնիվ, մենք կարող ենք նշել համակարգի վստահված անձ: Բայց կա մի բան, TOR-ի վրա դա SOCKS5 պրոքսի է, և հարմարության համար մենք կցանկանայինք նաև 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

Դե, հիմա մեր համակարգում կա երկու պրոքսի սերվեր, և երկուսն էլ թողարկվում են TOR-ի միջոցով՝ socks5://192.168.0.2:9050 և http://192.168.0.6:8123

Այժմ մենք կարող ենք կարգավորել մեր դրամապանակի միջավայրը

# 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

Դե, հիմա կեղևը կաշխատի վստահված անձի տակից: Եթե ​​ցանկանում ենք տեղադրել փաթեթներ, ապա պետք է ավելացնենք /usr/local/etc/pkg.conf վանդակի արմատի տակից

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

Դե, հիմա ժամանակն է ավելացնել TOR թաքնված ծառայությունը որպես դրամապանակի վանդակում մեր SSH ծառայության հասցե:

# 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

Սա մեր կապի հասցեն է: Եկեք ստուգենք տեղական մեքենայից: Բայց նախ մենք պետք է ավելացնենք մեր SSH բանալին.

wallet@electrum:/ % mkdir ~/.ssh

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

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

Դե, 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

Եկեք միացնենք (Որպեսզի դա աշխատի, ձեզ հարկավոր է տեղական TOR դեյմոն, որը լսում է 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

Հաջողություն:

Ակնթարթային և միկրովճարումների հետ աշխատելու համար մեզ անհրաժեշտ է նաև հանգույց Lightning ցանցը, փաստորեն, սա կլինի մեր հիմնական աշխատանքային գործիքը Bitcoin-ի հետ: U*գ-կայծակորը մենք պատրաստվում ենք օգտագործել որպես դեյմոն Sparko plugin, որը լիարժեք HTTP (REST) ​​ինտերֆեյս է և թույլ է տալիս աշխատել ինչպես շղթայից դուրս, այնպես էլ ցանցային գործարքների հետ: c-lightning գործելու համար անհրաժեշտ է bitcoind բայց այո.

*Կան Lightning Network արձանագրության տարբեր իրականացումներ տարբեր լեզուներով: Նրանցից, որոնք մենք փորձարկեցինք, c-lightning-ը (գրված է C-ով) թվում էր ամենակայունը և ռեսուրսների համար արդյունավետ:

# 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

Մինչև անհրաժեշտ ամեն ինչ կազմվում և տեղադրվում է, եկեք ստեղծենք RPC օգտվող 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

Բջիջների միջև իմ քաոսային անցումը պարզվում է, որ այնքան էլ քաոսային չէ, եթե նշեք օգտակարությունը tmux, որը թույլ է տալիս ստեղծել մի քանի տերմինալ ենթասեսիաներ մեկ սեանսի ընթացքում: Անալոգային: screen

Bitcoin վանդակում.

Այսպիսով, մենք չենք ցանկանում բացահայտել մեր հանգույցի իրական IP-ն, և մենք ցանկանում ենք բոլոր ֆինանսական գործարքներն իրականացնել TOP-ի միջոցով: Ուստի ևս մեկ սոխ պետք չէ։

# 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

Այժմ եկեք ստեղծենք 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 ~

դուք նաև պետք է կազմաձևման ֆայլ ստեղծեք bitcoin-cli-ի համար, մի կոմունալ, որը հաղորդակցվում է bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

ստուգում

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

[
  "test"
]

մեկնարկը lightningd

lightning@lightning:~ % lightningd --daemon

Իրեն lightningd դուք կարող եք վերահսկել կոմունալը lightning-cli, օրինակ `

lightning-cli newaddr ստացեք հասցեն նոր մուտքային վճարման համար

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all դրամապանակի ամբողջ գումարը ուղարկեք հասցեին (բոլոր շղթայական հասցեները)

Նաև հրամաններ շղթայից դուրս գործողությունների համար lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay և այլն:

Դե, հավելվածի հետ հաղորդակցվելու համար մենք ունենք REST Api

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

Ամփոփել

# 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 վանդակում.

Մենք ունենք կոնտեյներների հավաքածու, որոնցից յուրաքանչյուրն ունի իր հասանելիության մակարդակը ինչպես տեղական ցանցից, այնպես էլ դեպի տեղական ցանց:

# zfs list

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

Ինչպես տեսնում եք, bitcoind-ը զբաղեցնում է բոլոր 190 ԳԲ տարածքը: Իսկ եթե մեզ անհրաժեշտ լինի մեկ այլ հանգույց թեստերի համար: Այստեղ է, որ ZFS-ը հարմար է: Օգնությամբ cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com դուք կարող եք ստեղծել լուսանկար և կցել նոր բջիջ այս նկարին: Նոր բջիջը կունենա իր սեփական տարածքը, բայց ֆայլային համակարգում հաշվի կառնվի միայն ներկայիս վիճակի և բնօրինակի տարբերությունը (մենք կխնայենք առնվազն 190 ԳԲ)

Յուրաքանչյուր բջիջ իր առանձին ZFS տվյալների բազան է, և սա չափազանց հարմար է: ZFS-ը նաև թույլ է տալիս անել տարբեր այլ հետաքրքիր բաներ, ինչպես օրինակ ուղարկել Snapshots միջոցով SSH. Մենք դա չենք նկարագրի, արդեն շատ բան կա:

Հարկ է նաև նշել հյուրընկալողի հեռակառավարման մոնիտորինգի անհրաժեշտությունը, այս նպատակների համար մենք ունենք Zabbix- ը.

B - անվտանգություն

Անվտանգության հետ կապված, եկեք սկսենք ենթակառուցվածքի համատեքստում հիմնական սկզբունքներից.

Գաղտնիություն — UNIX-ի նման համակարգերի ստանդարտ գործիքներն ապահովում են այս սկզբունքը: Մենք տրամաբանորեն առանձնացնում ենք մուտքը համակարգի յուրաքանչյուր տրամաբանորեն առանձին տարր՝ բջիջ: Մուտքն ապահովվում է օգտատերերի ստանդարտ նույնականացման միջոցով՝ օգտագործողների անձնական բանալիների միջոցով: Ամբողջ հաղորդակցությունը բջիջների միջև և մինչև վերջ տեղի է ունենում կոդավորված ձևով: Սկավառակի կոդավորման շնորհիվ մենք չպետք է անհանգստանանք տվյալների անվտանգության մասին՝ սկավառակը փոխարինելիս կամ այլ սերվեր տեղափոխելիս: Միակ կարևոր մուտքը հյուրընկալող համակարգ մուտքն է, քանի որ նման մուտքն ընդհանուր առմամբ ապահովում է տվյալների մուտք դեպի բեռնարկղեր:

Ամբողջությունը «Այս սկզբունքի իրականացումը տեղի է ունենում մի քանի տարբեր մակարդակներում։ Նախ, կարևոր է նշել, որ սերվերի ապարատային, ECC հիշողության դեպքում ZFS-ն արդեն «դուրս է» հոգում տվյալների ամբողջականության մասին տեղեկատվական բիթերի մակարդակում: Ակնթարթային լուսանկարները թույլ են տալիս ցանկացած պահի կրկնօրինակումներ կատարել: Բջիջների արտահանման/ներմուծման հարմար գործիքները հեշտացնում են բջիջների վերարտադրությունը:

Հասանելիություն -Սա արդեն ընտրովի է։ Կախված է ձեր փառքի աստիճանից և այն փաստից, որ դուք ատողներ ունեք: Մեր օրինակում մենք երաշխավորեցինք, որ դրամապանակը հասանելի է բացառապես TOP ցանցից: Անհրաժեշտության դեպքում դուք կարող եք արգելափակել ամեն ինչ firewall-ում և թույլ տալ մուտք գործել սերվեր բացառապես թունելների միջոցով (TOR կամ VPN-ն այլ խնդիր է): Այսպիսով, սերվերը հնարավորինս կտրված կլինի արտաքին աշխարհից, և միայն մենք ինքներս կկարողանանք ազդել դրա հասանելիության վրա։

Մերժման անհնարինությունը - Եվ դա կախված է հետագա շահագործումից և օգտատերերի իրավունքների, մուտքի և այլնի ճիշտ քաղաքականությանը համապատասխանելուց: Բայց ճիշտ մոտեցման դեպքում օգտատերերի բոլոր գործողությունները ենթարկվում են աուդիտի, և գաղտնագրային լուծումների շնորհիվ հնարավոր է միանշանակ բացահայտել, թե ով և երբ է կատարել որոշակի գործողություններ:

Իհարկե, նկարագրված կոնֆիգուրացիան բացարձակ օրինակ չէ այն բանի, թե ինչպես միշտ պետք է լինի, այն ավելի շուտ օրինակ է այն բանի, թե ինչպես կարող է լինել՝ պահպանելով չափման և հարմարեցման շատ ճկուն հնարավորությունները:

Ինչ վերաբերում է ամբողջական վիրտուալացմանը:

Ամբողջական վիրտուալացման մասին, օգտագործելով cbsd, կարող եք կարդալ այստեղ. Դա միայն աշխատանքի համար կավելացնեմ bhyve Դուք պետք է միացնեք միջուկի որոշ տարբերակներ:

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Այսպիսով, եթե հանկարծ ձեզ անհրաժեշտ է գործարկել դոկեր, ապա տեղադրեք որոշ debian և գնացեք:

Bitcoin վանդակում.

Այսքանը

Կարծում եմ, դա այն ամենն է, ինչ ես ուզում էի կիսվել: Եթե ​​ձեզ դուր եկավ հոդվածը, ապա կարող եք ինձ ուղարկել որոշ բիթքոյններ. bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Եթե ​​ցանկանում եք փորձել բջիջները գործողության մեջ և ունենալ որոշ բիթքոյններ, կարող եք գնալ իմ pet-նախագիծ.

Source: www.habr.com