Page 1 of 2
[TOOL] glsa-mail e glsa-report, notifica delle GLSA via mail
Posted: Wed May 05, 2004 4:38 pm
by FonderiaDigitale
Probabilmente e' pure il primo software marchiato o fatto stto l'egida dei gechi
Questo script manda una notifica a una mail specificata quando viene rilasciata una advisory che influenza (potenzialmente) la sicurezza del sistema.
Code: Select all
#!/bin/sh
# script to check for any Gentoo advisory and notify admins via email.
# Requires Gentoolkit
#
# to be called from cron, eg.
# * */6 * * * glsa-mail.sh
#
# Released under the GPL.
# Author Giovanni Ferri <FonderiaDigitale@gechi.it>
# Gechi web site www.gechi.it
# change this! :)
email="root"
checkGLSA () {
tmpfile="/tmp/GLSA_${RANDOM}"
mailfile="/tmp/GLSA_${RANDOM}"
IFS="
"
glsa-check --nocolor --list 2>/dev/null > $tmpfile
lines=`perl -0777pe 's/^(?:.*\n){4}//' $tmpfile`
rm -f $tmpfile
year=`date +%Y`
for each in $lines; do
GLSAn=`echo "$each"|cut -d' ' -f1`
type=`echo "$each"|cut -d' ' -f2`
case $type in
*N*)
if [ "$got" != 1 ]; then
got=1
echo "$HOSTNAME could be affected by this vulnerability:" >> $mailfile
echo >> $mailfile
fi
glsa-check --dump $GLSAn 2>/dev/null >> $mailfile
;;
esac
done
}
checkGLSA
cat $mailfile|mail $email -s 'new GLSA vulnerability found!! Check your machine.'
if [ "$got" == 1 ]; then
rm -f $tmpfile $mailfile
else
exit 0
fi
Buon divertimento

Posted: Wed May 05, 2004 4:47 pm
by federico
Buona idea, il funzionamento e' semplice ma sicuramente si tratta di un tool che risulta utile. Lo sto utilizzando

Posted: Wed May 05, 2004 6:05 pm
by FonderiaDigitale
Si, ed e' scritto pure male

