Amministrazione di sistema
Installazione e gestione di server basati su GNU/Linux
Indice
Architettura di un sistema GNU/Linux
Paradigmi progettuali POSIX
FHS
Bootstrap del sistema
Gestione del disco
Installazione con debootstrap
Chroot
Gestione dei servizi
Networking (base)
Screen
Architettura x86
Architettura GNU/Linux
Architettura GNU/Linux
Paridigmi progettuali POSIX
Everything is a file
KISS (Keep it simple and stupid)
Everything is a file
Ordinary/plain files
documenti, dati binari, eseguibili
Directory
file speciali che memorizzano una lista del loro contenuto
Special/device file
rappresentano un’astrazione dell’hardware di sistema, possono essere a caratteri o a blocchi, a seconda del tipo di accesso che consentono
KISS (Keep it simple, stupid)
Per ottenere funzionalità avanzate è possibile concatenare i comandi base
Le configurazioni sono basate su file di testo intellegibili
La potenza, versatilità e velocità dell’interfaccia CLI tipica di un sistema GNU/Linux è diretta conseguenza di questo paradigma
FHS (1/2)
L’organizzazione del file system su sistemi GNU/Linux segue uno standard denominato FHS (FS Hierarchy Standard)
Il filesystem è caratterizzazo da una struttura ad albero rovesciato, la cui origine prende il nome di root (radice) ed è rappresentato dal simbolo /
FHS definisce dei percorsi standard in cui devono essere posizionate le risorse del sistema
FHS (2/2)
Segue una lista di alcune delle principali directory di sistema:
- /boot: contiene il kernel e tutti i file e gli eseguibili necessari nella fase di boot
- /etc: continene tutte le configurazioni di sistema
- /dev: directory adibita a contenere i device files (devfs)
- /bin: eseguibili base di un sistema POSIX (ls, mv..)
- /sbin: eseguibili base di un sistema POSIX per task di amministrazione (ifconfig, mkfs..)
- /lib: librerie condivise di sistema
- /usr -> /usr/bin /usr/sbin /usr/lib: replica parte della struttura di / e contiene applicazioni di alto livello (server grafico, programmi utente)
Nomenclatura dischi
Linux utilizza diversi sistemi per riconoscere i dischi installati e le partizioni.
Il primo, e più conosciuto, è quello che identfica i dischi con /dev/hdx (IDE/ATA) e /dev/sdx (SCSI/SATA), dove x è una lettera dell’alfabeto che indica l’ordine dei dischi. A questa sigla si aggiunge un numero cardinale che indica il numero della partizione.
Esiste un secondo sistema per identificare le partizioni in maniera univoca: gli UUID. Tali codici vengono generati in fase di formattazione e possono essere utilizzati per le operazioni comuni come boot e mount
Per ottenere la lista degli UUID:
$> sudo blkid
Partizionamento (schemi comuni)
In fase di progettazione di un server un aspetto estremamente delicato (e spesso sottovalutato) è la definizione dello schema di partizionamento da adottare.
Nota: Linux mette a disposizione del SysAdmin degli strumenti estremamente sofisticati per gestire i dischi in maniera più granulare, con funzionalità di labelling, grouping, shrinking e hot-snapshotting (LVM2)
Gestione delle partizioni
Esempi:
fdisk /dev/sda
echo -e “m\np\nq” | fdisk /dev/sda
Creazione dei filesystem
GNU/Linux supporta una vasta gamma di filesystem attraverso l’utilizzo di componenti kernel-space (driver per consentire al kernel di leggere/scrivere) ed user-space (programmi di supporto per la manipolazione dei filesystem).
mkfs -t ext3 -l badblocks /dev/hda1
mkfs -t vfat /dev/sdc1
Un caso particolare è l’area di swap, che deve essere inizializzata con un comando ad-hoc:
mkswap /dev/sda1
Check dei filesystem
A volte può capitare che, a causa di rimozioni di file e/o spostamenti, o di spegnimento forzato del sistema, le strutture dati interne al FS debbano essere riorganizzate per ottimizzare l’accesso o per sopperire ad eventuali errori (ad es. blocchi difettosi).
# trova e corregge gli errori su un filesystem ext3
fsck -t ext3 -f -p /dev/hda1
Sequenza di boot
boot loader (grub)
kernel e initrd (Linux chainload)
mount dei filesystem
init/upstart e processi di sistema
Bootstrap x86
Durante la fase di bootstrap su architetture x86 vengono eseguite le seguenti operazioni:
- caricamento iniziale di un particolare SW chiamato BIOS (Base I/O System), residente su una memoria EPROM e non modificabile (se non con procedure apposite). Il BIOS sovraintende alle operazioni minime di I/O del PC
- esecuzione del POST (Power-ON Self Test)
- caricamento del boot loader ed esecuzione del master boot code
MBR
L’MBR (Master Boot Record) è il primo settore del primo Hard Disk di un PC ed è caratterizzato da una dimensione fissa di 512Bytes. Esso, su architetture x86, svolge due funzioni estremamente importanti:
- contiene la tabella delle partizioni (ultimi 64Bytes + firma 0xAA55)
- contiene il boot loader, necessario all’avvio del SO (300Bytes + 80 di messaggi di errore)
Boot Loader
Per poter avviare un SO su PC x86, senza bisogno di mettere mano all’hardware, è indispensabile un boot loader
Un BL è un programma che si inserisce nella fase di bootstrap del sistema e permette di scegliere il SO da avviare. Su GNU/Linux l’attuale BL standard è GRUB (che ha soppiantato il vetusto LILO)
I boot loader espongono inoltre l’importante funzionalità del passaggio di parametri al SO, in modo da modificare il tipo di avvio.
GRUB (1/2)
Caratteristiche:
- bl universale: può caricare la maggior parte dei SO esistenti
- flessibilità : può essere installato su HD, CD-ROM, Memorie USB
- configurazione attraverso un normale file di testo (in genere /boot/grub/menu.lst)
- utility per la configurazione automatizzata (grub-install, update-grub, grub-floppy, …)
- accesso nativo al contenuto dei filesystem. Attualmente sono supportati Ext2/Ext3, ReiserFS, XFS, JFS, UFS, VFAT
GRUB integra una console interattiva, grazie alla quale è possibile installarlo o configurarlo al volo
GRUB (2/2)
Proprio a causa della sua estrema flessibilità , GRUB è costituito da tre componenti, di cui due obbligatorie e una opzionale:
- Stage 1: obbligatorio. Risiede nell’MBR ed effettua il solo caricamento degli stage successivi
- Stage 1.5: opzionale. Risiede all’inizio della partizione di boot - sovraintende il caricamento dei driver di FS e dello stage 2
- Stage 2: obbligatorio. Risiede anch’esso all’inizio della partizione di boot. Carica il menù di scelta del SO con la console integrata e inizia il processo di chainload.
Installazione interattiva di GRUB
Per installare in maniera interattiva GRUB sono necessari i seguenti step:
Linux chainload
Con il passaggio dai kernel 2.4.x ai 2.6.x, la ‘chainload’ del sistema è stata modificata, passando dall’uso di initrd (un root fs temporaneo che contiene tutti i moduli necessari all’avvio del sistema), ad un meccanismo più flessibile: initramfs:
- Il sistema carica il kernel base (vmlinuz)
- Successivamente viene montato in ram un root filesystem temporaneo (initramfs), che contiene i moduli necessari ad inizializzare l’hardware (controller dei dischi, framebuffer..)
- Dopo questa fase di configurazione, viene montato il root fs definitivo (passato mediante l’opzione root) e viene richiamato init
SystemV init e avvio dei servizi
init è il primo processo eseguito su sistemi Unix-like, ed ha il compito lanciare ( spawn ) tutti gli altri processesi.
Generalmente init è lanciato in modalità demone ed è caratterizzato da PID 1.
Nota: le ultime versioni di Debian (e derivate) hanno sostituito SysV init con il nuovo sistema upstart, che gestisce avvii concorrenti e gestione delle dipendenze tra processi
Mount dei filesystem
Nota: fanno eccezione il rootfs e i fs speciali (devfs, sysfs, procfs), che vengono montati dagli script di initramfs
Sysadmin installation
Il System Administrator ha in genere delle esigenze molto diverse da quelle dell’utente di un sistema Desktop.
ControllabilitÃ
Il sysadmin deve poter controllare con precisione quali servizi devono essere attivi nel sistema.
Deve inoltre avere il pieno controllo dei file di configurazione e dei dati necessari alle applicazioni installate.
FlessibilitÃ
Il sysadmin deve poter decidere cosa utilizzare, eliminando il superfluo (o potenzialmente dannoso) e aggiungendo ciò che si rende necessario per:
- fornire i servizi richiesti
- correggere un problema segnalato
- supportare una nuova periferica…
RiproducibilitÃ
Il syadmin deve poter riprodurre più volte i risultati ottenuti, possibilmente senza dover ripetere tutti i passi intermedi rivelatisi necessari la prima volta.
Spesso i server non sono del tutto eterogenei tra loro, ma hanno molte caratteristiche comuni.
Inoltre una volta messo online un servizio si deve essere in grado di sostituirlo in qualsiasi momento e il più velocemente possibile.
Debootstrap
Debootstrap è basato esclusivamente su bash, wget, ar e tar e per questo motivo è in grado di funzionare da un qualsiasi sistema *nix-like
Utilizzo:
debootstrap [opzioni] SUITE TARGET_DIR
&> debootstrap –arch=amd64 karmic karmic
Chroot
L’operazione di chroot su sistemi *nix permette di cambiare al volo la root directory per tutti i processi lanciati dall’interno della stessa.
Dal momento in cui un programma viene spostato in una chroot, non potrà più accedere a dati all’esterno della stessa, che pertanto prende il nome di chroot jail.
La chroot è estremamente utile nelle seguenti situazioni:
- postconfigurazione di un sistema installato in debootstrap
- sandboxing di servizi di rete
- primo livello di virtualizzazione (v.di OpenVZ)
- sviluppo / testing
Postconfigurazione
Al termine di un’installazione con debootstrap si rendono necessari alcuni step di postconfigurazione:
- installazione di un kernel
- setting hostname
- configurazione delle partizioni
- configurazione di rete (interfaces e resolv.conf)
- installazione e configurazione del bootloader
- impostazione password di root
- reboot!
Caso pratico
Installazione su VM (Qemu/KVM) con debootstrap e rsync
System V INIT
Tradizionalmente esistono due principali modalità di init: BSD e System V. Quest’ultimo è quello utilizzato da GNU/Linux e consiste di una serie di script shell organizzati in directory
Ogni directory corrisponde ad un particolare runlevel. Le directory sono create all’interno di /etc ed hanno nome rcN.d, dove N rappresenta il runlevel stesso. All’interno di tali directory sono presenti link agli script da lanciare.
nico@alcadds:/etc$ ls -ld rc?.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc0.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc1.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc2.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc3.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc4.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc5.d
drwxr-xr-x 2 root root 4096 2010-05-25 12:13 rc6.d
drwxr-xr-x 2 root root 4096 2009-11-19 12:38 rcS.d
Runlevels
Un runlevel è una abbreviazione numerica per definire una determinata modalità operativa del sistema
La modalità di boot scelta viene configurata all’interno del file /etc/inittab con la direttiva di configurazione initdefault. Esistono diversi runlevel, ognuno con un uso differente:
0
: Halt del sistema
1
: Single-User Mode, nessuna interfaccia di rete
2
: Multi-User Mode, nessuna interfaccia di rete
3
: Multi-User Mode, networking abilitato
4
: Non utilizzato, disponibile per l’utente
5
: Multi-User Mode come nel 3 ed interfaccia grafica
6
: Reboot
S
: Single-User Mode, come nel 3, il terminale diventa console
Nota: su sistemi Debian (e derivati) non viene fatta distinzione tra i runlevel dal 2 al 5 (tutti multi-user in modalità grafica)
Networking
La configurazione base della rete su sistemi Linux è mantenuta in una manciata di file di configurazione:
- /etc/hostname: nome host della macchina
- /etc/hosts: lista degli host noti
- /etc/resolv.conf: configurazione del DNS
- /etc/network/interfaces: configurazione delle interfacce di rete
Gestione dei DNS
resolv.conf è il file in cui GNU/Linux mantiene le configurazioni per il sistema di risoluzione dei “nomi” di rete (DNS)
È indispensabile per una macchina che deve collegarsi ad Internet o ad una rete dotata di servizi avanzati. Le opzioni di configurazione sono state progettate per essere facilmente comprensibili, ad esempio:
# /etc/resolv.conf di esempio
nameserver 192.168.0.1
domain foobar.com #nome del dominio locale
search foobar.com #lista di ricerca per i nomi degli host
Configurazione delle interfacce
/etc/network/interfaces è il file per la configurazione delle interfacce di rete di sistema.
Anche in questo caso le opzioni di configurazione sono facilmente comprensibili. Il file è organizzato in stanze, ognuna delle quali consta di una o più righe.
auto lo eth0 eth1
iface lo inet loopback
iface eth0 inet dhcp
iface eth1 inet static
address 192.168.0.100
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
Configurazione manuale: ifconfig
Es. di configurazione:
- ifconfig eth0 10.1.1.102 netmask 255.255.255.0 broadcast 10.1.1.255 up
Visualizzazione info:
Configurazione manuale: route
Il comando “route” serve a manipolare le tabelle di routing del kernel.
Es. configurazione rotta di default:
- route add default gw 10.0.0.1
Aggiunta di una rotta verso una particolare rete:
- route add -net 192.168.76.0 netmask 255.255.255.0 dev eth0
Visualizzazione tabelle di routing:
Configurazione manuale: ip
Esso permette infatti di visualizzare e configurare routing, interfacce, policy di routing e tunnels.
Esempi:
- sintassi standard: ip [opzioni] oggetto [comando [argomenti]]
- ip addr list (ip a)/ ip route list (ip r)
- ip addr add 10.1.1.1 dev tap0 && ip link set tap0 up
- ip route add default via 10.1.1.1
Creazione di un bridge: brctl
Il comando “brctl” è usato per configurare, gestire e monitorare i bridge ethernet nel kernel linux.
Un bridge ethernet è un dispositivo usato per connettere interfacce e reti differenti in un unico dominio comune.
Esempi:
- brctl addbr brname
- brctl delbr brname
- brctl show brname
- brctl addif brname ifname
- brctl delif brname ifname
Network filtering
Il codice di firewalling Linux ha una lunga storia:
Kernel 2.0 (1996): ipfwadm
Kernel 2.2 (1999): ipchains
Kernel 2.4 e 2.6 (2001): iptables
Network filtering
Il framework netfilter/iptables gestisce tutte le attività di firewalling su Linux. In particolare:
netfilter è l’insieme dei moduli in kernel space
iptables il comando con cui si gestisce netfilter
Feature principali
Packet filtering stateless e stateful
Supporto IPv4 e IPv6
Ogni tipo di natting (DNAT, SNAT..)
Infrastruttura estendibile
Architettura a plug-in
Architettura di netfilter (1/2)
La gestione dei pacchetti di rete è ottenuta attraverso tre componenti:
- Tabelle ( tables ): sovrainsiemi di regole ordinate e adibite allo stesso scopo.
- Catene ( chains ): elenchi di regole eseguiti in un particolare momento dell’elaborazione dei pacchetti. Ogni tabella espone una serie di catene di default (INPUT, OUTPUT, FORWARD..), alla quale possono aggiungersi catene custom
- Regole ( rules ): ogni regola è caratterizzata da criteri (matching) e target (azione da intraprendere: -j ACCEPT, -j DROP ..)
Architettura di netfilter (2/2)
Iptables lavora su 3 tabelle (tables):
- filter - regola il firewalling (policy di accettazione/drop dei pacchetti)
- nat - regola le attività di natting
- mangle - interviene sulla alterazione dei pacchetti.
Firewall
La tabella predefinita (implicita) su cui opera iptables è filter. Essa riguarda le attività di filtraggio del traffico.
filter presenta 3 catene di default:
- INPUT - pacchetti destinati al sistema (in ingresso da ogni interfaccia)
- OUTPUT - pacchetti originati dal sistema (in uscita)
- FORWARD - pacchetti che attraversano il sistema, con IP sorgente e destinazione esterni.
Gestione delle catene
Inserimento regole:
iptables -A CATENA ... - Aggiunge una regola alla fine della catena indicata
iptables -I CATENA [#] ... - Inserisce alla riga # (default 1) una regola nella catena indicata
iptables -N CATENA - Crea una nuova catena custom
iptables -P CATENA TARGET - Imposta il target di default per la catena indicata
Rimozione regole e azzeramenti:
iptables -F [catena] - Ripulisce tutte le catene (o quella indicata)
iptables -X [catena] - Ripulisce tutte le catene custom (o quella indicata)
iptables -Z [catena] - Azzera i contatori sulle catene
iptables -D catena # - Cancella la regola numero # dalla catena indicata
Matching (1/2)
Esistono molteplici regole di matching dei pacchetti; esse possono essere combinate e utilizzate in una stessa regola.
Nota: Il carattere ! si usa come NOT logico):
Criteri di match standard:
-p [!] proto: protocollo IP (es: tcp, udp, gre, ah…)
-s [!] address[/mask]: indirizzo IP sorgente (o network con maschera di sottorete)
-d [!] address[/mask] indirizzo IP destinazione (o network)
-i [!] interface[+]: interfaccia di rete di entrata ([+] wildcard)
-o [!] interface[+]: interfaccia di rete di uscita ([+] wildcard)
-f: frammento di pacchetto
Matching (2/2)
Estensioni TCP (-p tcp):
–sport port[:port]: porta o range di porte TCP sorgenti
–dport port[:port]: porta o range di porte TCP di destinazione
–tcp-flags flag: flag TCP attivi (SYN, ACK, FIN, RST, URG, PSH)
–syn: pacchetti con solo SYN attivo (nuove connessioni)
–tcp-option option: match per specifiche opzioni della intestazione TCP
Samples
Drop delle connessioni HTTP in ingresso
iptables -I INPUT -p tcp --dport 80 -j DROP
Simple routing con masquerading
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Packet sniffing
Uno strumento insostituibile in questo tipo di task è il comando tcpdump, che permette di effettuare sniffing dei pacchetti in transito sulle interfacce del sistema.
Esempi:
- sintassi base: tcpdump options [expression]
- tcpdump -i wlan0
- tcpdump -i wlan0 -s0 -X
- tcpdump -I -i wlan0 -s0 -X
- tcpdump -i wlan -s0 -X port 80
Network statistics: netstat
Il comando netstat fornisce statistiche su:
- connessioni
- rotte statiche
- interfacce
Esempi:
- netstat -atpn (socket TCP in ogni stato)
- netstat -ltpn (socket TCP in listening)
- netstat -upn (socket UDP)
- netstat -x (socket UNIX)
- netstat -i (interfacce)
- netstat -rn (rotte statiche)
Network swiss-knife: nc
NetCat ( nc ) permette di leggere e scrivere dati attraverso la rete su protocolli TCP e UDP.
Fornisce due modalità d’uso:
- connessione verso macchina remota
- ascolto in locale (apertura socket)
Alcuni esempi:
- Client di posta: nc mail.server.net 25
- Web server: cat index.html | nc -l -p 8080 -q1
- Port scanner: nc host 1-1024 -v -z
- Backdoor: nc -l -p 5050 -e /bin/bash
Port scanner: nmap
Funzionalità :
- Host discovery (ping scan, synscan..)
- Port scanning
- Service version detection
- OS detection
Esempi:
- nmap –sP 192.168.0.1-255 (Ping Scan)
- nmap –sT 192.168.0.1 (TCP connect Scan)
- nmap –sS 192.168.0.1 (TCP SYN Scan)
- nmap –sU 192.168.0.1 (UDP Scan)
- nmap –sV 192.168.0.1 (Version detection)
- nmap –O [-sV -v] 192.168.0.1 (OS detection)
Screen - Terminal multiplexer (1/3)
Screen è un window manager full-screen, il cui funzionamento si basa sul multiplexing di un terminale fisico tra uno o più processi (tipicamente shell interattive)
Offre alcune funzionalità tipiche di un window manager, in un ambiente CLI:
- apertura nuove finestre
- tiling dello schermo
- visualizzazione della lista delle finestre aperte
- visualizzazione dei log dell’output
- operazioni di copia e incolla tra finestre
Screen - Terminal multiplexer (2/3)
Per lanciare screen è sufficiente digitare il comando screen. Verrà avviato il windows manager, con una finestra, una shell al suo interno, ed una sessione “attached”.
All’avvio di screen sul sistema verranno dunque forkati due processi:
- uno per il window manager (top lo visualizza come SCREEN)
- uno per la sessione correntemente attached al window manager (in top screen)
È possibile in ogni momento effettuare il detach di una sessione mediante la combinazione di tasti C-a d (Ctrl+a e successivamente d)
Nota: pur effettuando il detach di una sessione, il comando in esecuzione resterè attivo all’interno di SCREEN, e sarà possibile riconnettere una sessione successivamente sullo stesso output
Screen - Terminal multiplexer (3/3)
Comandi per attaccare una sessione a screen:
- screen -r pid.sessionname - Aggancia il terminale alla sessione specificata
- screen -R - Aggancia il terminale all’ultima sessione utilizzata
- screen -x - Aggancia il terminale ad una sessione (multiplexa l’output)
- screen -ls - Visualizza le sessioni attive
Hotkey (dall’interno di una sessione screen):
- C-a c - Crea una nuova finestra, con all’interno una shell interattiva
- C-a 0-9 - Cambia la vista alla finestra #
- C-a ” - Visualizza la lista delle finestre attive
- C-a d - Effettua il detach della sessione
- C-a i - Visualizza info sulla finestra attiva
- C-a SPC/C-a n - Cambia la vista alla finestra successiva
- C-a S - Split orizzontale della vista in due finestre
- C-a TAB - Sposta l’input sulla finestra successiva in modalità split
- C-a H - Effettua il logging della sessione
Copyright 2010 - Alca Soc. Coop.
released under CreativeCommons 2.5 by-nc-sa