بيتكوين في قفص؟

لقد حدث أنني مدير أنظمة وشبكات الكمبيوتر حسب المهنة (باختصار: مسؤول النظام) ، وأتيحت لي الفرصة لإخبار الأستاذ. أنشطة مجموعة متنوعة من الأنظمة ، بما في ذلك تلك التي تتطلب إجراءات أمنية مشددة [إضافية]. لقد حدث أيضًا أنه منذ بعض الوقت وجدته مثيرًا للاهتمام بيتكوين، ولم تستخدمه فحسب ، بل أطلقت أيضًا العديد من الخدمات الصغيرة من أجل تعلم كيفية العمل بشكل مستقل مع شبكة البيتكوين (المعروفة أيضًا باسم p2p بعد كل شيء) من وجهة نظر مطور (بالطبع ، أنا dev، لذلك ، مر). لكنني لا أتحدث عن التنمية ، أنا أتحدث عن بيئة آمنة وفعالة للتطبيقات.

التكنولوجيا المالية (FINTECH) انتقل إلى جانب أمن المعلومات (أمن تكنولوجيا المعلومات) والأول بدون الثانية يمكن أن يعمل ، ولكن ليس لفترة طويلة. لهذا السبب أرغب في مشاركة تجربتي ومجموعة الأدوات التي أستخدمها والتي تتضمن مثل FINTECHو أمن تكنولوجيا المعلومات، وفي نفس الوقت ، ويمكن استخدامها أيضًا في غرض أوسع أو مختلف تمامًا. في هذه المقالة ، سأتحدث ليس كثيرًا عن البيتكوين ، ولكن عن نموذج البنية التحتية لتطوير وتشغيل الخدمات المالية (وليس فقط) - باختصار ، تلك الخدمات التي تهم "ب". ينطبق هذا على كل من بورصة البيتكوين وعلى حديقة حيوانات الشركة الأكثر شيوعًا لخدمات شركة صغيرة لا علاقة لها ببيتكوين.

أريد أن أشير إلى أنني من مؤيدي المبادئ "أبقها بسيطة غبية" и "الاقل هو الاكثر"لذلك ، فإن كل من المقالة وما تم وصفه فيه سيكون لهما الخصائص التي تدور حولها هذه المبادئ.

سيناريو خيالي: لنلقِ نظرة على كل شيء باستخدام مثال مبادل البيتكوين. قررنا إطلاق عملية تبادل الروبل والدولار واليورو مقابل عملات البيتكوين والعكس صحيح ، ولدينا بالفعل حل عملي ، ولكن بالنسبة للأموال الرقمية الأخرى مثل qiwi و webmoney ، أي لقد أغلقنا جميع القضايا القانونية ، ولدينا تطبيق جاهز يعمل كبوابة دفع للروبل والدولار واليورو وأنظمة الدفع الأخرى. إنه مرتبط بحساباتنا المصرفية ولديه نوع من واجهة برمجة التطبيقات لتطبيقاتنا النهائية. لدينا أيضًا تطبيق ويب يعمل كمبادل للمستخدمين ، حسنًا ، مثل خزانة qiwi أو webmoney النموذجية - قم بإنشاء حساب وإضافة بطاقة وما إلى ذلك. إنها تتواصل مع تطبيق البوابة الخاص بنا ، وإن كان ذلك عبر واجهة برمجة تطبيقات REST في المنطقة المحلية. ولذا قررنا ربط عملات البيتكوين وفي نفس الوقت ترقية البنية التحتية لأن. في البداية ، تم رفع كل شيء بسرعة على الصناديق الافتراضية في المكتب تحت الطاولة ... بدأ استخدام الموقع ، وبدأنا نشعر بالقلق بشأن الجهوزية والأداء.