ma fa il suo dovere
Tanto comunque ci tornero' sopra per aggiungerci qualcosa sicuramente in futuro
Posted: Thu May 06, 2004 8:34 pm
by federico
Ma la variabile che imposti Year a cosa serve ?
E poi.. visto che nn conosco perl, cosa fa quella riga? Ad occhio e croce pare una regexp
Posted: Fri May 07, 2004 9:05 am
by randomaze
federico wrote:Ma la variabile che imposti Year a cosa serve ?
E poi.. visto che nn conosco perl, cosa fa quella riga? Ad occhio e croce pare una regexp
In effetti pare che non la usi dopo, cmq. non é in perl ma in shell e con quell'istruzione assegna alla variabile (year) l'output del comando "date +%Y" (in pratica mette l'anno nella variabile!)
Posted: Fri May 07, 2004 4:48 pm
by federico
Siccome ieri sera non avevo nulla da fare ho scritto una implementazione python del tuo programma, fa la stessa cosa ma manda una mail leggermente diversa, con la descrizione del baco in attach (se ci sono X bachi manda una mail con X attach) e funziona senza il supporto di programmi mail esterni. E' possibile specificare un server smtp per l'invio della mail.
Code: Select all
#!/usr/bin/env python
# Lo script controlla i Gentoo Advisory e notifica eventuali rischi via mail
# Richiede gentoolkit e un programma mail funzionante da riga di comando
# glsa-mail.py puo' essere richiamato via cron, es:
# * */6 * * * glsa-mail.py
# Implementazione python di glsa-mail.sh di Giovanni Ferri <FonderiaDigitale@gechi.it>
# Rilasciato sotto licenza GPL
# Federico Galli - fede@sideralis.net - www.sideralis.net
# Riccardo Galli - riccardo@sideralis.net - www.sideralis.net
#Usage:
#glsa-check.py TO SMTP PORT
#SMTP default = localhost
#PORT default = 24
import os, sys, re
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
import email.Utils as Utils
import smtplib, StringIO
argc=len(sys.argv)
if not 2<=argc<=4:
print 'Usage: addressTO [smtpserver [port]]'
sys.exit(1)
to=sys.argv[1]
server= argc in (3,4) and sys.argv[2] or "localhost"
port=argc==4 and int(sys.argv[3]) or 25
PATTERN=re.compile(r'(?P<date>\d+-\d+)\s\[(?P<status>.)\]\s(?P<desc>.*)\(\s(?P<prog>.+)\s\)',re.MULTILINE)
soggetto="glsa-check report"
intestazione="Sono state rilevate le seguenti vulnerabilita':\n\n"
stdin,stdout,stderr=os.popen3("glsa-check --list")
text=stdout.read()
stderr=StringIO.StringIO()
stdout.close()
lista_prob=[]
lista_attachs=[]
for line in PATTERN.findall(text):
if line[1]=='N':
lista_prob.append(line[2])
stdin,stdout,stderr=os.popen3('glsa-check --dump %s' % line[0])
body=stdout.read()
stderr=StringIO.StringIO()
stdout.close()
lista_attachs.append(body)
if not lista_attachs : sys.exit(0)
body=intestazione+'\n'.join(lista_prob)
import socket
msg=MIMEBase('multipart','mixed')
msg['From']="glsa-check@%s.py"% socket.gethostname() or 'sideralis.net'
msg['To']=to
msg['Date']=Utils.formatdate()
msg['Message-ID']=Utils.make_msgid()
msg['Subject']=soggetto
msg.attach(MIMEText(body))
for i in lista_attachs:
msg.attach(MIMEText(i))
try:
s=smtplib.SMTP(server,port)
s.sendmail(msg['From'],msg['To'],str(msg))
s.quit()
except smtplib.SMTPException,e:
print e
Siccome a volte il python perde la sua indentazione nel forum, si puo' scaricare qui
www.sideralis.net/download/glsa-check.py
Fede
Posted: Sat May 08, 2004 1:39 am
by FonderiaDigitale
fico
Adesso lo testo e poi ti so dire
Posted: Mon May 10, 2004 11:37 pm
by federico
Ok ho scritto una versione ottimizzata che richiama direttamente le librerie da gentoolkit e ci mette circa meta' del tempo della versione precedente:
Code: Select all
blackman@altair blackman $ time python glsa-report.py fede@sideralis.net smtp.fastwebnet.it
real 0m1.081s
user 0m0.854s
sys 0m0.052s
blackman@altair blackman $ time python glsa-check.py fede@sideralis.net smtp.fastwebnet.it
real 0m2.158s
user 0m1.259s
sys 0m0.065s
blackman@altair blackman $
Il che mi pare pregevole.
La versione glsa-report e' scaricabile da
www.sideralis.net/download/glsa-report.py e il codice e' questo :
Code: Select all
#!/usr/bin/env python
# Lo script controlla i Gentoo Advisory e notifica eventuali rischi via mail
# Richiede gentoolkit e un programma mail funzionante da riga di comando
# glsa-mail.py puo' essere richiamato via cron, es:
# * */6 * * * glsa-mail.py
# Revisione python di glsa-mail.sh di Giovanni Ferri <FonderiaDigitale@gechi.it>
# Rilasciato sotto licenza GPL
# Federico Galli - fede@sideralis.net - www.sideralis.net
# Riccardo Galli - riccardo@sideralis.net - www.sideralis.net
#Usage:
#glsa-report.py TO SMTP PORT
#SMTP default = localhost
#PORT default = 25
import os, sys
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
import email.Utils as Utils
sys.path.insert(0, "/usr/lib/gentoolkit/pym")
from glsa import checkconfig, get_glsa_list, GlsaTypeException, Glsa, portage
import smtplib, random
argc=len(sys.argv)
if not 2<=argc<=4:
print 'Usage: addressTO [smtpserver [port]]'
sys.exit(1)
to=sys.argv[1]
server= argc in (3,4) and sys.argv[2] or "localhost"
port=argc==4 and int(sys.argv[3]) or 25
lista_prob=[]
lista_attachs=[]
glsaconfig = checkconfig(portage.config(clone=portage.settings))
completelist = get_glsa_list(glsaconfig["GLSA_DIR"], glsaconfig)
fileName='/tmp/tmp_blabla'+str(int(random.random()*100))
for myid in completelist:
try:
myglsa = Glsa(myid, glsaconfig)
except GlsaTypeException, e:
#print "invalid GLSA: %s (error message was: %s)" % (myid, e)
continue
if myglsa.isVulnerable():
lista_prob.append(myglsa.title)
myglsa.dump(outfile=fileName)
fp=file(fileName)
lista_attachs.append(fp.read())
fp.close()
os.remove(fileName)
if not lista_attachs : sys.exit(0)
soggetto="glsa-check report"
intestazione="Sono state rilevate le seguenti vulnerabilita':\n\n"
body=intestazione+'\n'.join(lista_prob)
import socket
msg=MIMEBase('multipart','mixed')
msg['From']="glsa-check@%s.py"% socket.gethostname() or 'sideralis.net'
msg['To']=to
msg['Date']=Utils.formatdate()
msg['Message-ID']=Utils.make_msgid()
msg['Subject']=soggetto
msg.attach(MIMEText(body))
for i in lista_attachs:
msg.attach(MIMEText(i))
try:
s=smtplib.SMTP(server,port)
s.sendmail(msg['From'],msg['To'],str(msg))
s.quit()
except smtplib.SMTPException,e:
print e
Tra le raffinatezze vi e' la creazione random di un file sotto etc (mantenere il nome fisso alza il rischio sicurezza) e ho scritto al tipo che scrive glsa-report xke' c'e' un pezzo di codice un po' schifoso (spero che implementi il bugfix)

Posted: Mon May 10, 2004 11:43 pm
by FonderiaDigitale
due note:
- alcuni sono costretti a usare un smtp server con autenticazione
- il file e' bene crearlo sotto /tmp piu che in /etc
per il resto.. notevole. e son contento che la mia idea sia servita.

ps. ho cambiato il topic in qualcosa di piu congeniale.
Posted: Tue May 11, 2004 12:23 pm
by federico
La tua idea e' veramente piaciuta, su questo non ci piove!
Ho mostrato ad amici l'idea e sono tutti rimasti contenti!
Per le note, il file viene scritto sotto /tmp, ho scritto forse etc da qualche parte e ora nn lo vedo?
Code: Select all
fileName='/tmp/tmp_blabla'+str(int(random.random()*100))
E per l'smtp con autenticazione hai ragione.. sarebbe il caso di implementarlo...
Fede
Posted: Thu May 13, 2004 2:41 pm
by federico
Fixato quello che c'era da fixare, aggiunta l'autenticazione per smtp e una buona gestione degli errori, ora direi che è a posto.
http://www.sideralis.net/download/glsa- ... .0.tar.bz2
per chi fosse interessato a provare.
Federico
Posted: Thu May 13, 2004 4:58 pm
by FonderiaDigitale
ok, ti dico quello che ho rilevato da fixare:
Code: Select all
$ ./glsa-report.py -t xxx@yyyy.it -s smtp.tin.it
{'xxx@yyyy.it': (550, 'RCPT TO:<xxx@yyyy.it> Relaying not allowed - please use SMTP AUTH')}
forse qui sarebbe da catturare l'output e rispondere con un errore standard
cambia il n. versione da 1 a 2
potresti aggiungere una opzione --verbose che rilascia in stdout il contenuto di cosa trova (anche se non trova nulla). utile per chi pensa non funzioni non vedendo output.
Posted: Thu May 13, 2004 5:25 pm
by solka
Ciao,
ho provato la versione di federico, ma mi dà il seguente errore:
Code: Select all
pitagora glsa-report-1.0 # glsa-report -t solkanar@ngi.it -s smtp.fastwebnet.it
Traceback (most recent call last):
File "/usr/bin/glsa-report", line 94, in ?
os.remove(fileName)
OSError: [Errno 2] No such file or directory: '/tmp/tmp_glsa-report18'
pitagora glsa-report-1.0 # glsa-report -t solkanar@ngi.it -s smtp.fastwebnet.it
Traceback (most recent call last):
File "/usr/bin/glsa-report", line 94, in ?
os.remove(fileName)
OSError: [Errno 2] No such file or directory: '/tmp/tmp_glsa-report44'
pitagora glsa-report-1.0 # glsa-report -t solkanar@ngi.it -s smtp.fastwebnet.it
Traceback (most recent call last):
File "/usr/bin/glsa-report", line 94, in ?
os.remove(fileName)
OSError: [Errno 2] No such file or directory: '/tmp/tmp_glsa-report92'
pitagora glsa-report-1.0 # glsa-report -t solkanar@ngi.it -s smtp.fastwebnet.it
Traceback (most recent call last):
File "/usr/bin/glsa-report", line 94, in ?
os.remove(fileName)
OSError: [Errno 2] No such file or directory: '/tmp/tmp_glsa-report77'
sbaglio io qualcosa?
Posted: Thu May 13, 2004 5:30 pm
by federico
[EDIT]
Per quanto riguarda l'errore del traceback, e' dovuto al fatto che non ho pensato che un sistema potesse essere esente da errori, come il tuo

Ho sistemato questa cosa e se vuoi provare se ora funziona puoi scaricare
http://www.sideralis.net/download/glsa-report.py
e sostitirlo a quello attuale, mi sai dire come va poi?
(PS: visto che probabilmente il tuo sistema e' privo di errori, se vuoi provare a vedere cosa fa il programma puoi editare la riga 88
if myglsa.isVulnerable():
trasformandola in
if not myglsa.isVulnerable():
in questo modo dovrebbe arrivarti una mail contenente tutti i glsa corretti

)
Sappimi dire!
[/EDIT]
Okey, per quanto riguarda gli errori del server smtp ci avevo fatto caso ma avevo fatto finta di non vedere, preparo qualcosa del tipo "il server ha detto BLABLA, probabilmente si e' verificato un errore nell'invio della mail"
Inoltre aggiungo un po' di verbosaggio
Oltre queste due cose che mi fai notare ho notato -uno se ne accorge sempre dopo- un paio di sottigliezze nel codice che potevo ottimizzare, sistemo quanto prima possibile
Grazie infinite per il supporto !
Posted: Thu May 13, 2004 11:06 pm
by federico
Allora allora allora...
http://www.sideralis.net/download/glsa- ... .1.tar.bz2
Lavorando a tutto questo il programma si e' un po' ingrossato, spero di non aver lasciato pezzi in giro.
- aggiunto il verbose
- aggiunta una buona gestione degli errori
Fede
Posted: Thu May 13, 2004 11:32 pm
by FonderiaDigitale
[editato!]
siccome usare degli avvisi di sicurezza senza controllare la veridicita' della fonte NON e' bello, conviene anche controllare se chi ha firmato le GLSA e' effettivamente chi dice di essere.
allora conviene importare le chiavi pubbliche di tutti gli sviluppatori gentoo: per fare questo -
una tantum - basta eseguire questo snippet:
Code: Select all
for a in `lynx -dump http://www.gentoo.org/proj/en/devrel/roll-call/userinfo.xml|grep 0x`; do
i=`expr match "$a" '.*\(0x........\).*'`
case $i in
0x????????) gpg --keyserver hkp://subkeys.pgp.net -q --search-keys "$i";;
esac
done
lascio a te (federico) l'onere di convertirlo in python, se credi, e di aggiungere una opzione al programma tipo --importgentookeys (visto che io, in python, faccio ancora abbastanza pena

)
vedi se ti sembra utile (la fase di importing delle chiavi DEVE essere lasciata manuale... e' bene controlla cosa si importa).
Posted: Thu May 13, 2004 11:55 pm
by federico
[edit!]
mi hai editato lo script sotto gli occhi

ora lo riprovo
[/edit]
[edit 2]
Keys 1-1 of 1 for "0xA314EE7E"
(1) Arne Mejlholm (Aaby) <
aaby@gentoo.org>
1024 bit DSA key A314EE7E, created 2004-01-14
Enter number(s), N)ext, or Q)uit >
Mi spieghi anche questo che significa?
[/edit 2]
Ho visto ora il post, dopo il wkend ci lavoro un po' ma... essenzialmente non ho capito

