Università
di Bologna
Universita di Bologna
Facoltà di
Ingegneria
Facolta di Ingegneria
Dipartimento di Elettronica
Informatica e Sistemistica
Laboratorio di Informatica 
Avanzata
lia
uniwex logo
Iscrizione agli esami

Corso di Laboratorio di Amministrazione di Sistemi L-A

A.A. 2011/2012

Informazioni generali Materiale didattico Guida al laboratorio Esercitazioni proposte
Calendario


Esercizi svolti in laboratorio (cliccare sul nome del file per vedere il codice), proposte di esercizi da svolgere autonomamente, alcuni testi di prove d'esame assegnate in passato.

Testo File Strumenti impiegati Data di svolgimento
Creazione di utenti, gruppi, e directory condivise in cui utenti di un gruppo possano collaborare (creando file che siano automaticamente accessibili in lettura e scrittura da tutti i membri del gruppo): traccia dei comandi ripasso su permessi, bit speciali, umask; adduser, chown, chmod 27 febbraio
Contare quanti file esistono con una certa estensione, definita come la stringa posta dopo l'ultimo carattere "punto" presente nel nome del file, per tutte le estensioni trovate nei file presenti nel direttorio passato come parametro sulla riga di comando  e sottodirettori. Limitare l'output alle sole 5 estensioni più numerose. estensioni.sh rev, grep, uniq 29 febbraio
Esercizio proposto: Modificare l'esercizio precedente per eliminare dal conteggio le directory ed evitare che "punti" in campi diversi dal nome file possano causare problemi.  estensioni2.sh  
Esercizio proposto: Modificare l'esercizio precedente per contare quanti file esistono con una certa estensione, limitatamente all'elenco di estensioni passate come parametri sulla riga di comando. estparam.sh variabili speciali $n

Utilizzare le funzionalità avanzate di sort (switch -k e -t) per ordinare per data di nascita, a parità di data per cognome, a parità di entrambi per nome un file nel formato Nome/Cognome/GG/MM/AAAA oppure  Nome/Cognome/AAAA/MM/GG
sortnomi.sh
29 febbraio
Verificare se c'è un UID libero tra il più alto presente nel file /etc/passwd e quello immediatamente inferiore. uid1.sh Variabili, backtick, pipelines, filtri (sort, head, tail), aritmetica della shell, test, if-then-else 5 marzo
uid2.sh read, apertura di subshell 5 marzo
Stampare gli username corrispondenti agli N più elevati userid presenti nel file /etc/passwd, essendo N un parametro passato sulla riga di comando. 5nomi-ciclo.sh
5nomi-awk.sh
cut avanzato, read di più variabili, cicli while 7 marzo
Dato un file nel formato:
nomeutente1 indirizzo1
datanascita1 telefono1
nomeutente2 indirizzo2
datanascita2 telefono2
....
produrre in output
nomeutente1 telefono1
nomeutente2 telefono2
....
duerighe.sh Varie possibilità di parsing delle righe di testo, anche con IFS
7 marzo
Mostrare tutti gli username, chiedendo all'utente conferma di un'ipotetica azione da svolgere per ciascuno. readterminal.sh read alimentato esplicitamente da terminale 7 marzo
Dato un file di nome "testo" sulla macchina locale, lo si faccia remotamente ordinare alla macchina che ha meno processi in esecuzione tra quelle elencate nel file "lista", memorizzando il risultato nel file "testo.ord" in locale. sshnum.sh
sshload.sh
sshsort.sh
esecuzione remota e spostamento dati con ssh 12 marzo
Esercizio proposto: descrivere la configurazione di un account utente sshknock sulla VM Server, in modo che sia possibile raggiungerlo via ssh dall'utente root della VM Client, ma non avviare una sessione interattiva. L'unico effetto della connessione deve essere  la scrittura dell'indirizzo del client che la origina nel file /home/sshknock/ip.new sshknock.txt file authorized_keys
Progettare uno script che lanci due comandi in parallelo (in questo esempio i comandi siano "sleep 10" e "sleep 20") e verifichi ogni 5 secondi se sono ancora in esecuzione o no, scrivendo sul file "log" lo stato dei due processi e terminando l'esecuzione quando entrambi terminano. parallelo.sh esecuzione in background, variabile speciale $!, sleep, ps, break 14 marzo
Esercizio proposto: Modificare l'esercizio precedente perchè accetti come parametri un numero arbitrario di comandi da lanciare in parallelo, poi proceda alla verifica periodica come sopra. parallenne.sh
parallenne-alt.sh (array con indici non consecutivi, controlli più specifici sui processi in esecuzione)
array della shell, shift e/o variabili speciali $* $@
Produrre su standard output l'elenco delle 10 directory di N-esimo livello (N passato come secondo parametro) che occupano più spazio al di sotto della directory passata come primo parametro, ordinato dalla più grande alla più piccola. dirsizeN.sh

