بیت کوین در قفس؟

این اتفاق افتاد که من به طور حرفه ای مدیر سیستم ها و شبکه های کامپیوتری هستم (به طور خلاصه: مدیر سیستم) و کمی بیش از 10 سال فرصت داشتم به پروفسور بگویم. فعالیت‌های طیف گسترده‌ای از سیستم‌ها، از جمله آن‌هایی که به اقدامات امنیتی [افراطی] نیاز دارند. اتفاقا چند وقت پیش هم برام جالب بود بیت کوینو نه تنها از آن استفاده کرد، بلکه چندین سرویس میکرو را نیز راه اندازی کرد تا نحوه کار مستقل با شبکه بیت کوین (با نام مستعار p2p) از دیدگاه یک توسعه دهنده (البته من یکی از آنها هستم) devبنابراین، من از آنجا عبور می کردم). اما من در مورد توسعه صحبت نمی کنم، من در مورد یک محیط امن و کارآمد برای برنامه ها صحبت می کنم.

فناوری مالی (fintech) کنار امنیت اطلاعات بروید (infosec) و اولی می تواند بدون دومی کار کند، اما نه برای مدت طولانی. به همین دلیل می‌خواهم تجربه‌ام و مجموعه ابزارهایی را که استفاده می‌کنم، که هر دو را شامل می‌شود، به اشتراک بگذارم fintechو infosec، و در عین حال، و همچنین می تواند برای اهداف گسترده تر یا کاملا متفاوت استفاده شود. در این مقاله نه چندان در مورد بیت کوین، بلکه در مورد مدل زیرساختی برای توسعه و بهره برداری از خدمات مالی (و نه تنها) - در یک کلام، خدماتی که "B" اهمیت دارد، به شما خواهم گفت. این هم در مورد صرافی بیت کوین و هم در مورد معمولی ترین باغ وحش شرکتی خدمات یک شرکت کوچک که به هیچ وجه با بیت کوین مرتبط نیست، صدق می کند.

توجه داشته باشم که من طرفدار اصول هستم "ساده باش احمقانه" и "کمتر بیشتر است"بنابراین، هم مقاله و هم آنچه در آن شرح داده شده است دارای خواصی خواهد بود که این اصول در مورد آن است.

سناریوی خیالی: بیایید با استفاده از مثال مبدل بیت کوین به همه چیز نگاه کنیم. ما تصمیم گرفتیم مبادله روبل، دلار، یورو را برای بیت کوین و برگشت راه اندازی کنیم و در حال حاضر یک راه حل کارآمد داریم، اما برای سایر پول های دیجیتال مانند qiwi و webmoney، یعنی. ما تمام مسائل قانونی را بسته ایم، یک برنامه آماده داریم که به عنوان درگاه پرداخت روبل، دلار و یورو و سایر سیستم های پرداخت عمل می کند. به حساب های بانکی ما متصل است و نوعی API برای برنامه های نهایی ما دارد. ما همچنین یک برنامه وب داریم که به عنوان یک مبدل برای کاربران عمل می کند، خوب، مانند یک حساب معمولی qiwi یا webmoney - ایجاد یک حساب، اضافه کردن یک کارت و غیره. با برنامه دروازه ما ارتباط برقرار می کند، البته از طریق REST API در منطقه محلی. و بنابراین تصمیم گرفتیم بیت کوین ها را به هم متصل کنیم و در عین حال زیرساخت ها را ارتقا دهیم، زیرا ... در ابتدا، همه چیز با عجله روی جعبه های مجازی در دفتر زیر میز قرار داده شد ... سایت شروع به استفاده کرد و ما شروع به نگرانی در مورد زمان کار و عملکرد کردیم.

بنابراین، بیایید با چیز اصلی شروع کنیم - انتخاب یک سرور. زیرا کسب و کار در مثال ما کوچک است و ما به میزبان (OVH) که انتخاب خواهیم کرد اعتماد داریم یک گزینه بودجه که در آن نصب سیستم از روی تصویر اصلی .iso غیرممکن است، اما مهم نیست، بخش امنیت فناوری اطلاعات قطعا تصویر نصب شده را تجزیه و تحلیل خواهد کرد. و وقتی بزرگ شدیم، کمد خودمان را تحت قفل و کلید با دسترسی فیزیکی محدود اجاره خواهیم کرد و شاید DC خودمان را بسازیم. در هر صورت، لازم به یادآوری است که هنگام اجاره سخت افزار و نصب تصاویر آماده، این احتمال وجود دارد که یک تروجان از هاست را روی سیستم خود آویزان کنید، که در بیشتر موارد قصد جاسوسی از شما ندارد. اما برای ارائه سرور ابزار مدیریت راحت تر.

