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. 2005/2006

Informazioni generali
Materiale didattico
Laboratorio
Calendario


UML-Howto [pdf]: come installare UML sul proprio sistema per simulare più macchine e svolgere con più efficacia gli esercizi che coinvolgono ruoli client, server e router. Sinceri ringraziamenti ai miei ex-studenti Silvia Cereda e Matteo Fazi.
Aggiornamento:
un possibile problema se si utilizza lo stage3 della versione corrente di gentoo (2005.1) è quello di udev (di default su gentoo dalla 2005.0) che non funziona granchè bene con una macchina uml. Una "patch" per questo problema è quella di installare il vecchio devfs
(emerge devfs) durante la fase di setup del filesystem della macchina virtuale.
Esercizi svolti in laboratorio (cliccare sul nome del file per vedere il codice) e proposte di esercizi da svolgere autonomamente

Nome file
Testo
uid.sh
Verificare se c'è un UID libero tra il più alto (solitamente 65534) presente nel file /etc/passwd e quello immediatamente inferiore.
uid2.sh
Estendere uid.sh per indicare correttamente il primo UID utilizzabile anche nel caso che /etc/passwd non contenga 65534
read.sh
produrre su standard output l'elenco degli utenti presenti in /etc/passwd nella forma "nome username id userid"
read2.sh
modificare read.sh per trovare efficientemente e stampare lo username corrispondente all'userid più alto presente nel file
estensioni.sh
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.
estparam.sh
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
dirsize1.sh
produrre su standard output l'elenco delle 10 directory che occupano più spazio al di sotto di /usr, ordinato dalla più grande alla più piccola.
dirsize2.sh
produrre su standard output l'elenco delle 10 directory di secondo livello (es.: local/bin, java/jre, share/doc) che occupano più spazio al di sotto di /usr, ordinato dalla più grande alla più piccola
dirsize3.sh
modificare dirsize1.sh per stampare anche l'elenco delle 5 directory più grandi trovate al di sotto di ciascuna delle 10 individuate al passo precedente.
danger.sh
Cercare i file con il SUID bit settato e le directory scrivibili da tutti senza sticky bit
free1h.sh

Stampa un messaggio su un file se in una qualsiasi partizione lo spazio libero scende sotto al 10%.
Schedulare free1h con crontab perchè sia eseguito ogni ora.
free5s.sh Utilizza free1h per eseguire il monitoraggio ogni 5 secondi.
archiveflat.sh
Copiare in una directory (passata come primo parametro allo script) tutti i file più vecchi di un certo numero di giorni (passato come secondo parametro).
archivetree.sh
Copiare mantenendo la struttura delle directory originali in cui si trovano, tutti i file 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).
load.sh
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.
load2.sh
Migliorare lo script precedente perchè:
- deduca correttamente il percorso di lancio dello script da rischedulare
- deduca correttamente il percorso di lancio del comando (parametro dello script da rischedulare)
- limiti il numero di tentativi di lancio ad un massimo di 20
monitor remoto [PDF]
(il file PDF descrive il problema, propone passo per passo una traccia di soluzione, e contiene spunti di esercizi da svolgere autonomamente per estenderla)
toctoc.sh
  |
  |
  |
  |
  |
 V
Il primo script, toctoc.sh, gira sulla macchina client 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 172.16.1.1 lancio "toctoc.sh  172.16.1.254  172.16.2.1  80": viene creato sulla macchina 172.16.1.254 un file di nome /tmp/172.16.1.1 che contiene "172.16.2.1  80"
avanti.sh
  |
  |
  |
  |
  |
  |
 V
Il secondo script è pensato per girare su router che riceve la connessione lanciata da client. Tale macchina deve agire da router/firewall, bloccando di default tutto il traffico che tenti di attraversarlo.
Lo script avanti.sh deve verificare senza mai fermarsi, ogni 5 secondi, la presenza di connessioni ssh al router, verificare la presenza di file inviati da client "toctoc" e la loro corrispondenza con le connessioni ssh rilevate, e nel caso ne trovi deve:
1) inserire una regola nel packet filter che consenta al client di attraversare il router solo per connettersi al server sulla porta remota specificata nel file. Porre attenzione alla direzione delle connessioni.
2) cancellare il file creato dal client e disconnettere forzatamente la connessione ssh agendo sul server sshd
timeout.sh
Trascorsi 5 minuti circa (per comodità nel calcolo si possono trascurare i secondi) dal transito dell'ultimo pacchetto avvistato su router relativo ad una delle connessioni abilitate tra un client ed un server su una determinata port, la regola del packet filter inserita in precedenza deve essere rimossa.
Progetto complessivo












Un certo insieme di utenti di deve poter monitorare il carico dei propri server linux (uno o più per utente). I dati che permettono la mappatura tra utente e server e tra server e credenziali d'accesso sono memorizzati in una directory LDAP (ospitata su di un server configurabile con la variabile d'ambiente $LDAPSERVER) secondo queste specifiche:
  • l'utente è definito a partire dalla classe "account" dello schema cosine.schema, con l'aggiunta di un attributo ammsisserver con valore "nome/ip/metodo", dove metodo può essere ssh oppure snmp
  • il server è definito a partire dalleclassi "nisObject" e "ipHost" di nis.schema
  • se il server e' accessibile via ssh deve essere presente l'ulteriore attributo ammsisusername 
  • se il server e' accessibile via snmp deve essere presente l'ulteriore attributo ammsiscommunity
Una volta che l'utente abbia avviato il controllo:
- in caso il carico sia superiore a 0.8 si deve registrare l'evento sulla facility local0.warning di syslog e ripetere il controllo dopo 15 minuti
- in caso contrario si deve registrare l'evento sulla facility local0.info di syslog e ripetere il controllo dopo 3 minuti.

La macchina locale deve essere configurata per bloccare tutto il traffico IP da e per il mondo esterno, consentendo per il tempo minimo indispensabile il transito dei pacchetti strettamente necessari.

Ai fini del test si configuri almeno un server in modo che sia accessibile via ssh senza dover digitare la password ed un server in modo che il demone snmp riporti direttamente il superamento della soglia di carico. Si popoli corrispondentemente la directory perchè l'utente root locale possa accedere a questi server di test.

----
OBIETTIVI
    TRACCIA DI SOLUZIONE
1. redigere lo schema necessario alla definizione di utenti e server, popolare la directory.

loadmon.schema, utenti-server.ldif
2. configurare syslog

syslog.conf
3. configurare snmpd sul server

righe da aggiungere a snmpd.conf
4. configurare ssh sul server

operazioni da fare
5. inizializzare il filtraggio

iptables.sh
6. script di monitoraggio

loadmonitor.sh