jueves, 12 de septiembre de 2013

que es sieve y como usarlo


A menudo, en temas de correo, oímos hablar de Sieve, que por cierto, significa "colador". Dícese de sieva a:

         un lenguaje de programación única y
         expresamente para filtrar correo.

Con esos truenos mete miedo al que no quiere o sabe programar, pero noes más que un sistema de filtrado vestido de sintaxis clásica. Sieve tiene muchas implementaciones para ciertos usos específicos, por eso, al buscar en internet encontramos unas guías abstractas que con la explicación y cuarenta quilos, coges el P1. La documentación oficial en la wiki de fastmail.fm aclara que hay que tener una cuenta de fastmail... Entonces salta la interrogante:

-¿y cómo lo pruebo?

Hay sitios web de correo que te permiten implementar filtros de correo usando sieve. Fastmail.fmi (los creadores de sieve) es uno de ellos, también myopera y todos los que le cuelgan a messagingengine.com allá en país de los canguros. Pero aquí en cubita la bella no sería útil para borrar los correos grandes del servidor SIN TENER QUE BAJARLOS :D

Pero como dice el forense: -vamos por partes

En linux existe una implementación, típica de linux como dicen los novatos: "un comando". El intérprete de sieve casi siempre viene en el paquete mailutils. Con eso, podemos botar a fetchmail y a procmail, ya que ese intérprete hace tanto la bajada del correo como su reparto y filtrado.

Los "escripses" de sieve son ficheros con una extensión ".siv"

Digamos que tenemos nuestro escript; queremos alar, bajar y filtrar el correo en un buzón imap:

$ sieve -f imap://fulano:tupassword@servidor/ escript.siv

Si quieres alar de un pop3:

$ sieve -f pop://fulano:tupassword@servidor/ escript.siv

Osea, -f indica la URL hacia el buzón, ya que por defecto el sieve de mailutils, ala los correos en
/var/mail/$USER

Bueno, dentro de escript.siv va todo lo que has visto (o no) en la guías abstractas...

Hablemos de el lenguaje como tal. Para empezar tiene librerías. Como en cualquier lenguaje, dichas librerías cumplen funciones y han de ser inlcuídas o no, a gusto del consumidor. Eso en mi opinión es un cliché pa que parezca un lenguaje y un estorbo a la hora de teclear porque algunas cosas ya están incluidas pero otras no.

La sintaxis básica es esta:

require ["libreriatal","libreriamascual"];
if condición {
   acción;
   acción "parámetro";
   stop;
   }

OJO! hay cosas que terminan en punto y coma; la sentencias pues.

Por ejemplo, digamos que queremos mandar todos los correos cuyo asunto incluya la palabra 'Re:' al buzón "respuestas", para eso usaremos la librería "fileinto" que se dedica a "archivar en" donde le digas. Este
script debería tener una linea para incluir la librería y otro para filtrar. Se verían así:

   require ["fileinto"];
   if header :contains "Subject" "Re:" { fileinto "respuestas"; stop; }

Simple, si el campo Subject: contiene la cadena "Re:", ejecutamos fileinto, a fileinto le mandamos como argumento el nombre del buzón, en este caso 'respuestas' será el nombre del buzón LOCAL donde se
almacenará el correo por último el punto y coma. Después viene la sentencia "stop" que la veremos más adelante.

Ya solo sería ejecutar el intérprete como expliqué arriba. Simplemente varíe el campo que desea machear y el criterio, con eso estará creando filtros a como le acomode.

NO ponga ":" ya que eso seria, por ejemplo el valor "From:" machearía un campo que diga "From::" en el correo y no existe tal cosa.

Podemos también comprar múltiples valores o múltiples campos. Por ejemplo, veamos que nuestra dirección este en To: o Cc:

   if header :contains ["To","Cc"] "tudireccion" {
   fileinto "/home/fulano/mail/personal";
   stop;
   }

