มันเกิดขึ้นโดยอาชีพฉันเป็นผู้ดูแลระบบคอมพิวเตอร์และเครือข่าย (โดยย่อ: ผู้ดูแลระบบ) และฉันมีโอกาสบอกกับศาสตราจารย์ มานานกว่า 10 ปีเล็กน้อย กิจกรรมของระบบที่หลากหลาย รวมถึงกิจกรรมที่ต้องใช้มาตรการรักษาความปลอดภัย [ขั้นสูงสุด] มันเกิดขึ้นเมื่อไม่นานมานี้ฉันพบว่ามันน่าสนใจ dev
ฉันก็เลยผ่านไป) แต่ฉันไม่ได้พูดถึงการพัฒนา ฉันกำลังพูดถึงสภาพแวดล้อมที่ปลอดภัยและมีประสิทธิภาพสำหรับแอปพลิเคชัน
เทคโนโลยีทางการเงิน (Fintech) ถัดจากความปลอดภัยของข้อมูล (อินโฟเซค) และอันแรกสามารถทำงานได้โดยไม่ต้องมีอันที่สอง แต่ไม่นาน นั่นเป็นเหตุผลที่ฉันต้องการแบ่งปันประสบการณ์และชุดเครื่องมือที่ฉันใช้ ซึ่งรวมถึงทั้งสองอย่าง Fintechและ อินโฟเซคและในเวลาเดียวกัน และยังสามารถใช้เพื่อวัตถุประสงค์ที่กว้างขึ้นหรือแตกต่างไปจากเดิมอย่างสิ้นเชิง ในบทความนี้ ฉันจะไม่บอกคุณมากนักเกี่ยวกับ Bitcoin แต่เกี่ยวกับโมเดลโครงสร้างพื้นฐานสำหรับการพัฒนาและการดำเนินงานของบริการทางการเงิน (และไม่เพียงเท่านั้น) กล่าวคือ บริการเหล่านั้นที่ "B" มีความสำคัญ สิ่งนี้ใช้ได้กับทั้งการแลกเปลี่ยน Bitcoin และสวนสัตว์ที่ให้บริการทั่วไปของบริษัทขนาดเล็กที่ไม่เกี่ยวข้องกับ Bitcoin แต่อย่างใด
ฉันอยากจะทราบว่าฉันเป็นผู้สนับสนุนหลักการ "ให้มันง่ายโง่" и "น้อยมาก"ดังนั้นทั้งบทความและสิ่งที่อธิบายไว้ในบทความจะมีคุณสมบัติตามหลักการเหล่านี้
สถานการณ์สมมติ: ลองดูทุกสิ่งโดยใช้ตัวอย่างของการแลกเปลี่ยน bitcoin เราตัดสินใจที่จะเปิดตัวการแลกเปลี่ยนรูเบิล ดอลลาร์ ยูโรสำหรับ bitcoins และกลับ และเรามีวิธีแก้ปัญหาที่ใช้งานได้อยู่แล้ว แต่สำหรับเงินดิจิทัลอื่น ๆ เช่น qiwi และ webmoney เช่น เราได้ปิดประเด็นทางกฎหมายทั้งหมดแล้ว เรามีแอปพลิเคชันสำเร็จรูปที่ทำหน้าที่เป็นเกตเวย์การชำระเงินสำหรับรูเบิล ดอลลาร์ และยูโร และระบบการชำระเงินอื่น ๆ มันเชื่อมต่อกับบัญชีธนาคารของเราและมี API บางประเภทสำหรับแอปพลิเคชันปลายทางของเรา นอกจากนี้เรายังมีเว็บแอปพลิเคชันที่ทำหน้าที่เป็นตัวแลกเปลี่ยนสำหรับผู้ใช้ เช่นเดียวกับบัญชี qiwi หรือ webmoney ทั่วไป - สร้างบัญชี เพิ่มบัตร และอื่นๆ โดยจะสื่อสารกับแอปพลิเคชันเกตเวย์ของเรา แม้ว่าจะผ่านทาง REST API ในพื้นที่ก็ตาม ดังนั้นเราจึงตัดสินใจเชื่อมต่อ bitcoin และในเวลาเดียวกันก็อัพเกรดโครงสร้างพื้นฐาน เพราะ... ในตอนแรก ทุกอย่างถูกวางไว้อย่างเร่งรีบบนกล่องเสมือนในสำนักงานใต้โต๊ะ... ไซต์เริ่มถูกใช้งาน และเราเริ่มกังวลเกี่ยวกับเวลาทำงานและประสิทธิภาพ
เริ่มจากสิ่งสำคัญกันก่อน - การเลือกเซิร์ฟเวอร์ เพราะ ธุรกิจในตัวอย่างของเรามีขนาดเล็กและเราไว้วางใจผู้ให้บริการโฮสต์ (OVH) ที่เราจะเลือก
การติดตั้งเซิร์ฟเวอร์
ทุกอย่างเรียบง่ายที่นี่ เราเลือกฮาร์ดแวร์ที่เหมาะสมกับความต้องการของเรา จากนั้นเลือกอิมเมจ FreeBSD หรือเราเชื่อมต่อ (ในกรณีของโฮสต์อื่นและฮาร์ดแวร์ของเราเอง) ผ่าน IPMI หรือกับจอภาพและป้อนอิมเมจ .iso FreeBSD ลงในการดาวน์โหลด สำหรับการตั้งค่าออเคสตราฉันใช้
การติดตั้งระบบเกิดขึ้นในลักษณะมาตรฐานฉันจะไม่ยึดติดกับสิ่งนี้ฉันจะสังเกตเพียงว่าก่อนเริ่มดำเนินการควรให้ความสนใจ การทำให้แข็ง ตัวเลือกที่นำเสนอ bsdinstaller
เมื่อสิ้นสุดการติดตั้ง (หากคุณติดตั้งระบบด้วยตัวเอง):
มี
นอกจากนี้ยังสามารถเปิดใช้งานพารามิเตอร์ที่กล่าวมาข้างต้นบนระบบที่ติดตั้งไว้แล้วได้อีกด้วย ในการดำเนินการนี้ คุณจะต้องแก้ไขไฟล์ 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
คุณควรตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งระบบเวอร์ชันล่าสุดแล้วและ
จากนั้นเราก็ตั้งค่า 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
วิธีการจัดการเรื่องนี้อธิบายไว้อย่างสมบูรณ์ใน
ตอนนี้เรารีบูตและดำเนินการกับซอฟต์แวร์บนเซิร์ฟเวอร์ แต่ละเซิร์ฟเวอร์เป็นไฮเปอร์ไวเซอร์สำหรับคอนเทนเนอร์หรือเครื่องเสมือนเต็มรูปแบบ ดังนั้นจึงเป็นสิ่งสำคัญที่โปรเซสเซอร์รองรับ VT-x และ EPT หากเราวางแผนที่จะใช้การจำลองเสมือนเต็มรูปแบบ
ในการจัดการคอนเทนเนอร์และเครื่องเสมือนที่ฉันใช้
ตู้คอนเทนเนอร์? นักเทียบท่าอีกครั้งหรืออะไร?
แต่ไม่มี. cbsd
เพื่อประสานภาชนะเหล่านี้ซึ่งเรียกว่าเซลล์
กรงเป็นโซลูชันที่มีประสิทธิภาพอย่างยิ่งสำหรับการสร้างโครงสร้างพื้นฐานเพื่อวัตถุประสงค์ที่หลากหลาย ซึ่งท้ายที่สุดแล้วจำเป็นต้องแยกบริการหรือกระบวนการแต่ละรายการโดยสิ้นเชิง โดยพื้นฐานแล้ว มันเป็นโคลนของระบบโฮสต์ แต่ไม่ต้องการการจำลองเสมือนสำหรับฮาร์ดแวร์เต็มรูปแบบ และด้วยเหตุนี้ ทรัพยากรจึงไม่ถูกใช้ไปกับ "ระบบปฏิบัติการเกสต์" แต่จะใช้กับงานที่กำลังดำเนินการเท่านั้น เมื่อใช้เซลล์สำหรับความต้องการภายใน นี่เป็นโซลูชันที่สะดวกมากสำหรับการใช้ทรัพยากรที่เหมาะสมที่สุด - เซลล์จำนวนมากบนเซิร์ฟเวอร์ฮาร์ดแวร์ตัวเดียวสามารถใช้ทรัพยากรเซิร์ฟเวอร์ทั้งหมดทีละเซลล์ได้หากจำเป็น เมื่อพิจารณาว่าบริการย่อยที่แตกต่างกันมักจะต้องมีเพิ่มเติม ทรัพยากรในเวลาที่ต่างกัน คุณสามารถแยกประสิทธิภาพสูงสุดออกจากเซิร์ฟเวอร์เดียวได้ หากคุณวางแผนและปรับสมดุลเซลล์ระหว่างเซิร์ฟเวอร์อย่างเหมาะสม หากจำเป็น คุณสามารถกำหนดข้อจำกัดเกี่ยวกับทรัพยากรที่ใช้ให้กับเซลล์ได้
แล้วระบบเสมือนจริงเต็มรูปแบบล่ะ?
เท่าที่ฉันรู้ cbsd
รองรับการทำงาน bhyve
และไฮเปอร์ไวเซอร์ XEN ฉันไม่เคยใช้อันที่สอง แต่อันแรกค่อนข้างใหม่ bhyve
ในตัวอย่างด้านล่าง
การติดตั้งและกำหนดค่าสภาพแวดล้อมโฮสต์
เราใช้เอฟเอส
gpart add -t freebsd-zfs /dev/ada0
/dev/ada0p4 added!
เพิ่มพาร์ติชันดิสก์ลงในพื้นที่ที่เหลือ
geli init /dev/ada0p4
ป้อนรหัสผ่านการเข้ารหัสของเรา
geli attach /dev/ada0p4
เราป้อนรหัสผ่านอีกครั้งและเรามีอุปกรณ์ /dev/ada0p4.eli - นี่คือพื้นที่เข้ารหัสของเรา จากนั้นเราจะทำซ้ำแบบเดียวกันสำหรับ /dev/ada1 และดิสก์ที่เหลือในอาร์เรย์ และเราสร้างอันใหม่
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 และการตั้งค่าไวท์ลิสต์ คุณสามารถทำได้โดยการอ่าน
เอาล่ะ... เราได้ติดตั้ง 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 อยู่ในกรง แต่เราต้องการการไม่เปิดเผยตัวตนเพราะเราต้องการเชื่อมต่อกับกรงบางแห่งผ่านเครือข่าย 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 ซึ่งจะทำหน้าที่เป็น Reverse-proxy และดูแลการต่ออายุใบรับรอง Let's Encrypt
# cbsd jsconstruct-tui
# cbsd jstart nginx-rev
# jexec nginx-rev
nginx-rev:/@[15:47] # pkg install nginx py36-certbot
ดังนั้นเราจึงวางการพึ่งพา 150 MB ไว้ในกรง และเจ้าภาพก็ยังสะอาดอยู่
กลับไปที่การตั้งค่า nginx ในภายหลัง เราต้องเพิ่มเซลล์อีกสองเซลล์สำหรับเกตเวย์การชำระเงินของเราบน nodejs และสนิมและเว็บแอปพลิเคชัน ซึ่งด้วยเหตุผลบางอย่างอยู่ใน 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 MB ที่แยกได้
ต่อไปเราจะดาวน์โหลดแอปพลิเคชันของเราด้วย git และเปิดใช้งาน
# cbsd jsconstruct-tui
# cbsd jstart webapp
# jexec webapp
webapp:/@[16:02] # pkg install mariadb104-server apache24 php74 mod_php74 php74-pdo_mysql
แพ็คเกจ 450 MB ในกรง
ที่นี่เราให้สิทธิ์นักพัฒนาเข้าถึงเซลล์โดยตรงผ่าน 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
เนื่องจากเราอยู่ที่นี่ เรามาเพิ่มกฎสำหรับ Reverse-proxy กันดีกว่า:
## web-ports for nginx-rev
IP_JAIL="192.168.0.3"
PORT_JAIL="{ 80, 443 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL
# pfctl -f /etc/pf.conf
ทีนี้มาเล็กน้อยเกี่ยวกับ bitcoins
สิ่งที่เรามีคือเรามีเว็บแอปพลิเคชันที่เปิดเผยจากภายนอกและสื่อสารกับเกตเวย์การชำระเงินของเราในเครื่อง ตอนนี้เราต้องเตรียมสภาพแวดล้อมการทำงานสำหรับการโต้ตอบกับเครือข่าย Bitcoin นั่นก็คือโหนด bitcoind
มันเป็นเพียงภูตที่ช่วยรักษาสำเนาของบล็อคเชนในเครื่องให้ทันสมัยอยู่เสมอ Daemon นี้มีฟังก์ชัน RPC และกระเป๋าเงิน แต่มี "ตัวห่อ" ที่สะดวกกว่าสำหรับการพัฒนาแอปพลิเคชัน เริ่มต้นด้วยการตัดสินใจที่จะใส่ electrum
เป็นกระเป๋าเงิน CLI
แล็ปท็อป สำหรับตอนนี้ เราจะใช้ Electrum กับเซิร์ฟเวอร์สาธารณะ และต่อมาเราจะเพิ่มมันลงในเซลล์อื่น
# cbsd jsconstruct-tui
# cbsd jstart electrum
# jexec electrum
electrum:/@[8:45] # pkg install py36-electrum
ซอฟต์แวร์อีก 700 MB อยู่ในกรงของเรา
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
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 และ
ตอนนี้เราสามารถกำหนดค่าสภาพแวดล้อมกระเป๋าสตางค์ของเราได้แล้ว
# 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 daemon ในเครื่องที่รับฟัง 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
ความสำเร็จ!
ในการทำงานกับการชำระเงินทันทีและการชำระเงินแบบไมโคร เรายังต้องมีโหนดด้วย 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
ดังนั้นเราจึงไม่ต้องการเปิดเผย IP ที่แท้จริงของโหนดของเรา และเราต้องการดำเนินธุรกรรมทางการเงินทั้งหมดผ่าน TOP ดังนั้นจึงไม่จำเป็นต้องใช้ .onion อื่น
# 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 GB จะเกิดอะไรขึ้นถ้าเราต้องการโหนดอื่นสำหรับการทดสอบ? นี่คือจุดที่ ZFS มีประโยชน์ ด้วยความช่วยเหลือ cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com
คุณสามารถสร้างสแน็ปช็อตและแนบเซลล์ใหม่เข้ากับสแน็ปช็อตนี้ได้ เซลล์ใหม่จะมีพื้นที่ของตัวเอง แต่ระบบไฟล์จะคำนึงถึงความแตกต่างระหว่างสถานะปัจจุบันและต้นฉบับเท่านั้น (เราจะบันทึกอย่างน้อย 190 GB)
แต่ละเซลล์จะมีชุดข้อมูล ZFS แยกกัน ซึ่งสะดวกมาก
นอกจากนี้ยังเป็นที่น่าสังเกตถึงความจำเป็นในการตรวจสอบโฮสต์ระยะไกลเพื่อจุดประสงค์เหล่านี้ที่เรามี
บี - ความปลอดภัย
ในส่วนของความปลอดภัย เริ่มจากหลักการสำคัญในบริบทของโครงสร้างพื้นฐานกันก่อน:
การรักษาความลับ - เครื่องมือมาตรฐานของระบบที่คล้ายกับ UNIX ช่วยให้มั่นใจถึงการนำหลักการนี้ไปใช้ เราแยกการเข้าถึงแต่ละองค์ประกอบของระบบอย่างมีเหตุผล - เซลล์ การเข้าถึงมีให้ผ่านการตรวจสอบผู้ใช้มาตรฐานโดยใช้คีย์ส่วนตัวของผู้ใช้ การสื่อสารทั้งหมดระหว่างและไปยังเซลล์สุดท้ายเกิดขึ้นในรูปแบบที่เข้ารหัส ด้วยการเข้ารหัสดิสก์ เราจึงไม่ต้องกังวลเกี่ยวกับความปลอดภัยของข้อมูลเมื่อเปลี่ยนดิสก์หรือย้ายไปยังเซิร์ฟเวอร์อื่น การเข้าถึงที่สำคัญเพียงอย่างเดียวคือการเข้าถึงระบบโฮสต์ เนื่องจากโดยทั่วไปแล้วการเข้าถึงดังกล่าวจะให้การเข้าถึงข้อมูลภายในคอนเทนเนอร์
ความสมบูรณ์ “การนำหลักการนี้ไปปฏิบัตินั้นเกิดขึ้นในหลายระดับที่แตกต่างกัน ประการแรก สิ่งสำคัญที่ควรทราบคือในกรณีของฮาร์ดแวร์เซิร์ฟเวอร์ หน่วยความจำ 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"
...
ดังนั้นหากคุณจำเป็นต้องเริ่มนักเทียบท่ากะทันหัน ให้ติดตั้งเดเบียนแล้วไปได้เลย!
นั่นคือทั้งหมด
ฉันเดาว่านั่นคือทั้งหมดที่ฉันต้องการแบ่งปัน หากคุณชอบบทความนี้ คุณสามารถส่ง bitcoins ให้ฉันได้บ้าง -
ที่มา: will.com