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:
- loggando attraverso syslog sul file /var/log/newconn
l'inizio e la
fine di ogni connessione diretta da Client a Server
- 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;
- 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 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 |
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):
- loggando attraverso syslog sul file /var/log/newconn
l'inizio e la
fine di ogni connessione diretta da Client a Server
- 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;
- 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
|