No tenemos que poner la dirección entera, pongamos solamente la parte de alante, de todas formas si el "To:" contiene una parte, macheará. Teniendo en cuenta lo "corticas" que son la direcciones cubanas como por ejemplo: salvadorsanchez@cacocum.hlg.sld.cu Mira que hay palabras largas en el idioma finlandés, pero nada como la direcciones de correo del ICRT, que se llevan la pantalla de lado a lado y se desaparecen antes que termines de leerla :D Mira que hay

Pero ÉCHATE ESTO, ponte que no quieras bajar aquellos correos más grande de un mega, podemos borrarlo SIN BAJARLO, mira:

   if size :over 1024K {discard; stop;}

Dícese de un correo cuyo tamaño sea mayor que 1024K ha de ser borrado.

La sentencia discard, borra el correo sin bajarlo, porque los encabezados de imap se bajan sin bajar el correo completo. Recuerde que sieve no solo es un comando de mailutils, está implementado en otro lenguaje, por ejemplo, la sentencia ":envelope" en vez de :contains, se usa para machear el comando MAIL FROM de los servidores SMTP en una implementación que trabaje DENTRO del servidor.

ah! y el stop... Si en vez de usar "stop" usaremos "keep", estaríamos diciendo que siga procesando el correo al siguiente filtro. El stop quiere decir que para ese correo que macheó esa regla, no se le hará más nada. En cambio, keep, seguirá procesando el correo por las demás reglas.

Para los usuarios de procmail:

:0c es keep
:0f es stop

Veamos cosas más locales y "desorbitantes", por ejemplo, digamos que queremos quitar todos los adjuntos del '.exe' de los correos para evitar virus.

if attachment :matches "*.exe*" { discard; stop; }

Usamos la sentencia attachment con el símbolo :matches detrás, osea "si el adjunto machea", luego el argumento "entre comilla" es el macheo, en este caso "*.exe*" note que está entre *asteriscos*, es una expresión regular.

También podemos anidar, para probar varias condiciones. Por ejemplo si un fichero ".zip" es mayor de un mega, que no pase.

if attachment :contains ".zip" {
   if size :over 1024K { discard; stop; }
   }

Como ven: ¡Dentro de los {} metimos otro filtro!

Digamos que el jefe nos dice:

-quiero que todos los correos que vengan del banco, se le envíen
 a "mengana", a "siclano" pero que además, le lleguen al que se lo
 mandaron originalmente
El diablito te dice "MDaemon lo hace facilito" pero tu, un linuxero radical, que usa software libre por convicción (o porque te obligaron a poner Nova) sabes que sieve tiene el power...

Así mismo, como dijo el jefe:

if envelope :contains "From" "banco" {
  redirect "mengana@dominio.cu";
  redirect "fulano@dominio.cu";
  keep;
}

El secreto para que le llegue a quien se lo mandaron originalmente es la palabra clave "keep" osea, "keep walking in your way" sigue tu camino.

miércoles, 4 de septiembre de 2013

procmail en el nilo


Todo el mundo cree que su configuración es casi jeroglífica y están en lo cierto. Ahora les mostraré una traducción romanizada del .procmailrc usado por el faraón Tutancamón. No no no no serio, les explicaré lo poquito que aprendí de procmail cacharreando y comiéndome los man Sin internet. Veremos solamente lo básico para no desbordarle el cerebro.

fetchmail y la mayoría de los MTA entregan a través de procmail. En este ejemplo, pasamos por alto el MTA y le damos el correo a procmail directamente; pero más adelante veremos como operar nuestro propio MTA. Tengamos en cuenta que todo entra por estandar input. Veamos como se las arreglaba Tutancamon para distribuir sus correos en unix.

$ cat .procmailrc

MAILDIR=$HOME/Mail
DEFAULT=/var/mail/$USER
VERBOSE=off

:0
* ^From:.princesa@rio_nilo.eg
jevita

Aquí de configuramos en las tres primeras lineas lo necesario para que funcione en "~/Mail" y la magia empieza en el jeroglifico ":0"

