<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>andi.de &#187; Howto</title>
	<atom:link href="http://www.andi.de/tag/howto/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andi.de</link>
	<description></description>
	<lastBuildDate>Mon, 29 Dec 2008 21:01:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Canon HV20: Konfiguration f&#252;r Low-Light</title>
		<link>http://www.andi.de/2008/12/29/canon-hv20-konfiguration-fuer-low-light/</link>
		<comments>http://www.andi.de/2008/12/29/canon-hv20-konfiguration-fuer-low-light/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 01:43:19 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[canon hv20 video]]></category>

		<guid isPermaLink="false">http://www.andi.de/?p=230</guid>
		<description><![CDATA[Als Gedankenst&#252;tze (damit ich nicht wieder danach suchen muss): Einstellungen Canon HV20 f&#252;r Low-Light-Lichtverh&#228;ltnisse: * Kinomodus (statt P, Av und Tv) * Custom Mode * Kontrast +1 * Farbe +1 * Sch&#228;rfe +1 * Belichtung 0 * Modus: 1080 25p Ergebnis: wesentlich weniger Bildrauschen bei wenig Licht]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.de/gp/product/B0012GN76A?ie=UTF8&#038;tag=simpkranbloga-21&#038;linkCode=as2&#038;camp=1638&#038;creative=19454&#038;creativeASIN=B0012GN76A"><img src="http://www.andi.de/wordpress/wp-content/uploads/2008/12/apert.png" alt="apert" title="apert" width="80" height="71" class="alignright size-full wp-image-229" /></a><em>Als Gedankenst&#252;tze (damit ich nicht wieder danach suchen muss):</em></p>
<p><strong>Einstellungen <a href="http://www.amazon.de/gp/product/B0012GN76A?ie=UTF8&#038;tag=simpkranbloga-21&#038;linkCode=as2&#038;camp=1638&#038;creative=19454&#038;creativeASIN=B0012GN76A">Canon HV20</a><img src="http://www.assoc-amazon.de/e/ir?t=simpkranbloga-21&#038;l=as2&#038;o=3&#038;a=B0012GN76A" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> f&#252;r Low-Light-Lichtverh&#228;ltnisse:<br />
</strong></p>
<p>* Kinomodus (statt P, Av und Tv)<br />
* Custom Mode<br />
* Kontrast +1<br />
* Farbe +1<br />
* Sch&#228;rfe +1<br />
* Belichtung 0<br />
* Modus: 1080 25p</p>
<p>Ergebnis: wesentlich weniger Bildrauschen bei wenig Licht <img src="http://www.andi.de/wordpress/wp-content/plugins/more-smilies/macinacs/wink.gif" alt=")" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2008/12/29/canon-hv20-konfiguration-fuer-low-light/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apple-Mail von Ballast reinigen</title>
		<link>http://www.andi.de/2007/03/02/apple-mail-von-ballast-reinigen/</link>
		<comments>http://www.andi.de/2007/03/02/apple-mail-von-ballast-reinigen/#comments</comments>
		<pubDate>Fri, 02 Mar 2007 21:35:57 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[daten]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[mail]]></category>

		<guid isPermaLink="false">http://www.andi.de/2007/03/02/apple-mail-von-ballast-reinigen/</guid>
		<description><![CDATA[Apples mail verstaut seine Informationen im Hintergrund in einer SQlite-Datenbank. Hier k&#246;nnen sich besonders beim Umgang mit IMAP-Postf&#228;chern im Laufe der Zeit einige alte und damit obsolete Eintr&#228;ge ansammeln, die im normalen Programmablauf nicht entsorgt werden und dadurch die Applikation unn&#246;tig verlangsamen. Man kann von Hand die Datenbank von nicht mehr ben&#246;tigten Eintr&#228;gen bereinigen und [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2007/03/mailapp.jpg" align="left" width="133" height="131" hspace="10" vspace="10" border="0" />Apples <em>mail</em> verstaut seine Informationen im Hintergrund in einer SQlite-Datenbank. Hier k&#246;nnen sich besonders beim Umgang mit IMAP-Postf&#228;chern im Laufe der Zeit einige alte und damit obsolete Eintr&#228;ge ansammeln, die im normalen Programmablauf nicht entsorgt werden und dadurch die Applikation unn&#246;tig verlangsamen.<br />
Man kann von Hand die Datenbank von nicht mehr ben&#246;tigten Eintr&#228;gen bereinigen und damit f&#252;r deutlich mehr Speed sorgen.<br />
Hierzu &#246;ffne man das Terminal bei beendetem <em>mail</em> und wechsle ins Biliotheksverzeichnis seiner Mails.</p>
<pre class="precode"><code>cd ~/Library/Mail</code></pre>
<p>Nun kann man SQlite starten und die betreffende Datenbank &#246;ffnen:</p>
<pre class="precode"><code>sqlite3 Envelope\ Index</code></pre>
<p>Wenn alles geklappt hat sollte sich nun das DBMS mit <code>sqlite&gt; </code> melden und auf Eingaben warten. Mit folgendem Kommando werden nicht mehr ben&#246;tigte Eintr&#228;ge geleert:</p>
<pre class="precode"><code>vacuum subjects;</code></pre>
<p>Anschlie&#223;end kann man SQlite durch <code>Steuerung + D</code> wieder beenden und <em>mail</em> wieder starten.<br />
Zur Sicherheit empfiehlt sich vor durchf&#252;hren dieser Schritte ein Backup der Mail-Datenbank <code>~/Library/Mail/Envelope Index</code>.</p>
<div align="right" class="via">[<a href="http://www.macnews.de/news/97955.html">via</a>]</div>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2007/03/02/apple-mail-von-ballast-reinigen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Achtung, fertig: verstecken!</title>
		<link>http://www.andi.de/2007/02/26/achtung-fertig-verstecken/</link>
		<comments>http://www.andi.de/2007/02/26/achtung-fertig-verstecken/#comments</comments>
		<pubDate>Mon, 26 Feb 2007 21:40:57 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[fenster]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[kostenlos]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.andi.de/2007/02/26/achtung-fertig-verstecken/</guid>
		<description><![CDATA[Exposé kann bekanntlich unter MacOS auf Knopfdruck alle aktiven Fenster ausblenden um einen Blick auf den Desktop freizugeben. Ab und an w&#228;re es aber praktisch, alle Fenster, die im Vordergrund aktiv sind, vollst&#228;ndig vom Bildschirm ausblenden zu k&#246;nnen, um Platz f&#252;r Neues zu schaffen. Ein kleines Applescript macht dies m&#246;glich. Einmal aufgerufen und schwupps: wieder [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2007/02/hideit.jpg" align="left" width="150" height="110" hspace="10" vspace="10" border="0" />Exposé kann bekanntlich unter MacOS auf Knopfdruck alle aktiven Fenster ausblenden um einen Blick auf den Desktop freizugeben.<br />
Ab und an w&#228;re es aber praktisch, alle Fenster, die im Vordergrund aktiv sind, vollst&#228;ndig vom Bildschirm ausblenden zu k&#246;nnen, um Platz f&#252;r Neues zu schaffen. Ein <a href="http://forums.macrumors.com/showthread.php?t=275858">kleines Applescript</a> macht dies m&#246;glich. Einmal aufgerufen und schwupps: wieder Platz am Bildschirm.<br />
Alternativ kann man sich auch ein kleines <a href="https://atlas.colorado.edu/~bjacobso/downloads/quitall.zip">Freeware-Programm herunterladen</a>, das ebenso diese Aufgabe erf&#252;llt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2007/02/26/achtung-fertig-verstecken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DoS-Angriffe erfolgreich aufhalten</title>
		<link>http://www.andi.de/2007/02/17/dos-angriffe-erfolgreich-aufhalten/</link>
		<comments>http://www.andi.de/2007/02/17/dos-angriffe-erfolgreich-aufhalten/#comments</comments>
		<pubDate>Fri, 16 Feb 2007 23:50:30 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Webtechnik]]></category>
		<category><![CDATA[angriff]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[modul]]></category>

		<guid isPermaLink="false">http://www.andi.de/2007/02/17/dos-angriffe-erfolgreich-aufhalten/</guid>
		<description><![CDATA[Immer wieder versuchen nervige Script-Kiddies, Spam-Bots oder sonstige b&#246;sgestimmte Zeitgenossen, durch viele Anfragen an Webserver in sehr kurzer Zeit deren Funktion zu beeintr&#228;chtigen und die Auslieferung der Inhalte an „normale“ Besucher dadurch zu erschweren oder gar ganz zu verhindern. Heutzutage generieren sich viele Webprojekte aus dynamisch erzeuten Seiten; die Bildung der Inhalte ben&#246;tigt daher Rechenzeit [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2007/02/angriff.jpg" width="163" align="left" height="140" hspace="10" vspace="10" border="0" />Immer wieder versuchen nervige Script-Kiddies, Spam-Bots oder sonstige b&#246;sgestimmte Zeitgenossen, durch viele Anfragen an Webserver in sehr kurzer Zeit deren Funktion zu beeintr&#228;chtigen und die Auslieferung der Inhalte an „normale“ Besucher dadurch zu erschweren oder gar ganz zu verhindern.<br />
Heutzutage generieren sich viele Webprojekte aus dynamisch erzeuten Seiten; die Bildung der Inhalte ben&#246;tigt daher Rechenzeit und Speicher auf derm Webserver, was das <a href="http://de.wikipedia.org/wiki/Denial_of_Service">DoS-Problem</a> verst&#228;rkt. Durch zu viele Anfragen in zu kurzer Zeit steigt die CPU-Auslastung an und in ung&#252;nstigen Situation ist kein Seiteaufbau mehr m&#246;glich, da dem Server der RAM ausgeht.<br />
Um hier Entlastung zu bringen wurde das Apache-Modul <em><a href="http://www.nuclearelephant.com/projects/mod_evasive/">mod_evasive</a></em> entwickelt (<a href="http://huschi.net/14_182_de.html">Download-Mirror</a>), welches die maximal m&#246;glichen Verbindungen pro IP-Adresse kontrolliert und im Bedarfsfall abblockt.<span id="more-137"></span><br />
mod_evasive erstellt intern eine Liste von zugreifenden IPs und angeforderten URLs. Sobald in einer einstellbaren Zeitspanne ein festgelegter Schwellwert &#252;berschritten wird, lehnt das Modul weitere Zugriffe innerhalb einer Blacklist-Frist mit einem <a href="http://de.wikipedia.org/wiki/Fehlerseite">403-Forbidden-Fehler</a> ab &#8212; hierduch erfolgt kein rechenintensiver Aufruf von Inhalten mehr und viele DoS-Attacken laufen ins Leere.<br />
Die Installation ist einfach. Das Modul kann im Quelltext <a href="http://huschi.net/14_182_de.html">bezogen</a> werden und bei installieren Apache-dev-Quellen simpel durch Aufruf von</p>
<pre class="precode"><code>apxs -i -a -c mod_evasive20.c</code></pre>
<p>kompiliert und den Apache-Modulen zugef&#252;gt werden.<br />
Bei der Installation wird ein Eintrag in die <code>httpd.conf</code> eingef&#252;gt; zus&#228;tzlich empfiehlt sich, die Parameter von mod_evasive an die eigenen Bed&#252;rfnisse anzupassen.<br />
Hierzu f&#252;gt man in der Apache-Konfiguration einen Abschnitt ein:</p>
<pre class="precode"><code>&lt;IfModule mod_evasive20.c&gt;
    DOSHashTableSize    3096
    DOSPageCount        5
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
&lt;/IfModule&gt;</code></pre>
<p>Die Bedeutung der einzelnen Option sind in der Dokumentation erl&#228;utert.<br />
Nach einem Neustart von Apache greift der Schutz. Bei Bedarf kann bei IP-Blacklistungen eine eMail an eine beliebige Adresse geschickt werden. Hierzu kann man oben zus&#228;tzlich die Option <code>DOSEmailNotify admin@mydomain.net</code> mit passender Adresse eintragen.<br />
Anzumerken bleibt, dass mod_evasive zwar eine deutliche Lastreduktion bei Angriffen bieten kann, einen vollst&#228;ndigen Schutz leistet aber nur ein Abblocken der DoS-Pakete mittels Firewall, bevor sie Apache &#252;berhaut erreichen k&#246;nnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2007/02/17/dos-angriffe-erfolgreich-aufhalten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Screensaver als Desktop-Hintergrund</title>
		<link>http://www.andi.de/2007/02/08/screensaver-als-desktop-hintergrund/</link>
		<comments>http://www.andi.de/2007/02/08/screensaver-als-desktop-hintergrund/#comments</comments>
		<pubDate>Thu, 08 Feb 2007 15:57:08 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[screensaver]]></category>

		<guid isPermaLink="false">http://www.andi.de/2007/02/08/screensaver-als-desktop-hintergrund/</guid>
		<description><![CDATA[Ist der Bildschirmhintergrund mal wieder viel zu &#246;de? Soll es neben der Arbeit ein bisschen Action auf dem Screen geben? Oder m&#246;chte man nur einmal mehr die Windows-User ein bisschen neidisch machen? Mit einem simplen Einzeilen-Kommando im Terminal kann man den aktuell eingestellten Bildschirmschoner als quasi animierten Desktop-Hintergrund starten. Einfach das Terminal &#246;ffnen und dort [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2007/02/scrsav.jpg" align="left" width="178" height="155" hspace="10" vspace="10" border="0" />Ist der Bildschirmhintergrund mal wieder viel zu &#246;de? Soll es neben der Arbeit ein bisschen Action auf dem Screen geben? Oder m&#246;chte man nur einmal mehr die Windows-User ein bisschen neidisch machen?<br />
Mit einem simplen Einzeilen-Kommando im Terminal kann man den aktuell eingestellten Bildschirmschoner als quasi animierten Desktop-Hintergrund starten.<br />
Einfach das Terminal &#246;ffnen und dort folgenden Befehl eingeben:</p>
<pre class="precode"><code>/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background &amp;</code></pre>
<p>&#8230;und schon wird es bunt und rappelig auf dem Schreibtisch.</p>
<div align="center"><img src="/wp-content/uploads/2007/02/miniterm.jpg" width="427" height="215" hspace="10" vspace="10" border="0" /></div>
<p>Dank des Grafikframeworks von MacOS schluckt die Spielerei auch bei grafisch aufwendigen Savern nur wenig Prozessor-Power und st&#246;rt somit den normalen Betrieb nicht merklich.<br />
Und wenn&#8217;s genug gezapplet hat und/oder die Arbeit ungest&#246;rt weitergehen soll: einfach das Terminal-Fenster schlie&#223;en und der Spuk hat ein Ende.  <img src="http://www.andi.de/wordpress/wp-content/plugins/more-smilies/macinacs/wink.gif" alt="-)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2007/02/08/screensaver-als-desktop-hintergrund/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mod_rewrite: Variablen auf neues Ziel umleiten</title>
		<link>http://www.andi.de/2007/01/08/mod_rewrite-variablen-auf-neues-ziel-umleiten/</link>
		<comments>http://www.andi.de/2007/01/08/mod_rewrite-variablen-auf-neues-ziel-umleiten/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 16:39:21 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[rewrite]]></category>

		<guid isPermaLink="false">http://www.andi.de/2007/01/08/mod_rewrite-variablen-auf-neues-ziel-umleiten/</guid>
		<description><![CDATA[Vielleicht standet ihr auch schon vor dem Problem: die URL-Struktur einer Webpr&#228;senz hat sich ge&#228;ndert, Skripte, welche Inhalte dynamisch generieren, liegen an anderen Orten und u.U. hat sich auch die Struktur der zu &#252;bergebenden GET-Variablen ge&#228;ndert. Prinzipiell eigentlich kein Problem, schlie&#223;lich sollten die dynamischen Inhalte aus dem Gesamtkontext mit der neuen Struktur erzeugt werden; anders [...]]]></description>
			<content:encoded><![CDATA[<p>Vielleicht standet ihr auch schon vor dem Problem: die URL-Struktur einer Webpr&#228;senz hat sich ge&#228;ndert, Skripte, welche Inhalte dynamisch generieren, liegen an anderen Orten und u.U. hat sich auch die Struktur der zu &#252;bergebenden GET-Variablen ge&#228;ndert.<br />
Prinzipiell eigentlich kein Problem, schlie&#223;lich sollten die dynamischen Inhalte aus dem Gesamtkontext mit der neuen Struktur erzeugt werden; anders sieht es jedoch aus, wenn es sich bei den Skript-Dateien um wichtige Inhalte handelt, die auch bei Google schon gut indiziert sind.<br />
Es w&#228;re &#228;rgerlich, wenn die bei Google gef&#252;hrten Links nicht mehr g&#252;ltig sind und ins Leere laufen &#8211; oder sogar 404-Fehler erzeugen.<br />
Um die Struktur von Web-Pr&#228;senzen auf neue Ziele „umzubiegen“ bietet sich ein Regelwerk in der sogenannten <code>.htaccess</code>-Datei an.<br />
Leider ist die Umleitung von GET-Variablen nicht ganz trivial.<br />
Der erste Gedanke w&#228;re z.B. folgende L&#246;sung, um die Parameter des Skripts <code>datei.php</code> &#8212; <code>param1</code> sowie <code>param2</code> auf die neue Location umzuleiten:</p>
<div class="precode" >
<pre><code>RewriteRule ^datei\.php\?param1=([^&amp;]+)&amp;param2([^&amp;]+) /neu/datei/$2/$1 [R=301,L]
#falsch!!
</code></pre>
</div>
<p>So klappt es leider nicht, da mod_rewrite diese Behandlung von QueryParametern nicht toleriert.<br />
Der richtige Ansatz l&#228;uft &#252;ber Analyse des QueryStrings, um die GET-Parameter zu separieren:</p>
<div class="precode" >
<pre><code>RewriteEngine On 
RewriteCond %{QUERY_STRING} ^param1=([^&amp;]+)&amp;param2=([^&amp;]+)$ 
RewriteRule ^datei\.php$ /datei/%2/%1? [R=301,L] 
</code></pre>
</div>
<p>Per <code>%n</code> wird hier auf die &#8216;Variablen&#8217; der vorigen RewriteCond zugegriffen.<br />
Nach diesem Muster lassen sich auch anspruchsvolle Umstukturierungen &#8220;google-freundlich&#8221; durchf&#252;hren. Beispiele f&#252;r weitere Rewrite-Methoden gibt es in der <a href="http://httpd.apache.org/docs/2.0/misc/rewriteguide.html">Apache-Dokumentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2007/01/08/mod_rewrite-variablen-auf-neues-ziel-umleiten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NiX-Spam in Spamassassin einbinden</title>
		<link>http://www.andi.de/2006/11/16/nix-spam-in-spamassassin-einbinden/</link>
		<comments>http://www.andi.de/2006/11/16/nix-spam-in-spamassassin-einbinden/#comments</comments>
		<pubDate>Thu, 16 Nov 2006 22:19:51 +0000</pubDate>
		<dc:creator>Andi</dc:creator>
				<category><![CDATA[Howto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nixspam]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spamassassin]]></category>

		<guid isPermaLink="false">http://www.andi.de/2006/11/16/nix-spam-in-spamassassin-einbinden/</guid>
		<description><![CDATA[Neben der Erkennung von Spam &#252;ber die herk&#246;mmlichen Regelsets von Spamassassin, dem Selbsttraining mittels Bayes und dem Abgleich bei bekannten Anti-Spam-Netzwerken wie razor2 oder pyzor, bietet es sich an, den Mailverkehr auch gegen die NiX-Spam-Liste des iX-Teams aus dem Hause Heise abzupr&#252;fen. NiX-Spam bietet eine st&#228;ndig erweiterte Hash-Datenbank alter und neuer Spaminhalte. Mittels eines einfachen [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/2006/11/spamass.jpg" align="left" width="183" height="131" hspace="10" vspace="10" border="0" />Neben der Erkennung von Spam &#252;ber die herk&#246;mmlichen Regelsets von <a href="http://spamassassin.apache.org/">Spamassassin</a>, dem Selbsttraining mittels Bayes und dem Abgleich bei bekannten Anti-Spam-Netzwerken wie <em>razor2</em> oder <em>pyzor</em>, bietet es sich an, den Mailverkehr auch gegen die <em>NiX-Spam</em>-Liste des iX-Teams aus dem Hause <a href="http://www.heise.de/">Heise</a> abzupr&#252;fen.<br />
<a href="http://www.heise.de/ix/nixspam/">NiX-Spam</a> bietet eine st&#228;ndig erweiterte Hash-Datenbank alter und neuer Spaminhalte. Mittels eines einfachen Plugins k&#246;nnen wir aus Mails, die Spamassassin durchlaufen, einen Hash-Abgleich mit der online verf&#252;gbaren NiX-Spam-Liste durchf&#252;hren lassen.<span id="more-52"></span></p>
<p>Zur Installation (Spamassassin 3.1 aufw&#228;rts unter Linux):</p>
<ul>
<li>
Den Inhalt von <em>ixhash.pm</em> per copy-paste in eine Datei <em>ixhash.pm</em> &#252;berf&#252;hren, diese laden wir in ein f&#252;r Spamassassin zugreifbares Verzeichnis auf dem Server (der Einfachhalt halber nehmen wir /etc/mail/spamassassin)
</li>
<li>
Die Eintr&#228;ge aus <em>ixhash.cf</em> in eine Datei <em>ixhash.cf</em> &#252;bernehmen und diese auf dem Server in /etc/mail/spamassassin ablegen.
</li>
<li>
Die erste Zeile von <em>ixhash.cf</em> an die lokalen Gegebenheiten (Pfad) anpassen.
</li>
<li>
Soweit war&#8217;s das, zum Testen <code>spamassassin -D &lt; /eine/nachricht</code> ausf&#252;hren (eine/nachricht sollte ein eMail-File sein). Wenn alles korrekt l&#228;uft sollten auf STDERR einige Nachrichten mit <em>IXHASH</em> auftauchen, die anzeigen, dass das Plugin aktiv ist.
</li>
</ul>
<p>Mit diesen wenigen Schritten kann die Erkennungsrate von Spamassassin nochmals gesteigert werden; die NiX-Spam-Liste ist ferner gegen deutsche Spam-Angriffe besser ausger&#252;stet, als manche andere Hash-Liste.</p>
<p><strong>Die Dateien:</strong></p>
<p><em>ixhash.cf</em>:</p>
<div class="precode" >
<pre><code>
  loadplugin    Mail::SpamAssassin::Plugin::iXhash /path/to/iXhash.pm
# This makes DNS queries time out after 10 seconds (2x default)
  ixhash_timeout    10

# This list uses iX Magazine's spam as datasource.
  body          IXHASH eval:ixhashtest('ix.dnsbl.manitu.net')
  describe      IXHASH This mail has been classified as spam @ iX Magazine, Germany
  tflags        IXHASH net
  score         IXHASH 1.5

# This list comes in @ spamtraps run by LogIn &amp; Solutions AG, Germany
# Manually verified stuff
  body          LOGINHASH1 eval:ixhashtest('nospam.login-solutions.de')
  describe      LOGINHASH1 mail has been classified as spam @ LogIn&amp;Solutions AG, Germany
  tflags        LOGINHASH1 net
  score         LOGINHASH1 1.5

# This list contains hashes from Mails classified as spam at a larger company based in Germany
# Lots of stuff, but automatically categorized and contributed
  body          LOGINHASH2 eval:ixhashtest('nospam.login-solutions.ag')
  describe      LOGINHASH2 mail has been classified as spam @ unknown company, Germany
  tflags        LOGINHASH2 net
  score         LOGINHASH2 1.5
</code></pre>
</div>
<p><em>ixhash.pm</em>:</p>
<div class="precode" >
<pre><code>
=head1 NAME

Mail::SpamAssassin::Plugin::iXhash - compute fuzzy checksums from mail bodies and compare to known spam ones via DNS

=head1 SYNOPSIS
  loadplugin    Mail::SpamAssassin::Plugin::iXhash /path/to/iXhash.pm
  ixhash_timeout        10
  body          IXHASH eval:ixhashtest('ix.dnsbl.manitu.net')
  describe      IXHASH This mail has been classified as spam @ iX Magazine, Germany
  tflags        IXHASH net
  score         IXHASH 1.5

=head1 DESCRIPTION

iXhash.pm is a plugin for SpamAssassin 3.1.0 and up. It takes the body of a mail, strips parts from it and then computes a hash value from the rest.
These values will then be looked up via DNS. 
This plugin is based on parts of the procmail-based project 'NiX Spam', developed by Bert Ungerer.(un@ix.de)
For more information see http://www.heise.de/ix/nixspam/. The procmail code producing the hashes only can be found here:
ftp://ftp.ix.de/pub/ix/ix_listings/2004/05/checksums

Parts of the code were submitted via heise forum by 'kungfuhasi'
See http://www.heise.de/ix/foren/go.shtml?read=1&amp;msg_id=7246759&amp;forum_id=48292.

Martin Blapp (mb@imp.ch) found and solved a problem occuring on Perl 5.8.7. Thanks a lot!

Further improvements (DNS timeouts) by Dallas Engelken (dallase@uribl.com) - see comments for details. 

=cut

package Mail::SpamAssassin::Plugin::iXhash;
use strict;
use Mail::SpamAssassin;
use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Util;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Net::DNS;
use Net::DNS::Resolver;
# Locale - this was on Bert's wishlist
use POSIX qw(locale_h);
setlocale(LC_CTYPE, "de_DE.ISO8859-1");
# LC_CTYPE now "Deutsch, Deutschland, codeset ISO 8859-1"
# Maybe not appropriate for spam that is neither German nor English

use vars qw(@ISA);
@ISA = qw(Mail::SpamAssassin::Plugin);
sub dbg { Mail::SpamAssassin::dbg (@_); }
sub new {
        my ($class, $mailsa, $server) = @_;
        $class = ref($class) || $class;
        my $self = $class-&gt;SUPER::new($mailsa);
        bless ($self, $class);
        $self-&gt;set_config($mailsa-&gt;{conf});
        $self-&gt;register_eval_rule ("ixhashtest");
        return $self;
}


sub set_config {
        my ($self, $conf) = @_;
        my @cmds = ();
        # implements ixhash_timeout config option - by dallase@uribl.com
        push(@cmds, {
                setting =&gt; 'ixhash_timeout',
                default =&gt; 5,
                type =&gt; $Mail::SpamAssassin::Conf::CONF_TYPE_NUMERIC,
        });
        $conf-&gt;{parser}-&gt;register_commands(\@cmds);
}


sub ixhashtest {
        my ($self, $permsgstatus,$muell,$dnsserver) = @_;
        dbg("IXHASH: IxHash querying Server $dnsserver");
        my ($digest,$answer,$ixdigest,$body) = "";
        my @body = $permsgstatus-&gt;{msg}-&gt;get_body();
        my $resolver = Net::DNS::Resolver-&gt;new;
        my $body_copy = "";
        foreach (@body) {
                $body .= join "", @$_;
        }
        my $rr;
        my $hits = 0;
        # alarm the dns query - dallase@uribl.com
        # --------------------------------------------------------------------------
        # here we implement proper alarms, ala Pyzor, Razor2 plugins. 
        # keep the alarm as $oldalarm, so we dont loose the timeout-child alarm
        # see http://issues.apache.org/SpamAssassin/show_bug.cgi?id=3828#c123
        my $oldalarm = 0;
        my $timeout = $permsgstatus-&gt;{main}-&gt;{conf}-&gt;{'ixhash_timeout'} || 5;
        eval {
                Mail::SpamAssassin::Util::trap_sigalrm_fully(sub { die "ixhash timeout reached"; });
        $oldalarm = alarm($timeout);
        
        #-----------------------------------------------------------------------
        # Creation of hash # 1 if following conditions are met:
        # - mail contains at least 16 spaces or tabs 
        # - mail consists of at least 2 lines
      # NB:  Edit this if you want to minimize FPs at the cost of not checking shorter mails.
      # FP ratio will be the higher the shorter the mails are 
        if (($body =~ /([\s\t].+?){16,}/ ) &amp;&amp; ($body =~ /.*$.*/)){
                # Copy $body into $body_copy - thanks to J. Stehle for pointing this out
                $body_copy = $body;
                # All space class chars just one time
                # Do this in two steps to avoid Perl segfaults
                # if there are more than 2.600 identical chars to be replaced
                # Step One
                $body_copy =~ s/([[:space:]]{100})(?:\1+)/$1/g;
                # Step Two
                $body_copy =~ s/([[:space:]])(?:\1+)/$1/g;
                # remove graph class chars and some specials
                $body_copy =~ s/[[:graph:]]+//go;
                # Create actual digest
                $digest = md5_hex($body_copy);
                dbg ("IXHASH: Computed hash-value $digest via method 1");
                dbg ("IXHASH: Now checking $digest.$dnsserver");
                # Now check via DNS query
                $answer = $resolver-&gt;search($digest.'.'.$dnsserver, "A", "IN");
                if ($answer) {
                        foreach $rr ($answer-&gt;answer) {
                                next unless $rr-&gt;type eq "A";
                                dbg ("IXHASH: Received reply from $dnsserver:". $rr-&gt;address);
                                $hits = 1 if $rr-&gt;address;
                        }
                }
        }
        # End of computing hash #1 
        #---------------------------------------------------------------------
        
        
        #---------------------------------------------------------------------
        # Creation of hash # 1 if mail contains at least 3 of the following characters:
        # '[&lt;&gt;()|@*'!?,]' or the combination of ':/'
        # (To match something like "Already seen?  http:/host.domain.tld/")
        # edit this if you want to minimize FPs (i.e. make sure that short emails are not checked)
        # 
        if ($body =~ /((([&lt;&gt;\(\)\|@\*'!?,])|(:\/)).*?){3,}/m ) {
                $body_copy = $body;
                # remove redundant stuff
                $body_copy =~ s/[[:cntrl:][:alnum:]%&amp;#;=]+//g;
                # replace '_' with '.'
                $body_copy =~ tr/_/./;
                # replace duplicate chars. This too suffers from a bug in perl
                # so we do it in two steps
                # Step One
                $body_copy =~ s/([[:print:]]{100})(?:\1+)/$1/g;
                # Step Two
                $body_copy =~ s/([[:print:]])(?:\1+)/$1/g;
                # Computing hash...
                $digest = md5_hex($body_copy);
                dbg ("IXHASH: Computed hash-value $digest via method 2");
                dbg ("IXHASH: Now checking $digest.$dnsserver");
                # Now check via DNS query
                $answer = $resolver-&gt;search($digest.'.'.$dnsserver, "A", "IN");
                if ($answer) {
                        foreach $rr ($answer-&gt;answer) {
                                next unless $rr-&gt;type eq "A";
                                dbg ("IXHASH: Received reply from $dnsserver:". $rr-&gt;address);
                                $hits = 1 if $rr-&gt;address;
                        }
                }
        }

        # End of computing hash #2 
        #-----------------------------------------------------------------------
        
        
        #-----------------------------------------------------------------------
        # Compute hash # 3 if 
        # - there are at least 8 non-empty characters in the body
        # - neither hash #1 nor hash #2 have been computed
        if (($body =~ /[\S]{8,}/) and (length($digest) &lt; 32)) {
                $body_copy = $body;
                $body_copy =~ s/[[:cntrl:][:space:]=]+//g;
                # replace duplicate chars. This too suffers from a bug in perl
                # so we do it in two steps
                # Step One
                $body_copy =~ s/([[:print:]]{100})(?:\1+)/$1/g;
                # Step Two
                $body_copy =~ s/([[:graph:]])(?:\1+)/$1/g;
                # Computing actual hash
                $digest = md5_hex($body_copy);
                dbg ("IXHASH: Computed hash-value $digest via method 3");
                dbg ("IXHASH: Now checking $digest.$dnsserver");
                # Check via DNS
                $answer = $resolver-&gt;search($digest.'.'.$dnsserver, "A", "IN");
                if ($answer) {
                        foreach $rr ($answer-&gt;answer) {
                                next unless $rr-&gt;type eq "A";
                                dbg ("IXHASH: Received reply from $dnsserver:". $rr-&gt;address);
                                $hits = 1 if $rr-&gt;address;
                        }
                }
        }
        if (defined $oldalarm) {
                alarm $oldalarm;  $oldalarm = undef;
        }
}; # End of sub ixhashtest

# Error handling - parto of Dallas' code
if ($@ =~ m/timeout/) {
        dbg("IXHASH: $timeout second timeout exceeded while checking $digest.$dnsserver");
}

return $hits;

}
1;
</code></pre>
</div>
<p>Mehr Hinweise finden sich im <a href="http://wiki.apache.org/spamassassin/iXhash">Spamassassin-Wiki</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andi.de/2006/11/16/nix-spam-in-spamassassin-einbinden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