controllo dei parametri, du, egrep 14 marzo
Modificare l'esercizio precedente perché accetti il numero delle directory da visualizzare come parametro dello switch -n, il livello come parametro dello switch -l, e la directory come parametro dello switch -d
dirsizeN-opts.sh
14 marzo
Esercizio proposto: Modificare l'esercizio precedente perchè, invece di selezionare le directory al livello specificato, individui automaticamente le directory foglia, cioè quelle che non contengono altre directory leafsize.sh  
Configurare rsyslog perchè i messaggi etichettati local0.* prodotti su Client siano loggati nel file /var/log/attivita di Server Client_rsyslog.conf
Server_rsyslog.conf
rsyslog
21 marzo
Ruotare il file /var/log/attivita (cioè fare in modo che da un certo istante in poi il logging sia ridiretto su di un nuovo file mentre le righe accumulate fino a quell'istante restino a disposizione per l'archiviazione) in modo da tenere fino a 10 copie compresse degli archivi generati.
logrotate.sh
spostamento di file aperti, fuser, gzip, lsof
21 marzo
Predisporre uno script che aggiorni in tempo reale le statistiche tratte dal file /var/log/attivita, ad esempio permettendo di contare quante righe sono comparse tra un'osservazione e la successiva, in modo efficiente anche in caso di crescita del file rapida e raggiungimento di grandi dimensioni.

Esercizio proposto: aggiungere un "lanciatore" che esegua logwatch in background e lo segnali ogni 10 secondi.
logwatch.sh funzioni, signal handling, tail -f, peculiarità delle subshell 21 marzo
Configurazione di una rete client-router-server, analisi e diagnostica del traffico Traccia della configurazione e testing della rete

Come rendere permaneneti le modifiche alla configurazione
ifconfig, route, ping, wireshark, netstat
26 marzo
Monitorare il traffico ssh tra la VM Client e la VM Server sulla VM Router:
  1. loggando attraverso syslog sul file /var/log/newconn l'inizio e la fine di ogni connessione diretta da Client a Server
  2. durante la "vita" di ogni connessione, al superamento di una certa soglia (espressa in numero di pacchetti per minuto) connettersi alla sorgente del traffico eccessivo ed individuare l'utente responsabile e loggare lo username nel file /var/log/excess;
  3. provvedere alla realizzazione di uno script di controllo che avvii ed arresti il monitoraggio, eseguendo tutte le operazioni di configurazione in modo automatico.
Esercitazioni proposte: completare gli script come da commenti all'interno delle tracce
netmon.sh
connection_monitor.sh
traffic_monitor.sh
log_user.sh
tcpdump
syslog
netstat
case
28 marzo
Predisporre il demone snmpd su Server per poter realizzare via snmp i controlli previsti dagli esercizi "sshnum" (rilevando il carico del sistema anzichè il numero di processi attivi) e "netmon" (elencando le connessioni attive sulla macchina) Verificare con wireshark il contenuto dei pacchetti. snmpd.conf.txt
/etc/snmp/snmpd.conf
/etc/default/snmpd
snmpwalk, snmpget
2 aprile
Se il carico del sistema è inferiore ad una soglia specificata come primo parametro dello script, lancia il comando specificato come secondo parametro. Altrimenti, con at, rischedula il test dopo 2 minuti, e procede così finchè non riesce a lanciare il comando.

Estensioni proposte:
  • verificare i problemi di path e di output dovuti all'esecuzione dello script da parte del demone atd.
  • estendere lo script perchè qualsiasi parametro specificato dopo il secondo venga passato al comando da eseguire.
  • estendere lo script perchè accetti un nuovo parametro, prima di tutti gli altri, che rappresenta il numero massimo di tentativi  da eseguire. Superato tale numero il processo non viene rischedulato, e il fallimento viene loggato con priorità error; loggare con priorità info ogni tentativo.