Eso es un numero cero con dos puntos y si ponemos ":0:" le decimos que bloquee el fichero de arribo para por si alguien lo modifica por el camino, osea, evita que dos aplicaciones escriban en el mismo fichero.
Yo no lo uso. Bueno, veamos lo demás:

* ^From:.princesa@rio_nilo.eg

Eso es "*" Compara "^" lo que empieze de "From:" palante ".princesa@rio_nilo.eg" note el punto delante de la dirección; quiere decir que machee lo que tenga delante para no contar el nombre real y guiarte por la dirección de correo así por ejemplo si el header de la dirección dice.

   From: "Pantera del Desierto" <princesa@rio_nilo.eg>

Procmail usará esa expresión egrep(por si no lo a notado) y macheara la dirección de correo sin importar lo que tenga.

Luego en la siguiente linea dice solamente

jevita

Guao! Que ruta tan simple. Es que ya declaramos la variable $MAILDIR y eso lo hace una ruta relativa que el programa la interpreta como una ruta absoluta conjugada con la vairable $MAILDIR.

Yo para ponerle la tapa al pomo, creo un link entre los "inboxes"

ln -s /var/mail/inbox /hom/tutancamon/Mail/inbox

Así el inbox del home y el de /var/mail son la misma cosa. Pero acá hay un detalle curioso y es que procmail es capaz de entregar en cualquier formato (decente) de correo. Si pusiéramos:

jevita/

Con el "/" al final. Entregaríamos en un "Maildir" bajo "~/Mail/".

Aprovechemos para hablar un poquito sobre los "maildir"

Maildir es el formato de "qmail". Muy bueno para grandes cantidad de correos muy rápido. Su escritura y lectura es mas rápido porque es de uno en uno. También dicen que es más seguro pero no dicen en que
sentido o porqué es más seguro, así que... no creo que sea más seguro. Las explicaciones que dan usualmente hablan de mayor rendimiento pero no de seguridad como tal. El Maildir organiza los correos tendiendo dentro 3 subdirectorios: "cur","new","tmp" El directorio "cur" almacena los correos leídos, el directorio "new" los nuevos y el "tmp" los que están siendo escritos, evitando así el uso de locks. Cada correo será siempre un fichero separado en la carpeta new o cur, ideal para cuando desarrollo aplicaciones de correo y no quiera lidiar con el formato mbox.

Pero volviendo con procmail... En el caso que pusiéramos:

jevita/.

Con un "/." entonces entregaríamos en formato "MH" que es el que usan algunos clientes muy viejos pero es otro buen sustituto del mbox principalmente cuando son muchos correos. De todas formas le recomiendo
más "Maildir" que "MH", ya que mh tiene TODO el correo (nuevo y viejo) en un mismo directorio, usando un fichero de control para ver cual es nuevo o viejo. Dicho fichero varía según el cliente y suele dar unos
bateos horribles.

Por último:

jevita

Entrega en formato crudo porque si confiamos en que será un mbox... no se mi procmail que fue descargado y compilado supuestamente última vesión y el formato mbox no pincha bien. Mas bien tira los correos
crudos uno atrás del otro en un fichero. Para corregir ese "palo" yo pongo esta regla primero que ninguna.

:0fw
| formail

Formail es un programa que manipula los encabezados del correo. Veamos un ejemplo típico de formail manipulando encabezados:

| formail -I "From: Fulano <direccion@dominio.org>"

Esto le insertará y/o remplazará el encabezado from. Digamos que desea marcar todos los hilos nuevos de un lista y que dichos correos lleguen a su carpeta filtrada con la marca flag puesta. Aquí formail es la herramienta definitiva.Digamos que la lista se llama gutl-l@jovenclub.cu:

Nuestro procmailrc se vería así:

:0fw # resalta los nuevos correos en gutl
* X-BeenThere: gutl-l@jovenclub.cu
* !^Subject.*(Re:|Fw:)
|formail -I 'X-Status: F'