نصب سرور

اینجا همه چیز ساده است. ما سخت افزاری را انتخاب می کنیم که متناسب با نیازهای ما باشد. سپس تصویر FreeBSD را انتخاب کنید. خوب، یا ما (در مورد یک هاست دیگر و سخت افزار خودمان) از طریق IPMI یا با مانیتور وصل می شویم و تصویر .iso FreeBSD را وارد دانلود می کنیم. برای تنظیم ارکستر استفاده می کنم غیر ممکن и mfsbsd. تنها چیزی که در مورد کیمسوفی ما انتخاب کردیم نصب سفارشی برای اینکه دو دیسک در آینه فقط پارتیشن‌های boot و home "باز" ​​باشند، بقیه فضای دیسک رمزگذاری می‌شود، اما بعداً در مورد آن بیشتر توضیح خواهیم داد.

بیت کوین در قفس؟

نصب سیستم به روش استاندارد انجام می شود، من در این مورد نمی پردازم، فقط توجه می کنم که قبل از شروع عملیات ارزش توجه دارد سخت شدن گزینه هایی که ارائه می دهد bsdinstaller در پایان نصب (اگر خودتان سیستم را نصب کنید):

بیت کوین در قفس؟

وجود دارد مواد خوب در مورد این موضوع، من به طور خلاصه آن را در اینجا تکرار می کنم.

همچنین امکان فعال کردن پارامترهای ذکر شده در بالا در یک سیستم از قبل نصب شده وجود دارد. برای این کار باید فایل بوت لودر را ویرایش کرده و پارامترهای هسته را فعال کنید. *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 از اولولول، برای او آرزوی سلامتی و برکت بیشتر برای این فایده فوق العاده دارم!

ظروف؟ دوباره داکر یا چی؟

اما نه. زندان های FreeBSD یک ابزار عالی برای کانتینری کردن است، اما ذکر شده است cbsd برای تنظیم این ظروف که سلول نامیده می شوند.

قفس یک راه حل بسیار موثر برای ساخت زیرساخت برای اهداف مختلف است، جایی که در نهایت به جداسازی کامل خدمات یا فرآیندهای فردی نیاز است. در اصل، این یک شبیه سازی از سیستم میزبان است، اما نیازی به مجازی سازی کامل سخت افزاری ندارد. و به لطف این، منابع برای "سیستم عامل مهمان" صرف نمی شود، بلکه فقط برای کارهای در حال انجام است. هنگامی که سلول ها برای نیازهای داخلی استفاده می شوند، این یک راه حل بسیار مناسب برای استفاده بهینه از منابع است - دسته ای از سلول ها در یک سرور سخت افزاری می توانند هر کدام به صورت جداگانه در صورت لزوم از کل منبع سرور استفاده کنند. با توجه به اینکه معمولاً زیرخدمات مختلف نیاز به اضافی دارند. منابع در زمان‌های مختلف، اگر به‌درستی سلول‌ها را بین سرورها برنامه‌ریزی و متعادل کنید، می‌توانید حداکثر عملکرد را از یک سرور استخراج کنید. در صورت لزوم، سلول‌ها همچنین می‌توانند محدودیت‌هایی در مورد منبع مورد استفاده در نظر بگیرند.

بیت کوین در قفس؟

مجازی سازی کامل چطور؟

تا آنجا که میدونم cbsd کار را پشتیبانی می کند bhyve و هایپروایزر XEN من تا حالا از دومی استفاده نکردم ولی اولی نسبتا جدیده هایپروایزر از FreeBSD. ما به یک مثال از استفاده نگاه خواهیم کرد bhyve در مثال زیر

نصب و پیکربندی محیط میزبان