niceexec.sh at 4 aprile
Configurazione di un filesystem su dispositivo affidabile: partizionamento dei dischi, definizione di un RAID software, formattazione, configurazione per il restart automatico. traccia dei comandi [PDF]
fdisk, mdadm, lvm commands, mkfs.ext3, /etc/fstab, /etc/mdadm
16-18 aprile
Nella directory passata come primo parametro allo script ed in tutte le subdirectory, individuare i file che non siano stati modificati da più di un dato numero di giorni (passato come terzo parametro), e copiarli in una directory passata come secondo parametro.
archiveflat.sh funzioni, controllo formale dei parametri, find 2 maggio
Esercizio proposto: trovare tutti i file con almeno un bit speciale settato, metterli in un file elenco.nuovo, ed al termine confrontare i file elenco.nuovo ed elenco.vecchio mostrando le differenze secondo questo formato:

Nuovi file trovati rispetto alla precedente invocazione:
... elenco dei file che compaiono in elenco.nuovo ma non in elenco.vecchio ...

File cancellati rispetto alla precedente invocazione:
...

File a cui è stato rimosso il bit speciale d
alla precedente invocazione:
...

Aggiornare poi elenco.vecchio  con il contenuto di elenco.nuovo.
findspecial.sh find, sort o grep che utilizza pattern presi da un file
Copiare in una directory (passata come primo parametro allo script):
  • tutti i file del sistema che non siano stati modificati da un dato numero di giorni (passato come secondo parametro allo script)
  • tutti i file al di sotto di /home appartenenti ad uid non corrispondenti ad utenti validi del sistema
mantenendo la struttura delle directory originali in cui si trovano.
archivetree.sh tar 2 maggio
Questo script accetta tre parametri: il primo è una directory locale, il secondo un nome di host, il terzo una directory su tale host.
Lo script deve trasferire, mantenendo struttura e permessi, il contenuto della dir. locale sull'host remoto nella dir. indicata.
Ricordare di controllare la validità formale dei parametri ed anche se possibile la validità effettiva: in questo caso si può testare l'esistenza della dir, la raggiungibilità dell'host, e se la dir remota non esiste crearla.
sshcopy.sh ssh, tar, ping/nc, esecuzione condizionata con "&&" 2 maggio
Esercizio proposto: realizzare una procedura di backup incrementale rispetto al precedente esercizio "sshcopy.sh", cioè un analogo sistema di copia remota che però trasferisca solo i file cambiati o apparsi dopo l'ultima esecuzione del backup. Risolvere il problema in due modi:
1) con tar (si vedano le opzioni mtime, newer e simili), facendo in modo che ogni backup incrementale sia collocato in una subdirectory con nome INCR-YYYYMMDD (si veda la man page del comando date)
2) con rsync (si studi la man page corrispondente)
incr-tar.sh
incr-rsync.sh
tar, rsync, ssh

confronto di timestamp

Monitorare il traffico ssh tra la VM Client e la VM Server sulla VM Router (VARIANTE DA ESEGUIRE CON IPTABLES):
  1. loggando attraverso syslog sul file /var/log/newconn l'inizio e la fine di ogni connessione diretta da Client a Server
  2. durante la "vita" di ogni connessione, al superamento di una certa soglia (espressa in numero di pacchetti per minuto) connettersi alla sorgente del traffico eccessivo ed individuare l'utente responsabile e loggare lo username nel file /var/log/excess;
  3. provvedere alla realizzazione di uno script di controllo che avvii ed arresti il monitoraggio, eseguendo tutte le operazioni di configurazione in modo automatico.
TRACCIA da completare e correggere
netmon.sh
connection_monitor.sh
traffic_monitor.sh
log_user.sh
iptables
syslog
netstat
case
9 maggio
Esercitazione su configurazione di server LDAP ed utilizzo dei client tools a riga di comando (è consigliabile aver letto la guida a ldap)

filesystem.schema
- Definire un attributo fn di tipo adatto a rappresentare un nome di file, un attributo fs adatto a rappresentare una dimensione in byte, una classe ausiliaria dir che contenga obbligatoriamente fn e facoltativamente fs, una classe ausiliaria file che contenga obbligatoriamente sia fn che fs

ldap-fs-store.sh - memorizzare nella directory un sottoalbero del filesystem, passato come parametro allo script, riproducendo con i DN la struttura gerarchica della collocazione di file e directory

ESERCIZI PROPOSTI:
ldap-fs-sumspace.sh - esplorando la directory LDAP, calcolare per ogni entry che rappresenta una directory lo spazio occupato dai file presenti in tale directory, ed aggiornare l'entry con la somma