لذلك ، لنبدأ بالخادم الرئيسي - اختيار الخادم. لأن العمل في مثالنا صغير ونحن على ثقة من مزود الاستضافة (OVH) الذي سنختاره خيار الميزانية حيث لا يمكنك تثبيت النظام من صورة .iso الأصلية ، ولكن لا يهم ، سيقوم قسم أمن تكنولوجيا المعلومات بالتأكيد بتحليل الصورة المثبتة. وعندما نكبر ، نؤجر خزانة ملابسنا بشكل عام بقفل ومفتاح مع وصول مادي محدود ، وربما سنبني DC الخاص بنا. على أي حال ، تجدر الإشارة إلى أنه عند استئجار الأجهزة وتثبيت الصور الجاهزة ، هناك احتمال أن يكون لديك "حصان طروادة من المضيف" معلق في نظامك ، وهو في معظم الحالات لا يقصد التجسس عليك ، ولكن لتقديم خادم أدوات إدارة أكثر ملاءمة.

تثبيت الخادم

كل شيء بسيط هنا. نختار المكواة التي تناسب احتياجاتنا. ثم حدد صورة FreeBSD. حسنًا ، أو نقوم بالاتصال (في حالة مضيف آخر وأجهزتنا الخاصة) عبر IPMI أو باستخدام شاشة وإدخال صورة .iso FreeBSD في التمهيد. بالنسبة للإعداد الأوركسترالي الذي أستخدمه Ansible и com.mfsbsd. الشيء الوحيد الذي اخترناه في حالتنا مع kimsufi تثبيت مخصص من أجل أن يكون قرصان في المرآة "يفتحان" فقط قسم التمهيد و / الرئيسي ، سيتم تشفير باقي مساحة القرص ، ولكن سيتم تشفير المزيد عن ذلك لاحقًا.

بيتكوين في قفص؟

تم تثبيت النظام بطريقة قياسية ، ولن أتطرق إلى ذلك ، وسألاحظ فقط أنه قبل بدء التشغيل ، يجب الانتباه إلى تصلب الخيارات التي تقدم bsdinstaller في نهاية التثبيت (إذا قمت بتثبيت النظام بنفسك):

بيتكوين في قفص؟

هنالك مادة جيدة حول هذا الموضوع سأكرره هنا باختصار.

من الممكن أيضًا تمكين المعلمات أعلاه على نظام مثبت بالفعل. للقيام بذلك ، تحتاج إلى تحرير ملف أداة تحميل التشغيل وتمكين خيارات kernel. *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 الخاص بنا

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

كيفية إدارة هذا العمل موصوفة تمامًا في يرشد.

الآن نعيد التشغيل وننتقل إلى البرنامج على الخادم. كل خادم هو برنامج Hypervisor للحاويات أو الأجهزة الافتراضية الكاملة. لذلك ، من المهم أن يدعم المعالج VT-x و EPT إذا كنا نخطط لاستخدام المحاكاة الافتراضية الكاملة.

كإدارة للحاويات والآلات الافتراضية ، أستخدمها com.cbsd من أوليفولأتمنى له المزيد من الصحة والبركات لهذه المنفعة الرائعة!

حاويات؟ عامل ميناء مرة أخرى أم ماذا؟

و لا سجون FreeBSD هي أداة رائعة للتعبئة بالحاويات ، ولكن المذكورة cbsd لتنظيم هذه الحاويات ، واسمها الخلايا.

يعتبر القفص حلاً فعالاً للغاية لبناء البنية التحتية لمجموعة متنوعة من الأغراض ، ونتيجة لذلك ، يلزم عزل كامل للخدمات أو العمليات الفردية. إنها في الأساس نسخة من النظام المضيف ، ولكنها لا تتطلب أجهزة افتراضية كاملة. وبفضل هذا ، لا يتم إنفاق الموارد على "نظام التشغيل الضيف" ، ولكن فقط على العمل المنجز. عند استخدام الخلايا للاحتياجات الداخلية ، يعد هذا حلاً مناسبًا للغاية للاستخدام الأمثل للمورد - يمكن لمجموعة من الخلايا في خادم حديد واحد استخدام مورد الخادم بالكامل بشكل فردي إذا لزم الأمر. مع الأخذ في الاعتبار أن الخدمات الفرعية المختلفة عادة ما تحتاج إلى خدمات إضافية. الموارد في أوقات مختلفة ، يمكنك استخراج الحد الأقصى من الأداء من خادم واحد إذا كنت تخطط وتؤدي إلى عدم توازن الخلايا بين الخوادم بشكل صحيح. إذا لزم الأمر ، يمكن للخلايا أيضًا وضع حدود على المورد المستخدم.

بيتكوين في قفص؟