ما از FS استفاده می کنیم ZFS. این یک ابزار بسیار قدرتمند برای مدیریت فضای سرور است. به لطف ZFS، می‌توانید مستقیماً آرایه‌هایی از پیکربندی‌های مختلف را از دیسک‌ها بسازید، فضا را به صورت پویا "گرم" گسترش دهید، دیسک‌های مرده را تغییر دهید، عکس‌های فوری را مدیریت کنید، و خیلی چیزهای دیگر، که می‌توان در مجموعه‌ای از مقالات توضیح داد. بیایید به سرور خود و دیسک های آن برگردیم. در ابتدای نصب، فضای خالی روی دیسک ها برای پارتیشن های رمزگذاری شده گذاشتیم. چرا اینطور است؟ این به این دلیل است که سیستم به طور خودکار بیدار می شود و از طریق 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 - خب، ما حداقل کیت رزمی را آماده داریم. آرایه آینه‌ای از دیسک‌ها در صورت خرابی یکی از سه دیسک.

ایجاد یک مجموعه داده در یک "pool" جدید

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

تنظیم خط‌مشی‌های فایروال نیز یک موضوع جداگانه است، بنابراین من به راه‌اندازی خط‌مشی BLOCK ALL و تنظیم لیست‌های سفید نمی‌پردازم، می‌توانید با خواندن این کار را انجام دهید. اسناد رسمی یا هر یک از تعداد زیادی از مقالات موجود در گوگل.

خوب... ما cbsd را نصب کرده ایم، وقت آن رسیده است که اولین اسب کاری خود را ایجاد کنیم - شیطان بیت کوین در قفس!

cbsd jconstruct-tui

بیت کوین در قفس؟

در اینجا گفتگوی ایجاد سلول را می بینیم. پس از تنظیم همه مقادیر، بیایید ایجاد کنیم!

هنگام ایجاد اولین سلول خود، باید انتخاب کنید که از چه چیزی به عنوان پایه سلول ها استفاده کنید. من یک توزیع را از مخزن 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 سرور ما را فاش نخواهد کرد. بنابراین، ما سلول دیگری را برای "Forward" خدمات به عنوان یک سرویس ".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 and 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 فایروال

بیایید ببینیم سلول های ما چه 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 و کیف پول است، اما "wrapers" راحت تری برای توسعه برنامه وجود دارد. برای شروع، تصمیم گرفتیم قرار دهیم electrum یک کیف پول CLI است. این کیف پول ما از آن به‌عنوان «ذخیره سرد» برای بیت‌کوین‌های خود استفاده خواهیم کرد - به طور کلی، آن بیت‌کوین‌هایی که باید «خارج» سیستم در دسترس کاربران و به طور کلی دور از همه ذخیره شوند. همچنین دارای یک رابط کاربری گرافیکی است، بنابراین ما قصد داریم از همان کیف پول روی خود استفاده کنیم
لپ تاپ ها در حال حاضر ما از 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 از فضای زیرشبکه دیگری که NAT نشده است به آن بدهیم. اول بیایید تغییر کنیم /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

بیت کوین در قفس؟

بیت کوین در قفس؟

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

خوب، از یک ماشین مشتری لینوکس

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

!

برای کار با پرداخت های آنی و خرد نیز به گره نیاز داریم شبکه رعد و برقدر واقع، این ابزار اصلی کار ما با بیت کوین خواهد بود. U*ج - رعد و برقکه ما قصد داریم از آن به عنوان یک شبح استفاده کنیم پلاگین اسپارکو، که یک رابط HTTP (REST) ​​تمام عیار است و به شما امکان می دهد هم با تراکنش های خارج از زنجیره و هم با تراکنش های زنجیره ای کار کنید. c-lightning برای عملکرد مورد نیاز است bitcoind اما بله.

*پیاده سازی های مختلفی از پروتکل شبکه لایتنینگ در زبان های مختلف وجود دارد. از بین مواردی که ما آزمایش کردیم، 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

بیت کوین در قفس؟

بنابراین، ما نمی خواهیم 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

بیت کوین در قفس؟

ما مجموعه‌ای از کانتینرها داریم که هر کدام سطح دسترسی خاص خود را هم از شبکه محلی و هم به شبکه محلی دارند.

# 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

همانطور که می بینید، بیت کوین تمام 190 گیگابایت فضا را اشغال می کند. اگر برای آزمایشات به گره دیگری نیاز داشته باشیم چه؟ اینجاست که ZFS به کار می آید. با کمک cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com شما می توانید یک عکس فوری ایجاد کنید و یک سلول جدید به این عکس فوری متصل کنید. سلول جدید فضای مخصوص به خود را خواهد داشت، اما فقط تفاوت بین وضعیت فعلی و اصلی در سیستم فایل در نظر گرفته می شود (حداقل 190 گیگابایت ذخیره می کنیم)