Osea que todo lo que NO tenga Re o Fw en el asunto es un nuevo hilo, ya solo es cuestión de mirar la carpeta donde filtra la lista y verá los nuevos hilos con la flag puesta. El como se ven, depende mucho de
su cliente de correo.

Bueno y como filtral una lista? Pues mailman tiene el encabezado X-BeenThere: donde va la dirección de la lista, así que:

:0 # gutl-l la lista de cuba
* X-BeenThere: gutl-l@jovenclub.cu
gutl-l

Con eso tienen una breve noción de procmail, lo demás es "creatividad"

martes, 3 de septiembre de 2013

date -d FUTURO

Aveces queremos hacer un script o ALGO que machee una fecha que no es la actual, quicieramos que date resolveria ese problema pero cambiar la hora es una jodienda, pero mira, corre:

$  date -d '+7 days'

y te saldrá la hora de hoy, dentro de 7 días :D

pero aún más bestial, que día del mes era hace sieta días:

$ date -d '-7 days' '+%d'



Gnu-PGP y los secretos masónicos



Se especula que hay una selta secreta que pretendo cogerse el mundo. Uno de estos miembros decidio que su correo no debia ser leido por ahi o que sus email no se usarian para ingeneria social o que a nadie le interesa lo que se habla con su novia, entonces se inventó GPG (vea la verdadera historia aquí)

El principio es sencillo:

1- Crear un clave PGP.
2- Manda una clave publica a alguien.
3- Ese alguien te lo cifra con TU clave pública.
4- tu lo desifras con tu password.

Primero lo primero. Crear una Clave personal, la tuya la que no tiene nadie. Eso lo hacemos generando un "par de claves" par porque son dos, la perosnal y la publica pero se genera travez de una.

$ gpg --gen-key

Ahi comenzará un poroceso donde se genera la clave. Si pretende planear como hacer caer la unión sovietica por correo le recomiendo que se haga de un pasword bien pinguo.

echo! Clave creada para la dirección frater@gran_logia.org

Ahora probemos cifrar algo, un buen fichero de texto por ejemplo. Cogemos un fichero y le corremos este comando:

$ gpg --armor -r frater -o monografia.asc -e malvado_plan_B.txt

Ahora la explicación de los parametros:

"--armor" genera una forma llamada "ASCII amored data" o armadura ASCII lista para pasra por el correo. Claro esto es un chapusería porque lleva toda una información MIME que diga que es un correo cifrado en GPG pero bueno para que comprenda el principio.

Ahora bien, en este caso usamos nuestra propia clave publica pero si fueramos escribirle a:

complice@logia.pais_victima.org

Necesitamos la clave pública DE ÉL no la de nosotros. Le recuerdo que nosotros recibimos mensajes encriptados con nuestra propia clave publica. Veamos como sería este negocio...

Le mandamos nuestra clave publica a nuestro complice, Lo hacemos asi:

$ gpg --export --armor -o clave_publica.asc

Muy importante el parametro "--armor" sin la armadura ASCII solo mandariamos un chorro de mierda binaria buena para nada a nivel de correo pero muy util a nivel de archivo.

Ahora aparecera el fichero clave_publica.asc y este es la clave publica que le mandamos al cómplice.

Él ALLÁ correra el comando:

$ gpg --import clave_publica.asc

y agregara nuestra clave a su deposito de claves. Ahora esta listo para crear un cifrado que ni el podrá ver; solo su creador (tu) con la clave

Entonces Él ALLÁ corre.

$ gpg --armor -r frater -o monografia.asc -e malvado_plan_B.txt

y el fichero monografia.asc estara listo para ser enviado cifrado con nuestra clave para que solo tu lo puedas ver. Entonces el borra el fichero malvado_plan-B.txt con metodo Gudman de 7 pases y te envia el cifrado.

del lado de ACA lo decifras con el comando:

$ gpg -o planes.txt -d monografia.asc