ماذا عن الافتراضية الكاملة؟

بقدر ما أعرف cbsd يدعم العمل bhyve و XEN Hypervisor. لم أستخدم الثاني مطلقًا ، لكن الأول صغير نسبيًا برنامج Hypervisor من 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 - حسنًا ، لدينا الحد الأدنى من مجموعة القتال الجاهزة. مجموعة متطابقة من الأقراص في حالة فشل أحد الثلاثة.

ننشئ مجموعة بيانات على "تجمع" جديد

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 وإعداد القوائم البيضاء ، ويمكن القيام بذلك عن طريق القراءة الوثائق الرسمية أو أي من العدد الهائل من المقالات المتوفرة على Google.

حسنًا ... لقد قمنا بتثبيت cbsd ، حان الوقت لبناء أول عمود عمل لدينا ، وهو برنامج bitcoin الخفي!

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

يوجد Bitcoin في القفص ، لكننا بحاجة إلى إخفاء الهوية ، لأننا نريد الاتصال ببعض الأقفاص عبر شبكة TOR. بشكل عام ، نخطط لتدوير معظم الخلايا التي تحتوي على برامج مشبوهة فقط من خلال وكيل. شكرا ل 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 جدار الحماية

دعونا نرى ما هي عناوين 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 إنه مجرد خفي يحافظ على نسخة محلية من blockchain محدثة. يحتوي هذا البرنامج الخفي على وظائف RPC والمحفظة ، ولكن هناك "أغلفة" أكثر ملاءمة لتطوير التطبيقات. بادئ ذي بدء ، قررنا أن نضع electrum هي محفظة CLI. هذه المحفظة سنستخدمه كـ "مخزن بارد" لعملات البيتكوين الخاصة بنا - بشكل عام ، تلك البيتكوين التي ستحتاج إلى تخزينها "خارج" النظام الذي يمكن للمستخدمين الوصول إليه وبعيدًا عن الجميع بشكل عام. يحتوي أيضًا على واجهة مستخدم رسومية ، لذلك سنستخدم نفس المحفظة على موقعنا.
أجهزة الكمبيوتر المحمولة. في الوقت الحالي ، سنستخدم الإلكتروم مع الخوادم العامة ، وفي وقت لاحق في خلية أخرى سنقوم برفعها إلكتروم إكسحتى لا نعتمد على أحد إطلاقا.

# 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 من خلال TOR (مثل هذا الإصدار اللامركزي من VPN). نبدأ SSH في القفص ، لكن لا تلمس pf.conf الخاص بنا على المضيف.

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

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

الآن دعنا نوقف اتصال الإنترنت في القفص بالمحفظة. لنمنحه عنوان IP من مساحة شبكة فرعية أخرى غير محجوزة. دعونا نتغير أولا /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

حسنًا ، من جهاز عميل 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

النجاح!

للعمل مع المدفوعات الفورية والمتناهية الصغر ، نحتاج أيضًا إلى عقدة شبكة البرق، في الواقع ، ستكون هذه أداة العمل الرئيسية لدينا مع البيتكوين. *ج- البرق، الذي سنستخدمه كبرنامج خفي ، هو البرنامج المساعد سباركو، وهي واجهة HTTP (REST) ​​كاملة وتسمح لك بالعمل مع كل من المعاملات خارج السلسلة والمعاملات عبر السلسلة. c-lightning بحاجة للعمل bitcoind ولكن، نعم.

*هناك تطبيقات مختلفة على PLs مختلفة لبروتوكول 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

بيتكوين في قفص؟

حسنًا ، لا نريد الكشف عن IP الحقيقي لعقدتنا ، ونريد إجراء جميع المعاملات المالية من خلال TOR. لذلك ، هناك حاجة إلى واحد.

# 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

كما ترى ، تحتل bitcoind مساحة 190 جيجا بايت. ولكن ماذا لو احتجنا إلى عقدة أخرى للاختبارات؟ هذا هو المكان الذي يكون فيه ZFS مفيدًا. مع مساعدة cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com يمكنك إنشاء لقطة وربط خلية جديدة بهذه اللقطة. سيكون للخلية الجديدة مساحة خاصة بها تمامًا ، ولكن سيتم أخذ الاختلاف بين الحالة الحالية والأصل فقط في الاعتبار في FS (وفر ما لا يقل عن 190 جيجابايت)

