Archivio per il 'Programmazione'Categoria

variabili oggetto, d’istanza: da Java a Python

Novembre 23, 2009

Questo è un argomento della Programmazione Orientata agli Oggetti ma non mi entra mai in testa e ogni volta mi perdo nel nulla. Sopratutto perché tale paradigma mi è stato spiegato solo con Java a Fondamenti di Informatica 1, usato negli altri corsi Universitari e infine ho dovuto imparare in tutta fretta C# per il tirocinio che mi avrebbe permesso di laurearmi. Quindi non ho una così ampia base astratta di comprensione teorica e mi basta cambiare linguaggio, per esempio Python, che ricado nelle stesse paranoie.

Java:

  • un oggetto ha le sue variabili che vengono chiamate Variabili di Esemplare (o Variabili d’Istanza) e non sono disponibili all’esterno delle classe.
  • una classe ha le sue variabili che vengono chiamate Variabili Statiche e non sono disponibili all’esterno della classe ma sono condivise fra gli oggetti della stessa.

Python:

Tutto quanto ho scritto non ha una regola fissa e il fatto di andare a toccare le Variabili di Esemplare/d’Istanza o Attributi Dato non mi è mai successa molto spesso: per questo faccio un casino della madonna. Un programmatore può rendere disponibili direttamente, senza cioè metodi sugli oggetti, le Variabili di Esemplare/d’Istanza o Attributi Dato, quindi rendere meno restrittivo l’incapsulamento.

Per esempio in C# le Variabili di Esemplare/d’Istanza o Attributi Dato possono essere tranquillamente viste all’esterno grazie alle Proprietà che permettono di non scrivere tanto codice per la scrittura di metodi (viene usato infatti per gli oggetti grafici).

Spero di non aver scritto strafalcioni altrimenti correggetemi, sono un n00b (o forse solo un nerd mancato che perde tempo a lavarsi e vestirsi bene).

ssh: denyhosts

Novembre 22, 2009

Configuare OpenSSH a prova di bomba

Siamo talmente paranoici che abbiamo fatto, quasi, tutto quanto consigliato qua per rendere il nostro server con OpenSSH a prova di bomba. Per un uso casalingo io non ho impostato però nessun firewall (mi fido delle impostazioni che ho messo sul mio router netgear dg834g) cioè nessuna regola di iptables sul sistema dove è veramente installato OpenSSH server.

Fregare gli attacchi brute-force

L’unica cosa che mi scoccia sono questi essere infimi, e poco pericolosi, chiamati script-kiddies che tentano degli attacchi brute-force sulla porta 22. Non che sia una gran scocciatura ma i file di log, più precisamente i /var/log/auth.log, tendono a riempirsi paurosamente. Ho trovato una soluzione KISS usando un programma, scritto in Python, chiamato denyhosts. Il concetto è semplice: si guarda i file di log e se un determinato IP fallisce la connessione ssh lo blocca ficcandolo in /etc/hosts.deny.

Una precisazione su come funzionano /etc/hosts.allow e /etc/hosts.deny. Questi sono dei file che configurano il TCP Wrapper: una spiegazione esaustiva si trova negli Appunti di Informatica Libera di Daniele Giacomini. Riassumendo: se un IP è regolamentato da una regola in /etc/hosts.allow tutto fila liscio, se invece questo IP non è previsto in /etc/hosts.allow il sistema guarda /etc/hosts.deny. Quindi in /etc/hosts.allow, se vogliamo fare in modo che gli IP della nostra sottorete non vengano bloccati, mettiamo questa riga:

sshd: 192.168.0.0/255.255.255.248

Ovviamente questo è solo un esempio preso dalla mia configurazione. Se non sapete niente di reti e sottoreti non capirete una tega, forse potrebbe venirvi in aiuto il programma ipcalc:

Esempio ipcalc

ma anche Wikipedia…se non basta fatevi un corso universitario di Reti di Calcolatori o leggetevi un libro a riguardo o rompete i coglioni a un SysAdmin (non io: non lo sono!).
In /etc/hosts.deny non mettiamo nulla: se ne occuperà automaticamente denyhosts. Per esempio una riga che aggiunge denyhosts è la seguente (ovviamente l’IP bloccato è di fantasia):