هر سلول مجموعه داده ZFS جداگانه خود است و این بسیار راحت است. ZFS نیز اجازه می دهد کارهای جالب دیگری مانند ارسال عکس های فوری از طریق SSH انجام دهید. ما آن را توصیف نمی کنیم، در حال حاضر چیزهای زیادی وجود دارد.

همچنین لازم به ذکر است نیاز به نظارت از راه دور میزبان، برای این اهداف ما است Zabbix.

ب - ایمنی

در مورد امنیت، اجازه دهید از اصول کلیدی در زمینه زیرساخت شروع کنیم:

محرمانه بودن - ابزارهای استاندارد سیستم های یونیکس مانند اجرای این اصل را تضمین می کنند. ما به طور منطقی دسترسی به هر عنصر منطقی جداگانه سیستم - یک سلول را جدا می کنیم. دسترسی از طریق احراز هویت استاندارد کاربر با استفاده از کلیدهای شخصی کاربران فراهم می شود. تمام ارتباطات بین و به سلول های انتهایی به شکل رمزگذاری شده انجام می شود. به لطف رمزگذاری دیسک، هنگام تعویض دیسک یا انتقال به سرور دیگر، لازم نیست نگران ایمنی داده ها باشیم. تنها دسترسی حیاتی دسترسی به سیستم میزبان است، زیرا چنین دسترسی به طور کلی دسترسی به داده های داخل کانتینرها را فراهم می کند.

صداقت «اجرای این اصل در چندین سطح مختلف اتفاق می افتد. اولاً، توجه به این نکته مهم است که در مورد سخت افزار سرور، حافظه ECC، ZFS قبلاً "خارج از جعبه" از یکپارچگی داده ها در سطح بیت های اطلاعات مراقبت می کند. عکس های فوری به شما این امکان را می دهد که در هر زمانی که بخواهید پشتیبان تهیه کنید. ابزارهای مناسب صادرات/واردات سلولی، تکثیر سلول را ساده می کند.

در دسترس بودن - این از قبل اختیاری است. بستگی به میزان شهرت شما و اینکه نفرت دارید. در مثال ما اطمینان حاصل کردیم که کیف پول منحصراً از شبکه TOP قابل دسترسی است. در صورت لزوم، می توانید همه چیز را در فایروال مسدود کنید و اجازه دسترسی انحصاری به سرور را از طریق تونل ها بدهید (TOR یا VPN موضوع دیگری است). بنابراین، سرور تا حد امکان از دنیای خارج قطع خواهد شد و تنها خود ما می توانیم در دسترس بودن آن تأثیر بگذاریم.

عدم امکان امتناع - و این بستگی به عملکرد بیشتر و رعایت سیاست های صحیح برای حقوق کاربر، دسترسی و غیره دارد. اما با رویکرد درست، تمام اقدامات کاربر ممیزی می‌شوند و به لطف راه‌حل‌های رمزنگاری می‌توان بدون ابهام تشخیص داد که چه کسی و چه زمانی اقدامات خاصی را انجام داده است.

البته، پیکربندی توصیف شده یک مثال مطلق از این نیست که همیشه باید باشد، بلکه نمونه ای از این است که چگونه می تواند باشد، در حالی که قابلیت های مقیاس بندی و سفارشی سازی بسیار انعطاف پذیر را حفظ می کند.

مجازی سازی کامل چطور؟

در مورد مجازی سازی کامل با استفاده از cbsd می توانید اینجا را بخوان. من فقط برای کار اضافه می کنم bhyve شما باید برخی از گزینه های هسته را فعال کنید.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

بنابراین اگر به طور ناگهانی نیاز به راه اندازی یک داکر دارید، سپس مقداری دبیان را نصب کنید و بروید!

بیت کوین در قفس؟

همین

حدس می‌زنم این تمام چیزی است که می‌خواستم به اشتراک بگذارم. اگر مقاله را دوست داشتید، می توانید چند بیت کوین برای من ارسال کنید - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. اگر می‌خواهید سلول‌ها را در عمل امتحان کنید و مقداری بیت‌کوین داشته باشید، می‌توانید به من مراجعه کنید پروژه حیوان خانگی.

منبع: www.habr.com