Ho capito che e' bene controllare che le firme di gpg siano corrette e non corrotte

e se capisco bene (sono una sega in gpg) la procedura sarebbe leggere la pagina dove sono listati gli sviluppatori attivi, leggerne le firme, controllare se matchano con quelle del secondo server (che immagino sia un server dove sono depositate le chiavi)
Ma.. se non matchano verosimilmente la pagina sul sito gentoo e' stata corrotta, o sbaglio? Quindi nel caso non matchassero potrebbero esserci delle informazioni non corrette sul sito di gentoo, giusto?
Non so se ho capito bene...
Ma te lo sei scritto tu quello snippet? Mi rendo conto di essere schiappissimo in bash scripting

Posted: Fri May 14, 2004 12:30 am
by federico
No spe..
leggiamo le chiavi dalla pagina di gentoo, troviamo i corrispettivi su quel server e poi aggiungiamo le voci [se ce n'e' + di uno prenderei quelli delle
mail@gentoo.org] al nostro gpg ottenendo qualcosa tipo questo
ackman@altair blackman $ gpg --list-keys
/home/blackman/.gnupg/pubring.gpg
---------------------------------
pub 1024D/98B1EECD 2003-03-01 Abhishek Amit <
abhishek@gentoo.org>
uid Abhishek Amit <
andrd@gentoo.org>
uid Abhishek Amit <
abhishekamit2000@yahoo.com>
uid Abhishek Amit (Personal) <
abhishek@aamit.com>
sub 1024g/6FCEB5FC 2003-03-01
... giusto?
Ma non mi pareva che glsa-check controllasse le chiavi gpg se presenti...
Posted: Fri May 14, 2004 8:59 pm
by solka
federico wrote:[EDIT]
Per quanto riguarda l'errore del traceback, e' dovuto al fatto che non ho pensato che un sistema potesse essere esente da errori, come il tuo

