$#random – a local mailer that returns a random EX_*

I found myself in a situation where I needed a local mailer that was required to return random exit values0 for email directed to certain users. Luckily, most of the job can be done via your .mc file:

MAILER_DEFINITIONS
Mrandom,        P=/opt/bin/random,
                F=lsDFMqbE,
                S=ruleset_noop, R=ruleset_random,
                T=DNS/RFC822/X-Unix,
                A=random $u

LOCAL_CONFIG
C{Random} adamo yiorgos admin system operator
Kcomp arith

LOCAL_RULESETS
Sruleset_noop
# This ruleset does nothing

Sruleset_random
# EX__BASE == 64 and EX__MAX == 78. EX_OK == 0, so we mask it to 79.
R$*             $: $1 . $(comp r $@ 64 $@ 79 $)
R$* . 79        $@ $1 . 0

LOCAL_RULE_0
R$={Random}  < $=w . > $*        $#random $: $1

When $#random is called, ruleset_random is called with $1 (the username) as an argument and returns $1.number, where number is a random number between EX__BASE (64) and EX__MAX (78) or zero. Therefore, the $#random binary is executed with $1.number as an argument.

/opt/bin/random can be as simple as this shell script1:

#!/bin/sh
# This is an example (non) delivery agent and is not considered safe to run on a 
# production server.
status=`echo $1 | sed -e 's/.*\.\(.*\)$/\1/'`

while read x
do
        # noop
done

exit $status

A random EX_* value is returned to the sender of the email, assuming s/he has emailed a local user contained in class $={Random}.


[0] – Valid sendmail exit codes (EX_*) are defined in sysexits.h.
[1] – In my case I wrote the mail delivery agent in C, as I needed to do a few more stuff prior to calling exit().

Guest post: zero2one

Ο zero2one ρωτάει:

Ελαφρώς άσχετο (συγνώμη, αλλά δεν ήξερα πως αλλιώς να σε βρω). Μου έστειλαν αυτό για να το υπογράψω.

http://www.petitiononline.com/forestgr/

Προφανώς ζητάει e-mail και προφανώς αναρωτιέμαι τι γίνεται με το spamming. Πώς ξέρω ότι δε πωλείται η διεύθυνσή μου σε spammers; Αυτό εξαρτάται από τη σοβαρότητα του site, φαντάζομαι. Το petitiononline φαίνεται σοβαρό πάντως.