كل خلية هي مجموعة بيانات ZFS منفصلة خاصة بها ، وهذا مريح للغاية. يسمح ZFS أيضًا قم بجميع أنواع الأشياء الرائعة الأخرى مثل إرسال لقطات عبر SSH. لن نصفها ، لذلك يوجد بالفعل الكثير.

ومن الجدير بالذكر أيضًا الحاجة إلى المراقبة عن بعد للمضيف ، لدينا لهذه الأغراض Zabbix.

ب- الأمن

بالنسبة للأمن ، فلنبدأ من المبادئ الأساسية في سياق البنية التحتية:

Конфиденциальность - الأدوات القياسية للأنظمة المشابهة لـ UNIX تفرض هذا المبدأ. نقوم بشكل منطقي بفصل الوصول إلى كل عنصر منفصل منطقيًا في النظام - خلية. يتم توفير الوصول من خلال مصادقة المستخدم القياسية باستخدام المفاتيح الخاصة للمستخدمين. يتم تشفير كافة الاتصالات بين وإلى الخلايا النهائية. بفضل تشفير القرص ، لا يمكننا القلق بشأن أمان البيانات أثناء استبدال القرص أو الترحيل إلى خادم آخر. الوصول المهم الوحيد هو الوصول إلى النظام المضيف ، حيث يوفر هذا الوصول بشكل عام الوصول إلى البيانات داخل الحاويات.

سلامة - يتم تنفيذ هذا المبدأ على عدة مستويات مختلفة. أولاً ، من المهم ملاحظة أنه في حالة أجهزة الخادم ، ذاكرة ECC ، يعتني ZFS بسلامة البيانات على مستوى بتات المعلومات خارج الصندوق. تتيح لك اللقطات الفورية إجراء نسخ احتياطي في أي وقت أثناء التنقل. تجعل أدوات تصدير / استيراد الخلايا الملائمة عملية النسخ المتماثل للخلايا أمرًا سهلاً.

توفر - إنه اختياري. يعتمد على درجة شهرتك وحقيقة أن لديك كارهين. في مثالنا ، تأكدنا من إمكانية الوصول إلى المحفظة حصريًا من شبكة TOR. إذا لزم الأمر ، يمكنك حظر كل شيء على جدار الحماية والسماح بالوصول إلى الخادم حصريًا عبر الأنفاق (TOR أو VPN مسألة أخرى). وبالتالي ، سيتم قطع الخادم عن العالم الخارجي قدر الإمكان ، ونستطيع نحن فقط التأثير على توفره.

استحالة الرفض - ويعتمد ذلك على مزيد من التشغيل والامتثال للسياسات الصحيحة لحقوق المستخدم والوصول وما إلى ذلك. ولكن مع النهج الصحيح ، يتم تدقيق جميع إجراءات المستخدم ، وبفضل حلول التشفير ، من الممكن تحديد من قام بإجراءات معينة ومتى قام بها بشكل فريد.

بالطبع ، التكوين الموصوف ليس مثالًا مطلقًا على الكيفية التي يجب أن يكون عليها دائمًا ، ولكنه أحد الأمثلة على كيف يمكن أن يكون ، مع الاحتفاظ بخيارات القياس والتخصيص المرنة للغاية.

ولكن ماذا عن الافتراضية الكاملة؟

حول المحاكاة الافتراضية الكاملة باستخدام cbsd ، يمكنك ذلك اقرأ هنا. سأضيف ذلك للعمل فقط bhyve تحتاج بعض خيارات kernel إلى التمكين.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

لذلك إذا كانت هناك حاجة فجأة لبدء عامل ميناء ، فإننا نرفع بعض الديبيان ونمضي قدمًا!

بيتكوين في قفص؟

هذا كل شئ

ربما هذا هو كل ما أردت مشاركته. إذا أعجبك المقال ، فيمكنك رمي عملات البيتكوين لي - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. إذا كنت ترغب في تجربة الخلايا في العمل ولديك بعض عملات البيتكوين ، فيمكنك الانتقال إلى مشروع الحيوانات الأليفة.

المصدر: www.habr.com