Έτυχε ότι στο επάγγελμα είμαι διαχειριστής συστημάτων και δικτύων υπολογιστών (συνοπτικά: διαχειριστής συστήματος) και είχα την ευκαιρία να το πω στον καθηγητή για λίγο περισσότερο από 10 χρόνια. τις δραστηριότητες μιας μεγάλης ποικιλίας συστημάτων, συμπεριλαμβανομένων εκείνων που απαιτούν [ακραία] μέτρα ασφαλείας. Έτυχε και πριν λίγο καιρό να το βρήκα ενδιαφέρον dev
, λοιπόν, περνούσα). Αλλά δεν μιλάω για ανάπτυξη, μιλάω για ένα ασφαλές και αποτελεσματικό περιβάλλον για εφαρμογές.
Χρηματοοικονομική τεχνολογία (fintech) πηγαίνετε δίπλα στην ασφάλεια πληροφοριών (πληροφορίες) και το πρώτο μπορεί να λειτουργήσει χωρίς το δεύτερο, αλλά όχι για πολύ. Γι' αυτό θέλω να μοιραστώ την εμπειρία μου και το σύνολο εργαλείων που χρησιμοποιώ, το οποίο περιλαμβάνει και τα δύο fintechΚαι πληροφορίες, και ταυτόχρονα, και μπορεί επίσης να χρησιμοποιηθεί για ευρύτερο ή εντελώς διαφορετικό σκοπό. Σε αυτό το άρθρο θα μιλήσω όχι τόσο για το Bitcoin, αλλά για το μοντέλο υποδομής για την ανάπτυξη και λειτουργία οικονομικών (και όχι μόνο) υπηρεσιών - με μια λέξη, εκείνες τις υπηρεσίες όπου το "Β" έχει σημασία. Αυτό ισχύει τόσο για το ανταλλακτήριο Bitcoin όσο και για τον πιο τυπικό εταιρικό ζωολογικό κήπο υπηρεσιών μιας μικρής εταιρείας που δεν συνδέεται με το Bitcoin με κανέναν τρόπο.
Θα ήθελα να σημειώσω ότι είμαι υποστηρικτής των αρχών "Κράτα το ανόητο απλό" и "λιγότερο είναι περισσότερο", επομένως, τόσο το άρθρο όσο και αυτό που περιγράφεται σε αυτό θα έχει τις ιδιότητες για τις οποίες αναφέρονται αυτές οι αρχές.
Φανταστικό σενάριο: Ας δούμε τα πάντα χρησιμοποιώντας το παράδειγμα ενός εναλλάκτη bitcoin. Αποφασίσαμε να ξεκινήσουμε την ανταλλαγή ρουβλίων, δολαρίων, ευρώ για bitcoin και αντίστροφα, και έχουμε ήδη μια λειτουργική λύση, αλλά για άλλα ψηφιακά χρήματα όπως το qiwi και το webmoney, π.χ. Κλείσαμε όλα τα νομικά ζητήματα, έχουμε μια έτοιμη εφαρμογή που χρησιμεύει ως πύλη πληρωμής για ρούβλια, δολάρια και ευρώ και άλλα συστήματα πληρωμών. Είναι συνδεδεμένο με τους τραπεζικούς μας λογαριασμούς και έχει κάποιο είδος API για τις τελικές εφαρμογές μας. Έχουμε επίσης μια εφαρμογή Ιστού που λειτουργεί ως εναλλάκτης για τους χρήστες, όπως ένας τυπικός λογαριασμός qiwi ή webmoney - δημιουργήστε έναν λογαριασμό, προσθέστε μια κάρτα και ούτω καθεξής. Επικοινωνεί με την εφαρμογή πύλης μας, αν και μέσω του REST API στην τοπική περιοχή. Και έτσι αποφασίσαμε να συνδέσουμε bitcoins και ταυτόχρονα να αναβαθμίσουμε την υποδομή, γιατί... Αρχικά, τα πάντα τοποθετήθηκαν βιαστικά σε εικονικά κουτιά στο γραφείο κάτω από το τραπέζι... ο ιστότοπος άρχισε να χρησιμοποιείται και αρχίσαμε να ανησυχούμε για το χρόνο λειτουργίας και την απόδοση.
Λοιπόν, ας ξεκινήσουμε με το κύριο πράγμα - την επιλογή ενός διακομιστή. Επειδή η επιχείρηση στο παράδειγμά μας είναι μικρή και εμπιστευόμαστε τον οικοδεσπότη (OVH) που θα επιλέξουμε
Εγκατάσταση διακομιστή
Όλα είναι απλά εδώ. Επιλέγουμε το υλικό που ταιριάζει στις ανάγκες μας. Στη συνέχεια επιλέξτε την εικόνα του FreeBSD. Λοιπόν, ή συνδέουμε (στην περίπτωση ενός άλλου hoster και του δικού μας υλικού) μέσω 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 -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 εάν σκοπεύουμε να χρησιμοποιήσουμε πλήρη εικονικοποίηση.
Για τη διαχείριση κοντέινερ και εικονικών μηχανών χρησιμοποιώ
Εμπορευματοκιβώτια; Docker πάλι ή τι;
Αλλά όχι. cbsd
για να ενορχηστρώσει αυτά τα δοχεία, τα οποία ονομάζονται κύτταρα.
Ο κλωβός είναι μια εξαιρετικά αποτελεσματική λύση για την κατασκευή υποδομών για διάφορους σκοπούς, όπου τελικά απαιτείται πλήρης απομόνωση μεμονωμένων υπηρεσιών ή διαδικασιών. Ουσιαστικά, είναι ένας κλώνος του συστήματος υποδοχής, αλλά δεν απαιτεί πλήρη εικονικοποίηση υλικού. Και χάρη σε αυτό, οι πόροι δεν δαπανώνται στο "guest OS", αλλά μόνο στην εργασία που εκτελείται. Όταν τα κελιά χρησιμοποιούνται για εσωτερικές ανάγκες, αυτή είναι μια πολύ βολική λύση για βέλτιστη χρήση πόρων - μια δέσμη κελιών σε έναν διακομιστή υλικού μπορεί να χρησιμοποιήσει το καθένα ξεχωριστά ολόκληρο τον πόρο του διακομιστή, εάν είναι απαραίτητο. Λαμβάνοντας υπόψη ότι συνήθως διαφορετικές υπουπηρεσίες χρειάζονται επιπλέον. πόρους σε διαφορετικές χρονικές στιγμές, μπορείτε να εξαγάγετε τη μέγιστη απόδοση από έναν διακομιστή εάν σχεδιάζετε και εξισορροπείτε σωστά τα κελιά μεταξύ των διακομιστών. Εάν είναι απαραίτητο, στα κελιά μπορούν επίσης να δοθούν περιορισμοί στον πόρο που χρησιμοποιείται.
Τι γίνεται με την πλήρη εικονικοποίηση;
Από όσο γνωρίζω cbsd
υποστηρίζει την εργασία bhyve
και XEN hypervisors. Δεν έχω χρησιμοποιήσει ποτέ το δεύτερο, αλλά το πρώτο είναι σχετικά καινούργιο bhyve
στο παρακάτω παράδειγμα.
Εγκατάσταση και διαμόρφωση του περιβάλλοντος κεντρικού υπολογιστή
Χρησιμοποιούμε FS
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
- Λοιπόν, έχουμε έτοιμο το ελάχιστο κιτ μάχης. Μια αντικατοπτρισμένη συστοιχία δίσκων σε περίπτωση που ένας από τους τρεις αποτύχει.
Δημιουργία ενός συνόλου δεδομένων σε ένα νέο "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, ήρθε η ώρα να δημιουργήσουμε το πρώτο μας άλογο εργασίας - τον εγκλωβισμένο δαίμονα 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, το οποίο θα λειτουργεί ως αντίστροφος διακομιστής μεσολάβησης και θα φροντίσει για την ανανέωση των πιστοποιητικών 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 και rust και μια εφαρμογή web, η οποία για κάποιο λόγο είναι σε 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
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
Λοιπόν, αφού είμαστε εδώ, ας προσθέσουμε επίσης έναν κανόνα για το 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
Λοιπόν, τώρα λίγα για τα bitcoin
Αυτό που έχουμε είναι ότι έχουμε μια εφαρμογή Ιστού που εκτίθεται εξωτερικά και μιλάει τοπικά στην πύλη πληρωμών μας. Τώρα πρέπει να προετοιμάσουμε ένα περιβάλλον εργασίας για την αλληλεπίδραση με το ίδιο το δίκτυο Bitcoin - τον κόμβο bitcoind
είναι απλώς ένας δαίμονας που διατηρεί ενημερωμένο το τοπικό αντίγραφο του blockchain. Αυτός ο δαίμονας έχει λειτουργικότητα 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 δεν θα έχουν άμεση πρόσβαση στο Διαδίκτυο. Ένα είδος δικτύου λογισμικού "air-gap". Και ο κανόνας του ΝΑΤ παραμένει ως είχε
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 που ακούει στο 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. Επομένως, δεν χρειάζεται άλλο .κρεμμύδι.
# 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
Όπως μπορείτε να δείτε, το bitcoin καταλαμβάνει και τα 190 GB χώρου. Τι γίνεται αν χρειαστούμε έναν άλλο κόμβο για δοκιμή; Εδώ είναι χρήσιμο το ZFS. Με βοήθεια cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com
μπορείτε να δημιουργήσετε ένα στιγμιότυπο και να επισυνάψετε ένα νέο κελί σε αυτό το στιγμιότυπο. Το νέο κελί θα έχει το δικό του χώρο, αλλά μόνο η διαφορά μεταξύ της τρέχουσας κατάστασης και του αρχικού θα λαμβάνεται υπόψη στο σύστημα αρχείων (θα εξοικονομήσουμε τουλάχιστον 190 GB)
Κάθε κελί είναι το δικό του ξεχωριστό σύνολο δεδομένων ZFS και αυτό είναι εξαιρετικά βολικό.
Αξίζει επίσης να σημειωθεί η ανάγκη για απομακρυσμένη παρακολούθηση του κεντρικού υπολογιστή, για αυτούς τους σκοπούς που έχουμε
Β - ασφάλεια
Όσον αφορά την ασφάλεια, ας ξεκινήσουμε από τις βασικές αρχές στο πλαίσιο της υποδομής:
Εμπιστευτικότητα — Τυποποιημένα εργαλεία συστημάτων που μοιάζουν με UNIX διασφαλίζουν αυτήν την αρχή. Διαχωρίζουμε λογικά την πρόσβαση σε κάθε λογικά ξεχωριστό στοιχείο του συστήματος - ένα κελί. Η πρόσβαση παρέχεται μέσω τυπικού ελέγχου ταυτότητας χρήστη χρησιμοποιώντας τα προσωπικά κλειδιά των χρηστών. Όλη η επικοινωνία μεταξύ και προς τα άκρα των κελιών γίνεται σε κρυπτογραφημένη μορφή. Χάρη στην κρυπτογράφηση δίσκου, δεν χρειάζεται να ανησυχούμε για την ασφάλεια των δεδομένων κατά την αντικατάσταση ενός δίσκου ή τη μετεγκατάσταση σε άλλο διακομιστή. Η μόνη κρίσιμη πρόσβαση είναι η πρόσβαση στο κεντρικό σύστημα, καθώς αυτή η πρόσβαση παρέχει γενικά πρόσβαση σε δεδομένα μέσα σε κοντέινερ.
Ακεραιότητα «Η εφαρμογή αυτής της αρχής συμβαίνει σε πολλά διαφορετικά επίπεδα. Πρώτον, είναι σημαντικό να σημειωθεί ότι στην περίπτωση του υλικού διακομιστή, της μνήμης ECC, το ZFS ήδη "out of the box" φροντίζει για την ακεραιότητα των δεδομένων στο επίπεδο των bits πληροφοριών. Τα άμεσα στιγμιότυπα σάς επιτρέπουν να δημιουργείτε αντίγραφα ασφαλείας ανά πάσα στιγμή. Τα βολικά εργαλεία εξαγωγής/εισαγωγής κυψελών κάνουν την αναπαραγωγή κελιών απλή.
Διαθεσιμότητα - Αυτό είναι ήδη προαιρετικό. Εξαρτάται από το βαθμό της φήμης σου και το γεγονός ότι έχεις μισητές. Στο παράδειγμά μας, εξασφαλίσαμε ότι το πορτοφόλι ήταν προσβάσιμο αποκλειστικά από το δίκτυο TOP. Εάν είναι απαραίτητο, μπορείτε να αποκλείσετε τα πάντα στο τείχος προστασίας και να επιτρέψετε την πρόσβαση στον διακομιστή αποκλειστικά μέσω τούνελ (το TOR ή το VPN είναι άλλο θέμα). Έτσι, ο διακομιστής θα αποκοπεί όσο το δυνατόν περισσότερο από τον έξω κόσμο και μόνο εμείς οι ίδιοι θα μπορούμε να επηρεάσουμε τη διαθεσιμότητά του.
Αδυναμία άρνησης - Και αυτό εξαρτάται από την περαιτέρω λειτουργία και τη συμμόρφωση με τις σωστές πολιτικές για δικαιώματα χρήστη, πρόσβαση κ.λπ. Αλλά με τη σωστή προσέγγιση, όλες οι ενέργειες των χρηστών ελέγχονται και χάρη στις κρυπτογραφικές λύσεις είναι δυνατό να προσδιοριστεί με σαφήνεια ποιος εκτέλεσε ορισμένες ενέργειες και πότε.
Φυσικά, η περιγραφόμενη διαμόρφωση δεν είναι ένα απόλυτο παράδειγμα του πώς θα έπρεπε να είναι πάντα, είναι μάλλον ένα παράδειγμα του πώς μπορεί να είναι, ενώ διατηρεί πολύ ευέλικτες δυνατότητες κλιμάκωσης και προσαρμογής.
Τι γίνεται με την πλήρη εικονικοποίηση;
Σχετικά με την πλήρη εικονικοποίηση με χρήση cbsd μπορείτε bhyve
Πρέπει να ενεργοποιήσετε ορισμένες επιλογές πυρήνα.
# cat /etc/rc.conf
...
kld_list="vmm if_tap if_bridge nmdm"
...
# cat /boot/loader.conf
...
vmm_load="YES"
...
Έτσι, αν ξαφνικά χρειαστεί να ξεκινήσετε ένα docker, εγκαταστήστε κάποιο debian και πηγαίνετε!
Αυτό είναι όλο
Υποθέτω ότι αυτό ήταν το μόνο που ήθελα να μοιραστώ. Αν σας άρεσε το άρθρο, τότε μπορείτε να μου στείλετε μερικά bitcoin -
Πηγή: www.habr.com