Ta kontroll över din spam med procmail - del 3 Spamkarantän och andra procmailprocesser. Kurt Magnusson



Relevanta dokument
Ta kontroll över din spam med procmail - del 2 Mail-/spamboxhantering. Kurt Magnusson

JavaScript del 3 If, Operatorer och Confirm

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

MMA132: Laboration 2 Matriser i MATLAB

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Unix design. Unix är ett operativsystem från mellan 1969 och 1972, beroende på hur man räknar. Unix utvecklas fortfarande.

Olika shell. Skalprogrammering. Pipor och omdirigering av strömmar

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Användarhandledning Version 1.2

Kort om World Wide Web (webben)

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Laboration med Internet och HTML

Programmering i C++ Kompilering från kommandoraden

Bygg din egen verktygslåda till PC-DMIS. Workshop, PC-DMIS dagar 2015

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Tfn Telephone. Kontr Checked. Skapa PDF-filer i Windows

Installationsanvisning för Su Officemallar 2013 För PC

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Föreläsning 5 Mer om funktioner, villkor

Introduktion till användning av linux-servern sledge och några övningsuppgifter

Spam är tyvärr något som numer upptar en stor del av de flesta e-postanvändares liv, så även mitt.

Arduinokurs. Kurstillfälle 4

Datorns delar DATORLÅDA CD/DVD-SPELARE/BRÄNNARE SKÄRM. DISKETT-STATION Finns sällan i nya datorer. TANGENTBORD

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Grundläggande Ordbehandling Microsoft Word

Excel-guide. Introduktion

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

L04.1 Marodören. Inledning. Mål. Genomförande. Uppgift 1 Hello World. Moment I

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Logik och kontrollstrukturer

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Automatisera uppgifter med Visual Basic-makron

Bruksanvisning Bläckfisken USB

ANVÄNDARGUIDE VITAL & TALANDE TANGENTBORD

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Datorn från grunden. En enkel introduktion. Innehåll: Inledning 1 Vad är en dator? 2 Datorns olika delar 3 Starta datorn 5 Stänga av datorn 7

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

STRÄNGAR DATATYPEN. Om du vill baka in variabler eller escape-tecken måste du använda dubbla citattecken. strängar

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Mappar och filer för webbsidor

Innehållsförteckning. Inledning Introduktion Övrigt Presentationens innehåll... 6

WEBDESIGN A - DTR 1210

Laboration: Whitebox- och blackboxtesting

Lathund för BankID säkerhetsprogram

Felsökning av kommunikation mellan DLS och GPS mottagare.

Ordlistor, filhantering och ut på webben. Linda Mannila

SNABBGUIDE för Windows Media Encoder (media kodaren) - Sänd live med din webbkamera

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Övningar till UNIX/Linux Grundkurs och förslag till LÖSNING

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Nya Aquila använder senaste versionen av våra verktyg: UniPaaS 1.9 (tidigare Magic), samt Crystal Reports version 12 (idag kör ni på version 8).

En kort text om programmering i C.

Välj bort om du vill. 96 Internet och e-post. 2. Mail-programmet finns i datorn. 1. Skriv mail i sökrutan. Windows Live Mail i Aktivitetsfältet.

Internet. En enkel introduktion. Innehåll:

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Appar vi arbetat med

Omsorgen Användarhandledning

E-POST3 Ett lättanvänt e-postprogram med stöd för talsyntes

FC-kurs Röbäcks skolområde, åk 5-6

Gränssnitt för FakeGranska. Lars Mattsson

TDP005: Introduktion till Make

Storegate Pro Backup. Innehåll

INTERNET Adress: fc.enkoping.se (obs! ej www i början) Då kommer du till denna sida. Logga in. Fyll i ditt Användarnamn och Lösenord.

Vop handledning. Användarhandledning till Vop applikationen. UPPGJORD: Mattias Gyllsdorff GODKÄND:Mattias Gyllsdorff REV: A DATUM:

Visual Basic, en snabbgenomgång

FC-kurs Röbäcks skolområde femmor och sexor

C++ Lektion Tecken och teckenfält

Snabbguide till First Class

FrontPage Express. Ämne: Datorkunskap (Internet) Handledare: Thomas Granhäll

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Kapitel 16: Programmering

Grunderna i stegkodsprogrammering

Lathund Claro Read Plus

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Bakgrund. Bakgrund. Bakgrund. Håkan Jonsson Institutionen för systemteknik Luleå tekniska universitet Luleå, Sverige

Flexiservice PS/2. Bruksanvisning

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

SELLOUT. Version 2.5. eyescream information ab