Ποια είναι η γνώμη σου;
Ευχαριστώ (-:

Η γνώμη μου: Όποτε έχει κανείς ενδοιασμούς για το πως θα χρησιμοποιηθεί το email που δηλώνει, αλλά παράλληλα χρειάζεται να το γνωστοποιήσει, μπορεί να καταφύγει στις υπηρεσίες του Mailinator. Βασικά χαρακτηριστικά της υπηρεσίας:

  • Mailinator requires no sign-up. To create an account, you send email to it.
    You cannot send email from Mailinator.
  • Your Mailinator email inbox can be read by anyone. There is no security here. If they know (or guess) your email address, they can read your mail.
  • You cannot delete your email here (you can’t reply either), after a few hours, all email is auto-deleted.
  • Mailinator has strict rules about what kind of email it receives. Plain text is best, html is filtered. Images, attachments, and fancy stuff is simply stripped away.

Υ.Γ. Ρωτάς “συγνώμη, αλλά δεν ήξερα πως αλλιώς να σε βρω”.
Απάντηση: Contact info (scroll down)

Πολιτικό spam

Άργησε αλλά μου ήρθε και εμένα. Και το πιο εντυπωσιακό: Δεν ήρθε στο ατομικό μου mailbox, αλλά στο mailbox του διαχειριστή του GR.eu.org. Που σημαίνει πως δεν έγινε καν προσπάθεια για να βεβαιωθεί κάποιος εάν η λίστα που του δόθηκε έχει μέσα ατομικές διευθύνσεις email ή όχι. Πριν μερικές μέρες (2007/9/3) ο υποψήφιος βουλευτής Κώστας Τουρνάς μου έστειλε το ακόλουθο email:

Τηλ. Επικοινωνίας:

210 ___ _ ___, 210 ___ _ ___,

6934 __ __ __, 6934 __ __ __

e-mails:

info@_______.gr, tour@___.gr

Web: www._______.gr

Τα νούμερα και τα URLs/emails τα έχω σβήσει ηθελημένα. Όποιος ενδιαφέρεται μπορώ να του τα δώσω. Το ενδιαφέρον με το συγκεκριμένο email είναι πως έχει:

From: www._______.gr <info@_______.gr>

και:

Date: Sat, 30 Dec 1899 00:00:00 +0300

Το παραπάνω μήνυμα είναι spam με οποιοδήποτε ορισμό της ένοιας. Δεν υπάρχει η ταυτότητα του αποστολέα, δεν υπάρχει κανένας τρόπος να γνωρίζω εκ των προτέρων εάν η διεύθυνση επικοινωνίας είναι έγκυρη ή όχι και έχει τόσο λανθασμένη ημερομηνία αποστολής (30 Σεπτεμβρίου του 1899!!!) ώστε να βγαίνει πρώτο ή τελευταίο στα αδιάβαστα μηνύματα μου (ανάλογα με την χρονοταξινόμηση που επιλέγει ο παραλήπτης).

Και ερχόμαστε στο σήμερα (2007/9/11):

Η Φιλελεύθερη Συμμαχία αποφάσισε να στείλει το πολιτικό της μήνυμα σε κάθε mailbox μου, συγκαταλεγομένων ενός forward που έχω από το irc.gr (και που υπάρχει μόνο σε μία σελίδα στο Google – άρα έχουμε να κάνουμε καθαρά με περίπτωση harvesting) και ένα alias για ένα σκονισμένο ημιτελές προσωπικό project (επίσης μία σελίδα στο Google). Η ΦΣ ισχυρίζεται στο ίδιο το μήνυμα:

“Σημείωση: το μήνυμα αυτό δεν είναι spam. Δεν στοχεύουμε στην προώθηση καμίας εμπορικής δραστηριότητας και δεν πρόκειται να σας ξαναενοχλήσουμε εφόσον δεν το επιθυμείτε. Το μήνυμα αυτό είναι μια πολιτική ενημέρωση για την γνωστοποίηση του εγχειρήματός μας και των θέσεών μας στους Έλληνες πολίτες. Θεωρούμε υποχρέωσή μας να επικοινωνήσουμε με τους πολίτες προκειμένου να ψηφίσουν στις εκλογές έχοντας λάβει όσο σφαιρικότερη ενημέρωση γίνεται. Η σφαιρική πολιτική ενημέρωση αγγίζει τον πυρήνα της Δημοκρατίας μας και σας καλούμε όχι απλά να μελετήσετε τις θέσεις και τις προτάσεις μας, αλλά και να συμβάλλετε στην γνωστοποίησή τους, προωθώντας αυτό το μήνυμα στον κύκλο επαφών σας. Ευχαριστούμε εκ των προτέρων για την κατανόηση και την βοήθειά σας.”

Αποστολέας του μηνύματος:

From: Φιλελεύθερη Συμμαχία <info@_____________.net>

Ούτε η ΦΣ μπήκε στον κόπο να ελένξει εάν κάποιες διευθύνσεις από τη λίστα που (αλήθεια πως έφτασε να) έχει στην κατοχή της, είναι ατομικές ή όχι. Μεταχειρίζεται το φτηνό τρικ να ισχυριστεί πως δεν πρόκειται για εμπορική δραστηριότητα. Αναρωτιέμαι: Είναι έτοιμη η ΦΣ να πάμε παρέα στην ΑΠΔΠΧ για μια γνωμοδότηση;

Το ζήτημα είναι όμως πως όπως και ο Κώστας Τουρνάς έτσι και η ΦΣ παραβιάζει τη νομοθεσία (Ν.3471/2006), όπου και γράφεται:

“Άρθρο 11 (Μη ζητηθείσα επικοινωνία)

1. Η χρησιμοποίηση αυτόματων συστημάτων κλήσης, ιδίως με χρήση συσκευών τηλεομοιοτυπίας (φαξ) ή ηλεκτρονικού ταχυδρομείου, και γενικότερα η πραγματοποίηση μη ζητηθεισών επικοινωνιών με οποιοδήποτε μέσο ηλεκτρονικής επικοινωνίας, με ή χωρίς ανθρώπινη παρέμβαση, για σκοπούς απευθείας εμπορικής προώθησης προϊόντων ή υπηρεσιών και για κάθε είδους διαφημιστικούς σκοπούς, επιτρέπεται μόνο αν ο συνδρομητής συγκατατεθεί εκ των προτέρων ρητώς.”

Δεν υπάρχει καμία ρητή μου δέσμευση να δεχτώ τέτοιου είδους επικοινωνία. Στην περίπτωση του ΚΤ δεν αναφέρεται ευδιάκριτα ο αποστολέας (αλλά τουλάχιστον αναφέρεται το πρόσωπο προς όφελος του οποίου επιχειρείται η επικοινωνία). Στην δε περίπτωση της ΦΣ δεν υπάρχει ούτε η ταυτότητα του αποστολέα, αλλά ούτε και του ωφελούμενου, εκτός κι αν σαν πρόσωπο θεωρείται η ίδια η ΦΣ ή το σύνολο των υποψηφίων της.

Κρίμα, γιατί η ΦΣ φαινόταν αρκετά υποσχόμενη.

milter-dnsbl

Sendmail administrators using FEATURE(dnsbl) may have noticed that ruleset check_rcpt is executed after all connected milters have executed the corresponding xxfi_*() routines.

Wouldn’t it be better if a milter (in fact the first in order) could block a connection based on a list of DNSBLs?

That is why I wrote my first milter, milter-dnsbl (download). milter-dnsbl has no configuration file; on startup it takes a number of arguments that allow you to specify a number of DNSBLs, plus whitelists published via DNS, or based on the domain name of the connecting host. It requires a running lwresd(8) which it uses as a caching server. Read the manpage that comes with the source code distribution.

milter-dnsbl is distributed with an OpenBSD-style license and has been tested on an Ubuntu 6.06 i386 server.

Πονηριές

Με την υπόθεση πως οι mail servers που εμπλέκονται στην διακίνηση ενός email message είναι συγχρονισμένοι με NTP, το πότε στάλθηκε το μήνυμα φαίνεται καθαρά από τα Received: headers.-

Διευκρίνηση: Έτσι με το να αλλάζουμε την ώρα στον υπολογιστή μας ώστε να φαίνεται πως το μήνυμα εστάλη άλλη ώρα από αυτή που το στείλαμε κανονικά (Date: header), δεν καταφέρνουμε τίποτε.

graymilter with DNS based whitelists support – part 3

In part 2 we saw a simple way of whitelisting domain names in Jef Poskanzer’s graymilter. However, this is a solution that does not scale well enough for busy mail systems. Adding or removing a domain from the whitelist means recompiling graymilter which is not the most convenient thing, especially if one needs to do it (over and over) on multiple mail servers.

Wouldn’t it be easier if you could update only one file and have the information distributed to all mail servers? One way of doing this is by using rbldnsd:

“rbldnsd is a small and fast DNS daemon which is especially made to serve DNSBL zones. This daemon was inspired by Dan J. Bernstein’s rbldns program found in the djbdns package.”

Normally people use rbldnsd for publishing blacklists, but this should not stop you. After all you only need to publish a list. Whether it is a blacklist or a whitelist depends on how the program that consults it decides upon the information it gets. I start rbldnsd as follows:

/usr/sbin/rbldnsd -p /var/run/rbldnsd.pid -r/var/lib/rbldns -b1.2.3.4 \\
whitelist.tee.gr:combined:whitelist.tee.gr.txt

And assuming that I want to enlist the domains example.com, example.net and example.org, whitelist.tee.gr.txt looks like this:

; It is declared as a combined zonefile when rbldnsd statrs
$DATASET dnset: @
.example.com
.example.net
.example.org

The next step is to patch graymilter so that it consults a nameserver. While we are at it why not use lwresd?

“[lwresd] provides resolution services to local clients using a combination of a lightweight resolver library and a resolver daemon process running on the local host. These communicate using a simple UDP-based protocol, the “lightweight resolver protocol” that is distinct from and simpler than the full DNS protocol.

To use the lightweight resolver interface, the system must run the resolver daemon lwresd or a local name server configured with a lwres statement.

The lwresd daemon is essentially a caching-only name server that responds to requests using the lightweight resolver protocol rather than the DNS protocol. Because it needs to run on each host, it is designed to require no or minimal configuration. Unless configured otherwise, it uses the name servers listed on nameserver lines in /etc/resolv.conf as forwarders, but is also capable of doing the resolution autonomously if none are specified.”

Now using the lwres(3) interface we can write a query function that consults the domain name whitelist that we serve via rbldnsd:

#ifndef _TEE_CHECKS_C_
#define _TEE_CHECKS_C_ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lwres/lwres.h>
#include <lwres/netdb.h>
static int
tee_check_domain(char *host, char *whitelist)
{
        char *name;
        int l, herr;
        struct hostent *he;
        l = strlen(host) + strlen(whitelist) + 1;
        name = (char *)malloc(l);
        if (name == NULL) {
                syslog(LOG_INFO, "tee_check_domain(): malloc() error: aborting");
                return(0);
        }
        memset(name, '\0', l);
        sprintf(name, "%s%s", host, whitelist);
        /* syslog(LOG_INFO, "tee_check_domain(): %s", name); */
        he = lwres_getipnodebyname(name, AF_INET, 0, &herr);
        if (he == NULL) {
                free(name);
                if (herr == HOST_NOT_FOUND) {
                        return(1);
                } else {
                        return(0);
                }
        }
        lwres_freehostent(he);
        free(name);
        return(0);
}
#endif /* _TEE_CHECKS_C_ */

and again after line 680 of graymilter.c (assuming graymilter-1.26):

if (tee_check_domain(connhost, ".whitelist.tee.gr") == 0) {
  syslog(LOG_INFO, "accepting host %s from whitelist", connhost);
  return SMFIS_ACCEPT;
}

After you run ./configure you have to add -llwres to the generated Makefile.

So there, now rbldnsd distributes your domain name whitelist and you have local caching at every mail server with the help of lwresd.

(part 2) (final)

Φορητότητα email


(ή στο περίπου φορητότητα)

Στο δελτίο τύπου της 2007-06-29 της ΕΕΤΤ διαβάζουμε μερικά ενδιαφέροντα πράγματα:

Α) Αυτόματη προώθηση ηλεκτρονικής αλληλογραφίας όταν αλλάζει ο πάροχος