Y te pedirá TU password de TU clave. Complicado verdad :-(

PERO BUENO!!

Mutt te hace la vida MUY facil, veamos como se comporta Mutt y sus habilidades especiales. Yo uso el 1.5.20 que es la version mas estable hasta el momento que escribo esto.

En el .muttrc pondremos lo siguiente.

set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f"
set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f"
set pgp_encrypt_only_command="gpg --output - --armor -r %r -e %f"
set pgp_encrypt_sign_command="gpg --passphrase-fd 0 --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust -r %r -- %f"
set pgp_import_command="gpg --no-verbose --import -v %f"
set pgp_export_command="gpg --no-verbose --export --armor %r"
set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r"
set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r"
set pgp_autosign=yes
#OJO en este liena de abajo
set pgp_sign_as=frater
set pgp_replyencrypt=yes
set pgp_timeout=1800
set pgp_good_sign="^gpg: Good signature from"

Preste atención a la 4ta linea de abajo hacia arriba, dice:

set pgp_sign_as=frater

Ahí sustituya "frater" por su nombre de clave o mejor por la ID. Para averiguar la ID liste sus claves.

$ gpg -k

y tendrá algo como esto:

    pub   1024D/DE1A6CA5 2010-05-28
    uid                  chicho <frater@gran_logia.org>
    sub   2048g/0C914E56 2010-05-28

En este caso su clave es la "pub" DE1A6CA5

Ahora Mutt esta listo para convertirce en la herramienta definitiva para su consiparicion de conquista mundial. Mandele su clave publica a sus amigos iluminatis, esto lo hace en la pantalla principal de Mutt
presionando la combinaciond e teclas Escape + "k"

Enonces recivira el "input" donde pone la direccion de su complice y el asunto:

"oigan todos... le mando mi clave a mi complice"

ya que el asunto NO se encripta; así que usa uno menos explícito...

Pero nos surge la duda..

-Como encripto?

Bueno eso ya viene siendo mas complicado. Primero le pide su clave publica a su amigo el complice y cuando la tenga ya mutt sabra que hacer con ella. Veamos un ejemplo.

Cuando su amigo mande su clave publica mutt le dara la opcion de "importarla". Usted la importa y luego compone un mesaje NORMAL. Luego de poner todo sus secretos mas intimos y los tarros que le pega a
su novia salva el texto y cierra el editor. Al romperse la tuberia caerá en la pantalla de mutt done le dice presione "y" para enviar, NO la presione.

Ahi usted presiona "k" y le dara varais opciones. Una de ellas es la "e" de Encrypt. Si todo esta bien Mutt detecta la clave publica con la dirección de su complice que conincide con la direccion del destino del mensaje y BUN! cifrado para el cómplice.

Eso es la firma PGP. Esta se usa como un sello de lacre para la autenticidad y NO encrypta el mensaje. Para ello en la pantalla donde presiono "k" en vez de presionar luego la "e" solo presione la "s" de Sign y generara la firma de autenticidad anidada al correo.

Ahora también está de moda, que la clave sea en el cuerpo del mensaje, ya sea la firma o la propia clave. lugar de ser un adjunto, sea parte del cuerpo. Los clientes de correos lo procesan pero mutt parece quedarse loco.

Para cifrar en lina y procesar correos cifrados en linea, podemos usar esto:


set pgp_replyinline=yes
set pgp_autoinline=yes

No obstante, decifrar inline sigue siendo una jodienda. Si vez la documentación oficial, es todo una brujería con procmail, pero es más simple esto:

message-hook '!~g !~G ~b "^-----BEGIN PGP (SIGNED )?MESSAGE"' 'exec check-traditional-pgp'

Simple verdad? un ganchito... Otra cosa, quizas quieras agregar un encabezado para decirles a todos donde est;a tu firma:

set my_header="X-PGP-Key:h ttp://tuserver/~usuario/clave.asc"

Claro! Evolution lo hace todo solo y Thunderbird tiene un plugin.