Grundläggande datalogi - Övning 1

Scan2Text Svensk Doc 2.0. Scan2Text Användarguide

Manual över DPR Fakturering med kundreskontra

E-post. Elektronisk post, Två huvudtyper av elektronisk post Outlook Express Säkerhetsåtgärder mot datavirus...

RödGrön-spelet Av: Jonas Hall. Högstadiet. Tid: minuter beroende på variant Material: TI-82/83/84 samt tärningar

Introduktion till programmering, hösten 2011

Programmering II (ID1019) :00-12:00

Äventyrskväll hos Scouterna är skoj, ska vi gå tillsammans?

Installationsanvisning för Su Officemallar 2003 För PC

Appar vi arbetat med. ipad projekt 2013 appar vi jobbat med. Nina Lundell Sida "1

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Gran Canaria - Arbetsbeskrivning knapplänkar (Mediator 8)

2. Ibruktagande av Modem- och ISDN-förbindelse

Introduktion till frågespråket SQL (v0.91)

Hur patchar man Entré?

Språket Python - Del 1 Grundkurs i programmering med Python

3-5 Miniräknaren Namn:

UNIX Introduktion UNIX. Datorerfarenhet. Vad menar man med operativsystem

Labora&on 1 Introduk&on &ll utvecklingsmiljön övningar/uppgi<er

E-post. A. Windows Mail. Öppna alternativ. Placera ikonen på skrivbordet.

Transkript:

Ta kontroll över din spam med procmail - del 3 Spamkarantän och andra procmailprocesser Kurt Magnusson I de två tidigare texterna visade jag hur jag lagt upp mitt procmailrc-skript och hur man med av shellskript cirkulerar de ingående extrabrevlådorna. Men jag nämnde också att man kan får procmail att interagera med andra processer, som shellskripts, att bli effektivare än de inbyggda procmail-kommandona tillåter. Vi kanske kan ta en liten överkurs och se på hur en sådan lösning skulle kunna se ut. - procmails innersta Man måste komma ihåg när man jobbar med procmail, att programmet är binärt. Dvs inte binärt i formen av att datorprogram är binära, utan att dess regelstruktur är binär. Antingen uppfylls en regel och "kontrollobjektivet" utförs eller så händer inget alls. Det nns inga mellanlägen, inga riktiga "if-else if-else" kontroller eller liknande. Man bör se procmail som en serie med enkla "iftester", med möjlighet till en enkel "else". I senaste texten hade jag med en korrektion för något jag kallade Stock/Stockholm-"spam", att skilja mellan aktier [stock] och Stockholm. Denna var som gjort som en "if-else" : :0 : *.*stock :0 # "If" text innehåller Stockholm, gör inget *.*Stockholm :0 E # "Else" menas stocks (aktier), dumpa $SPAM Vi fångar alla problematiska brev med textsträngen "stock" som en huvudregel. Sedan sker valet. Krull-paranteserna anger vilka två regler som ingår i vår fejkade "if-else"-sats. Om texten är "Stockholm" görs inget (tom parantes), men om det är "stock" så ses det som spam och går i soporna. Den uppmärksamme ser genast, att om någon skriver "över stock och sten" så uppfylls ju också spamvillkoret. Detta är en brist vi har svårt att göra något åt, eventuellt att man med en nestad "Else" gör en ny "if-else"-test på om brevet innehåller "ÅÄÖ", som då skulle tyda på att det inte är stocks. :0 : *.*stock :0 # "If" text innehåller Stockholm, gör inget *.*Stockholm :0 E # "Else" menas stocks (aktier), dumpa i svarta hålet :0 # "If" text innehåller ÅÄÖ * *(Å Ä Ö å ä ö)* :0 E # "Else" så är det stocks $SPAM Ta kontroll över din spam med procmail del 3 Sida 1 Lars Magnusson - Får ej användas utan att källan anges