# DenyHosts: Sat Nov 21 13:05:13 2009 | ALL: 123.123.123.123
ALL: 123.123.123.123

Figo no? Ora non ci resta che editare il file di configurazione di denyhosts che si trova, su Arch Linux, in /etc/denyhosts/denyhosts.cfg.

Configurazione di denyhosts.cfg

Prendo paro paro il mio file di configurazione con una spiegazione tutta mia. Le FAQ sul sito e i commenti su denyhosts.cfg sono molto esaustivi ma degli esempi in più non fanno mai male e non vi faranno sicuramente schifo (vero?). Comunque sia sto usando la versione 2.6 di denyhosts.

SECURE_LOG = /var/log/auth.log Ovviamente questo è il file che denyhosts parsa per andare a pescarsi gli IP da bannare.

HOSTS_DENY = /etc/hosts.deny In un sistema Linux è qui che ci sono le regole per il TCP Wrapper degli IP a cui è vietato l’ingresso nel sistema.

PURGE_DENY = 2d Ricordo che stiamo parlando di uso domestico, quindi abbiamo un indirizzo dinamico raggiungibile magari, con l’ausilio di dyndns come ho fatto io, con un URL www. Ma abbiamo sempre un indirizzo dinamico e ad ogni caduta di connessione (grazie Telecom) cambiamo spesso IP. Quindi gli script-kiddies non punteranno sempre a noi pensando che siamo sempre noi cambiando, magari, gli username e password. Insomma non siamo un bersaglio fisso! Quindi è inutile riempire /etc/hosts.deny di IP. Anche perché magari pure gli script-kiddies hanno IP dinamici come tutti i comuni mortali (a parte i compuer zombie ma si spera di no). Quindi è meglio ripulire /etc/hosts.deny abbastanza spesso. 2d infatti sta per 2 day: due giorni.

BLOCK_SERVICE = ALL Ok, abbiamo solo sshd attivo come servizio. Sarebbe più logico mettere BLOCK_SERVICE = sshd. De gustibus. Questo cambia ovviamente le occorrenze di /etc/hosts.deny che dal mio esempio precedente diventerebbero

# DenyHosts: Sat Nov 21 13:05:13 2009 | sshd: 123.123.123.123
sshd: 123.123.123.123

Denyhosts è molto configurabile, può controllare o tutti i servizi o solo quello che vogliamo noi.

DENY_THRESHOLD_INVALID = 2 Ogni due tentativi da parte di un username invalido (che non esiste sul sistema o che non è specificato in AllowUsers o AllowGroups in /etc/ssh/sshd_config) l’IP viene bannato. Metti che uno al posto di scrivere cicciobanza scrive cicciobnza…lo banniamo subito? Diamogli una seconda possibilità.

DENY_THRESHOLD_VALID = 3 Diamo invece tre tentativi a un user valido nel sistema, magari ha la giornata storta e sbaglia la password (che comunque, siamo stati bravi, è un’autenticazione chiave pubblica/privata).

DENY_THRESHOLD_ROOT = 1 Diciamo che se uno tenta subito root lo banniamo immediatamente..vero?

DENY_THRESHOLD_RESTRICTED = 1 Questa è una sboronata. Possiamo specificare degli username (in /var/lib/denyhosts/restricted-usernames) a cui possiamo dare tot tentativi. Io ho messo 1 perché ci metto i classici: mysql, test, user…i soliti username che non andrebbero mai usati…

WORK_DIR = /var/lib/denyhosts Si commenta da sola, io la lascio così di default e consiglio di fare altrettanto!

SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES A dire la verità non ho ben capito. Sembra che denyhosts si faccia dei sospetti di attacco anche sugli hosts della nostra sottorete e ci avverta di questo. Ho lasciato YES ma approfondirò in seguito…

HOSTNAME_LOOKUP=NO A dire la verità non ho capito molto questo. Non ho capito cosa se ne faccia denyhosts del nome host dell’IP associato che blocca. Approfondirò anche questo…

LOCK_FILE = /var/run/denyhosts.pid Si commenta da solo, lasciamolo così com’è.

ADMIN_EMAIL = Lo lascio vuoto, non ho nessun Postfix o simili installato sul sistema che invii mail di avvertimento quindi…

