I-fetchmail-server: (0.05) (potato) Recogiendo correo con fetchmail en un servidor de intranet Este es _MI SISTEMA_ de recoger/filtrar y repartir correo 0.00 7/5/01 Empiezo a trastear 0.01 14/6/01 Retoques 0.02 15/9/01 webmail/ftp/http a LO MALO 0.03 5/12/01 Mejoro detección de adjuntos para evitar falsos positivos (correo basura con código html), añado .bat y .scr a peligrosos 0.04 7/12/01 Desvio mensajes con imagenes en Internet o con scripts a Spam 0.05 10/12/01 Los tags de imagenes pueden tener varias lineas, usar [.\>]* EN BREVE: Vamos a: - Recoger el correo con fetchmail pero _NO_ como usuario root - Usar el usuario (sin shell) "correo" para procesar con procmail el correo recogido con fetchmail antes de entregarlo al SMTP local - Separar el correo basura si nuestras direcciones no estan en To:/Cc: (este sistema tiene inconvenientes) - Desviar los mensajes con adjuntos peligrosos (EXE, etc...) a otra cuenta - Desviar los archivos word con macros (EXPERIMENTAL) a otra cuenta *POR HACER* Desviar a SPAM mensajes que cargan imagenes de Internet Notificar a usuarios que un correo ha sido desviado por llevar ejecutables Usuarios to desde fetchmailrc deben existir sino se pierde el correo Uso con conexión intermitente ¿sudo? Login de fetchmail a syslog ANTES DE EMPEZAR: Necesitas instalar: - fetchmail: Para recoger correo del proveedor - procmail: Para filtrar correo - ipopd/qpopper: Buzones para tus usuarios - Postfix: Un servidor de envio de correo SMTP (mira I-postfix) ATENCION: Si tienes algún usuario con login debes crear una cuenta diferente para el correo p.e. usuariocorreo Y crear un alias para que el correo local de "usuario" llegue a la cuenta "usuariocorreo" Poner en /etc/aliases : ---8<--- usuario: usuariocorreo --->8--- MOTIVO: La contraseña circula en texto claro y se puede capturar con un sniffer comprometiendo esa cuenta PASO A PASO: 1) Crear usuarios para usar como buzones de correo _SIN LOGIN_ (sin shell) - modificar /etc/adduser.conf dejando como shell: ---8<--- DSHELL=/bin/false --->8--- - adduser usuario # Ahora ya añade usuarios sin shell 2) Crear el usuario "correo" sin shell con: adduser --system correo # Se usa para bajar el correo Puedes forzar un número de usuario usando: adduser --system --uid 1234 correo # Se usa para bajar el correo 3) Hacer que el correo del usuario correo sea procesado por procmail, crear /home/correo/.forward conteniendo la linea: ---8<--- |/usr/bin/procmail --->8--- 4) Crear /home/correo/.fetchmailrc con la info para recoger el correo ---8<--- defaults #comun a todos los servidores mda "/usr/bin/procmail -a %T -f -" #entregar correo a procmail (filtros) # -a %T = hace que $1 sea la dirección de destino local # -f - = regenera el from si no está fetchall #recoger todos los mensajes #flush #borrar mensajes antiguos (los pierde si no se descargaron) #keep #mantener mensajes en el proveedor tras bajarlos pass8bits #vital para los acentos #una linea poll por cada buzón POP3 a mirar poll pop.proveedor.es protocol POP3 timeout 60 user usuariopop1 pass SECRETO to correo poll pop.proveedor2.es protocol POP3 timeout 60 user usuariopop2 pass SECRETO to correo --->8--- 5) fetchmail devuelve un error si los permisos de .fetchmailrc no son 600 6) Crear /home/correo/.procmailrc con la info para filtrar el correo Mira el Anexo-1 7) Lanzar "fetchmail -s" desde cron cada cierto tiempo como usuario "correo", añadir a /etc/crontab la linea: ---8<--- # RECOGER CORREO # min hora DiaMes Mes DiaSemana(Lunes=1) Usuario Comando # m h dom mon dow user command 1-46/15 8-17 * * 1-5 correo fetchmail -s --->8--- ARCHIVOS: DETALLE: En el log de recogida /home/correo/procmail.log -> Solo se registra el destinatario final y no las copias CONCLUSIONES: LO BUENO: Separación de SPAM y bloqueo de ejecutables centralizada Ya he interceptado muchos virus de mail LO MALO: Mensajes quedan como spam si nos los envian como Bcc: (grupo de correo) Alguien tiene que mirarse el buzón "spam" una vez al dia para rescatar mensajes Si se pone .procmailrc con VERBOSE=yes cron envia un mensaje en cada recogida (lo bueno es que así no nos olvidamos de quitar el verbose ;-) Las recogidas fallidas (aunque sea un solo buzón) también son reportadas por correo al administrador, sería mejor a un log Si los usuarios se bajan correo por webmail, o descargan archivos por ftp o http no pasan por este separador de spam/archivos peligrosos ANEXO-1 .procmailrc ---8<--- #MAILDIR=$HOME MAILDIR=/var/spool/mail # Directorio por defecto para entregar mail VERBOSE=off # "yes" es como un modo debug.../"off" no LOGFILE=$HOME/procmail.log # Archivo de log (registro de sucesos) # Esto es solo necesario al poner el correo en buzones directamente usando los # permisos del grupo. Por defecto se aplica 077 y el grupo no puede acceder UMASK=007 # Al suministrar quita privilegios solo a "los otros" #En ":0 c:" # :0 Es el inicio del recipiente # c Entrega copia del correo y continua procesando más destinatarios, # (Si no se pone se entrega solo al primer recipiente que coincida) # B Egrep en el cuerpo del mensaje (H en la cabecera, valor por defecto) # : Utiliza archivo de bloqueo (para evitar colisiones) necesario _SOLO_ # al entregar en buzones directamente # # * Las condiciones empiezan con "*", varias lineas "*" hacen AND # # NOTA:Por defecto el egrep interno no diferencia entre mayusculas y minusculas # # CHULETA DEL EGREP INTERNO # .* cualquier caracter (.) cualquier numero de veces (*) # ^ inicio de linea # ! negación # (...|...) OR # j[ou]an o juan o joan, indistintamente mayúsculas y minúsculas # # CAMPOS INTERESANTES EN LA CABECERA # # ^To: Asunto del e-mail # ^Cc: Copia para # ^Subject: Asunto # ^X-Envelope-To: Destinatario del mensaje (lo utilizan algunas # listas de correo) # # /home/usuario/correo/buzon # Esto entrega el correo directamente # # ¡Atención a los permisos de los directorios! # # ¡crear buzon con grupo = fetchmail! # # _SOLO_ en este caso necesitamos UMASK=007 # !usuario # Enviar correo por SMTP, ¡Atención a las # # referencias circulares! #### # MENSAJES DE CRON :0 *^From:.*Cron Daemon.* ! usuariocorreo #### # CAPTURA DE ADJUNTOS CON MACROS (MS-Word 97 como minimo) # Lo que vamos a hacer es detectar en el cuerpo la cadena # "0x00 M 0x00 a 0x00 c 0x00 r 0x00 o 0x00 s 0x00" que parece estar siempre # presente cuando hay macros... # Como los adjuntos siempre vienen codificados hay que buscar esa cadena # ya codificada # En la codificacion base64 (3 en 4) hay tres cadenas resultantes en funcion # de la posicion relativa de la cadena desde el inicio del texto # Aunque la codificacion quoted-printable no suele ser la usada en los .doc # la añado por si acaso (es el cuarto valor) :0 B * .*(TQBhAGMAcgBvAHM|E0AYQBjAHIAbwBz|BNAGEAYwByAG8Acw|M=00a=00c=00r=00o=00s=00) ! exemacros #### # PERMITO ARCHIVOS .EXE (AUTODESCOMPRIMIBLES) A CIERTOS USUARIOS # Solo archivos con nombres sin símbolos raros, sólo letras, números, - y _ # Esto es para evitar cosas como "virus.jpg.exe" :0 HB * .*filename="[a-zA-Z-_]\.exe" *(^To:|^Cc:).*nombreusuario ! nombreusuario #### # CAPTURA DE CORREO CON EJECUTABLES .EXE , ETC... (VIRUS DE E-MAIL) # ¿Como restringir solo a una linea de la cabecera MIME? # ^Content-.*(\>*^\>+.*)*name= # # (\>*^\>+.*)* = cualquier número de saltos de linea y lineas empezadas con # al menos un espacio o tabulador # En las cabeceras de los mensajes de correo (y las MIME) los saltos de linea # se consideran espacios (siempre que la linea siguiente empiece en espacio # o tabulador), los tabuladores también se consideran espacios. # # Realmente no restringimos solo a la cabecera MIME pero son suficientemente # improbables otros falsos positivos # Esto coincide con lineas (cabeceras de adjuntos MIME) como: # # Content-Type: audio/x-wav; # name="Sorry_about_yesterday.MP3.pif" # Content-Transfer-Encoding: base64 # Content-ID: # # y como: # # Content-Type: application/octet-stream; name="CFGWIZ32.EXE" # Content-Transfer-Encoding: base64 # Content-Disposition: attachment; filename="CFGWIZ32.EXE" # # NOTA: \> = [^a-zA-Z0-9_] (y \n) es decir simbolo entre-palabras o nueva linea # NOTA: .* NO incluye cambios de linea (\n), pero \> SI # Capturo adjuntos MIME :0 HB * ^Content-.*(\>*^\>+.*)*name=.*(\.exe|\.com|\.hta|\.vbs|\.js|\.reg|\.pif|\.bat|\.scr) ! exemacros # Captuto adjuntos ¿uuencode? # (lo he tomado del virus de e-mail Happy.exe) # ^begin 644 Happy99.exe_ # :0 HB * ^begin.*(\.exe|\.com|\.hta|\.vbs|\.js|\.reg|\.pif|\.bat|\.scr) ! exemacros #### # LISTAS DE CORREO QUE PARECEN SPAM (dirección de campo "To:" no nuestra) # Y CONOCIDOS QUE NOS ENVIAN CORREO COMO Bcc: # NOTA: $1 = destino especificado en .fetchmailrc :0 *^From:.*Kriptopolis.* ! $1 # kriptopolis, boletin de seguridad y criptografía #### # ANTISPAM (correo basura) Generalmente no viene a mis direcciones. # Tambien puede no ser spam, pero mejor concentrarlos en un usuario (yo), # puede ser: # - un error al preparar el mail (aun no entiendo como, pero sucede...) # - una copia invisible (discrección) de un mensaje de usuario A a usuario B :0 * !(^To:|^Cc:).*midominio1 * !(^To:|^Cc:).*midominio2 * !(^To:|^Cc:).*midominio3 ! spam # Desviar mensajes con imagenes en Internet a SPAM # Desviar mensajes con frames en Internet a SPAM # Ejemplo de imagen real (multilinea): # # - Usar [.\>]* cualquier caracter incluido saltos de linea en vez de .* :0 HB * (<\>*img[.\>]*src[.\>]*>|<\>*frame[.\>]*src[.\>]*>) ! spam # Desviar mensajes con script a SPAM (javascript, u otros programas) # ¿O deberíamos desviarlo como si fuera un presunto virus? # NOTA: "object" puede contener tanto flash como java... :0 HB * (<\>*script[.\>]*>|<\>*object[.\>]*>|<\>*applet[.\>]*>) ! spam ## EL CORREO SE ENTREGA A QUIEN CORRESPONDE TRAS LAS COPIAS ################### ## DEJAR COPIAS A... # 1) Copias por nombre # 2) Copias a varias personas en cuentas de correo comunes (de departamento) # 3) Repartir en folders (grupo o owner = que el que corre fetchmail) :0 c *(^To:|^Cc:).*nombre *(^To:|^Cc:).*dir-de-correo@proveedor.es ! usuario-que-recibe-copia ## ENTREGAR CORREO A QUIEN LE CORRESPONDE ($1=destino local en .fetchmailrc) # Esto es posible gracias a que en .fetchmailrc llamamos a procmail con # el parámetro -a %T :0 ! $1 --->8---