Ho sistemato questa cosa e se vuoi provare se ora funziona puoi scaricare
http://www.sideralis.net/download/glsa-report.py
e sostitirlo a quello attuale, mi sai dire come va poi?
(PS: visto che probabilmente il tuo sistema e' privo di errori, se vuoi provare a vedere cosa fa il programma puoi editare la riga 88
if myglsa.isVulnerable():
trasformandola in
if not myglsa.isVulnerable():
in questo modo dovrebbe arrivarti una mail contenente tutti i glsa corretti

)
Sappimi dire!
[/EDIT]
Ciao,
non ho provato l'ultima versione aggiornata, ma cmq con questa modifica funziona perfettamente

Cambiando quella linea arrivano tutti i glsa corretti
saluti
Posted: Mon May 17, 2004 10:55 am
by federico
Sicuramente allora ti funzionerà anche l'ultima versione, col funzionamento normale. Il tuo errore è stato un buon bug report, in pratica nella gestione del tutto viene creato un file temporaneo che viene cancellato a ciclo esecutivo finito. Il punto era che viene cancellato sempre ma viene creato solo se ci sono bug glsa, che tu non avevi
Fede
Posted: Mon May 17, 2004 12:57 pm
by HexDEF6
Ho un piccolo problema con lo script:
il mio server smtp (server gentoo con qmail e qmail-scanner) mi manda questa mail:
Code: Select all
Attention: glsa-check@HexDEF6.py
A problem was found in an Email message you sent.
This Email scanner intercepted it and stopped the entire message
reaching its destination.
The problem was reported to be:
Illegal breakage found in header name - potential virus
Please contact your I.T support personnel with any queries regarding this
policy.
leggendo in giro ho letto che potrebbe succedere una cosa del genere se il body di una mail non inizia con una linea a capo...
Qualcun altro con questo problema?
Ciao!
Posted: Mon May 17, 2004 1:23 pm
by federico
Dunque, probabilmente si trattava di una sbagliata implementazione da parte nostra dell'rfc 2822, prova a modificare la linea 135 con
Code: Select all
body=intestazione+'\r\n'.join(lista_prob)+'\r\n'
Dovrebbe risolvere l'errore che giustamente riportava il tuo qmail.
[edit]
www.sideralis.net/download/glsa-report.py
e' il codice aggiornato con questa modifica.
Posted: Tue May 18, 2004 12:54 pm
by HexDEF6
federico wrote:Dunque, probabilmente si trattava di una sbagliata
Dovrebbe risolvere l'errore che giustamente riportava il tuo qmail.
www.sideralis.net/download/glsa-report.py
e' il codice aggiornato con questa modifica.
niente da fare... a me da ancora lo stesso errore