Οι χρήστες ηλεκτρονικού ταχυδρομείου (e mail) που αλλάζουν Πάροχο Υπηρεσιών Διαδικτύου (Internet Service Provider) αποκτούν πλέον τις εξής δυνατότητες:

1. Η ηλεκτρονική αλληλογραφία τους προωθείται αυτομάτως από το παλαιό πάροχο στην νέα τους διεύθυνση για χρονικό διάστημα δύο (2) μηνών.

2. Για διάστημα έξι (6) μηνών αποστέλλεται από το παλαιό πάροχο στον αποστολέα της αλληλογραφίας τους ένα απαντητικό μήνυμα που τον ενημερώνει για την νέα τους ηλεκτρονική διεύθυνση.

Επίσης, ο παλαιός Πάροχος Υπηρεσιών Διαδικτύου δε μπορεί να εκχωρήσει σε άλλο χρήστη διεύθυνση ηλεκτρονικού ταχυδρομείου που έχει καταργηθεί, πριν την πάροδο έξι (6) μηνών από την κατάργησή της. Κατ’ εξαίρεση, η διεύθυνση μπορεί να εκχωρηθεί, πριν την εκπνοή του συγκεκριμένου διαστήματος, μόνο στον χρήστη ο οποίος ήταν ο προηγούμενος κάτοχός της.

