Full Circle Magazine, download

Volevo scaricarmi tutti i numeri di Full Circle Magazine, ho così scritto uno script. Tutto cablato nel codice bash ma funziona perfettamente per scaricare tutti le uscite dalla 1 a 53

#!/bin/bash
for i in {1..53}
do
wget "http://dl.fullcirclemagazine.org/issue"$i"_it.pdf"
done

Ovviamente questo scarica solo la traduzione in Italiano una volta per volta. Basta salvare il file come fcmd.sh (o comevoletevoi.sh), dargli i permessi di esecuzione

chmod +x fcmd.sh

ed eseguirlo

./fcmd.sh

Ovviamente si potrebbe migliorare con i parametri di wget oppure usare aria2c, parametrizzare lo script per i numeri da scaricare … ma non ne avevo voglia.

alla fine il colloquio

alla fine il colloquio di ieri sera sembra essere andato bene.

Alla fine non è programmazione alla code monkey, diciamo che prima di andare a scrivere codice delphi ci sono personalizzazioni, a basso livello, del loro gestionale con SQL e file di configurazione. L’ERP, infatti, ha una parte RAD ed è simile, nel concetto, a quello che sto usando ora a tirocinio.

Infine, se serve, dovrei essere anche disposto all’aiuto nella configurazione di server linux o thin client basati su linux che bootano windows.

Ora devo sentire la loro risposta, dico solo che il colloquio è andato avanti un ora e mezza e il tipo mi è sembrato garbato e molto bravo a spiegare.

Purtroppo alla fine ero stremato e non sono riuscito a dire tutto quello che volevo cioè: minchia che ficata! Sta roba è meglio delle tecnologie che ho usato fino ad ora nelle mie esperienze!! Spero che si sia letto fra le righe…

ultime…

Ho seguito dei corsi ma devo ancora capire, dove sono ora, cosa stanno usando attualmente (grazie al corso so solo cosa useranno, tutta roba open source + gpl a livello enterprise). Metti che la cosa la posso ficcare dentro il curriculum…. Poi sono arrivate due nuove tirocinanti con una delle quali dovrò fare la parte del WebGis (che sarebbe il clou del tirocinio anche se faccio altro nel frattempo oltre il normale cazzeggio-tirocinante-informatico). Finalmente incomincio a normalizzare questi cazzo di database su PostgreSQL in base alla cartografia (notare che il 20 marzo io tomo tomo…cacchio caccio…finisco…se mi pagano qualcosa anche rimango eh).

Sul portatile ho installato e configurato: openbox, tint2 (in attesa di bmpanel2 magari con un applet per la batteria), conky (che con openbox scazza se non si configura diversamente da xfce), feh, volwheel, gnote (fico: tomboy senza mono, yeah!). Naturalmente mi sono aiutato con obconf, obmenu (ma un solo cazzo di strumento per i *.xml di openbox? se sapessi fare un programma in python con glade sarebbe una cazzata) e una modificata ovviamente a .gtkrc-2.0. Consumo di ram di circa 100MB su un 1GB totale. Niente male, quasi non mi manca avere un DE.

Sto pensando se incominciare (la in di incominciare è perché sono veneto) a guardare o meno Caprica che sarebbe il prequel di Battlestar Galactica. No ma sul serio…cosa ci trovo in questa storia che è la solita minestra riscaldata (pure scritta da un mormone con riferimenti teologici a go go…)? Beh effettivamente anche Neon Genesis Evangelion…. Poi prendo per il culo i fissati di Avatar (sì insomma, non potete decidere che vi piace se non siete ancora andati a vederlo) facendo notare che, effetti speciali a parte, è la solita minestra…ah lo già detto.

Ho anche detto che ultimamente cazzeggio? Vorrei provare sslh per sputare sulla stessa porta ssl e ssh. Sai che ficata, meno rotture sul firewall del netgear e meno porte aperte per il cazzo. Ah, ssl mi serve per Webmin che si sposa abbastanza bene con Arch Linux… Oltretutto il tutor mi ha passato in PDF: tutta l’annata 2008 di Linux Pro, l’annata 2009 di PC Professionale, 6 mesi di Linux & C. ho scoperto che mi sta sui coglioni il boss). Ma non ho voglia di leggerli, cazzeggio…

Sage non funziona con Firefox 3.6 e ho incomincio ad avere l’astinenza compulsiva di controllare i feed.

variabili oggetto, d’istanza: da Java a Python

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 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

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

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

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…