Usa le jail di FreeBSD su Raspberry Pi
Crea e mantieni i tuoi contenitori (ovvero jail) su larga scala su FreeBSD con Bastille.
I contenitori sono diventati molto popolari grazie a Docker su Linux, ma esistono implementazioni molto precedenti, incluso il sistema jail su FreeBSD. Un contenitore è chiamato "jail" nella terminologia di FreeBSD. Il sistema jail è stato rilasciato per la prima volta in FreeBSD 4.0 nel lontano 2000 e da allora è stato continuamente migliorato. Mentre 20 anni fa veniva utilizzato principalmente su server di grandi dimensioni, ora puoi eseguirlo sul tuo Raspberry Pi.
Jail e container su Linux
Lo sviluppo del contenitore ha preso un percorso molto diverso su FreeBSD rispetto a Linux. Su FreeBSD, la containerizzazione è stata sviluppata come una rigorosa funzionalità di sicurezza alla fine degli anni '90 per l'hosting virtuale e la sua flessibilità è cresciuta nel corso degli anni. Limitare le risorse informatiche di un contenitore non faceva parte del concetto originale; questo è stato aggiunto più tardi.
Quando ho iniziato a utilizzare le prigioni in produzione nel 2001, è stato piuttosto doloroso. Ho dovuto preparare i miei script per automatizzare il lavoro con loro.
Per quanto riguarda Linux, ci sono stati parecchi tentativi di containerizzazione, incluso lxc.
Docker ha portato popolarità, accessibilità e facilità d'uso ai contenitori. Ora ci sono molti altri strumenti su Linux (ad esempio, preferisco usare Podman sul mio laptop). E Kubernetes ti consente di lavorare con contenitori su larga scala.
Bastille è uno dei tanti strumenti disponibili nei port di FreeBSD per gestire le jail. È paragonabile a Docker o Podman e consente di creare e mantenere jail su larga scala invece che manualmente. Ha un sistema di modelli per installare e configurare automaticamente le applicazioni all'interno delle jail, simile a Dockerfile. Supporta anche funzionalità avanzate di FreeBSD, come ZFS o VNET.
Installa FreeBSD su Raspberry Pi
Installare BSD su Raspberry Pi è abbastanza simile all'installazione di Linux. Scarichi un'immagine compressa dal sito web di FreeBSD e la aggiungi
su una scheda SD. Puoi anche utilizzare uno strumento di scrittura di immagini dedicato; ce ne sono molti disponibili per tutti i sistemi operativi (OS). Scarica e scrivi un'immagine dalla riga di comando con:
wget https://download.freebsd.org/ftp/releases/arm64/aarch64/ISO-IMAGES/13.0/FreeBSD-13.0-BETA1-arm64-aarch64-RPI.img.xz
xzcat FreeBSD-13.0-BETA1-arm64-aarch64-RPI.img.xz | dd of=/dev/XXX
Questo scrive l'ultima immagine beta disponibile per le schede Raspberry Pi a 64 bit; controlla la pagina di download se usi un'altra scheda Raspberry Pi o desideri utilizzare un'altra build. Sostituisci XXX
con il nome del dispositivo della tua scheda SD, che dipende dal tuo sistema operativo e da come la scheda si collega al tuo computer. Di proposito non ho utilizzato un nome di dispositivo in modo da non sovrascrivere nulla se copi e incolli semplicemente le istruzioni senza pensarci. L'ho fatto e ho avuto la fortuna di avere un backup recente del mio portatile, ma non è stata un'esperienza piacevole.
Dopo aver scritto la scheda SD, inseriscila nel tuo Raspberry Pi e avvialo. Il primo avvio richiede un po' più tempo del solito; Sospetto che le dimensioni della partizione vengano adattate alle dimensioni della scheda SD. Dopo un po', riceverai la familiare richiesta di accesso su un buon vecchio schermo basato su testo. Il nome utente è root e la password è la stessa del nome utente. Il server SSH è abilitato per impostazione predefinita, ma non preoccuparti; l'utente root non può accedere. È comunque una buona idea cambiare la password con qualcos'altro. La rete viene configurata automaticamente da DHCP per la connessione Ethernet (non ho testato il WiFi).
Il modo più semplice per configurare Bastille sul sistema è accedere tramite SSH a Raspberry Pi e copiare e incollare i comandi e la configurazione in questo articolo. Hai un paio di opzioni, a seconda di quanto tieni alle migliori pratiche del settore o sei disposto a trattarlo come un sistema di test. Puoi abilitare l'accesso root nella configurazione SSHD (spaventoso, ma è quello che ho fatto all'inizio) o creare un utente normale che possa accedere da remoto. In quest'ultimo caso, assicurati che l'utente faccia parte del gruppo "wheel" in modo che possa utilizzare su -
per diventare root e utilizzare Bastille:
root@generic:~ # adduser
Username: czanik
Full name: Peter Czanik
Uid (Leave empty for default):
Login group [czanik]:
Login group is czanik. Invite czanik into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh bash rbash git-shell nologin) [sh]: bash
Home directory [/home/czanik]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : czanik
Password : *****
Full Name : Peter Czanik
Uid : 1002
Class :
Groups : czanik wheel
Home : /home/czanik
Home Mode :
Shell : /usr/local/bin/bash
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (czanik) to the user database.
Add another user? (yes/no): no
Goodbye!
La quinta riga aggiunge l'utente al gruppo volante. Tieni presente che potresti avere un elenco diverso di shell sul tuo sistema e Bash non fa parte del sistema di base. Installa Bash prima di aggiungere l'utente:
pkg install bash
PKG deve eseguire il bootstrap al primo avvio, quindi l'invocazione del comando richiederà un po' più tempo questa volta.
Inizia con Bastiglia
Gestire le jail con gli strumenti del sistema base di FreeBSD è possibile, ma non proprio conveniente. Usare uno strumento come Bastille può semplificarlo notevolmente. Non fa parte del sistema base, quindi installalo:
pkg install bastille
Come puoi vedere dall'output del comando, Bastille non ha dipendenze esterne. È uno script di shell che si basa sui comandi del sistema base di FreeBSD (con un'eccezione che noterò più avanti quando spiegherò i modelli).
Se vuoi avviare i tuoi contenitori all'avvio, abilita Bastille:
sysrc bastille_enable="YES"
Inizia con un caso d'uso semplice. Molte persone utilizzano i contenitori per installare diversi strumenti di sviluppo in contenitori diversi per evitare conflitti o semplificare i propri ambienti. Ad esempio, nessuna persona sana di mente vorrebbe installare Python 2 su un sistema nuovo di zecca, ma potrebbe essere necessario eseguire uno script antico di tanto in tanto. Quindi, crea una prigione per Python 2.
Prima di creare la tua prima jail, devi avviare una versione di FreeBSD e configurare la rete. Assicurati solo di eseguire il bootstrap della stessa versione o di una versione precedente rispetto a quella in esecuzione sull'host. Per esempio:
bastille bootstrap 12.2-RELEASE
Scarica ed estrae questa versione nella struttura della directory /usr/local/bastille
.
La rete può essere configurata in molti modi diversi utilizzando Bastille. Un'opzione che funziona ovunque, sul computer locale e nel cloud, è l'utilizzo di interfacce clonate. Ciò consente alle jail di utilizzare una rete interna che non interferisce con la rete esterna. Configura e avvia questa rete interna:
sysrc cloned_interfaces+=lo1
sysrc ifconfig_lo1_name="bastille0"
service netif cloneup
Con questa configurazione di rete, i servizi nelle tue prigioni non sono accessibili dalla rete esterna, né possono raggiungere l'esterno. È necessario inoltrare le porte dall'interfaccia esterna del tuo host alle jail e abilitare la traduzione dell'accesso alla rete (NAT). Bastille si integra con il firewall PF di BSD per questa attività. Il seguente pf.conf
configura il firewall PF in modo tale che Bastille possa aggiungere dinamicamente regole di port forwarding al firewall:
ext_if="ue0"
set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo
table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if)
rdr-anchor "rdr/*"
block in all
pass out quick modulate state
antispoof for $ext_if inet
pass in inet proto tcp from any to any port ssh flags S/SA modulate state
È inoltre necessario abilitare e avviare PF affinché queste regole abbiano effetto. Tieni presente che se lavori tramite una connessione SSH, l'avvio di PF terminerà la connessione e dovrai effettuare nuovamente l'accesso:
sysrc pf_enable="YES"
service pf restart
Crea la tua prima prigione
Per creare una prigione, Bastille ha bisogno di alcuni parametri. Innanzitutto, è necessario un nome per la prigione che stai creando. È un parametro importante, poiché ti riferirai sempre a una prigione con il suo nome. Ho scelto il nome della prigione ungherese più famosa per i criminali più elitari, ma nella vita reale i nomi delle prigioni spesso si riferiscono alla funzione della prigione, come syslogserver
. Devi anche impostare la versione di FreeBSD che stai utilizzando e un indirizzo IP (protocollo Internet). Ho utilizzato un intervallo di indirizzi IP 10.0.0.0/8
casuale, ma se la tua rete interna utilizza già indirizzi provenienti da quello, utilizzare 192.168.0.0/16
è probabilmente una soluzione migliore idea:
bastille create csillag 12.2-RELEASE 10.17.89.51
La tua nuova prigione dovrebbe essere operativa entro pochi secondi. È un sistema base FreeBSD completo senza pacchetti aggiuntivi. Quindi installa alcuni pacchetti, come il mio editor di testo preferito, all'interno della prigione:
root@generic:~ # bastille pkg csillag install joe
[csillag]:
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
joe: 4.6,1
Number of packages to be installed: 1
The process will require 2 MiB more space.
442 KiB to be downloaded.
Proceed with this action? [y/N]: y
[csillag] [1/1] Fetching joe-4.6,1.txz: 100% 442 KiB 452.5kB/s 00:01
Checking integrity... done (0 conflicting)
[csillag] [1/1] Installing joe-4.6,1...
[csillag] [1/1] Extracting joe-4.6,1: 100%
Puoi installare più pacchetti contemporaneamente. Installa Python 2, Bash e Git:
bastille pkg csillag install bash python2 git
Ora puoi iniziare a lavorare nella tua nuova prigione appena creata. Non ci sono servizi di rete installati al suo interno, ma puoi raggiungerlo tramite la sua console:
root@generic:~ # bastille console csillag
[csillag]:
root@csillag:~ # python2
Python 2.7.18 (default, Feb 2 2021, 01:53:44)
[GCC FreeBSD Clang 10.0.1 (git@github.com:llvm/llvm-project.git llvmorg-10.0.1- on freebsd12
Type "help", "copyright", "credits" or "license" for more information.
>>>
root@csillag:~ # logout
root@generic:~ #
Lavora con i modelli
L'esempio precedente ha installato manualmente alcuni pacchetti all'interno di una jail. Configurare manualmente le jail non è divertente, anche se Bastille lo rende semplice. I modelli rendono il processo ancora più semplice; sono simili ai Dockerfile ma non hanno esattamente lo stesso concetto. Puoi eseguire il bootstrap dei modelli per Bastille proprio come le versioni di FreeBSD e poi applicarli alle prigioni. Quando applichi un modello, verranno installati i pacchetti necessari e verranno modificate le configurazioni secondo necessità.
Per utilizzare i modelli, è necessario installare Git sull'host:
pkg install git
Ad esempio, per eseguire il bootstrap del modello syslog-ng
, utilizzare:
bastille bootstrap https://gitlab.com/BastilleBSD-Templates/syslog-ng
Crea una nuova jail, applica il modello e reindirizza ad essa una porta esterna:
bastille create alcatraz 12.2-RELEASE 10.17.89.50
bastille template alcatraz BastilleBSD-Templates/syslog-ng
bastille rdr alcatraz tcp 514 514
Per testare il nuovo servizio all'interno della prigione, usa telnet per connettere la porta 514 del tuo host e inserisci del testo casuale. Usa il comando tail
all'interno della tua jail per vedere cosa hai appena inserito:
root@generic:~ # tail /usr/local/bastille/jails/alcatraz/root/var/log/messages
Feb 6 03:57:27 alcatraz sendmail[3594]: gethostbyaddr(10.17.89.50) failed: 1
Feb 6 04:07:13 alcatraz syslog-ng[1186]: Syslog connection accepted; fd='23', client='AF_INET(192.168.1.126:50104)', local='AF_INET(0.0.0.0:514)'
Feb 6 04:07:18 192.168.1.126 this is a test
Feb 6 04:07:20 alcatraz syslog-ng[1186]: Syslog connection closed; fd='23', client='AF_INET(192.168.1.126:50104)', local='AF_INET(0.0.0.0:514)'
Dato che sono un evangelista di syslog-ng, ho utilizzato il modello syslog-ng nel mio esempio, ma ce ne sono molti altri disponibili. Controlla l'elenco completo dei modelli Bastille per conoscerli.
Qual è il prossimo?
Spero che questo articolo ti ispiri a provare FreeBSD e Bastille sul tuo Raspberry Pi. Erano informazioni appena sufficienti per iniziare; per conoscere tutte le interessanti funzionalità di Bastille, come il controllo delle vulnerabilità delle tue jail e l'aggiornamento del software al loro interno, nella documentazione.