Som synes blir det lite oöverskådligt. Men om vi nu hade ett program som testar för både "Stockholm" och ÅÄÖ och som svarar med att returnera ett binärt svar (true/false), kan vi genom den enkla if-else-sättningen styra procmail så att om villkoret gäller, är brevet spam, annars en svensk text med Stockholm eller en stock i. Standardretursvar inom Unix är 0 (TRUE) för OK och 1 (FALSE) om det är fel. Om vi får TRUE, får procmail fortsätta processeringen även efter if-testen, annars dumpar vi brevet som spam. Vi måste alltså göra ett skript som kan göra denna test. Enklast är att använda "grep"-kommandot. Om vi vill ta reda på om det står "Över stock och sten", ser testen ut som 'grep "stock" grep "[ÅÄÖåäö]"'. Men varför göra två tester med grep? Vad vi vill testa är om en text med ordet "stock" också har ÅÄÖ i sig, en sk "OCH"-test. Tyvärr supporterar inte den version av grep som klarar flera testbegrepp, extended grep eller egrep OCH -tester, bara "ELLER"-tester, 'egrep "stock [ÅÄÖåäö]"', dvs. den hittar texten om det står stock eller om den innehåller ÅÄÖ, men inte om texten innehåller båda. En annan brist med grep i detta fall är att den arbetar radvis, därför måste åäö nnas på de rader där stock nns, men för det goda exemplets skull bryr vi oss inte om detta, det är procmail som vi ser på, inte shellskripts. Ett fungerande skript skulle kunna se ut som: #!/bin/sh ENGSWE="`cat - grep -i \"stock\" grep -i \"[åäö]\"`" if [ "$ENGSWE" = "" ] #engelsk text, stock = aktie return 1 else #svensk text return 0 Vi kan kalla vårt lilla program för "swedish analyzer" eller i god Unix namn-tradition, "swz". Även om "swz" är enkelt, nns några saker att förklara. ENGSWE är en skalvariabel, i vilken vi sparar resultatet av vårat testkommando. Det är något som fungerar iom att Unix-skal tillåter exekvering av kommandon i textsträngar. Det är formatet "`kommando(n)`" som tillåter detta, där <`> är det skiftade citattecknet som nns till vänster om backspace tangenten, inte det vanliga enkelcitatet, som delar tangent med <*>. "cat -" anger att vi läser från standard in, stdin, vilket jag nämnde i förra texten. Vi skall senare se på varför. Därefter kommer de två grep-testerna. "-i" betyder att vi bryr oss inte om stora eller små bokstäver i texten, alla är lika och då räcker det att testa mot små bokstäver. "return" är hur vi svarar tillbaka till procmail med ett värde om det är sant eller falskt. I ett språk som C kan man skriva TRUE eller FALSE i koden, inte 0 och 1, de nns denierade som boolska värden in språket, men inte så i skript. För att utnyttja "swz" i procmail, ändrar vi så bara regeln: :0 b # nn brev med bilder i * ^.*\.gif :0 # If, testa och om inget spam eller # virus returneras 0, gör inget $HOME/bin/swz :0 E # else, annars släng brevet /dev/null Nu ser vi varför vi måste ha "cat -" först i ENGSWE-raden, procmail sänder brevet via en sk Unix Ta kontroll över din spam med procmail del 3 Sida 2 Lars Magnusson - Får ej användas utan att källan anges

pipe till "swz" via stdin, vilken vi alltså måste kunna läsa för att få texten. Notera att jag lagt "swz" i mitt eget lokala bin-katalog. Om jag inte anger detta, nner procmail inte skriptet. Som nämnt; får vi en etta tillbaka, då har vi ett spam och brevet kan slängas i soptunnan. De brev som returnerar en nolla passerar och testas vidare av efterföljande regler, det kan ju nnas andra spamvillkor som uppfylls. Detta var ett mycket enkelt exempel och det kan diskuteras hur bra det är mot den nestade versionen av "else", men övningen får också tjäna som en introduktion till hur man kan använda externa program i procmail. Man kan också kanske tänka sig pdf-lter, att med hjälp av Ghostscript mm, som via ett shellskript testar pdf-spam. Pdf-spam verkar dock ännu vara i sin linda. - Earnest eller hur man gör en karantän Men vad gör vi den dagen grålisting slutar fungera? I de tidigare texterna nämnde jag min egen spamlösning, Earnest. Denna hade en mycket effektiv funktion som jag saknar i andra antispamlösningar, en karantän. För att rekapitulera, våren 2005 när spammen ökade kraftigt, från ca 60-70 per dag till över 250, hade min huvudblocklista, SURBL, extremt svårt att hinna med. Spammarna använde "burst", dvs mycket spam på kort tid, med flera olika URL:er i sig. Dessa URL:er hade en levtid på någon timme innan de byttes. Samtidigt behövde SURBL ca 40-60 minuter att få in och klassicera de nya URL:erna. Trots att jag hittade två honeypot-listor, vilka i nästan realtid extraherade och sände ut nya misstänkta URL:er hjälpte det inte. Även dessa hade viss eftersläpning, om än kortare än SURBL. Lösningen ck bli att de brev som inte passade whitelistan eller reglerna, ck vila i 20 minuter innan en sista extra analys gjordes, en kombinerad test mot SURBL och de två listorna. Det fungerade, dessa extra 20 minuter gjorde att de 250 spammen bara blev till 2-3 per dag. Min gissning är att om funktioner som autentisering, massutskickspärrar och grålistning slutar fungera, är en karantän enda rimliga lösning. De flesta användare har troligtvis inget problem med en sådan försening, speciellt om den kan kombineras med en whitelist. Nu var Earnest ett komplicerat skript på över 1000 rader samt med en hel del externa subprocesser, så vi kommer inte att se på det i sin helhet. Enkelt uttryckt såg själva karantänen ut så här: ====== Earnest karantän ======= # Hämta URL ur brev URL="`grep \"http:\" $TST_MAIL sed \"s#http://##g\" cut -d\"/\" -f1`" # Låt skriptet stå still i 20 min sleep 1200 # Hämta listorna curl http://domän/lista1 > $TMP_LIST # hämta lista curl http://domän/lista2 >> $TMP_LIST # hämta lista2 # dra ut unika URL:er (domän, inte ler) # checka med grep om våran URL är med LISTCHK="`sort $TMP_list uniq grep \"$URL\"`" # Om $LISTCHK inte är tom, var vår med # Brevet är spam if [ "$LISTCHK"!= "" ] MODE="DELETE" # Gör en sista test mot SURBL SURBLCHK="`nslookup $URL.multi.SURBL.org grep \"127.0.0\"`" Ta kontroll över din spam med procmail del 3 Sida 3 Lars Magnusson - Får ej användas utan att källan anges

