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. 2007/2008

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.

TestoFileStrumenti impiegatiData di svolgimento
Verificare se c'è un UID libero tra il più alto presente nel file /etc/passwd e quello immediatamente inferiore.uid1.shVariabili, backtick, pipelines, filtri (sort, head, tail), aritmetica della shell, test, if-then-else30 gennaio
uid2.shread, apertura di subshell30 gennaio
Stampare gli username corrispondenti ai 5 più elevati userid presenti nel file /etc/passwd.5nomi1.shcut avanzato, read di più variabili, cicli while 30 gennaio
5nomi2.shawk30 gennaio
Cercare lo username con uid più elevato, chiedendo all'utente conferma per proseguire ogni volta che nella ricerca si incontra un uid via via più elevato.max.shread alimentato esplicitamente da terminale30 gennaio
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.shrev, grep, uniq, variabili speciali $n30 gennaio
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.sh30 gennaio
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.shesecuzione in background, variabile speciale $!, sleep, ps, break1 febbraio
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.sharray della shell, shift e/o variabili speciali $* $@1 febbraio
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.shcontrollo dei parametri, du, egrep1 febbraio
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 directoryleafsize.sh1 febbraio
Creazione di utenti, gruppi, directory condivise traccia dei comandiripasso su permessi, bit speciali, umask6 febbraio
Copiare in una directory (passata come primo parametro allo script) tutti i file contenuti nella directory passata come secondo parametro più vecchi di un certo numero di giorni (passato come terzo parametro).archiveflat.shfind8 febbraio
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. Aggiornare poi elenco.vecchio  con il contenuto di elenco.nuovo.findspecial.shfind, sort o grep che utilizza pattern presi da un file8 febbraio
Copiare mantenendo la struttura delle directory originali in cui si trovano, tutti i file del sistema più vecchi di un certo numero di giorni (passato come secondo parametro allo script) e tutti i file appartenenti ad uid non corrispondenti ad utenti validi del sistema in una directory (passata come primo parametro).archivetree.shtar 8 febbraio
Dato un file di nome "testo" sulla macchina virtuale locale, composto da 1 parola per ogni riga, 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 13 febbraio
Esercizio proposto: descrivere la configurazione di un account utente sshknock sulla macchina virtuale 2 (MV2), in modo che sia possibile raggiungerlo via ssh dall'utente root della MV1, 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.txtfile authorized_keys13 febbraio
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.shssh, tar, ping/nc, esecuzione condizionata con "&&" 15 febbraio
Campionare ogni 10 secondi il carico del sistema e scrivere l'output sul file /var/log/load. Configurare il sistema per accertarsi che lo script sia sempre in esecuzione.

Ogni giorno alle 23:59 ruotare il log /var/log/load tenendo le ultime N copie in file compressi con nome /var/log/load.x.gz (x=1 per la copia più recente, x=2 per la penultima, ecc...).

Curare l'atomicità delle operazioni in modo da non perdere dati, ed effettuare le verifiche opportune per evitare che l'accesso concorrente possa danneggiare i file.
Prima variante: scrittura continua

logload1.sh
logrotate1.sh
fuser, spostamento di file aperti, gzip15/22 febbraio
Seconda variante: riapertura del file ogni 10s

logload2.sh
logrotate2.sh
crontab.txt
/etc/inittab
cron, init
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)
2) con rsync (si studi la man page)
incr-tar.sh
incr-rsync.sh
tar, rsync, ssh

confronto di timestamp
15 febbraio
configurazione di una rete client-router-server, analisi e diagnostica del trafficoreteifconfig, route, ping, wireshark15 febbraio
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.
niceexec.shat22 febbraio
Predisporre uno script che aggiorni in tempo reale le statistiche tratte da un file di log (anche molto grande), ad esempio permettendo di contare quante righe sono comparse tra un'osservazione e la successiva.logwatch.shfunzioni, signal handling, tail -f, peculiarità delle subshell22 febbraio
Monitorare il traffico ssh tra il client virtual1 ed il server virtual3 sul router virtual2:
1) loggando attraverso syslog sul file /var/log/newconn l'inizio e la fine di ogni connessione diretta da v1 a v3
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
netmon.sh
syslog.conf
iptables
syslog
netstat

xargs
case
27 febbraio
Predisporre virtual3 per poter rispondere ad una query snmp che rilevi se il carico di tale host è superiore a 0.5.
Effettuare la query da virtual1, verificando con wireshark su virtual2 (router) il contenuto dei pacchetti.
snmpd.conf.txt
snmpload.sh
/etc/snmp/snmpd.conf

snmpget
5 marzo
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 agendo sul server sshd

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.
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
ssh
iptables
logging
inittab
kill
netstat
cron
5/7 marzo
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

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-insert.sh)
ldap-fs-sumspace.sh
ldap-fs-purge.sh
/etc/ldap/slapd.conf
/etc/ldap/schema/*

ldapadd, ldapsearch, ldapmodify
7/12 marzo


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