Τα παραπάνω αναφέρονται επίσης στην τροποποίηση του Κανονισμού Γενικών Αδειών με την απόφαση 442/68/28-6-2007 (παρ. 3.8α και 3.8β)* της ΕΕΤΤ.

Η απόφαση αν και με σωστό πνεύμα δεν προσδιορίζει μερικά θέματα:

  • Σε ποια γλώσσα θα είναι το ενημερωτικό μήνυμα που θα πληροφορεί για την νέα διεύθυνση του χρήστη;
  • Είναι αρκετό ένα μήνυμα, όπως αυτό παράγεται π.χ. από το FEATURE(`redirect’) του sendmail ή πρέπει να είναι κάτι πιο επεξηγηματικό+;
  • Πως θα διαχειριστεί ο πάροχος μέσα σε αυτό το διάστημα των 6 μηνών επαναλλαμβανόμενες ενημερώσεις του (πρώην) χρήστη του για την ανακατεύθυνση της αλληλογραφίας του; Π.χ. όταν παύει τη σύμβασή του με τον πάροχο ζητάει να του προωθείται η αλληλογραφία στο Yahoo!Mail και μετά από ένα μήνα αλλάζει γνώμη και θέλει να ανακατευθύνεται στο Gmail.
  • Δεν προβλέπει τον χειρισμό των antispam filters, τόσο στον παλιό, όσο και στο νέο πάροχο. Στην περίπτωση που ο παλιός πάροχος έχει κεντρική πολιτική antispam κοινή για όλους τους χρήστες, θα πρέπει να εξαιρέσει αυτόν τον χρήστη; Εάν ναι, ο νέος πάροχος έχει δικαίωμα να κάνει blacklist τα συστήματα του παλαιού επειδή του προωθούν spam;

    Στην περίπτωση που έχουμε personalised antispam filtering, ο παλαιός πάροχος θα πρέπει να διατηρεί τα φίλτρα του πρώην χρήστη του για το διάστημα των 2 μηνών. Σε αυτό το χρονικό διάστημα θα πρέπει να του δίνει και πρόσβαση να ανανεώνει τα φίλτρα ή όχι;

Αυτό που με παραξενεύει είναι πως στο site της ΕΕΤΤ δεν είδα καμία διαδικασία διαβούλευσης για το θέμα της φορητότητας των διευθύνσεων email. Έστειλα και mail στις 2007-07-02 στην ΕΕΤΤ (στο info παπάκι eett.gr) αναζητώντας κάποιον για να μπορέσω να συζητήσω αυτά τα θέματα, αλλά τίποτα ακόμα.


[*] – PDF document
[+] – Π.χ. “A better E-mail bouncer

spam

“[…] πραγματικά δεν νομίζω πια ότι υπάρχει δυνατότητα να το αντιμετωπίσει κανείς, νιώθω σαν να είμαστε στο έλεος κάποιων εξαιρετικά ασυνείδητων ανθρώπων του πλανήτη και απλά τους αγνοούμε.” — από προσωπική μου επικοινωνία με χρήστη

Δεν έχω διαβάσει ποτέ καλύτερη τοποθέτηση από απλό χρήστη για το πρόβλημα.

Το σίγουρο είναι πως οι Postmasters δεν τους αγνοούν. Επειδή το spam είναι κοινωνικό και όχι τεχνικό πρόβλημα, οι Postmasters, όποια λύση κι αν εφαρμόζουν, είναι πάντα ένα βήμα πίσω.

ENISA Survey

Η ENISA έκανε πέρσυ ένα survey με θέμα τα μέτρα που λαμβάνουν οι service providers για την ασφάλεια και το spam. Το κείμενο σε μορφή PDF μπορείτε να το διαβάσετε εδώ:

Provider Security Measures Part 1: Security and Anti-Spam Measures of Electronic Communication Service Providers – Survey

Ενδιαφέροντα στοιχεία από τις 28 σελίδες του survey:

– “Providers in Europe are less concerned about outgoing emails, i.e. they are less concerned about their customers sending spam. They rely on legal instruments such as Terms and Conditions. In addition, to gain better information about legal consequences, enforcement could be further improved to prevent spam originating from Europe.”

– “Only the Finnish NRA* indicated that they issue recommendations or advice which describe technical safeguards in detail.”

Αυτή τη χρονική περίοδο η ENISA τρέχει ένα δεύτερο survey για να επικαιροποιήσει τα αποτελέσματα του πρώτου.

[via anti-spam-wg]


[*] – National Regulatory Authority