potrebbe essere il mio server che ha problemi? (tutte le altre mail che ricevo funzionano senza problemi)
Ciao!
edit:
se lo lancio dalla stessa macchina dove gira il server smtp, va tutto bene... se lo lancio dal mio desktop mi da l'errore

Posted: Tue May 18, 2004 4:33 pm
by federico
Hai modo di farmi vedere che mail arriva al server quando questo la rifiuta?
Io ho controllato, dovrebbe essere assolutamente rfc la mail che viene creata ma la ricontrollo daccapo.. certo che il tuo server e' proprio schizzinoso
Se riesci a mostrarmi la mail che ti rifiuta sarebbe proprio ottimo.
Posted: Tue May 18, 2004 6:21 pm
by HexDEF6
qui:
http://supahlooza.homelinux.org/mail.tar.gz
trovi le 2 mail, quella che mi ha spedito (ho eseguito lo script sul mio server dove c'e' il server smtp con questa riga: ./glsa-report.py -t
mio_indirizzo@supahlooza.homelinux.org ) e quella rifiutata ( ho eseguito lo script sul mio desktop lanciandolo così: ./glsa-report.py -t
mio_indirizzo@supahlooza.homelinux.org -s 192.168.0.254 dove 192.168.0.254 e' il mio server )
Ciao!