OpenBSD
Storia
Nel Giugno del 1996 Theo de Raadt, uno dei primi sviluppatori del NetBSD, si allontana dal progetto a causa di attriti con il resto della comunità. Il suo fork prenderà il nome di OpenBSD e i suoi obiettivi saranno: sicurezza, rispetto degli standard e portabilità.
Creazione di un supporto d'avvio per l'installazione
In questo articolo mi occuperò solamente dell'installazione e configurazione di base del port di OpenBSD per piattaforma i386 nella sua ultima versione: la 5.5. Per non sovraccaricare il server primario è consigliabile utilizzare un mirror, il mirror italiano si trova a questo indirizzo: ftp://openbsd.mirror.garr.it/pub/OpenBSD/5.5/i386/
Possiamo scegliere tra diversi file d'immagine per installare il sistema:
- floppy55.fs (Desktop PC) supporta la maggior parte delle periferiche PCI, ISA, dei controller IDE e SCSI e alcune schede PCMCIA.
- floppyB55.fs (Servers) supporta diversi controller RAID e SCSI non presenti nel floppy39.fs.
- floppyC55.fs (Laptops) contiene i driver CardBus and PCMCIA della maggior parte dei normali laptop.
- cd55.iso è una immagine ISO9660 che può essere usata per creare CD d'avvio. Contiene la più numerosa selezione di driver, se la macchina in cui vogliamo installare OpenBSD ha il supporto per il CDROM questa è probabilmente la scelta migliore.
- install55.iso immagine standard per l'installazione da CD-ROM, nella maggior parte dei casi è questo il file che conviene masterizzare
Creazione di un floppy di boot
Da sistemi BSD
Scaricare il file immagine desiderato (es. floppy55.fs)
Formattare un floppy
# fdformat /dev/rfd0c Format 1440K floppy `/dev/rfd0c'? (y/n): y Processing VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV done.
Se il floppy dovesse avere dei settori danneggiati sostituitelo.
Adesso scriviamo l'immagine sul floppy
# dd if=floppy55.fs of=/dev/rfd0c bs=32k
Da Linux
# fdformat /dev/fd0 # dd if=floppy55.fs of=/dev/fd0
Da MS DOS o Windows
Formattazione del floppy
C:\> format a:
Scrittura dell'immagine con rawrite
C:\> rawrite RaWrite 1.2 - Write disk file to raw floppy diskette Enter source file name: floppy55.fs Enter destination drive: a Please insert a formatted diskette into drive A: and press -ENTER- : Enter
Creazione di una ISO personalizzata
Molti potrebbero avere bisogno di un'iso per cdrom contenente non solo il sistema base, ma anche i sorgenti o dei pacchetti precompilati. Se vogliamo contribuire finanziariamente al progetto OpenBSD è possibile ordinare su http://www.openbsd.org/items.html i CD originali a 45 € + spese di spedizione. È comunque possibile creare un'iso NON ufficiale a partire dal materiale disponibile su Internet.
Scaricate tutto il contenuto di ftp://openbsd.mirror.garr.it/pub/OpenBSD/5.5/i386/ in OpenBSD/5.5/ Io per eseguire queste operazioni uso wget con l'opzione mirror, ma è possibile utilizzare qualsiasi client ftp.
# wget -m ftp://openbsd.mirror.garr.it/pub/OpenBSD/5.5/i386/ # mv openbsd.mirror.garr.it/pub/OpenBSD . # rm -rf openbsd.mirror.garr.it # cd OpenBSD/
Se ci interessa possiamo scaricare
- ports.tar.gz - l'albero dei ports.
- src.tar.gz - i sorgenti del sistema operativo di base.
- sys.tar.gz - i sorgenti del kernel.
- xenocara.tar.gz - i sorgenti del server grafico.
Possiamo anche creare la directory packages/ e aggiungervi qualsiasi pacchetto precompilato si desideri installare dopo l'installazione del sistema di base. Naturalmente si dovrà fare attenzione alle dipendenze di ciascun pacchetto scaricato e a non superare lo spazio del supporto sul quale vogliamo andare a scrivere la nostra iso.
# mkdir packages # cd packages # wget -m ftp://openbsd.mirror.garr.it/pub/OpenBSD/5.5/packages/i386/
Se non ci siete tornate nella cartella OpenBSD/ e date un comando di questo genere per creare la vostra iso
# mkisofs -r -l -V "OpenBSD-5.5" -A "OpenBSD v5.5-Release, \ Custom ISO, 06-05-2014." -b 5.5/i386/install55.fs -c boot.catalog \ -o openbsd-i386-5.5.iso ../OpenBSD/
Per masterizzare l'iso va bene qualsiasi programma: K3B, Nero o da linea di comando:
# cdrecord -v -tao dev=/dev/il_vostro_masterizzatore -data driveropts=burnfree openbsd-i386-5.5.iso
Installazione
Partiamo dal presupposto che stiate usando un'iso "tipo" la mia. Le parole o le lettere in neretto corrispondono a quello che dovreste digitare per proseguire con l'installazione. Fate fare il boot da CDROM al vostro computer e se tutto va bene dovrebbe apparirvi questo:
(I)nstall, (U)pgrade or (S)hell? i
Welcome to the OpenBSD/i386 5.5 install program.
This program will help you install OpenBSD in a simple and rational way. At
any prompt except password prompts you can run a shell command by typing
'!foo', or escape to a shell by typing '!'. Default answers are shown in []'s
and are selected by pressing RETURN. At any time you can exit this program by
pressing Control-C and then RETURN, but quitting during an install can leave
your system in an inconsistent state.
Specify terminal type: [vt220] Enter
kbd(8) mapping? ('?' for list) [none] it
Come da esempio premete prima Enter (a meno che non stiate usando una console seriale) per selezionare il terminale di default e poi it per selezionare il layout per la tastiera italiana.
IS YOUR DATA BACKED UP? As with anything that modifies disk contents, this program can cause SIGNIFICANT data loss. It is often helpful to have the installation notes handy. For complex disk configurations, relevant disk hardware manuals and a calculator are useful. Proceed with install? [no] yes
Cool! Let's get to it...
You will now initialize the disk(s) that OpenBSD will use. To enable all available security features you should configure the disk(s) to allow the creation of separate filesystems for /, /tmp, /var, /usr, and /home. Available disks are: wd0. Which one is the root disk? (or done) [wd0] Enter
Se il sistema riconosce più di un disco (es. wd1) potete specificare un supporto diverso da wd0, probabilmente però dovrete installare un boot loader (es. GRUB) per poter avviare la partizione dove avete installato OpenBSD.
Do you want to use *all* of wd0 for OpenBSD? [no] yes
Se invece non avete intenzione di usare l'intero hard disk vi consiglio di partizionarlo da Linux con cfdisk o con un qualsiasi altro tool grafico perché l'fdisk dell'OpenBSD è studiato per portare i neuroni dell'utente al suicidio di massa.
Ora ci troveremo ad usare disklabel per creare le slice nella partizione dell'OpenBSD. Aggiungiamo una label per la /
> a a offset: [63] Enter
Il punto di inizio della partizione, va bene il valore che ci dà lui.
size: [xxxxxxxxx] 2000m
A size possiamo indicare la grandezza della slice, nel caso dell'esempio 2000 Mb, specificando k per Kb, m per Mb o g per Gb dopo il valore numerico che abbiamo inserito.
Rounding to nearest cylinder: xxxxxx FS type: [4.2BSD] Enter mount point: [none] /
Aggiungiamo una label di swap
> a b offset: [xxxxxx] Enter size: [xxxxxxxx] 300m Rounding to nearest cylinder: xxxxxx FS type: [swap] Enter
Per uso server o multiutente sarebbe indicato aggiungere anche delle slice per: /tmp, /var e /home
> a d offset: [xxxxxxx] Enter size: [xxxxxxx] 200m Rounding to nearest cylinder: xxxxx FS type: [4.2BSD] Enter mount point: [none] /tmp
E così via...
> p m
Per visualizzare la situazione definitiva con i parametri in Megabyte.
> q Write new label?: [y] Enter OpenBSD filesystems: wd0a / The next step *DESTROYS* all existing data on these partitions! Are you really sure that you're ready to proceed? [no] y
Configurazione del sistema di base
Enter system hostname (short form, e.g. 'foo'): nistagmo
Configure the network? [yes] Enter Available interfaces are: ne0 Which one do you wish to initialize? (or 'done') [ne0] Enter Symbolic (host) name for ne0? [nistagmo] Enter The default media for ne0 is media: Ethernet autoselect (10baseT) Do you want to change the default media? [no] Enter IP address for ne0? (or 'dhcp') 192.168.254.1
Se nella vostra lan c'è un server dhcp potere usare il dhcp client invece dell'indirizzo IP statico, basta scrivere dhcp.
Netmask? [255.255.255.0] Enter
IPv6 address for fxp0? (or 'rtsol' or 'none') [none] No more interfaces to initialize. DNS domain name? (e.g. 'bar.com') [my.domain] home.net
DNS nameserver? (IP address or 'none') [none] IP.vostro.DNS Use the nameserver now? [yes] Enter
Default route? (IP address, 'dhcp' or 'none') IP.vostro.gateway
add net default: gateway 192.168.254.254 Edit hosts with ed? [no] Enter Do you want to do any manual network configuration? [no] Enter
Naturalmente dovete inserire i dati della vostra rete (IP, DNS, gateway...).
Password for root account? (will not echo) password_non_ovvia
Password for root account? (again) password_non_ovvia
"Will not echo" significa che non vedrete comparire niente sullo schermo mentre digitate la password, niente lettere ne asterischi. Per conferma dopo dovrete ridigitarla.
Installazione del sistema di base
Let's install the sets! Location of sets? (cd disk ftp http or 'done') [cd] Enter
Available CD-ROMs are: cd0.
Se abbiamo usato un floppy di boot, se ci siamo scordati qualcosa nella directory /5.5/i386/ della nostra iso o per qualsiasi altro motivo è possibile installare il sistema di base anche via ftp, http o da un altro disco.
Which one contains the install media? (or 'done') [cd0] Enter
Pathname to the sets? (or 'done') [5.5/i386] Enter
Select sets by entering a set name, a file name pattern or 'all'. De-select sets by prepending a '-' to the set name, file name pattern or 'all'. Selected sets are labeled '[x]'.
[X] bsd [X] bsd.rd [ ] bsd.mp [X] base38.tgz [X] etc38.tgz [X] misc38.tgz [X] comp38.tgz [X] man38.tgz [X] game38.tgz [ ] xbase38.tgz [ ] xetc38.tgz [ ] xshare38.tgz [ ] xfont38.tgz [ ] xserv38.tgz File Name? (or 'done') [bsd.mp] all
File Name? (or 'done') [done] Enter
Vi consiglio di selezionarli tutti ed installarli, ulteriori dettagli sono disponibili qui.
Getting bsd ... 100% |**************************************************| 5157 KB 00:08
[..]
Location of sets? (cd disk ftp http or 'done') [done] Enter
Ultimazione dell'installazione
Start sshd(8) by default? [yes] Enter
Se volete che il demone ssh venga avviato automaticamente all'avvio premete invio.
Start ntpd(8) by default? [no]
Il network time protocol daemon è un demone che sincronizza automaticamente l'orologio della vostra macchina con alcuni server su Internet. Se avete una connessione ADSL flat può essere una buona idea rispondere yes, se non vi interessa premete Invio.
Do you expect to run the X Window System? [yes] Enter
Se pensate di utilizzare il sistema grafico confermate anche questa opzione.
Change the default console to com0? [no] Enter
A meno che non sappiate cosa state facendo rispondete di no.
What timezone are you in? ('?' for list) [Canada/Mountain] Europe/Rome
Adesso l'installazione è finita, quando compare la shell scrivete halt e godetevi la viosta OpenBSD box.
CONGRATULATIONS! Your OpenBSD install has been successfully completed! To boot the new system, enter halt at the command prompt. Once the system has halted, reset the machine and boot from the disk. # halt
syncing disks... done
The operating system has halted. Please press any key to reboot.
Rendere il sistema più user friendly
Inserite queste righe nel file: /etc/profile
export PS1="[\u@\h \W]\\$ " alias ls='ls -a' alias ll='ls -l' alias free='top -n | head -5' PKG_PATH="http://openbsd.mirror.garr.it/pub/OpenBSD/5.5/packages/i386/" export PKG_PATH
Vi troverete una shell con un impatto visivo molto simile alla Bash di Linux, che volendo possiamo anche installare dato che è presente nei packages e nei ports.
[nomeutente@nomecomputer directory]$
Avendo esportato automaticamente il PKG_PATH, al prossimo login (non importa riavviare), per installare un pacchetto da Internet vi sarà sufficiente usare
# pkg_add nomepacchetto-versione.tgz
Create le directory /mnt/cdrom e /mnt/floppy dove montare i rispettivi device, su OpenBSD di default non vengono create.
# mkdir /mnt/cdrom # mkdir /mnt/floppy
Successivamente modificatefile: /etc/fstab aggiungendo le righe:
/dev/fd0a /mnt/floppy msdos rw,noauto,nosuid 0 0 /dev/cd0a /mnt/cdrom cd9660 ro,noauto 0 0
Adesso per montare cdrom e floppy basteranno i comandi:
# mount /mnt/cdrom # mount /mnt/floppy
Se come me avete un'immagine ISO di OpenBSD con una cartella 5.5/packages piena di pacchetti precompilati, per installarvi dovrete entrare in quella cartella e dare il comando:
# pkg_add pacchetto-versione.tgz
Per togliere un pacchetto invece:
# pkg_delete pacchetto-versione.tgz
L'albero dei port
Per compilare i pacchetti in maniera automatica possiamo decomprimere l'archivio ports.tar.gz nella directory /usr.
# cp /mnt/cdrom/5.5/ports.tar.gz /usr # cd /usr # tar -xzvf ports.tar.gz # rm ports.tar.gz # cd ports
Nella directory /usr/ports troveremo tutti i sorgenti dei pacchetti del software aggiuntivo disponibili per OpenBSD. Es.: per compilare ed installare nmap dovremo fare così:
# cd /usr/ports/net/nmap # make install
Configurazione di alcuni demoni utili
Editando il file di configurazione /etc/rc.conf è possibile gestire l'avvio automatico dei server del sistema di base. Però come sostengono anche nel manuale ufficiale dell'OpenBSD sarebbe buona norma non toccare mai il file /etc/rc.conf. Per facilitare successivi upgrade è meglio creare al suo posto il file /etc/rc.conf.local che al boot ne sovrascrive le impostazioni e copiarvi solamente le linee che vogliamo modificare. In questo modo otteniamo un unico file contenente tutte le modifiche.
Per avviare automaticamente Apache (già sotto chroot)
# echo httpd_flags= >> /etc/rc.conf.local
Bind
# echo named_flags= >> /etc/rc.conf.local
Personalmente cerco sempre di avere un server dns di cache nella mia rete locale in modo da non essere dipendente da quello del mio ISP. Una volta avviato Bind per sfruttarlo dal computer dove è installato dovrete anche modificare il file /etc/resolv.conf ed aggiungere come prima riga:
nameserver 127.0.0.1
Per gli altri computer della rete sarà sufficiente indicare come server DNS l'indirizzo IP locale del vostro server Bind, oppure effettuare tutto tramite dhcp se lo avete installato sul server.
Server dhcp
Editare il file /etc/dhcpd.interfaces selezionando la scheda di rete dove vogliamo rendere attivo il server dhcp. Dovremmo scegliere una delle schede di rete della rete interna.
# $OpenBSD: dhcpd.interfaces,v 1.1 1998/08/19 04:25:45 form Exp $ # # List of network interfaces served by dhcpd(8). # ne0 #ep0 #de1
Adesso modifichiamo in questo modo il file /etc/dhcpd.conf
# $OpenBSD: dhcpd.conf,v 1.1 1998/08/19 04:25:45 form Exp $ # # DHCP server options. # See dhcpd.conf(5) and dhcpd(8) for more information. # # Network: 192.168.1.0/255.255.255.0 # Domain name: my.domain # Name servers: 192.168.1.3 and 192.168.1.5 # Default router: 192.168.1.1 # Addresses: 192.168.1.32 - 192.168.1.127 # shared-network LOCAL-NET { option domain-name "openbsd.router"; option domain-name-servers 127.0.0.1; subnet 192.168.0.0 netmask 255.255.255.0 { option routers 192.168.0.1; range 192.168.0.100 192.168.0.150; } }
option domain-name-servers 127.0.0.1 - indica il server DNS che nel nostro caso coincide con la macchina stessaper cui lo imposteremo con l'indirizzo 127.0.0.1
option routers 192.168.0.1; - indica l'indirizzo IP del gateway, corrisponde all'IP della scheda di rete sul quale vogliamo attivare il dhcpd.
range 192.168.0.100 192.168.0.150; - ci permette di selezionare un range di indirizzi IP per il dhcp. Secondo le mie impostazioni nella LAN posso utilizzare gli indirizzi da 192.168.0.1 a 192.168.0.99 staticamente come IP fissi, mentre quelli da 192.168.0.100 a 192.168.0.150 verranno assegnati dinamicamente dal demone dhcp. (Anche gli indirizzi sopra al 192.168.0.150 sono liberi).
Per attivare il servizio dhcpd dovremo editare nuovamente il file /etc/rc.conf sostituendo la riga
dhcpd_flags=NO # for normal use: ""
con
dhcpd_flags="" # for normal use: ""
Condivisione della connessione
Per condividere la connessione dobbiamo attivare l'IP forwarding in modo che i pacchetti possano passare dal router al client che li ha richiesti.
# sysctl net.inet.ip.forwarding=1
Per rendere questa modifica permanente dovremo modificare il file /etc/sysctl.conf modificando la riga
net.inet.ip.forwarding=0
in
net.inet.ip.forwarding=1
Ed abilitare il routing da /etc/rc.conf sostituendo
routed_flags=NO # for normal use: "-q"
con
routed_flags="-q" # for normal use: "-q"
Adesso è la volta di vedere la configurazione del firewall /etc/pf.conf
Selezioniamo l'interfaccia di rete verso l'esterno
ext_if="pppoe0"
Adesso quella verso la LAN interna attraverso la quale condivideremo la connessione
int_if="ne0"
Impostiamo il nat dall'interfaccia esterna a tutte le altre
nat on $ext_if from !($ext_if) -> ($ext_if:0)
Blocchiamo in ingresso dall'esterno la porta 53, quella del DNS, per quando riguarda
il protocollo UDP così che nessuno da fuori possa sfruttare il nostro dns
block in on $ext_if proto udp to port = 53
Potremmo bloccare la porta UDP 53 anche solamente per un certo range di IP, ad esempio
gli IP che non fanno parte della sottorete 150.xxx.xxx.0/24
block in on $ext_if proto { tcp, udp } from !150.xxx.xxx.0/24 to port = 53 keep state
Blocchiamo i pacchetti ICMP così non ci rompono le scatole con i ping
block in proto icmp from any to any
# scrub for NAT in PPPoE for using max mtu value # questo parametro seve per far funzionare il nat con il pppoe scrub out on pppoe0 max-mss 1440
Configurazione dell'interfaccia hostname.pppoe
OpenBSD permette una semplice configurazione di tutte le interfacce di rete. Dobbiamo creare dei file del tipo hostname.nome_device nella directory /etc
es. il file /etc/hostname.ep0 potrebbe contenere quanto segue:
inet 192.168.0.1 255.255.255.0 NONE
Oppure, se viene configurata tramite dhcp semplicemente avere questa riga:
dhcp
Significherebbe che la nostra scheda di rete /dev/ep0 ha l'indirizzo 192.168.0.1 e la netmask 255.255.255.0
I sistemi BSD identificano le schede di rete col nome del driver ed un numero, quindi possono coesistere più schede con il medesimo numeo.
Non avremo come su Linux /dev/eth0, eth1, eth2... ma ne0, ne1 se abbiamo due schede NE2000 compatibile; ep0, ep1, ep2 per le 3Com e così via.
Un'impostazione tipica del file /etc/hostname.ppoe0
pppoedev ne0 !/sbin/ifconfig ne0 up !/usr/sbin/spppcontrol \$if myauthproto=pap myauthname=testcaller \ myauthkey=donttell !/sbin/ifconfig \$if inet 0.0.0.0 0.0.0.1 netmask 0xffffffff !/sbin/route add default 0.0.0.1 up
ne0 è l'interfaccia di rete alla quale è attaccato il modem ethernet. myauthname e mayautkey sono rispettivamente l'username e la password.
Pure-ftpd
Pure-ftpd è un server ftp molto semplice, ma al tempo stesso altamente configurabile. Per installarlo lanciamo il comando:
# pkg_add pure-ftpd-1.0.20.tar.gz
Per eseguirlo automaticamente all'avvio è necessario aggiungere al file /etc/rc.local queste righe:
if [ -x ${PREFIX}/sbin/pure-ftpd ]; then echo Starting Pure-FTPd ${PREFIX}/sbin/pure-ftpd -A -B -H -u1000 fi
Questa sopra è la configurazione di default, ecco invece la mia:
if [ -x ${PREFIX}/sbin/pure-ftpd ]; then echo Starting Pure-FTPd ${PREFIX}/sbin/pure-ftpd -B -A -H -u 1000 -c 3 -C 5 -y 4:3 -n 40000:100 -k 95 \ -O stats:/var/log/pureftpd.log -I 5 -F /etc/welcome.msg -t 1:15 fi
Vi spiego brevemente a cosa servono tutti gli argomenti che ho impostato: -B demonizza il processo
-A fa il chroot del server
-H non risolve via dns gli IP delle connessioni, risparmiando banda e cpu
-u <valore> nessun utente con un gid inferiore a "valore" può loggarsi, utile per non far loggare root
-c limite di connessioni dallo stesso IP
-C limite totale di connessioni supportate
-y limite di connessioni per uno stesso utente:utente_anonimo
-n limite numero_files:Mb_occupati, permette di creare delle quote che l'utente non può superare
-k se il disco è pieno più del 95% non permette upload
-O stats:/var/log/pureftpd.log esegue il log del server nel formato stats sul file indicato
-I Timeout in minuti, nel mio caso se un utente rimane inattivo per più di 5 min viene disconnesso
-F permette di indicare un file col messaggio di benvenuto
-t limita la banda degli utenti anonimi upload:download
-T limita la banda utenti normali upload:download
-a permette di indicare un gid corrispondente ad un gruppo di utenti considerati trusted che di conseguenza non vengono chrootati. Non va usato insieme all'opzione -A.