# Om $SURBLCHK inte är tom, var vår med # Brevet är spam if [ "$SURBLCHK"!= "" -a "$MODE"!= "DELETE" ] MODE="DELETE" Om vi skall förstå skriptet, första raden hämtar ut första spam-url:en från brevet. Egentligen är det lite svårare, men vi nöjer oss med denna idé. Resultatet sparas så i skalvariablen $URL, på samma sätt som vi sparade resultatet i "swz". Sleep är ett kommando som räknar ner sekunder. 20 min blir 1200 sek, det är så länge stoppar vi körningen av skriptet. Efter denna tid hoppas vi på att listorna vi använder kommer att ha aktuellt material. Jag nämnde vidare, att jag använde två spärrlistor. Vi sparar ner dem en sorterad temp-l, en l som tidigare namngivits genom att lagra lnamnet i en skal-variabel. TMP_LIST innehåller strängen "$HOME/tmp/spamlst.$$" och lens namn blir "/home/m8827/tmp/spamlst.25408", där 25408 ($$ i skriptet) är skriptets Unix-processnummer. Detta är helt enkelt ett sätt att skilja på olika processers temp-ler. Temporär-len genereras med ">" och vi lägger till lista 2 med ">>". De flesta bör känna igen detta från DOS bat-ler. Efter det sorterar vi temp-len och tar bort dubbletter med "uniq". Med "grep" ser vi om den URL vi vill testa nns med i den sammanslagna listan. Som med $URL denieras kommandoraden i en textsträng för en shellvariabel, som kommer att innehålla resultatet av körningen. Vi testar sedan variabeln i en if-sättning. Om den är tom fann "grep" inte någon matchning, annars om URL:en fanns i listorna var en spam-url. De flesta, som skrivit eller läst om Unixskript, ser att det nns ett kortare sätt att skriva denna test på: [ "$LISTCHK!= "" ] && MODE="DELETE" men min erfarenhet är att om man sällan skriver shellskript tar det längre tid att förstå vad man gjort, när man senare läser koden. Klassisk programskrivning ger bättre läsbarhet efter några år, så jag väljer en klassisk if-sättning. Lägg också märke till att "grep":s söksträng, "$URL", har citattecken och att dessa har <\> före sig. Detta för att inte bryta hela kommandolinjen. Denna denieras som text mellan två efterföljande dubbelcitattecknen. Kombinationen \" gör att shellet kan hanter de ingående kommandonas citattecken, utan att dessa kolliderar med hela strängdenitionen. Vi såg även detta i "swz" Om ett skript går fel, så är det oftast för att man bommat denna simpla detalj! Om vi fortsätter nedåt, SURBL's tjänst är en väldigt enkelt tjänst. Man tar den misstänkta URL:en och lägger till SURBLS domännamn samt använder DNS-kommandot "nslookup" för att testa resultatet. Om vi har URL:en "www.gogodidask.nu", misstänkt som en spamweb, blir testen "nslookup gogodidask.nu.multi.surbl.org". Om svaret (returnerat IP-nummer) startar på 127.0.0, så är gogodidask en spammare, annars är den en vanlig domän. SURBL har flera listor, men jag väljer den som innehåller alla olika undergrupper, multi. Sluttesten blir så om 127.0.0 returnerades eller om teststrängen var tom samt om MODE tidigare denierats till DELETE eller inte. Om t.ex. förra testen gav DELETE, utförs inte kommandot. Det kan diskuteras om denna sista test behövs eller inte, men jag tog med den för att visa hur man gör en skripttest med två olika villkor. En del skulle troligen göra en mera avancerad "if " - "elif " - "else" - "" test, men för oss är det överkurs. - Skriptet Detta var hur den aktiva delen av Earnest karantän såg ut i stora drag. För att göra en enkel Ta kontroll över din spam med procmail del 3 Sida 4 Lars Magnusson - Får ej användas utan att källan anges