AGE_RESET_VALID=1m Resetta i tentativi, dopo un minuto di inattività, di un utente valido. Del tipo, scannate password, aspettate un minuto: avete ancora 3 tentativi (riguardate DENY_THRESHOLD_VALID).

AGE_RESET_ROOT= Se uno tenta root non gli diamo altre possibilità.

AGE_RESET_RESTRICTED= Se uno tenta mysql non gli diamo altre possibilità.

AGE_RESET_INVALID= Se uno tenta un utente invalido non gli diamo altre possibilità.

DAEMON_LOG = /var/log/denyhosts Si commenta da solo. Comunque è meglio aggiungere /var/log/denyhosts in /etc/logrotate.d/syslog-ng in modo che logrotate faccia la rotazione anche dei log di denyhosts.

DAEMON_SLEEP = 1m Ogni minuto denhyhosts controlla i file di log. Ci saranno comunque dei tentativi, in un minuto, gli script kiddies provano circa 5-10 username al colpo.

DAEMON_PURGE = 1h Il periodo, quando denyhosts è daemonizzato, con il quale controlla le occorrenze di /etc/hosts.deny e le toglie (in base ovviamente a PURGE_DENY)

Queste sono configurazioni base e utili per un sistema casalingo. Più fico sarebbe sincronizzare /etc/hosts.deny anche con IP bannati da altri che usando denyhosts e che condividono le informazioni (tutto sempre configurando denyhosts.cfg) ma è troppo per noi. Io ho provato ma, come ho già detto, non siamo bersagli fissi.

Sensors, conky, awk e media

Ottobre 21, 2009

La mia ragazza ha un pc con dei sensori pazzeschi

k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp:  +19.0°C
Core0 Temp:  +25.0°C
Core1 Temp:  +24.0°C
Core1 Temp:  +22.0°C

Già: ho disabilitato quelli che fanno arrabbiare ACPI (togliendo del tutto sensors dai DAEMONS in rc.conf). Ma come faccio a mostrare ora la temperatura della CPU su conky? Ma sono giusti quei valori?

Prima risposta: facciamo una media con awk dei Core0 e Core1

sensors|awk ‘/Core0/ {totale+=$3 n++}END {print totale/n}’

e

sensors|awk ‘/Core1/ {totale+=$3 n++}END {print totale/n}’

Seconda risposta: più o meno sì facendo la media. Basta convincersene con i valori di  it87 (prima di togliere sensors dai DAEMONS) e anche grazie ad una visitina al BIOS.

Ultimamente…Python

Settembre 24, 2009

Ultimamente sto studiando Python. Finalmente! Era da tanto che volevo mettermici seriamente e solo ora che sono disoccupato mi sono deciso, così almeno ammazzo il tempo. Grazie agli infiniti moduli che si possono importare sto passando dalla programmazione concorrente con i threading, ai protocolli di rete, ai servizi client di ssh… Sto mettendo sul campo gli insegnamenti di Ingegneria informatica (a proposito, perché a Padova si ostinano con Java invece di insegnare con Python?). È talmente facile trovare in rete script di esempio, dell’utilizzo dei vari moduli, che si può subito partire a buttare giù righe di codice e la documentazione di certo non manca.

Io uso fondamentalmente l’approccio orientato agli oggetti con relativi metodi ma ovviamente scrivo qualche funzione all’esterno del main(). Il codice comunque rimane sempre molto compatto, con poco si può fare veramente di tutto. Certe volte capita di perdersi ore per scrivere due righe ma…quelle due righe cambiano il mondo!

Che dire, fra Python e C (sto studiando anche questo grazie agli articoli, di Giovanni Scafora, su Linux Pro) forse è meglio se inauguro una categoria Programmazione su questo blog…

awk e conky

Settembre 23, 2008

Mi sono accorto che awk è più potente di quanto pensassi, alla pari del mitico sed. Sono riuscito a migliorare il .conkyrc dove prendevo i valori per l’APC e le temperature del sistema.

Per esempio al posto di

sensors | grep ‘CPU Temp’ | awk ‘{print $3}’

si può fare questa cosa elegantissima sfruttando le regex

sensors | awk ‘/CPU Temp/ {print $3}’

Questo il mio .conkyrc attuale e come si presenta sul desktop