es: in LDAP ho
        fn=pippo,fn=lib,fn=usr.... con fs=10
        fn=pluto,fn=lib,fn=usr.... con fs=20
-->     aggiorno l'entry fn=lib,fn=usr....
        impostando fs=30

ldap-fs-purge.sh - esplorare la directory LDAP, e verificare se i file in essa rappresentati esistono ancora sul filesystem. In caso contrario rimuoverli da LDAP.
filesystem.schema
ldap-fs-store.sh
ldap-fs-sumspace.sh
ldap-fs-purge.sh
/etc/ldap/slapd.conf
/etc/ldap/schema/*

ldapadd, ldapsearch, ldapmodify
16 maggio
Esercitazione completa su routing, filtraggio, ssh, monitoraggio.

Dopo aver configurato come specificato sopra una rete client/router/server realizzare il seguente sistema di comunicazione.

Il primo script, toctoc.sh, gira sulle macchine client (della rete 10.1.1.0/24) ed accetta come parametri due indirizzi IP (router e server) ed un numero di porta TCP (port).
Usando ssh, deve depositare nella directory /tmp/ di router un file che abbia come nome l'IP address di client, che contenga in una singola riga i valori server e port separati da uno spazio, mantenendo poi la connessione ssh per almeno un minuto.
Esempio, sulla macchina 10.1.1.1 lancio
toctoc.sh 10.1.1.254 10.9.9.1 80 -> viene creato sulla macchina 10.1.1.254 un file di nome /tmp/10.1.1.1 che contiene "10.9.9.1  80"

Il secondo script routerconf.sh serve a configurare inizialmente il router, che deve agire da firewall, bloccando di default tutto il traffico tranne quello indispensabile per il funzionamento di toctoc.sh.

Il terzo script serverconf.sh serve a configurare il firewall dei server per accettare traffico entrante solo dagli host della rete locale.

Il quarto script avanti.sh è pensato per girare su router, e deve verificare senza mai fermarsi, ogni 5 secondi, se sono presenti connessioni ssh a router a cui corrispondano in /tmp file inviati da client "toctoc". Nel caso ne trovi deve:
1) inserire le regole nel packet filter che consentano al client di attraversare il router solo per connettersi al server sulla porta remota specificata nel file. Porre attenzione alla direzione delle connessioni. Vista la limitazione di traffico sui server, mascherare i pacchetti che dai client attraversano router.
2) cancellare il file creato dal client e disconnettere forzatamente la connessione ssh attivata da toctoc.sh agendo sul server sshd
Estensione proposta: condizionare l'esecuzione del punto 1 alla verifica, da condurre via SNMP, che sul server sia in esecuzione il processo rsyslogd -

Il quinto script timeout.sh, in esecuzione sul router anch'esso, deve osservare il  transito dei pacchetti relativo alle connessioni abilitate da avanti.sh. Trascorsi 5 minuti circa (per comodità nel calcolo si possono trascurare i secondi) di assenza di traffico relativo ad una connessione, deve rimuovere dal packet filter la regola che la consente, inserita in precedenza da avanti.sh.

Lo script openclose.sh può essere usato per concentrare le operazioni di apertura e chiusura del firewall in modo da garantirne la coerenza tra avanti.sh e timeout.sh.
Estensione proposta: all'atto della chiusura della connessione, aggiornare sulla directory LDAP ospitata dal router il conteggio delle connessioni osservate tra il client ed il server. A questo fine predisporre uno schema che consenta di costruire un sottoalbero del DIT formato da un primo livello di entry che rappresentino i client, ed un secondo livello di entry che rappresentino i server a cui il client si è connesso (e quante volte)
NOTA: non tutte le soluzioni sono complete, alcune come specificato nei commenti sono solo tracce.

toctoc.sh
routerconf.sh
serverconf.sh
avanti.sh
timeout.sh
openclose.sh
snmpd.conf
count.schema
ssh
iptables
logging
inittab
kill
netstat
cron
at
ldap
snmp
23 maggio


Prove d'esame

Prova d'esame svolta il 22 febbraio 2007 (contiene link alla traccia di soluzione)

Prova d'esame svolta il 28 marzo 2007

Prova d'esame svolta il 4 aprile 2007

Prova d'esame svolta il 11 aprile 2007

Prova d'esame svolta il 10 luglio 2007

Prova d'esame svolta il 16 febbraio 2009 (contiene link alla traccia di soluzione)

Prova d'esame svolta il 7 maggio 2012 (contiene link alla traccia di soluzione)