spamkarantän till procmail, en sista utväg att plocka oönskad spam, kan samma idé användas, men vi måste lägga till ett sista villkor. Efter de två testerna, måste vi se om MODE=DELETE eller om MODE är något annat. Det skulle kunna se ut så här: if [ "$SURBLCHK"!= "" -a "$MODE"!= "DELETE" ] MODE="DELETE" # Ge procmail ett val if [ "$MODE" = "DELETE" ] return 1 # Returnera FALSE else return 0 # Returnera TRUE Returnkommandot avslutar skriptet och sänder tillbaka en 0:a eller 1:a beroende på om brevet skall tas bort eller inte. Som jag tidigare nämnde vill vi ha 0 som OK, för då fungerar procmailregeln som när vi gjorde den för "paz", men där vi byter ut "paz" mot vår karantän. Låt oss kalla den för "sptst", förkortning av "spamtest". :0 :c # Testa alla kvarvarande brev * * :0 # If, testa och om inget spam # returneras 0, gör inget # Regeln står still i 20 minuter sptst :0 E # else, annars släng brevet /dev/null Det viktiga är att så få ler som möjligt hamnar här, för karantänen har en del negativa effekter på serverresurserna, samtidigt hör det till spammen natur att förbruka våra resurser. Jag kan inte säga hur mycket, men om varje medlems brevlåda har en karantän och procmail får köra flera processer parallellt, en för varje nytt brev istället för i tur och ordning, så kan det bli en hel del. Eventuellt borde karantänen nnas i den centrala cachen i stället, något som skulle tillåta att man har en test som ser hur många brev som har samma URL:er mailcachen, något som kan indikera att det är spam. Notera också att det skript jag visat ovan måste vara mer komplext. Jag har inte tagit hänsyn till att det kan nnas flera URL:er i breven, några för att förvilla utöver de vi söker. Vi har också fyra huvudtyper av HTML-kodning, brev med html-kod, äkta HTML-sidor och MIME base64-kodade sidor samt "HTML comment" kamouflerade brev. HTML-kodade brev är när specialbokstäver som ":/åäö" ersätts med "&colon;&div;åäö" eller med %-kod som "%36%36%37%38%39". "Äkta" HTML-sidor är sidor som sänds med en mailheader, medan MIME base64 inte är läsbart förrän texten konverterats tillbaka till normal text och "HTML comment" är att man lagt in "<nonsenstaggar>" för att förvilla rena textlter. Att hantera dessa utökar skriptförslaget ca 3-5 gånger. - Avslutning Ta kontroll över din spam med procmail del 3 Sida 5 Lars Magnusson - Får ej användas utan att källan anges

Detta var min sista text om procmail, jag hoppas att ni läsare fått en inblick vad man kan göra med procmail, inte bara för att bekämpa spam, men även idéer för andra ändamål, som automatisk bearbetning av brev. Jag har också försökt visa lite mer om shellskript-programmering utan att göra det till en programmeringskurs. Perl, PHP mm har idag nästan helt slagit ut shellskript, vilket är lite synd, då det fortfarande är ett flexibelt verktyg. En sista utvikning om shellskript, för er som kör Windows nns verktygen Cygwin och UnxUtils, två programpaket som ger oss bash respektive zsh på PC:n samt en hel hög av Unix-kommandon. Båda ger dessutom möjligheten att använda Word, Excel eller andra Windowsprogram i shellskripten. Tänk er ett tidsstyrt skript som hämtar en excell med sftp och sedan kör ett excelmakro i Excel. Makrot utför en beräkning samt sparar len som en csv-l. När Excel stängs, sänder skriptet csvlen vidare till andra (Unix) kommandon och ut kommer en ltrerad lista. Möjligheterna är många. Ta kontroll över din spam med procmail del 3 Sida 6 Lars Magnusson - Får ej användas utan att källan anges