Alma Mater Studiorum - Università di Bologna

Scuola di Ingegneria e Architettura
Dipartimento di Informatica - Scienza e Ingegneria
Laboratorio di Informatica Avanzata
Iscrizione agli esami

Corso di Laboratorio di Amministrazione di Sistemi T

A.A. 2012/2013

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
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 4 marzo
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 sort avanzato 4 marzo
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

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 13 marzo
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 18 marzo
uid2.sh read, apertura di subshell 18 marzo
Estendere l'esercizio precedente per verificare tutti gli intervalli tra UID consecutivi
uid3.sh variabile IFS, si veda anche duerighe.sh 18 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 18 marzo
Mostrare tutti gli username, chiedendo all'utente conferma di un'ipotetica azione da svolgere per ciascuno. readterminal.sh
read alimentato esplicitamente da terminale 18 marzo
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 20 marzo
Predisporre uno script che aggiorni in tempo reale le statistiche tratte da un 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 8 aprile
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 8 aprile
Modificare l'esercizio precedente perchè accetti come parametri un numero arbitrario di comandi da lanciare in parallelo, poi proceda alla verifica periodica come sopra.

Esercizio proposto:
garantire che tutti i processi lanciati vengano terminati se per qualsiasi motivo viene terminato il processo parallenne
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 $* $@ 8 aprile
Realizzare uno script che accetti sulla riga di comando
  • "-n" seguito da un numero che sarà memorizzato nella variabile NCOPIES; il parametro è opzionale e se assente NCOPIES deve assumere il valore di default pari a 4.
  • "-s" seguito da una stringa che sarà memorizzata nella variabile LOGSIGNAL; il parametro è opzionale e se assente LOGSIGNAL deve assumere il valore di default pari a USR1.
  • una stringa che sarà memorizzata nella variabile LOGFILE
Lo script "ruota" il file LOGFILE per tenerne copie storiche con estensione numerica (.1 corrisponde sempre al file generato più recentemente, ogni rotazione salva il file con estensione .n nel file con estensione .n+1, con un valore massimo pari a NCOPIES) e manda al processo che sta scrivendo sul file il segnale LOGSIGNAL (default=USR1) per avvertirlo al momento giusto di chiudere e riaprire il file.

Esercizio proposto: verificare nel modo più preciso possibile che i parametri passati siano sintatticamente e semanticamente corretti, e comprimere i file ruotati.
logrotate.sh
getopt, spostamento di file aperti, fuser, cicli for+seq, gzip
15 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 find 15 aprile
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 dalla 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, process substitution
15 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 17 aprile
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
22 aprile
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
Variante con tcpdump:
netmon.sh
connection_monitor.sh
traffic_monitor.sh
log_user.sh

Variante con iptables:
netmon.sh
connection_monitor.sh
traffic_monitor.sh
log_user.sh
tcpdump
syslog
netstat
case

iptables
cron
22 aprile
29 aprile
13 maggio
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 24 aprile
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
Configurare il packet filter per una politica di "default deny", che blocchi tutto ciò che non è esplicitamente consentito.

Esercizio proposto: predisporre una salvaguardia che eviti di "chiudersi fuori" quando è necessario configurare il packet filter su di una macchina remota
iptables.base.txt iptables
6 maggio
Configurare il packet filter di Router perché consenta il traffico tra Client e Server
- esponendo verso Server le connessioni come se fossero originate da Router stesso
- accettando le connessioni da Client verso Router stesso e ridirigendole verso Server

Esercizio proposto: sperimentare con regole di conteggio per capire quando viene effettuato il de-nat dei pacchetti ricevuti in risposta a pacchetti nat-tati prodotti da Router
iptables.nat.txt
iptables
8 maggio
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
15 maggio
20 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
filesystem.ldif

ldap-fs-store.sh
ldap-fs-sumspace.sh
ldap-fs-purge.sh
/etc/ldap/*

ldapadd, ldapsearch, ldapmodify
27 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.ldif
ssh
iptables
logging
inittab
kill
netstat
cron
at
ldap
snmp
3 giugno


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)