<?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>Aus dem Rechenzentrum</title>
	<atom:link href="http://blog.jonaspasche.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jonaspasche.com</link>
	<description>Technik, Kram und Drumherum</description>
	<lastBuildDate>Sun, 29 Apr 2012 15:56:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>(Auch) darum machen wir Uberspace.de</title>
		<link>http://blog.jonaspasche.com/2012/04/29/auch-darum-machen-wir-uberspace-de/</link>
		<comments>http://blog.jonaspasche.com/2012/04/29/auch-darum-machen-wir-uberspace-de/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 15:56:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[uberspace]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1263</guid>
		<description><![CDATA[Manchmal sind wir fast etwas überrascht davon, dass offenbar als Besonderheit Nr. 1 von Uberspace.de ausgerechnet das freie Preismodell gesehen wird, das wir eigentlich eher als Nebenschauplatz gesehen hatten &#8211; und das vornehmlich aus der Bequemlichkeit heraus entstanden ist, nicht ständig über &#8220;warum kostet dieses und jenes so und so viel, und woanders kostet das [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal sind wir fast etwas überrascht davon, dass offenbar als Besonderheit Nr. 1 von Uberspace.de ausgerechnet das freie Preismodell gesehen wird, das wir eigentlich eher als Nebenschauplatz gesehen hatten &#8211; und das vornehmlich aus der Bequemlichkeit heraus entstanden ist, nicht ständig über &#8220;warum kostet dieses und jenes so und so viel, und woanders kostet das aber so und so viel&#8221; diskutieren zu müssen. Eigentlich lag unser Hauptanliegen vielmehr darin, mal etwas angstfreier damit umzugehen, Usern eine &#8220;echte Shell&#8221; an die Hand zu geben, statt eines Webinterfaces, das einem bei dem, was man so machen will, eher hinderlich im Weg steht &#8211; und so auch ein bisschen mehr den &#8220;Spaß am Gerät&#8221; zu wecken und zu zeigen, wie vielfältig die Möglichkeiten mit Linux so sind.</p>
<p>Um so schöner, wenn dann in einer Supportmail auch mal so etwas zu lesen ist (vielen Dank an den Autor, dass wir ihn zitieren dürfen):</p>
<blockquote><p>
Jetzt mal im Ernst: Ich erinnere mich noch daran, dass ich dir vor einem Jahr geschrieben habe, dass das Tolle an Uberspace das Erfassen der Zusammenhänge ist. Das macht es auch weiterhin so spannend, euer Kunde zu sein, während man sich irgendwann an Confixx sattgesehen hat. Nun bin ich zwar immer noch kein Profi geworden (das habe ich jetzt zwei-, nein, dreimal eindrucksvoll bewiesen), dafür habt ihr mir die Berührungsängste, die ich gegenüber Linux hegte, genommen, auch im Desktopbereich. Allein dafür bin ich froh, dass es euch gibt. Danke.
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2012/04/29/auch-darum-machen-wir-uberspace-de/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Schreibmaschine mit memory_limit</title>
		<link>http://blog.jonaspasche.com/2012/04/26/schreibmaschine-mit-memory_limit/</link>
		<comments>http://blog.jonaspasche.com/2012/04/26/schreibmaschine-mit-memory_limit/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 00:06:51 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1249</guid>
		<description><![CDATA[Normalerweise sitze ich nicht um 1:20 Uhr noch am Rechner, um PHP-Probleme zu debuggen. Insbesondere nicht, wenn&#8217;s keine bezahlte Auftragsarbeit ist, sondern nacktes &#8220;Ich! Will! Das! Verstehen!&#8221;. Aber genau sowas hatte ich heute. Nachdem ich vor einigen Tagen schon mal ergebnislos an dem folgenden Problem herumgedoktert hatte, habe ich mich heute nochmal darin verbissen. Ein [...]]]></description>
			<content:encoded><![CDATA[<p>Normalerweise sitze ich nicht um 1:20 Uhr noch am Rechner, um PHP-Probleme zu debuggen. Insbesondere nicht, wenn&#8217;s keine bezahlte Auftragsarbeit ist, sondern nacktes &#8220;Ich! Will! Das! Verstehen!&#8221;. Aber genau sowas hatte ich heute. Nachdem ich vor einigen Tagen schon mal ergebnislos an dem folgenden Problem herumgedoktert hatte, habe ich mich heute nochmal darin verbissen.</p>
<p>Ein User betreibt einen Magento-Shop auf unserer Hosting-Plattform <a href="https://uberspace.de/">Uberspace.de</a>. Dazu gehören auch einige Hintergrundjobs, und zwar unter anderem dieser hier, der ganz offenkundig am <code>memory_limit</code> scheitert:</p>
<pre>
[demosite@krypton ~]$ php -c ~/cli /home/demosite/html/www.demosite.tld/shell/indexer.php status
PHP Fatal error:  Allowed memory size of 262144 bytes exhausted (tried to allocate 232 bytes) in /var/www/virtual/demosite/www.demosite.tld/app/code/core/Mage/Index/Model/Mysql4/Process.php on line 110
</pre>
<p>Moment mal &#8211; ein <code>memory_limit</code> von gerade mal 256K? Das kann ja eigentlich nicht sein. In der <code>php.ini</code> steht nämlich <code>512M</code>, und das wertet PHP an sich auch korrekt aus:</p>
<pre>
[demosite@krypton ~]$ php -c ~/cli -i | grep memory_limit
memory_limit =&gt; 512M =&gt; 512M
</pre>
<p>Nun gibt&#8217;s aber ja auch die Möglichkeit, in PHP-Scripts zur Laufzeit mit <code>ini_set()</code> einzelne Einstellungen dynamisch zu ändern, also auch das <code>memory_limit</code>. Schauen wir also mal, wo das möglicherweise noch so passiert:</p>
<pre>
[demosite@krypton ~]$ grep -r memory_limit /var/www/virtual/demosite/www.demosite.tld | grep -v cache
/var/www/virtual/demosite/www.demosite.tld/lib/Varien/.svn/text-base/Pear.php.svn-base:        @ini_set('memory_limit', '256M');
/var/www/virtual/demosite/www.demosite.tld/lib/Varien/Pear.php:        @ini_set('memory_limit', '256M');
/var/www/virtual/demosite/www.demosite.tld/lib/Zend/Memory/.svn/text-base/Manager.php.svn-base:     * Default value is 2/3 of memory_limit php.ini variable
/var/www/virtual/demosite/www.demosite.tld/lib/Zend/Memory/.svn/text-base/Manager.php.svn-base:        $memoryLimitStr = trim(ini_get('memory_limit'));
/var/www/virtual/demosite/www.demosite.tld/lib/Zend/Memory/Manager.php:     * Default value is 2/3 of memory_limit php.ini variable
/var/www/virtual/demosite/www.demosite.tld/lib/Zend/Memory/Manager.php:        $memoryLimitStr = trim(ini_get('memory_limit'));
/var/www/virtual/demosite/www.demosite.tld/magiczoomplus/module/magictoolbox/core/.svn/text-base/magictoolbox.params.class.php.svn-base:@ini_set('memory_limit', '512M');
/var/www/virtual/demosite/www.demosite.tld/magiczoomplus/module/magictoolbox/core/magictoolbox.params.class.php:@ini_set('memory_limit', '512M');
/var/www/virtual/demosite/www.demosite.tld/.svn/text-base/payment_check.php.svn-base:ini_set('memory_limit', '1024M');
/var/www/virtual/demosite/www.demosite.tld/.svn/text-base/.htaccess.svn-base:  php_value memory_limit 128M
/var/www/virtual/demosite/www.demosite.tld/.htaccess:  php_value memory_limit 128M
</pre>
<p>Okay, kommt einige Male vor, durchaus auch mit wechselnden Werten, aber nirgendwo etwas mit <code>256K</code>. Was also ist hier los?</p>
<p><a href="http://xdebug.org/">XDebug</a> muss her. Flugs kompiliert und die <code>xdebug.so</code> via <code>zend_extension</code> in die <code>php.ini</code> eingebunden und <code>xdebug.auto_trace=1</code> gesetzt. Dann nochmal ausgeführt und geschaut, und siehe da &#8211; dreimal wird <code>ini_set()</code> aufgerufen:</p>
<pre>
[demosite@krypton ~]$ grep ini_set traces/trace.3557638816.xt
    0.1443    8707248         -&gt; ini_set() /var/www/virtual/demosite/www.demosite.tld/shell/abstract.php:117
    0.1443    8707384         -&gt; ini_set() /var/www/virtual/demosite/www.demosite.tld/shell/abstract.php:117
    0.1444    8706736         -&gt; ini_set() /var/www/virtual/demosite/www.demosite.tld/shell/abstract.php:123
</pre>
<p>Also mal geschaut, was an dieser Stelle so für Code steht &#8211; und das hat mich wirklich überrascht:</p>
<pre>
    /**
     * Parse .htaccess file and apply php settings to shell script
     *
     */
    protected function _applyPhpVariables()
    {
        $htaccess = $this-&gt;_getRootPath() . '.htaccess';
        if (file_exists($htaccess)) {
            // parse htaccess file
            $data = file_get_contents($htaccess);
            $matches = array();
            preg_match_all('#^\s+?php_value\s+([a-z_]+)\s+(.+)$#siUm', $data, $matches, PREG_SET_ORDER);
            if ($matches) {
                foreach ($matches as $match) {
                    @ini_set($match[1], $match[2]);
               	}
            }
            preg_match_all('#^\s+?php_flag\s+([a-z_]+)\s+(.+)$#siUm', $data, $matches, PREG_SET_ORDER);
            if ($matches) {
                foreach ($matches as $match) {
                    @ini_set($match[1], $match[2]);
                }
            }
        }
    }
</pre>
<p>Es kommt hier also Code zum Tragen, der bei der Ausführung eines PHP-Scripts auf der <em>Kommandozeile</em> eine <em>.htaccess-Datei</em> auswertet, die in diesem Kontext nun eigentlich überhaupt keine Rolle spielt &#8211; handelt es sich dabei doch um eine webserver-spezifische Konfigurationsdatei. Also flugs dort nochmal reingeschaut:</p>
<pre>
[demosite@krypton ~]$ grep memory_limit /var/www/virtual/demosite/www.demosite.tld/.htaccess
  php_value memory_limit 128M
</pre>
<p>Hm. Da steht aber auch nichts von 256K. Wo zum Kuckuck kommt das her? Also auf die Schnelle &#8211; es ist spät &#8211; schnell ein wenig Debugging-Code an die entsprechende Stelle gesetzt, um einfach mal auszugeben, was <em>genau</em> dort geschrieben wird (jaja, das ist nicht elegant, aber man muss auch mal pragmatisch sein dürfen):</p>
<pre>
               	foreach ($matches as $match) {
                    echo "setting '" . $match[1] . "' to '" . $match[2] . "'\n";
                    @ini_set($match[1], $match[2]);
                }
</pre>
<p>Die Ausgabe hat dann doch reichlich überrascht:</p>
<pre>
[demosite@krypton ~]$ php -c ~/cli /home/demosite/html/www.demosite.tld/shell/indexer.php status
'etting 'memory_limit' to '128M
'etting 'max_execution_time' to '18000
PHP Fatal error:  Allowed memory size of 262144 bytes exhausted (tried to allocate 92 bytes) in /var/www/virtual/demosite/www.demosite.tld/app/code/core/Mage/Index/Model/Mysql4/Process.php on line 110
</pre>
<p>Auch dem ungeübten Betrachter wird auffallen, dass die Ausgabe nicht mit <code>setting</code>, sondern mit <code>'etting</code> beginnt, und dafür nicht mit <code>'128M'</code> endet, sondern mit <code>'128M</code>. Was zum..? Es wird doch nicht..?</p>
<p>Ein kleiner Exkurs: Unix-Systeme benutzen andere Zeilenumbrüche als Windows-Systeme. Während unter Unix Zeilenumbrüche mit einem einzelnen <em>line feed</em> (<code>"\n"</code>) separiert werden, werden unter Windows Zeilenumbrüche mit einem <em><a href="http://en.wikipedia.org/wiki/Carriage_return">carriage return</a>, line feed</em> (<code>"\r\n"</code>) separiert: Carriage return, der gute alte Wagenrücklauf wie bei der Schreibmaschine &#8211; am Hebel ziehen, um den Druckkopf wieder am Zeilenanfang zu positionieren; Druckwalze eine Zeile vorrücken lassen.</p>
<p>Und genau so sah das hier aus: Das zweite <code>'</code> von <code>'128M'</code> ist nach vorne gerutscht; ein <em>carriage return</em> hat stattgefunden. Und das wiederum heißt, dass &#8230; Moment, kurz nachgucken &#8230;</p>
<pre>
[demosite@krypton ~]$ file /var/www/virtual/demosite/www.demosite.tld/.htaccess
/var/www/virtual/demosite/www.demosite.tld/.htaccess: ASCII English text, with CRLF line terminators
</pre>
<p>&#8230; richtig: Die Inhalte der <code>.htaccess</code>-Datei sind mit Windows-Zeilenumbrüchen gespeichert. Werden jene nun auf einem Unix-System eingelesen, was die Zeilen am &#8220;<code>\n</code>&#8221; auftrennt, dann hat <code>memory_limit</code> hier faktisch nicht den Wert &#8220;<code>128M</code>&#8220;, sondern den Wert &#8220;<code>128M\r</code>&#8221; &#8211; Wagenrücklauf inklusive. Und <em>genau das</em> ist es, was PHP nun so gar nicht schmeckt. Verdammte Axt!</p>
<p>Also los:</p>
<pre>
[demosite@krypton ~]$ dos2unix /var/www/virtual/demosite/www.demosite.tld/.htaccess
dos2unix: converting file /var/www/virtual/demosite/www.demosite.tld/.htaccess to UNIX format ...
</pre>
<p>Getestet:</p>
<pre>
[demosite@krypton ~]$ php -c ~/cli /home/demosite/html/www.demosite.tld/shell/indexer.php status
setting 'memory_limit' to '128M'
setting 'max_execution_time' to '18000'
Product Attributes:            Pending
Product Prices:                Pending
Catalog Url Rewrites:          Pending
Product Flat Data:             Pending
Category Flat Data:            Pending
Category Products:             Pending
Catalog Search Index:          Running
Stock status:                  Pending
</pre>
<p>Problem gelöst. Script läuft. Nur noch die Debug-Zeile wieder rausnehmen. So, erledigt.</p>
<p>Und jetzt ist wirklich Zeit für&#8217;s Bett.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2012/04/26/schreibmaschine-mit-memory_limit/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Raketengeschichten</title>
		<link>http://blog.jonaspasche.com/2012/02/24/raketengeschichten/</link>
		<comments>http://blog.jonaspasche.com/2012/02/24/raketengeschichten/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 10:36:05 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[recht]]></category>
		<category><![CDATA[uberspace]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1218</guid>
		<description><![CDATA[Auf unserer Hosting-Plattform Uberspace.de gibt&#8217;s eine neue Rakete im Logo. Gleich vorweg, hier der Vorher-Nachher-Vergleich: alt neu Ein bisschen runder, ein Fenster mit Aussicht (wer braucht das nicht!), aber vor allem: Nun wirklich in keinster Weise mehr mit einer Tim-und-Struppi-Rakete verwechselbar. Wir hatten das auch zuvor nicht wirklich gesehen. Unsere Rakete war ein selbstgezeichneter Entwurf [...]]]></description>
			<content:encoded><![CDATA[<p>Auf unserer Hosting-Plattform Uberspace.de gibt&#8217;s eine neue Rakete im Logo. Gleich vorweg, hier der Vorher-Nachher-Vergleich:</p>
<table style="width: 100%">
<tr>
<td style="text-align: center"><img src="https://uberspace.de/static/img/logo-trans-old.png" style="width: 180px" /></td>
<td style="text-align: center"><img src="https://uberspace.de/static/img/logo-trans-2012.png" style="width: 180px" /></td>
</tr>
<tr>
<td style="text-align: center">alt</td>
<td style="text-align: center">neu</td>
</tr>
</table>
<p>Ein bisschen runder, ein Fenster mit Aussicht (wer braucht das nicht!), aber vor allem: Nun wirklich in keinster Weise mehr mit einer <a href="http://www.google.com/search?q=tintin+rocket&amp;tbm=isch" target="_blank">Tim-und-Struppi-Rakete</a> verwechselbar.</p>
<p>Wir hatten das auch zuvor nicht wirklich gesehen. Unsere Rakete war ein selbstgezeichneter Entwurf eines Grafikers bei <a href="http://www.webcontact.de/" target="_blank">web://contact</a>, der nicht auf der besagten Rakete basierte, sondern vielmehr Anlehnung an die klassische <a href="http://www.google.com/search?q=aggregat+4&amp;tbm=isch" target="_blank">Aggregat 4</a> (auch bekannt als &#8220;V-2&#8243;) nahm &#8211; ein weithin bekanntes <a href="http://de.wikipedia.org/wiki/Aggregat_4" target="_blank">Design von Wernher von Braun von 1939</a>, das offenbar auch Tim-und-Struppi-Zeichner Hergé <a href="http://en.wikipedia.org/wiki/Destination_Moon_(Tintin)#Synopsis" target="_blank">als Inspiration diente</a>:</p>
<blockquote><p>
&hellip; An unmanned subscale prototype of the rocket — the &#8220;X-FLR6&#8243;, resembling a V-2 rocket — is launched on a circumlunar mission to photograph the far side of the Moon &hellip;
</p></blockquote>
<p>Aus unserer Sicht bestand hier auch eine deutliche Abgrenzung &#8211; ein anderes Karomuster (2&#215;2 statt 5&#215;2), keine schwarzen Trennlinien zwischen den Karos, ein deutlich anderes Größenverhältnis zwischen Korpus und Flügeln &#8230; aber dennoch bekamen wir dann kürzlich Post des Verlags, der die Rechte an den Tim-und-Struppi-Cartoons hält, mit dem Hinweis auf eine unberechtigte Verwendung von Elementen des von Hergé gezeichneten Cartoons und der Aufforderung, jene zu entfernen.</p>
<p>Wir haben dies lange im Team und auch mit der Designagentur besprochen. Einerseits sind wir überzeugt davon, hier keine Rechtsverletzung begangen zu haben &#8211; nicht zuletzt, weil das Design, an dessen unsere Rakete Anlehnung fand, schon deutlich älter war ist als der betreffende Cartoon, und weil der Verlag wohl kaum Rechte an jeglicher gezeichneter Comic-Rakete haben kann, selbst dann nicht, wenn sie rot ist. Oder eben auch Karos hat. Andererseits haben wir auch kein Interesse an einem langwierigen und kostenintensiven Rechtsstreit, dessen Ausgang &#8211; subjektiv wie solche grafischen Bewertungen nun mal sind &#8211; für beide Seiten ungewiss sein dürfte. Last but not least trat der Verlag nicht über eine Anwaltskanzlei mit einer teuren Kostennote und hohen Schadensersatzforderung an uns heran, sondern mit einem eigenen Schreiben mit der schlichten Aufforderung, die beanstandete Rakete zu entfernen und zuzusichern, sie künftig nicht mehr zu verwenden. Heutzutage, wo man ja eigentlich mit allem, was man im Web veröffentlicht, schon mit einem Bein im Knast steht, fanden wir das einen ausgesprochen fairen und seriösen Umgang, den wir mit einem entsprechenden Entgegenkommen auch würdigen wollten.</p>
<p><a href="http://www.kanzlei-im-alten-museum.de/kuschert.htm" target="_blank">Rechtsanwalt Jochen Kuschert</a>, der in unserem Auftrag die Situation rechtlich einschätzte, ergänzte seine Stellungnahme mit einer Anmerkung, die weniger der konkreten Rechtsprechung, sondern wohl eher der juristischen Alltagserfahrung geschuldet ist:</p>
<blockquote><p>
Möglich und oft auch üblich ist aber auch, dass von Rechteinhaber vorschnell oder „bewusst“ nicht existierende Ansprüche geltend gemacht werden, um möglichst viel „Freiraum“ zwischen den eigenen Werken und anderen Werken zu schaffen. Denn die rechtlichen Unwägbarkeiten bestehen auf beiden Seiten.
</p></blockquote>
<p>Wir haben daraufhin entschieden, eine Änderung des Designs unserer Rakete zu beauftragen, die seit heute morgen sowohl im Logo als auch im Fuß der Seite entsprechend ausgewechselt wurde. Unser Antwortschreiben an den Verlag dokumentieren wir hier:</p>
<blockquote><p>
Dear [...],</p>
<p>thanks a lot for contacting us.</p>
<p>We&#8217;re really sorry to hear that you consider the Uberspace.de rocket as a look-alike of the TINTIN rocket from the HERGE comic strip series. Please be assured that we&#8217;re trying to solve your concerns in all conscience.</p>
<p>Simply said, the Uberspace.de rocket is not based on the TINTIN rocket, and it differs from it in many aspects:</p>
<p>The TINTIN rocket, for example, &#8230;</p>
<p>- has a 5&#215;2 tile set<br />
- uses black lines to separate the tiles from each other<br />
- has enormous wings<br />
- has an antenna at the top</p>
<p>However, the Uberspace.de rocket &#8230;</p>
<p>- has a 2&#215;2 tile set<br />
- doesn&#8217;t use black lines to separate the tiles<br />
- has much smaller wings<br />
- does not have an antenna at the top</p>
<p>The Uberspace.de rocket resembles the design of the well-known &#8220;Aggregat 4&#8243; rocket used in World War II, also known as &#8220;V2&#8243;, which is a Wernher von Braun design from 1939 and thus nearly 15 years older than the creation of HERGE.</p>
<p>It&#8217;s obvious that HERGE has been heavily inspired by the V2, too, but in fact it would be hard to make a comic adaption of the V2 that would *not* have some similarities with the TINTIN rocket.</p>
<p>While we really feel confident that the Uberspace.de rocket isn&#8217;t a TINTIN rocket look-alike, we clearly understand that you&#8217;d prefer a design which has more &#8220;distance&#8221; from the TINTIN rocket. As we&#8217;re not interested in a legal dispute &#8211; especially because many of our team members are fans of the TINTIN comics, including myself &#8211; we have worked together with our designers to create a new rocket for use in both our logo as well as in our footer image.</p>
<p>The new rocket design:</p>
<p>- still differs in all aspects mentioned above<br />
- has an even more different shape with a heavily rounded down top (while the TINTIN rocket has a spiky top)<br />
- stretches the 2&#215;2 tile set throughout the rocket&#8217;s body (while the TINTIN rocket encloses its 5&#215;2 tile set by a top and bottom which is completely red)<br />
- adds a black bull&#8217;s-eye (which the TINTIN rocket doesn&#8217;t have at all)</p>
<p>Summarized, the modified Uberspace.de rocket now has even larger differences from the TINTIN rocket, and we&#8217;re pretty sure that nobody would falsely identify the Uberspace.de rocket as a TINTIN rocket.</p>
<p>That being said: While we can provide you with a written undertaking that we won&#8217;t, at any time in the future, use any image of a rocket that *might* be mistaken for a TINTIN rocket by an untrained eye, we really can&#8217;t acknowledge an injunctive relief against the use of any strip, character, name and symbol, as we have never used (or misused) one of these in the past.</p>
<p>I therefore propose the following phrase:</p>
<p>&#8220;I, Jonas Pasche, will not, at any time in the future, use any image of a rocket that might be mistaken for a TINTIN rocket.&#8221;</p>
<p>Please let me know if you agree with that phrase or if you still have any concerns.</p>
<p>Best regards,<br />
Jonas Pasche
</p></blockquote>
<p>Wir werden sehen, ob die Angelegenheit damit erfolgreich abgeschlossen werden kann oder nicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2012/02/24/raketengeschichten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lob des Backups</title>
		<link>http://blog.jonaspasche.com/2012/02/11/lob-des-backups/</link>
		<comments>http://blog.jonaspasche.com/2012/02/11/lob-des-backups/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 10:28:43 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[iscsi]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1213</guid>
		<description><![CDATA[Während ich diesen Artikel schreibe, rauschen im anderen Fenster die Zeilen der rsync-Ausgaben über den Bildschirm. Um 07:12 Uhr bemerkte Icinga die ersten Probleme; um 7:17 Uhr eskalierte es sie auf mein Handy. Seitdem bin ich wach, und weil ich während des nun laufenden Restores ohne nichts weiter unternehmen kann und die nächsten Schritte bereits [...]]]></description>
			<content:encoded><![CDATA[<p>Während ich diesen Artikel schreibe, rauschen im anderen Fenster die Zeilen der <code>rsync</code>-Ausgaben über den Bildschirm. Um 07:12 Uhr bemerkte Icinga die ersten Probleme; um 7:17 Uhr eskalierte es sie auf mein Handy. Seitdem bin ich wach, und weil ich während des nun laufenden Restores ohne nichts weiter unternehmen kann und die nächsten Schritte bereits vorbereitet habe, mache ich das Beste draus: Ich blogge.</p>
<p>Um&#8217;s direkt vorwegzunehmen: In technischer Hinsicht bietet dieser Blogpost keinerlei Erkenntnisgewinn. Nur vielleicht eine Moral, die da lautet: <strong>Macht Backups</strong>. (Und <a href="http://www.chicagotribune.com/news/columnists/chi-schmich-sunscreen-column,0,4054576.column" target="_blank" title="Kolumne von Mary Schmich">benutzt Sonnencreme</a>, klar.)</p>
<p>Vom Monitoring aus dem Schlaf geholt zu werden, ist erstmal kein großer Aufreger. Nicht selten geht es hier um Probleme vom Kaliber &#8220;der Apache braucht mal einen Restart&#8221; oder auch &#8220;die Mailqueue ist ungewöhnlich voll&#8221; (was auf einen Spamvorfall hindeutet). Echte Ausfälle sind selten. In diesem Fall war es ein sehr kundenspezifischer Check: Es wird durch ein PHP-Script geprüft, ob eine ganz bestimmte Spalte einer ganz bestimmten Tabelle einer MySQL-Datenbank eine bestimmte Länge hat. Die Gründe für diesen Check führen hier zu weit; es gab vor längerer Zeit einen Vorfall, der dazu Anlass gab, und wir sind eigentlich immer bestrebt, für Vorfälle, die nicht durch unser Monitoring diagnostiziert wurden, anschließend noch bessere Checks zu schreiben. Dieser hier ist ein schönes Beispiel: Der Apache lief. Der MySQL-Server lief. Apache konnte auch mit MySQL kommunizieren. Aber MySQL konnte keine Daten <em>schreiben</em>. Das Gros der Checks des fraglichen Systeme meldete daher fröhlich &#8220;alles in Ordnung&#8221; &#8211; obwohl überhaupt nichts in Ordnung war. Mir war nur noch nicht bewusst, wie sehr nicht.</p>
<p>Das ausgeführte <code>DESCRIBE kunden</code> führte jedenfalls zu einem Fehler, und zwar konkret zu <code>Can't create/write to file '/tmp/#sql_2fc2_0.MYI' (Errcode: 30)</code>. Das muss jetzt erstmal noch keine Katastrophe sein, sondern kann auf simple Probleme wie eine überschrittene Quota oder eine vollgelaufene Partition hindeuten (was wir zwar auch monitoren, aber nur in einer niedrigeren Frequenz, weil sowas typischerweise nicht &#8220;von jetzt auf gleich&#8221; passiert). Also habe ich mich dann erstmal per SSH eingeloggt, was auch geklappt hat.</p>
<p>Als <code>df -h</code> dann lediglich <code>Command not found</code> lieferte, und <code>ps ax</code> dann auch, war ich dann sehr schnell richtig wach, und es war klar: Das Problem ist größerer Natur als nur eine vollgelaufene <code>/tmp</code>-Partition. Auch <code>dmesg</code> ließ sich nicht mehr ausführen. Da es sich bei dem System um eine Xen-Instanz handelte, war von daher ein Login auf dem Wirtssystem dran. <code>xm console</code> zeige neben dem Login nur noch einen <code>ext3</code>-Fehler: <code>Journal has aborted</code>. Okay, das kommt <em>mal</em> vor. Selten. Und es ist in der Regel kein Problem, das sich nicht mit einem <code>fsck.ext3</code> lösen ließe. Also: <code>xm shutdown</code>, <code>xm create -c</code>, &#8230; und das sah alles so <em>gar</em> nicht gut aus, denn <code>pygrub</code> mochte keine grub-Konfiguration innerhalb des Blockdevices des Gasts mehr finden.</p>
<p>Nun sieht dieses System so aus, dass eine lokal eingebaute Festplatte im physischen Server lediglich als Boot-Medium fungiert. Die Blockdevices hingegen kommen via iSCSI von unserem Storage-Cluster: Zwei dicke Maschinen mit je einem RAID6 über 16 Platten, die über DRBD repliziert werden, und auf denen dann LVM-Volumes via <code>ietd</code> exportiert werden. Schnell ein Login auf dem derzeit aktiven Filer: Gibt&#8217;s Probleme? Ein Blick in die Logfiles, in <code>dmesg</code>, &#8230; aber alles sah gut aus. Ich habe mich schnell auf einigen anderen Xen-Gästen eingeloggt, die ebenfalls vom Storage-Cluster aus exportiert werden, aber dort war alles in Ordnung, stabiler Betrieb, auch Schreibzugriffe problemlos möglich.</p>
<p>Im konkreten Fall ist auch der physische Server, auf dem die Xen-Instanz läuft, redundant ausgelegt: Via Heartbeat überwachen sich beide Hosts gegenseitig, und wer aktiv ist, bindet das iSCSI-Target ein und fährt die darauf enthaltene Xen-Instanz hoch. Das Setup läuft an sich prima und hat auch schon einige (geplante) Failover-Vorgänge überstanden. Ich hielt den Zeitpunkt für gegeben, einen Failover durchzuführen. Die Xen-Instanz war schnell gestoppt (tja, wenn das Linux-System erstmal nicht mehr auf sein Blockdevice schreiben kann, geht das verdammt fix &#8230;), dann ein <code>iscsiadm --logout</code> &#8211; und das hing. Und hing. Und hing. Was von daher merkwürdig war, weil der iSCSI-Server durchaus anpingbar war, also kein Problem mit dem Netzwerkinterface o.ä. vorliegen konnte.</p>
<p>In solchen Fällen ist es wichtig, eine Split-Brain-Situation zu vermeiden, sprich, es sollten nicht zwei Hosts das gleiche Blockdevice bearbeiten. Die einfachste Möglichkeit ist, den ohnehin praktisch toten Host komplett vom Strom zu trennen. Gesagt, getan &#8211; ist dank IPMI ja alles kein Problem. Dann die Übernahme des iSCSI-Targets auf den anderen Knoten, die von Heartbeat ohnehin automatisch veranlasst wurde, als der bisher aktive Host nicht mehr anpingbar war. Klappte. Mit einem <em>kleinen</em> Problem: Das Blockdevice beinhaltet eigentlich eine Partitionstabelle, die genau eine Partition umfasst, nämlich die Root-Partition. Wird das iSCSI-Target eingebunden, taucht es insofern als <code>/dev/sdb</code> auf (<code>/dev/sda</code> ist das eingebaute Boot-Plattensystem), und noch dazu ein <code>/dev/sdb1</code> mit jener Root-Partition.</p>
<p><code>/dev/sdb</code> war da. <code>/dev/sdb1</code> fehlte. Ein <code>fdisk -l /dev/sdb</code> behauptete schlicht, es gebe keine Partitionstabelle. Das Blockdevice selbst hatte aber schon mal zumindest die korrekte Größe &#8211; der Zugriff via iSCSI an sich schien also zu klappen. Sicherheitshalber habe ich mir dann die Partition direkt auf dem Storage-Cluster angeschaut, um sicherzugehen, dass es wirklich kein iSCSI-Problem ist. Zum Vergleich, so <em>sollte</em> es aussehen (bei einem identisch eingerichteten Xen-Image):</p>
<pre>
[root@filer01 ~]# fdisk -lu /dev/mapper/vgdrbd1-vserver_working 

Disk /dev/mapper/vgdrbd1-vserver_working: 188.7 GB, 188743680000 bytes
255 heads, 63 sectors/track, 22946 cylinders, total 368640000 sectors
Units = sectors of 1 * 512 = 512 bytes

                              Device Boot      Start         End      Blocks   Id  System
/dev/mapper/vgdrbd1-vserver_working1   *           1   368627489   184313744+  83  Linux
</pre>
<p>Und so sah es <em>faktisch</em> aus:</p>
<pre>
[root@filer01 ~]# fdisk -lu /dev/mapper/vgdrbd2-vserver_broken 

Disk /dev/mapper/vgdrbd2-vserver_broken: 188.7 GB, 188743680000 bytes
255 heads, 63 sectors/track, 22946 cylinders, total 368640000 sectors
Units = sectors of 1 * 512 = 512 bytes

Disk /dev/mapper/vgdrbd2-vserver_broken doesn't contain a valid partition table
</pre>
<p>Okay, iSCSI selbst war als akute Fehlerquelle insofern aus dem Spiel. Es schien an der Zeit, <a href="http://www.cgsecurity.org/wiki/TestDisk" target="_blank" title="TestDisk-Website">TestDisk</a> ins Spiel zu bringen. Dieses Tool ist Gold wert, wenn es darum geht, defekte Partitionstabellen zu fixen, unter anderem, in dem es die Platte sektorenweise nach Blöcken absucht, die z.B. wie ein ext3-Superblock aussehen &#8211; oder nach einem Backup davon, denn ext3 legt immer gleich mehrere Kopien des Superblocks verteilt über das Blockdevice an.</p>
<p>TestDisk fand <em>nichts</em>. Also wirklich überhaupt gar nichts. Insofern hatte ich wenig Hoffnung, dass der darauffolgende Schritt noch etwas bringen würde, nämlich die Partitionstabelle anhand eines identisch aufgesetzten VServers zu rekonstruieren. Aber bevor ich&#8217;s nicht versucht habe &#8230; erwartungsgemäß scheiterte aber der Versuch, die frisch angelegte Partition zu mounten (die ja eigentlich durchaus noch das Dateisystem hätte enthalten müssen &#8211; die Partitionstabelle zu bearbeiten, ändert ja nichts daran, dass auf dem Rest der Platte immer noch unverändert Daten liegen). Aus einem anderen Xen-Image identischer Konfiguration konnte ich noch die Positionen ableiten, die die Backup-Superblocks haben sollten, und habe sie alle durchprobiert &#8211; nichts.</p>
<p>An diesem Punkt war dann Schluss. Wir sind kein Datenrettungsunternehmen, und wir können auch nicht mal eben fix ein einzelnes LVM-Volume eines Clusters, auf dem noch ein paar Dutzend weiterer &#8211; voll funktionsfähiger &#8211; Volumes liegen, an ein solches schicken (wenn, dann müssten wir einen Klon des LVM-Volumes auf eine externe Platte anfertigen), und selbst wenn, würde das das Problem nicht lösen, dass das System <em>im Moment</em> eben nicht läuft. Insofern ist an dieser Stelle der Punkt gekommen, an dem ich mit hängenden Schultern sagen muss: Ich habe absolut keine Ahnung, was hier passiert ist. Der Storage-Cluster meldet weiterhin keinerlei Probleme. Sein RAID6 ist 100% in Ordnung (sagt der Controller). Und vor allem gab es ja keinerlei schreibenden Zugriffe auf Partitionstabelle oder Dateisystem des Images des Xen-Gasts, die irgendwie hätten fehlschlagen und etwas korrumpieren können &#8211; und Daten verschwinden eigentlich nicht &#8220;einfach so&#8221;, nicht ohne dass ein physischer Defekt vorliegen würde, was bei einem RAID-System mit vollkommen intakten Platten nun wirklich ausgesprochen unwahrscheinlich ist. Aber, wie&#8217;s aussieht, möglich.</p>
<p>Nun also rasseln die Dateien aus dem letzten Backup via <code>rsync</code> wieder zurück auf ein frisch angelegtes und mit einem Dateisystem versehenen Blockdevice. Der größte Datenblock, nämlich <code>/home</code>, ist schon durch, insofern kann es sich nur noch um Minuten handeln. Deshalb noch kurz ein Punkt im Hinblick auf Backups &#8211; darauf legen wir großen Wert: <em>Insbesondere</em> dort machen wir nichts mit proprietärer Software oder irgendwelchem Kompressions- oder <code>diff</code>-Gebastel. Die Gelegenheiten, bei denen uns <code>rdiff-backup</code> (dessen Konzept eigentlich ziemlich cool ist) im Stich gelassen hat, sei es durch <em>absurd</em> lange Restore-Zeiten selbst für einzelne Dateien, oder schlicht durch komplette Abbrüche mitten im Prozess, überwiegt die Zahl der Gelegenheiten, in denen es uns gerettet hat, bei weitem. Deshalb sind wir in Sachen Backup extrem konservativ: Ein extra Server mit eigenen Platten, keine komplizierten LVM-DRBD-Sonstwas-Layer dazwischen, einfach nur eine schnöde Partition angelegt, mit <code>rsync</code> kommen die Daten drauf. Versionierung läuft über Hardlinks. Auf diese Weise liegen zwei Versionen der gleichen Datei zwar nicht so platzsparend wie &#8220;erste Version plus Diff&#8221; oder &#8220;letzte Version plus Reverse-Diff&#8221; auf der Platte, aber dafür in einem Zustand, bei dem sich jeder Versionsstand mit Bordmitteln wie <code>cp</code> oder eben <code>rsync</code> schnell auf jede beliebige andere Hardware bringen lässt. Der Charme besteht eben nicht in Features, sondern manchmal schlicht im Weglassen selbiger.</p>
<p>So, die letzten Dateien laufen durch. In der Xen-Konfiguration ist bereits die <code>disk</code>-Zeile auf das neue Blockdevice angepasst. <code>rsync</code> fertig, <code>umount</code>, <code>xm create -c</code>. Bootet.</p>
<p>Die Maschine läuft nun also wieder, zwar mit einem Stand von gestern Nacht, aber eine bessere Option gibt es nun mal nicht. Downtime: Von 07:12 Uhr bis 11:01 Uhr &#8211; fast vier Stunden, was die Verfügbarkeit im Jahresmittel auf ärgerliche 99,95% herunterkatapultiert (wobei nur etwa eine halbe Stunde auf tatsächliche administrative Arbeiten entfällt &#8211; der Rest hingegen auf den Restore der Daten; man sollte also bei einem Backup nicht unterschätzen, dass auch ein Restore eine signifikante Downtime bedeuten kann). Aber der (ziemlich branchenspezifische) Shop wird nachts kaum besucht, am Wochenende noch weniger, von daher hält sich der potentielle Schaden wohl hoffentlich in Grenzen. Dass ein solcher Vorfall nun ausgerechnet bei einem System auftritt, wo sowohl die physischen Maschinen &#8220;vorne&#8221; redundant ausgelegt sind als auch der Storage-Cluster &#8220;hinten&#8221;, ärgert mich um so mehr, aber es ist ein gutes Beispiel dafür, dass Hochverfügbarkeit durch Failover-Cluster auch nur eine <em>Teilmenge</em> möglicher Störungen absichert &#8211; und derart tiefgreifende Schäden an Dateisystemen und Partitionstabelle gehören nicht dazu. Die Lehren, die ggf. aus diesem Vorfall zu ziehen sind, werden wir dann am Montag im Teammeeting besprechen.</p>
<p>Also Leute, macht Backups. Gute Backups. Und vor allem vollständige Backups: Seid nicht zu selektiv &#8211; kopiert lieber zuviel als zuwenig, auch wenn man im Moment leider <a href="http://www.heise.de/newsticker/meldung/Western-Digital-kaempft-mit-den-Folgen-der-Flutkatastrophe-1421551.html" target="_blank">immer noch nicht wieder</a> &#8220;Plattenplatz kostet doch eh fast nichts&#8221; sagen kann. Und schaut gelegentlich, dass eure Backups auch funktionieren. Ihr wisst nie, wann sie euch mal den Allerwertesten retten.</p>
<p>So, jetzt erstmal Kaffee.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2012/02/11/lob-des-backups/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Das Rätsel der öffentlichen Home-Verzeichnisse</title>
		<link>http://blog.jonaspasche.com/2011/12/30/das-raetsel-der-oeffentlichen-home-verzeichnisse/</link>
		<comments>http://blog.jonaspasche.com/2011/12/30/das-raetsel-der-oeffentlichen-home-verzeichnisse/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 21:28:39 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[npm]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1199</guid>
		<description><![CDATA[Bei Uberspace.de haben wir in der Vergangenheit immer mal wieder erlebt, dass einzelne Home-Verzeichnisse, die normalerweise nur für den Besitzer les- und schreibbar waren, plötzlich öffentlich lesbar waren: [root@taurus ~]# ls -l /home ... drwx------ 5 user1 user1 4096 19. Dez 11:15 user1 drwx------ 5 user2 user2 4096 16. Dez 12:32 user2 drwxr-xr-x 5 user3 [...]]]></description>
			<content:encoded><![CDATA[<p>Bei <a href="https://uberspace.de/" target="_blank">Uberspace.de</a> haben wir in der Vergangenheit immer mal wieder erlebt, dass einzelne Home-Verzeichnisse, die normalerweise nur für den Besitzer les- und schreibbar waren, plötzlich öffentlich lesbar waren:</p>
<p><code>[root@taurus ~]# ls -l /home<br />
...<br />
drwx------  5 user1 user1 4096 19. Dez 11:15 user1<br />
drwx------  5 user2 user2 4096 16. Dez 12:32 user2<br />
drwxr-xr-x  5 user3 user3 4096 20. Dez 15:04 user3<br />
drwx------  5 user4 user4 4096 20. Dez 11:25 user4<br />
drwx------  5 user5 user5 4096 15. Dez 13:09 user5<br />
...</code></p>
<p>Anfangs haben wir, wann immer uns das auffiel, die Rechte entsprechend korrigiert und den User informiert &#8211; und in keinem einzigen Fall bekamen wir die Rückmeldung, dass ein User die Rechte tatsächlich selbst so geändert hatte; vielmehr waren alle bass erstaunt, wie so etwas passieren konnte.</p>
<p>Nun ist diese Änderung nicht <em>so</em> schlimm, wie es auf den ersten Blick aussehen mag, denn die meisten sensiblen Daten, beispielsweise Mails, sind auch innerhalb des Home-Verzeichnisses nur für den Eigentümer selbst lesbar, und beispielsweise PHP-Scripts, die MySQL-Zugangsdaten erhalten, liegen im DocumentRoot, der ohnehin außerhalb von <code>/home</code> liegt und von daher nicht betroffen ist. Aber natürlich gibt es potentiell immer noch viele Möglichkeiten, so an Informationen zu gelangen, die niemanden etwas angehen &#8211; wenngleich nicht aufgrund einer Sicherheitslücke, denn wir setzen die Rechte ja durchaus korrekt und strikt auf 700, und &#8220;von alleine&#8221; ändern sie sich nun mal nicht: Es muss also irgendwas sein, was von den betreffenden Usern selbst ausgelöst wird, und zwar höchstwahrscheinlich versehentlich.</p>
<p>Unsere eigenen Tools haben wir zügig kontrolliert und konnten schon nach kurzer Zeit mit an Sicherheit grenzender Wahrscheinlichkeit ausschließen, dass eins von denen für das Problem verantwortlich zeichnete. Parallel dazu artete die periodische manuelle Kontrolle mit der Zeit in echte Arbeit aus, so dass wir kurzerhand beschlossen, ein Script zu schreiben, das die Rechte alle paar Minuten prüft, automatisiert fixt und den betreffenden User eine Mail sendet, einerseits mit dem Hinweis auf die Korrektur, andererseits aber auch mit der Bitte, uns doch mitzuteilen, was sie in den letzten paar Minuten so getan hatten, um einige Hinweise zu erlangen, wie diese plötzliche Rechteänderung denn nun eigentlich genau passieren kann.</p>
<p>Nach einigen Rückmeldungen verdichteten sich die Hinweise darauf, dass es etwas mit <a href="http://npmjs.org/" target="_blank">npm</a> zu tun haben könnte, dem Paketmanager von <a href="http://nodejs.org/" target="_blank">node.js</a> &#8211; aber es war schwierig, den Effekt zu reproduzieren: Zeitweise schien es, als würde der Effekt nur bei der Installation ganz bestimmter Module auftreten; aber auch hier trat der Effekt nicht verlässlich auf. Weder die betreffenden User noch wir hatten zunächst in Betracht gezogen, dass es daran liegen könnte, <em>in welchem Verzeichnis man sich befindet</em>, während man <code>npm install ...</code> ausführt.</p>
<p>Ein kleiner Exkurs.</p>
<p>Für praktisch jede Scriptsprache gibt es auch Tools, mit dem zusätzliche Module heruntergeladen und installiert werden können &#8211; und das Konzept ist im Grunde immer gleich. Um ein paar Beispiele zu nennen:</p>
<ul>
<li><a href="http://php.net/" target="_blank">PHP</a> hat <a href="http://pear.php.net/" target="_blank">PEAR</a> und installiert Module in das Verzeichnis, das in der <code>~/.pearrc</code> dafür angegeben wird.</li>
<li><a href="http://www.perl.org/" target="_blank">Perl</a> hat <a href="http://www.cpan.org/" target="_blank">CPAN</a> und installiert Module in das Verzeichnis, das via <code>PREFIX</code> über die <code>CPAN::MyConfig</code> angegeben wird.</li>
<li><a href="http://python.org/" target="_blank">Python</a> hat <a href="http://packages.python.org/distribute/easy_install.html" target="_blank">easy_install</a> und <a href="http://pypi.python.org/pypi/pip" target="_blank">pip</a> und installiert Module in das Verzeichnis, das in der <a href="http://peak.telecommunity.com/DevCenter/EasyInstall#administrator-installation" target="_blank">distutils.cfg</a> angegeben wird.</li>
<li><a href="http://www.ruby-lang.org/" target="_blank">Ruby</a> hat <a href="http://rubygems.org/" target="_blank">RubyGems</a> und installiert Module in <code>$HOME/.gem</code>.</li>
</ul>
<p>Ist hier möglicherweise ein Muster erkennbar? Ich denke doch.</p>
<p>Das Problem ist nun, dass node.js und npm hier ein ganz anderes Konzept verwirklichen. Hier wird ein Verzeichnis <code>node_modules</code> <em>im Verzeichnis der Applikation</em> angelegt, in dem die zu installierenden Module landen. Entwickelt man also unter ein und dem selben Linux-User mehrere node.js-Applikationen, so müssen die gewünschten Module <em>für jede Applikation separat</em> installiert werden. Ja, ich habe da selbst erstmal daran gezweifelt, aber der npm-Autor <a href="http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/" target="_blank">führt ganz konkret aus</a>:</p>
<blockquote><p>
[...]<br />
Install it in both places. Seriously, are you that short on disk space? It’s fine, really. They’re tiny JavaScript programs.<br />
[...]<br />
The first option is the best in my opinion. Simple, clear, explicit.<br />
[...]
</p></blockquote>
<p>npm hat nun die Eigenschaft, beim Anlegen von Verzeichnissen jene automatisch mit chmod 755 zu behandeln. Im Oktober 2011 kam noch eine Option dazu, um <a href="https://github.com/isaacs/npm/issues/1509" target="_blank">eine umask zu setzen</a>, die dies anpassbar macht, aber 755 ist weiterhin der Default. Das Problem ist nun, dass npm auch bei <em>bereits bestehenden</em> Verzeichnissen sicherstellt, dass jene die vorgegebenen Rechte bekommen.</p>
<p>Und hier liegt letztlich der Hund begraben. npm hat nämlich eine <a href="http://npmjs.org/doc/folders.html" target="_blank">dokumentierte Logik</a>, wohin genau es Module installiert. Man muss sich nämlich nicht zwingend im Applikations-Root-Verzeichnis befinden, sondern kann auch in einem Unterverzeichnis davon sein: npm hangelt sich dann so lange verzeichnisweise nach oben, bis es ein Verzeichnis findet, das ein Unterverzeichnis <code>node_modules</code> beinhaltet, und betrachtet jenes Verzeichnis dann als den Applikations-Root. <a href="http://npmjs.org/doc/folders.html#More-Information" target="_blank">Dumm ist das nicht</a>:</p>
<blockquote><p>
This behavior is inspired by and similar to git&#8217;s .git-folder seeking logic when running git commands in a working dir.
</p></blockquote>
<p>Problematisch wird es dann, wenn es kein Verzeichnis <code>node_modules</code> gibt. In diesem Fall sieht npm nämlich das <em>aktuelle</em> Verzeichnis als Applikations-Root an &#8211; und wenn man also während der Installation gerade zufällig in seinem Home-Verzeichnis ist, bekommt jenes ein harsches <code>chmod 755</code> ab. So sieht das in der Praxis aus:</p>
<p><code>[dummy@lyra ~]$ ls -ld ~<br />
drwx------ 16 dummy dummy 4096 Dec 30 11:25 /home/dummy</p>
<p>[dummy@lyra ~]$ npm install fibers --verbose<br />
...<br />
npm verb mkdir done: /home/dummy 755<br />
...</p>
<p>[dummy@lyra ~]$ ls -ld ~<br />
drwxr-xr-x 16 dummy dummy 4096 Dec 30 11:25 /home/dummy</code></p>
<p>Insofern ist dieses Verhalten insbesondere für User gefährlich, die sich mit dem node-Konzept applikationsspezifischer <code>node_modules</code>-Verzeichnisse noch nicht vertraut gemacht haben und es schlicht und einfach von PHP, Perl, Python, Ruby oder irgendeiner anderen Sprache gewohnt sind, dass es keine Rolle spielt, in welchem Verzeichnis man sich gerade befindet, wenn man Module installiert. Auch andere Bugreports zeigen, dass wir und unsere User <a href="https://github.com/isaacs/npm/issues/1201" target="_blank">nicht die einzigen sind, die über dieses Verhalten stolpern</a>.</p>
<p>Als schnellen Workaround haben wir nach unserer Analyse <a href="https://uberspace.de/dokuwiki/development:nodejs#npm" target="_blank">im Uberspace-Wiki dokumentiert</a>, dass es eine gute Idee ist, <code>umask = 077</code> in seine <code>~/.npmrc</code> aufzunehmen &#8211; auf diese Weise passiert das <code>chmod</code> zwar immer noch, richtet aber keinen Schaden mehr an &#8211; und für die Ausführung der node.js-Applikationen ist es zumindest bei Uberspace.de auch nicht vonnöten, dass noch jemand anders als der Eigentümer selbst auf die Applikation zugreifen kann.</p>
<p>Parallel dazu haben wir <a href="https://github.com/isaacs/npm/issues/1971" target="_blank">einen Bugreport verfasst</a>, der dieses Problem thematisiert &#8211; und wie es aussieht, wird das in künftigen npm-Versionen dann erfreulicherweise anders laufen. Danke an Nils für seine wichtigen Hinweise; an Peter für seine tatkräftige Unterstützung beim Debugging; und an Isaac für das schnelle Feedback.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2011/12/30/das-raetsel-der-oeffentlichen-home-verzeichnisse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ich will 5 Kinder mit dir!</title>
		<link>http://blog.jonaspasche.com/2011/12/13/ich-will-5-kinder-mit-dir/</link>
		<comments>http://blog.jonaspasche.com/2011/12/13/ich-will-5-kinder-mit-dir/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 21:07:41 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1183</guid>
		<description><![CDATA[Es wäre viel zu schade, eine solche Mail einfach nur zu beantworten und dann im Ticketsystem als erledigt zu markieren. Für den Fall, dass mal ein Tag oder auch eine ganze Phase so richtig mies läuft und wir Zweifel bekommen, warum wir Uberspace.de überhaupt machen (nicht, dass wir da im Moment tatsächlich irgendwelche Zweifel hätten, [...]]]></description>
			<content:encoded><![CDATA[<p>Es wäre viel zu schade, eine solche Mail einfach nur zu beantworten und dann im Ticketsystem als erledigt zu markieren. Für den Fall, dass mal ein Tag oder auch eine ganze Phase so richtig mies läuft und wir Zweifel bekommen, warum wir <a href="https://uberspace.de/">Uberspace.de</a> überhaupt machen (nicht, dass wir da im Moment tatsächlich irgendwelche Zweifel hätten, aber man weiß ja nie), haben wir uns hier eine Mail eines Users aufbewahrt, die dann genau die Glückspille sein wird, die alles wieder gut werden lässt. Wir bloggen es im Volltext mit freundlicher Genehmigung des Absenders &#8211; vielen Dank, dass du uns das teilen lässt.</p>
<blockquote><p>
<code><br />
<strong>To:</strong> hallo@uberspace.de<br />
<strong>Subject:</strong> Hallo Ubernauten! Ich glaube ich habe mich gerade verliebt.<br />
<strong>Date:</strong> Mon, 12 Dec 2011 22:18:49 +0100<br />
</code></p>
<p>Hallo hallo uberspace,</p>
<p>ich bin etwas verlegen und weiß nicht genau wie ich dich ansprechen soll. Ich bin ja eigentlich seit Jahren in ner Beziehung die zwar grundsolide &#8211; aber doch nichts wirklich prickelndes mehr ist. Und plötzlich sehe ich dich und glaube weder meinen Augen noch diesem wundervollen Gefühl in der Magengrube. Bitte denk jetzt nichts Falsches von mir, ich bin ein super ehrlicher Typ! Ich schreibe gerade meine Bachelorarbeit und hätte wirklich was Besseres zu tun, als mich nach was anderem umzusehen. Aber wie es halt so ist, im unverhofftesten Moment trifft es einen dann plötzlich. Und nachdem ich dich gefühlte 5 Minuten (3 Stunden) anstarre kann ich nicht anders&#8230;</p>
<p>Ich liebe dich und will 5 Kinder mit dir!</p>
<p>Jaaa und jetzt sagst du sicherlich: „Hey das bin ich schon gewohnt, ich habe halt diese Ausstrahlung auf manche Menschen&#8230; Aber 1) ich bin nicht monogam und 2) wir wär’s, wenn wir’s erst mal für nen Monat miteinander probieren.“</p>
<p>Das Ding ist: Die 5 erwähnten Kinder kommen aus meiner aktuellen Beziehung und ich kann, wenn ich mich nicht sofort entscheide, das Sorgerecht nicht einfach ohne Komplikationen übertragen…</p>
<p>…ähm Entschuldigung für diese Gefühlsduselei. Hier die Fakten:<br />
- Ich bin gerade über euch gestolpert, finde das Angebot unschlagbar<br />
- $HOSTER Vertrag steht kurz vor der Verlängerung und ich würde gern wechseln<br />
- Ich habe 5 Domains, die ich überwiegend als Mailweiterleitung zu Gmail nutze<br />
- Ich habe keine Ahnung wie ich den Umzug am geschicktesten einleiten und durchführen kann<br />
- Kleines Bedenken: Neben einem positiven Blogeintrag habe ich noch nie was von euch gehört (was nichts heißen muss)</p>
<p>Vielen Dank schon mal im Voraus,<br />
ich hoffe auf eine lange und glückliche Ehe
</p></blockquote>
<p>Stellvertretend für meine Teamkollegen gebe ich gerne zu, dass ich mich nicht einfach nur gefreut habe, sondern tatsächlich auch ein wenig gerührt bin. Eine herzlichere Domainumzugsbestellung gab&#8217;s ziemlich sicher noch nie.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2011/12/13/ich-will-5-kinder-mit-dir/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>VeriSigns Preisschraube</title>
		<link>http://blog.jonaspasche.com/2011/12/02/verisigns-preisschraube/</link>
		<comments>http://blog.jonaspasche.com/2011/12/02/verisigns-preisschraube/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 22:37:27 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[domains]]></category>
		<category><![CDATA[preise]]></category>
		<category><![CDATA[verisign]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1153</guid>
		<description><![CDATA[Seit vielen Jahren betreibt VeriSign unter anderem die .com- und auch die .net-Registry. Der heutige Newsletter unseres Domainregistrars, der schon wieder eine Preiserhöhung für .com- und .net-Domains ankündigte, veranlasste mich, einmal die Preiserhöhungen der letzten Jahre nachzuvollziehen. &#8220;Datum PM&#8221; ist dabei mit dem Datum der jeweiligen Pressemitteilung verlinkt, die als Quelle herangezogen wurde; &#8220;Datum PE&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Seit vielen Jahren betreibt <a href="http://verisigninc.com/?loc=de_DE" target="_blank">VeriSign</a> unter anderem die .com- und auch die .net-Registry. Der heutige Newsletter unseres Domainregistrars, der <em>schon wieder</em> eine Preiserhöhung für .com- und .net-Domains ankündigte, veranlasste mich, einmal die Preiserhöhungen der letzten Jahre nachzuvollziehen. &#8220;Datum PM&#8221; ist dabei mit dem Datum der jeweiligen Pressemitteilung verlinkt, die als Quelle herangezogen wurde; &#8220;Datum PE&#8221; ist das Datum, ab dem die jeweilige Preiserhöhung gilt.</p>
<table border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<th>Datum PM</th>
<th>Datum PE</th>
<th colspan="2">Preis .com</th>
<th colspan="2">Preis .net</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2">Preis Stand 2006</td>
<td style="text-align: right">$6.00</td>
<td style="text-align: right"></td>
<td style="text-align: right">$3.50</td>
<td style="text-align: right"></td>
</tr>
<tr>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTIzNDI1MCZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">05.04.2007</a></td>
<td>15.10.2007</td>
<td style="text-align: right">$6.42</td>
<td style="text-align: right">+7,0%</td>
<td style="text-align: right">$3.85</td>
<td style="text-align: right">+10,0%</td>
</tr>
<tr>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTM4MDEzNSZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">27.03.2008</a></td>
<td>01.10.2008</td>
<td style="text-align: right">$6.86</td>
<td style="text-align: right">+6,9%</td>
<td style="text-align: right">$4.23</td>
<td style="text-align: right">+9,9%</td>
</tr>
<tr>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTU3MDI5MiZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">17.12.2009</a></td>
<td>01.07.2010</td>
<td style="text-align: right">$7.34</td>
<td style="text-align: right">+7,0%</td>
<td style="text-align: right">$4.65</td>
<td style="text-align: right">+9,9%</td>
</tr>
<tr>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTc3NzgyNiZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">14.07.2011</a></td>
<td>15.01.2012</td>
<td style="text-align: right">$7.85</td>
<td style="text-align: right">+6,9%</td>
<td style="text-align: right">$5.11</td>
<td style="text-align: right">+10,9%</td>
</tr>
</tbody>
</table>
<p>Der Preis für .com-Domains ist also innerhalb von gerade mal fünf Jahren um stolze 30,8% gestiegen, was immer noch ein Witz ist gegen den Preis von .net-Domains, der im gleichen Zeitraum sogar um 46,0% gestiegen ist.</p>
<p>Zu diesen Preisen, die VeriSign erhebt, kommt noch ein TLD-unabhängiger Zuschlag, der von ICANN erhoben wird. Während VeriSign aber immer teurer wird, <em>sank</em> der ursprüngliche ICANN-Zuschlag von ursprünglich $0.25 <a href="http://www.icann.org/en/announcements/announcement-09jul07.htm" target="_blank">im Juli 2007 auf $0.20</a> und liegt derzeit nur noch bei $0.18 pro Domain und Jahr.</p>
<p>Nun hat Christoph Grueneberg vom Domainvermarktermagazin <a href="http://www.dvmag.de/" target="_blank">DVmag.de</a> sich bereits ein wenig <a href="http://www.dvmag.de/verisign-preiserhohung-fur-com-und-net-domains/" target="_blank">in den VeriSign-Verträgen mit ICANN umgesehen</a> und ist im <a href="http://www.icann.org/en/tlds/agreements/verisign/registry-agmt-com-22sep10.htm" target="_blank">Vertrag für den .com-Betrieb</a> in Abschnitt 7.3 auf sehr konkrete Bestimmungen gestoßen, was den Maximalpreis angeht, den VeriSign von seinen Resellern verlangen darf:</p>
<blockquote><p>
(d)       Maximum Price.  The Maximum Price for Registry Services subject to this Paragraph 7.3 shall be as follows:</p>
<p>(i)         from the Effective Date through 31 December 2006, US$6.00;</p>
<p>(ii)        for each calendar year beginning with 1 January 2007, the smaller of the preceding year&#8217;s Maximum Price or the highest price charged during the preceding year, multiplied by 1.07; provided, however, that such increases shall only be permitted in four years of any six year term of the Agreement.  In any year, however, where a price increase does not occur, Registry Operator shall be entitled to increase the Maximum Price by an amount sufficient to cover any additional incremental costs incurred during the term of the Agreement due to the imposition of any new Consensus Policy or documented extraordinary expense resulting from an attack or threat of attack on the Security or Stability of the DNS, not to exceed the smaller of the preceding year&#8217;s Maximum Price or the highest price charged during the preceding year, multiplied by 1.07.
</p></blockquote>
<p>Für den Zeitraum vom 01.03.2006 (Abschluss der Vereinbarung bis zum 31.12.2006 liegt der Preis also bei maximal $6.00; beginnend mit dem 01.01.2007 darf VeriSign den Preis für .com-Domains um maximal 7% pro Jahr anheben. Christoph Grueneberg liegt allerdings aus meiner Sicht falsch, wenn er angibt:</p>
<blockquote><p>
Eine solche Gebührenerhöhung ist in der Regel nur alle vier Jahre innerhalb einer sechsjährig laufenden Vereinbarung gültig.
</p></blockquote>
<p>Abgesehen davon, dass &#8220;alle vier Jahre innerhalb einer sechsjährig laufenden Vereinbarung&#8221; ja schon rein logisch nur exakt ein einziges Mal vorkommen kann, übersetze ich &#8220;such increases shall only be permitted in four years of any six year term of the Agreement&#8221; ganz klar so, dass es in maximal vier von sechs Jahren der Vertragslaufzeit entsprechende Preiserhöhungen geben darf. Insofern hat VeriSign hier keine außerordentliche Belastungen geltend gemacht (wie das Posting auf DVmag.de vermuten ließ), denn in der Zeit vom 01.01.2007 bis heute, also in knapp fünf Jahren, hat VeriSign seine Preise &#8220;nur&#8221; die zulässigen vier Mal erhöht, das aber jeweils auch in der maximal möglichen Höhe.</p>
<p>Für den Betrieb von .net wurde währenddessen <a href="http://www.icann.org/en/tlds/agreements/verisign/registry-agmt-appg-net-org-16apr01.htm" target="_blank">bereits im April 2001</a> ein Maximalpreis von $6.00 festgelegt &#8211; und zwar ganz ohne eine Erhöhungsklausel. Insofern wundert es nicht, dass VeriSign hier gleich größere Schritte macht &#8211; bis zum Maximum von $6.00 ist ja noch ein bisschen Luft.</p>
<p>Zurecht fragt das DVmag, ob bei der steigenden Zahl von Domainregistrierungen nicht eigentlich der Preis eigentlich <em>sinken</em> müsste, zumal bei einem virtuellen Gut wie Domains, die in erster Linie indirekte Kosten in Form von Verwaltungsaufwand und Infrastrukturbetrieb bedeuten. Schauen wir uns also doch mal an, was VeriSign so mitteilt. Hierbei fällt auf, dass bei jeder Preiserhöhung die &#8220;queries per day&#8221; verlautbart werden, die natürlich jedes Mal angestiegen sind. Extrahiert aus den Pressemeldungen:</p>
<ul>
<li>15.04.2007: &#8220;nearly 30 billion queries per day today&#8221;</li>
<li>27.03.2008: &#8220;more than 33 billion DNS queries per day&#8221; (+10%)</li>
<li>17.12.2009: &#8220;more than 50 billion queries per day&#8221; (+52%)</li>
<li>14.07.2011: &#8220;an average daily query load of 57 billion&#8221; (+14%)</li>
</ul>
<p>Ich habe mir daher mal angeschaut, wieviele Domains zu den jeweiligen Zeiten so registriert waren, und habe dazu entsprechend stolze Pressemeldungen ausgewählt, die möglichst dicht an den Preiserhöhungs-Pressemeldungen lagen. Da gibt&#8217;s zu lesen:</p>
<ul>
<li>05.03.2007: &#8220;The base of .com and .net domain names grew to 65 million domain names by the close of 2006&#8243;</li>
<li>05.03.2009: &#8220;The .com and .net adjusted base surpassed 80.4 million domain name registrations at the end of 2007.&#8221; (+24%)</li>
<li>21.09.2009: &#8220;The overall base of .com and .net domain names grew to 93.5 million domain names during the second quarter of 2009&#8243; (+16%)</li>
<li>31.08.2011: &#8220;The .com and .net Top Level Domains (TLDs) experienced aggregate growth, surpassing a combined total of 110 million names in the second quarter of 2011&#8243; (+18%)</li>
</ul>
<p>Während also von ca. Frühjahr 2007 bis ca. Herbst 2011 die Zahl der täglichen DNS-Anfragen um rund 90% gestiegen sind, ist die Zahl der Domains ebenfalls um immerhin 69% gestiegen &#8211; und damit entsprechend auch die mit Domains erwirtschafteten Umsätze.</p>
<p>Wofür sonst braucht VeriSign also kontinuierlich höhere Gebühren?</p>
<p>2007: &#8220;To address the increase in both DNS volume and cyber attacks, VeriSign recently announced a major initiative entitled Project Titan to expand the capacity of its global Internet infrastructure by ten times by the year 2010&#8243; &#8211; VeriSign will seine Kapazitäten so erweitern, dass sie &#8220;over 4 trillion queries a day&#8221; packen.</p>
<p>2008: &#8220;The .com and .net infrastructures are continually being fortified and scaled to defend against increasingly sophisticated cyber attacks and to help protect against service disruptions. VeriSign is increasing the capacity of its global Internet infrastructure by ten times by the year 2010.&#8221;</p>
<p>2009: &#8220;VeriSign will continue investment to build out the .com and .net infrastructures to manage the increasing demands on the infrastructure brought on by the proliferation of Internet-enabled phones and devices and the emergence of DNS-centric technologies and services. VeriSign also continues to scale and fortify the .com and .net infrastructures globally to defend against increasingly sophisticated cyber attacks.&#8221;</p>
<p>2011: &#8220;Continued strong global Internet usage growth, along with increasingly powerful distributed denial of service (DDoS) attacks leveled against all parts of the Internet&#8217;s critical infrastructure, have dramatically increased the demands on Internet infrastructure providers such as Verisign.&#8221;</p>
<p>Mit anderen Worten: The same procedure as every year. Immer mehr Leute benutzen das Internet (ach was!), und es gibt &#8220;cyber attacks&#8221;, und gerade als ich schon dachte, dass alles mit &#8220;cyber&#8221; im Namen irgendwie so nach den 90ern klingt, sind&#8217;s 2011 prompt &#8220;DDoS attacks&#8221; geworden.</p>
<p>Bleibt eben noch die Frage offen, wieso beispielsweise .de-Domains nicht nur schon immer wesentlich günstiger sind als .com- und .net-Domains, sondern auch seit Jahren nicht eine einzige Preiserhöhung erfahren haben &#8211; obwohl auch die DENIC kräftig in den Ausbau von Infrastruktur, IPv6-Deployment, Umsetzung von DNSSEC etc. investiert hat. Irgendwas scheint dort also besser zu laufen als bei VeriSign. Vielleicht braucht aber VeriSign das viele Geld auch nicht für Investitionen, sondern für, äh &#8230;</p>
<table border="1" cellspacing="0" cellpadding="5">
<thead>
<tr>
<th>Datum</th>
<th>Pressemitteilung</th>
</tr>
</thead>
<tbody>
<tr>
<td>06.11.2008</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTQ1MDAyMCZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">VeriSign Reports 18% Year-Over-Year Revenue Growth in Third Quarter 2008</a></td>
</tr>
<tr>
<td>07.05.2009</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTQ5OTA1NSZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">VeriSign Reports 13% Year-Over-Year Revenue Growth in First Quarter 2009</a></td>
</tr>
<tr>
<td>06.08.2009</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTUyNTU1MSZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">VeriSign Reports 9% Year-Over-Year Revenue Growth in Second Quarter 2009</a></td>
</tr>
<tr>
<td>05.11.2009</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTU1NTYwNyZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">VeriSign Reports 6% Year-Over-Year Core Revenue Growth in Third Quarter 2009</a></td>
</tr>
<tr>
<td>02.08.2010</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTY0NzQyMSZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">VeriSign Reports 9% Year-Over-Year Revenue Growth in Second Quarter 2010</a></td>
</tr>
<tr>
<td>02.10.2010</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTY3OTAwMSZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">VeriSign Reports 10% Year-Over-Year Revenue Growth in Third Quarter 2010</a></td>
</tr>
<tr>
<td>27.01.2011</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTcxMzMwNiZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">Verisign Reports 10% Year-Over-Year Revenue Growth in 2010</a></td>
</tr>
<tr>
<td>24.04.2011</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTc0OTY1MiZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">Verisign Reports 12% Year-Over-Year Revenue Growth in First Quarter 2011</a></td>
</tr>
<tr>
<td>28.07.2011</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTc4MjYxMSZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">Verisign Reports 13% Year-Over-Year Revenue Growth in Second Quarter 2011</a></td>
</tr>
<tr>
<td>27.10.2011</td>
<td><a href="http://verisigninc.com/en_US/news-events/press-room/articles/index.xhtml?artLink=aHR0cHM6Ly9wcmVzcy52ZXJpc2lnbi5jb20vZWFzeWlyL2N1c3RvbXJlbC5kbz9lYXN5aXJpZD1BRkMwRkYwREI1QzU2MEQzJnZlcnNpb249bGl2ZSZwcmlkPTgxNDQzMiZyZWxlYXNlanNwPWN1c3RvbV85Nw%3D%3D" target="_blank">Verisign Reports 14% Year-Over-Year Revenue Growth in Third Quarter 2011</a></td>
</tr>
</tbody>
</table>
<p>Aber das ist natürlich nur eine schamlose Vermutung. Wenn dann aber Mitte Januar möglicherweise auch bei uns die .com- und .net-Domains teurer werden, dann sollte nun zumindest bekannt sein, warum das so ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2011/12/02/verisigns-preisschraube/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTTPS, Websockets, Port-Multiplexing &#8211; wenn Apache nicht mehr reicht</title>
		<link>http://blog.jonaspasche.com/2011/11/30/https-websockets-port-multiplexing-wenn-apache-nicht-mehr-reicht/</link>
		<comments>http://blog.jonaspasche.com/2011/11/30/https-websockets-port-multiplexing-wenn-apache-nicht-mehr-reicht/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 11:22:26 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1149</guid>
		<description><![CDATA[Fangen wir mal mit HTTPS an. Wenn man Apache als Webserver einsetzt, heißt die Antwort auf die Frage nach HTTPS in der Regel mod_ssl. Gut integriert, featurereich, stabil. Und so weiter. Vor diesem Hintergrund mag es zunächst nicht ganz offensichtlich sein, warum wir uns nach einer alternativen HTTPS-Implementierung umsehen. Das ist zugegebenermaßen ein bisschen von [...]]]></description>
			<content:encoded><![CDATA[<p>Fangen wir mal mit HTTPS an. Wenn man Apache als Webserver einsetzt, heißt die Antwort auf die Frage nach HTTPS in der Regel <a href="http://www.modssl.org/" target="_blank">mod_ssl</a>. Gut integriert, featurereich, stabil. Und so weiter. Vor diesem Hintergrund mag es zunächst nicht ganz offensichtlich sein, warum wir uns nach einer alternativen HTTPS-Implementierung umsehen. </p>
<p>Das ist zugegebenermaßen ein bisschen von hinten durch die Brust ins Auge: Eigentlich geht&#8217;s um <a href="http://en.wikipedia.org/wiki/WebSocket" target="_blank">Websockets</a>, die dem Apache fremd sind. Wem das nichts sagt, dem mag als erste Erklärung reichen, dass es sich hierbei um ein Protokoll handelt, das im Gegensatz zu klassischem statuslosen HTTP (Request, Response, Ende) eine persistente Verbindung zwischen Browser und Webserver offenhält, über die in beiden Richtungen kommuniziert werden kann und die aufgrund ihres binären Protokolls nur wenig Overhead hat, gerade im Vergleich mit HTTP. Das hat große Vorzüge für moderne Webapplikationen, die eben viel stärker mit dem Server interagieren &#8211; es dürfte auf der Hand liegen, dass es z.B. für einen Webmailer viel effektiver ist, wenn der Server einfach die Information &#8220;1 neue Mail&#8221; an den Clienten senden kann, als wenn der Client alle paar Sekunden beim Server nachfragen muss, ob es etwas Neues gibt (Polling).</p>
<p>Hier fangen aber nun die Unsicherheiten an. Der Verbindungsaufbau einer Websocket-Verbindung läuft über HTTP (oder HTTPS), wobei ein Upgrade-Header mitgeschickt wird, der dem Server mitteilt, dass er auf das Websocket-Protokoll upgraden soll. Damit ist auch schon das primäre Problem beschrieben: Websockets laufen über den HTTP-Port 80 (oder den HTTPS-Port 443), sind aber nun mal kein HTTP, sondern benutzen HTTP nur als eine Art Startrampe. Das bedeutet im Umkehrschluss: Serverseitig wird etwas benötigt, was Websockets <em>kann</em> &#8211; oder zumindest ausreichend ignoriert, um sie nicht kaputtzumachen. Webserver können das aber typischerweise nicht, denn die Nutzung von Websockets ist tief in der jeweiligen Applikation verwurzelt, und die Applikationen, die mit Websockets hantieren (die beispielsweise auf <a href="http://nodejs.org/" target="_blank">node.js</a> und <a href="http://socket.io/" target="_blank">socket.io</a> basieren), sind typischerweise welche, die <em>selbst</em> HTTP und auch Websockets sprechen und dann entsprechend des Upgrade-Headers unterscheiden, was zu tun ist.</p>
<p>Wir stellen insbesondere bei unserer Hostingplattform <a href="https://uberspace.de/" target="_blank">Uberspace.de</a> fest, dass der Apache im Grunde immer weniger als Webserver genutzt wird, sondern eher als eine Art Applikations-Multiplexer, der eingehende Requests an eigenständig laufende Applikationen weiterleitet. Denn machen wir uns nichts vor: Alle jüngeren Entwicklungen im Web-Umfeld laufen auf solche Setups hinaus und unterstützen dann verschiedenste Deployment-Möglichkeiten &#8211; welcher Webserver dann als Frontend eingesetzt wird, tritt zunehmend in den Hintergrund; häufig ist es dann auch kein Apache mehr, sondern ein nginx oder ein lighttpd (was für uns keine Option darstellt, weil wir eben <em>auch</em> noch viele User mit &#8220;klassischen&#8221; Webapplikationen haben, bei denen ein Bündel PHP-Dateien irgendwo unterhalb des DocumentRoots abgelegt wird und wo Apaches .htaccess-Features häufig unverzichtbar sind). Ich will diese Entwicklung an dieser Stelle nicht bewerten; sie mag Vor- und auch Nachteile haben. In Bezug auf die Implementierung von HTTP muss ich nur an dieser Stelle einmal loswerden, dass ich schon verwundert bin, warum so viele Tools ihre eigenen HTTP-Stacks implementieren. HTTP ist nämlich durchaus überraschend komplex, und selbst im ziemlich reifen Apache werden bis heute Bugs aufgedeckt (wie kürzlich die <a href="http://seclists.org/fulldisclosure/2011/Aug/175" target="_blank">allzu sorglose Behandlung fehlerhafter Range-Header</a>, die einen Apache zum Absturz bringen konnte), bei denen ich mich als Applikationsentwickler eher darüber freuen würde, wenn ich mich um die HTTP-Implementierung nicht kümmern müsste und mich stattdessen über ein schmales, strenger definiertes Interface an den Webserver andocken könnte &#8211; aber als ausgewiesener Freund von FastCGI bin ich verwunderte Blicke ja bereits lange gewohnt. Vertagen wir jene Diskussion also erstmal, denn darum geht es hier nicht. Fakt ist: Immer mehr Applikationen sprechen selbst HTTP, also brauchen wir einen Weg, jene mittelfristig vernünftiger einzubinden als mit <code>RewriteRule ... [P]</code>.</p>
<p>Fest steht erstmal, dass solche Applikationen, die selbst HTTP sprechen, entsprechend nicht auf Port 80 laufen können, weil der ja schon durch den Apache belegt ist. Mit zunehmender Verbreitung von IPv6 könnte man natürlich ins Auge fassen, Usern die freie Wahl zu lassen, auf Port 80 &#8220;ihrer&#8221; IPv6-IP (bei Uberspace.de vergeben wir jedem User eine eigene) dann eben ihre eigene Applikation laufen zu lassen, aber machen wir uns nichts vor: IPv4 wird uns noch viele Jahre erhalten bleiben und für vermutlich gar nicht mal so kurze Zeit auch noch unverzichtbar sein. Und da wir bei IPv4 keine separaten IPs vergeben, bleibt hier also nur jenes Multiplexing, bei dem ein HTTP-Frontend die Requests verteilt. Und da wird der Umstand, dass der Apache keine Websockets beherrscht &#8211; hier also in dem Sinne, dass er sie nicht via <a href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html" target="_blank">mod_proxy</a> an die Applikation durchreicht und die Verbindung dann auch offenhält &#8211; zunehmend zum Problem. Nicht akut, denn nur Chrome 14, Firefox 7 und IE 10 bieten derzeit <a href="http://en.wikipedia.org/wiki/WebSocket#Browser_support" target="_blank">Unterstützung für den aktuellen Websockets-Standard</a>, und Libraries wie <a href="http://socket.io/" target="_blank">socket.io</a> machen automatisch Fallbacks auf Polling, was ja auch funktioniert. Aber die Frage nach Websockets ist zumindest ausreichend akut, dass wir uns schon heute damit beschäftigen, Lösungen zu finden, die über Hacks und Workarounds hinausgehen.</p>
<p>Den Apache werden wir nicht los, und das wollen wir auch gar nicht, schon aus den oben genannten Gründen, insbesondere wegen seiner .htaccess-Features. Aber er taugt wohl kaum als künftiges Frontend auf Port 80. Dort brauchen wir etwas, was sozusagen Port-Multiplexing macht, und idealerweise auch <em>nur</em> das &#8211; da die Applikationen mit ihren ganzen Features erst hintendran laufen, sollte das Frontend bitte besonders schlank und flink sein und durch eine minimale Codebasis auch weitaus einfacher auf mögliche Schwachstellen untersuchbar sein als ein Moloch wie Apache.</p>
<p>Was sich uns zuerst als vielversprechende Alternative in den Weg gestellt hat, war <a href="https://www.varnish-cache.org/" target="_blank">Varnish</a>, und um es gleich vorwegzunehmen: Wir haben Varnish auch nach wie vor im Auge, primär aufgrund seines hervorragenden Rufs als &#8220;accelerating cache&#8221;. Websockets sind mit Varnish <a href="https://www.varnish-software.com/blog/browsers-html5-websocket-varnish-cook-thief-his-wife-her-lover" target="_blank">ganz offiziell kein Problem</a>.</p>
<p>Bemerkt Varnish einen Upgrade-Header, öffnet es (geeignete Konfiguration vorausgesetzt) eine Pipe zur Zielapplikation und hält sich bei der weiteren Kommunikation einfach raus &#8211; es reicht alles unverändert durch. Das Problem: Varnish beherrscht kein HTTPS, und zwar mit Absicht. Wer mehr darüber lesen will, kann sich diesen <a href="https://www.varnish-cache.org/docs/3.0/phk/ssl.html" target="_blank">launigen Rant des Varnish-Autors</a> zu Gemüte führen, dessen sonstige <a href="https://www.varnish-cache.org/docs/3.0/phk/index.html" target="_blank">random thoughts</a> nebenbei auch sonst mehr als lesenswert sind. Seine Empfehlung: Man möge doch bitte einfach einen SSL-Proxy wie <a href="http://nginx.org/" target="_blank">nginx</a> oder <a href="http://www.apsis.ch/pound/" target="_blank">Pound</a> vor Varnish setzen, was dann HTTPS macht. Gut, das klingt erstmal machbar. <a href="https://github.com/yaoweibin/nginx_tcp_proxy_module" target="_blank">nginx kann derzeit noch nicht mit Websockets umgehen</a> (nur via TCP, was dann aber wieder eine eigene IP oder einen eigenen Port braucht und somit nicht auf Basis von Hostnamen oder URLs funktioniert). Zwar gibt es derzeit kein offizielles Statement, inwieweit Pound mit Websockets zurechtkommt, aber zumindest einer gibt an, dass diese Kombination <a href="http://the-rig.refinery29.com/post/7263057532/pound-and-varnish" target="_blank">prima funktioniere</a>, so dass wir das für den Moment mal als gegeben hinnehmen, bis wir es selbst getestet haben.</p>
<p>Je länger wir uns mit Pound beschäftigen, desto charmanter erscheint uns diese Lösung &#8211; und zwar auch unter dem Aspekt, dass es damit problemlos möglich ist, &#8220;das ganze SSL-Zeugs&#8221; unter einer autarken User-ID laufen zu lassen, in einer chroot-Umgebung, und damit gut vom Rest des Systems abgeschottet &#8211; im Gegensatz zu mod_ssl, bei dem potentielle Sicherheitslücken immer das Risiko bieten, die Berechtigungen des Apache-Users und damit zumindest Leserechte auf verdammt vielen Sachen zu erlangen.</p>
<p>Dazu bietet Pound eben die Möglichkeit, Verbindungen anhand einer Vielzahl von Kriterien &#8211; primär seien hier reguläre Ausdrücke auf die aufgerufene URL sowie auf HTTP-Header genannt &#8211; an unterschiedliche Backends weiterzuleiten. Es wäre damit also kein Problem, Aussagen wie &#8220;Verbindungen zu <code>www.userdomain.tld</code> an Port 8012 schicken&#8221; oder &#8220;Verbindungen zur URL <code>/pad</code> von <code>www.userdomain.tld</code> an Port 8012 schicken&#8221; in einer Pound-Konfiguration auszudrücken, was letztlich Möglichkeiten eröffnet, hier für User ein kleines Interface zu bauen, mit dem sie ihre Hostnamen und ggf. auch die URL-Pfade ihrer Hostnamen selbstständig auf Ports ihrer Wahl routen könnten, was ein hohes Maß an Flexibilität eröffnen und den Support entlasten könnte, der sich in Bezug auf solche Applikationen vor allem auf die wiederkehrende Erläuterung von Proxy-RewriteRules und der Erklärung der Frage &#8220;Wieso geht das mit den Websockets nicht&#8221; konzentriert und damit zunehmend Leidensdruck erzeugt.</p>
<p>Und schließlich könnten wir noch eine weitere Fliege mit der gleichen Klappe schlagen: Pound beherrscht ab der Version 2.6 &#8211; die zwar noch als experimentell gilt, aber bereits mehrere Releases erfahren hat &#8211; auch <a href="http://en.wikipedia.org/wiki/Server_Name_Indication" target="_blank">Server Name Indication</a> (SNI), was Voraussetzung dafür ist, mehrere SSL-Zertifikate auf einer einzelnen IP zu betreiben &#8211; bei IPv4 herrscht hier ja nun eben Knappheit, und wir würden durchaus gerne viel lauter &#8220;Nutzt doch HTTPS mit euren eigenen Zertifikaten!&#8221; rufen, wenn das nicht derzeit noch regelmäßig damit verbunden wäre, dafür IPv4-IPs zu verbrauchen, was wir gerne vermeiden würden &#8211; eine höchst ärgerliche Zwickmühle.</p>
<p>Nun ist der SNI-Support bei Pound noch ein wenig eingeschränkt, weil bei der Auswahl eines passenden Certs ausschließlich nach dem Common Name (CN), nicht aber nach den Subject Alternative Names gematcht wird, die mittlerweile durchaus sehr verbreitet sind &#8211; nicht zuletzt bei den <a href="http://www.startssl.com/" target="_blank">SSL-Zertifikaten von StartCom</a>, die wir auf unseren Uberspace-Hosts einsetzen. Hier prüfen wir gerade Möglichkeiten, mit einem entsprechenden Patch diese Funktionalität noch zu erweitern. Wenn&#8217;s klappt, könnten wir damit die Möglichkeit bieten, beliebige Stückzahlen von SSL-Zertifikaten einfach in unsere Konfiguration einzubauen &#8211; und zwar ohne Apache-Restarts, die ja letztlich immer dazu führen, dass alle aktuellen FastCGI-Prozesse (und damit auch PHP-Interpreter) gestoppt werden und neu gestartet werden müssen, weshalb Apache-Restarts immer möglichst zu vermeiden sind.</p>
<p>Und Varnish? Bleibt interessant, aber vor allem wegen seiner Caching-Fähigkeiten. Als reines Frontend und als Multiplexer tut&#8217;s Pound auch alleine &#8211; und wenn sich herausstellt, dass es bei Pound mit den Websockets nicht hinhaut, dann müssen wir sowieso nochmal nach einer Alternative suchen, denn Varnish allein tut&#8217;s ja auch nicht &#8211; wegen fehlendem SSL-Support. Allein wegen seiner vielfältigen Routing-Fähigkeiten und wegen seines SNI-Supports könnte Pound aber schon heute einen wichtigen Beitrag zu leisten, unser Hosting bei Uberspace.de besser zu machen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2011/11/30/https-websockets-port-multiplexing-wenn-apache-nicht-mehr-reicht/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wenn klassische Presse über IT-Themen berichtet</title>
		<link>http://blog.jonaspasche.com/2011/09/24/wenn-klassische-presse-uber-it-themen-berichtet/</link>
		<comments>http://blog.jonaspasche.com/2011/09/24/wenn-klassische-presse-uber-it-themen-berichtet/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 23:57:00 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[presse]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spamcop]]></category>
		<category><![CDATA[t-online]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1128</guid>
		<description><![CDATA[&#8230; dann bleibt Fremdschämen selten aus. Über einen Hinweis von Bert Ungerer kam ich auf den taz-Artikel Panne bei T-Online. Er mag heute einmal repräsentativ für viele Artikel mit IT-Bezug stehen, die man in der Nicht-IT-Presse so findet &#8211; dass es hierbei ausgerechnet die taz trifft, ist dabei schlichter Zufall. So wird im Artikel berichtet: [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; dann bleibt Fremdschämen selten aus. Über einen <a href="https://twitter.com/#!/nixspam/status/117317331448897537">Hinweis von Bert Ungerer</a> kam ich auf den taz-Artikel <a href="http://www.taz.de/Panne-bei-T-Online/!78701/">Panne bei T-Online</a>. Er mag heute einmal repräsentativ für viele Artikel mit IT-Bezug stehen, die man in der Nicht-IT-Presse so findet &#8211; dass es hierbei ausgerechnet die taz trifft, ist dabei schlichter Zufall. So wird im Artikel berichtet:</p>
<blockquote><p>Unangenehme Überraschung für Kunden von T-Online. Wenn sie in den vergangenen Wochen E-Mails versandten, bekamen sie oft unvermutete Fehlermeldungen: Ihre Nachricht konnte nicht zugestellt werden, wurde verzögert oder blieb einfach verschwunden.</p></blockquote>
<p>Vielleicht bin ich hier einfach nur vorgeschädigt, aber ich kann es langsam nicht mehr hören. <em>E-Mails verschwinden nicht</em>, und es ärgert mich zunehmend, wenn das Medium E-Mail von irgendwelchen Schlaumeiern als unzuverlässig gebrandmarkt wird. Ja, E-Mails landen im Spamordnern. Ja, E-Mails werden verzögert, beispielsweise durch Greylisting. Ja, E-Mails können bouncen, wenn der Empfängerserver sie nicht akzeptiert. Aber <em>sie verschwinden nicht</em>. Das ist nur der vordergründige Eindruck, der bei vielen Usern entsteht, die schlicht keinen Blick in ihren Spamfilter werfen oder Bounces nach dem Motto &#8220;Das ist ja Englisch, das versteh ich nicht&#8221; löschen und dann so tun als wüssten sie von nichts. Die Fälle, in denen E-Mails tatsächlich verschwinden, sind extrem selten (triple bounces würden mir hier ad hoc einfallen) und praktisch immer auf klare Fehlkonfigurationen zurückzuführen &#8211; die dann aber eben überhaupt nichts mit dem Spamproblem zu tun haben und in der Regel auch nicht auf das Medium E-Mail zurückzuführen sind, sondern auf entsprechende von Usern selbst verfasste Filterregeln.</p>
<blockquote><p>Schuld war ein Spam-Filter, der die Mail-Server des deutschen Groß-Providers als Versender unerwünschte Werbepost deklarierte.</p></blockquote>
<p>Man mag den Unterschied für akademisch halten, aber: Spamcop ist eine Blacklist und <em>kein</em> Spamfilter. Betreiber von Mailservern können aus freien Stücken entscheiden, ob sie eine solche Blacklist heranziehen, um ihre SMTP-Verbindungen bereits grob vorzufiltern. Spamcop selbst filtert überhaupt nichts &#8211; das wäre technisch auch gar nicht möglich, solange nicht die MX-Records im DNS den Mailtraffic einer Domain explizit über Spamcop routen würden. Stattdessen stellt Spamcop einfach nur die Information bereit: &#8220;Von diesem und jenem Host wird viel Spam versendet&#8221;, und diese Information ist zunächst einmal schlicht und einfach <em>wahr</em> &#8211; das leugnet ja nicht einmal T-Online. Es ist also mitnichten so (und dieser Eindruck entsteht aus dem Artikel), dass einfach mal irgendso eine Antispamfirma den ausgehenden Mailverkehr von T-Online abklemmen könnte. Das ist immer noch die freie Entscheidung der Betreiber der empfangenden Mailserver, ob sie der Empfehlung von Spamcop folgen wollen oder nicht.</p>
<blockquote><p>Spezialisierte Betreiber wie Spamcop überwachen das Spamvolumen weltweit und registrieren haargenau wie viele Spam-Nachrichten von einer IP-Adresse kommen.</p></blockquote>
<p>Das ist blanker Unsinn. Wenn Mailserver A eine Mail an Mailserver B sendet, dann bekommt Spamcop davon exakt überhaupt nichts mit. Faktisch hat Spamcop nur zwei Datenquellen: Einerseits manuelle Beschwerden, bei denen Empfänger unerwünschter Mails jene an Spamcop meldeten, und zweitens Spamfallen, also E-Mail-Adressen, die nie für legitimen Mailverkehr verwendet wurden und somit ausschließlich von Spammern angeschrieben werden, sei es, weil sie jene Adressen schlicht geraten haben, oder weil sie Websites oder Verzeichnisse abgescannt haben, wo jene Mailadressen publiziert wurden. Spamcop hat also eben gerade <em>keine</em> Ahnung, wie viele Spam-Nachrichten von einer IP-Adresse kommen. Es zählt nur Beschwerden. Der Unterschied mag im Detail liegen, aber da der Autor explizit konstatiert, Spamcop würde die Anzahl der Spam-Nachrichten &#8220;haargenau registrieren&#8221;, ist anzunehmen, dass er schlicht nicht begriffen hat, wie Spamcop funktioniert (und wie nicht).</p>
<blockquote><p>Doch alle Bemühungen von T-Online, von der Spamcop-Liste gestrichen zu werden, scheiterten zunächst, da der Anbieter auf seine Regeln beharrte: Wer von der Liste gestrichen werden will, muss den Spam-Ausstoss seiner Mailserver auf ein Mindestmaß beschränken.</p></blockquote>
<p>Abgesehen davon, dass der Autor hoffentlich gemeint hat, dass Mailserver den Spam-Ausstoß auf ein <em>Minimum</em> beschränken sollten (denn was wäre denn bitte ein <em>Mindest</em>maß für Spam-Ausstoß?!), ist das erstmal durchaus richtig. Die Formulierung aber, dass T-Online sich doch irgendwie &#8220;bemüht&#8221; habe, und dass das aber &#8220;gescheitert&#8221; sei, legt nahe, dass der Autor offenbar der Meinung ist, Spamcop habe das Scheitern gewissermaßen verschuldet. Aber warum genau hätte Spamcop sich auch anders verhalten sollen? Spamcop veröffentlicht, von wessen Servern viel Spam versendet wird. Von den T-Online-Mailservern <em>wurde</em> viel Spam versendet. Die Information, die Spamcop dann entsprechend führt, ist also völlig richtig, und sie ist auch nicht einfach so zurückzunehmen, nur weil T-Online quengelt. Hinter der Formulierung des Autors steht offenbar die Einschätzung, dass T-Online für das Internet sozusagen &#8220;too big to fail&#8221; sei und man hier entsprechend Sonderregeln schaffen müsste, weil &#8230; ja, warum eigentlich? Es gibt nämlich eben genau <em>keinen</em> Grund, für T-Online irgendwelche Sonderregeln zu schaffen. Die müssen sich an die Spielregeln halten und Spam so weitgehend wie möglich vermeiden, so wie auch wir, und so wie auch jeder andere Provider.</p>
<p>Als es dann schließlich darum geht, dass T-Online nun auch Spamfilterung für <em>aus</em>gehende Mails durchführt, ergänzt der Autor:</p>
<blockquote><p>Solche Filter sind noch nicht üblich, werden aber von immer mehr Unternehmen eingesetzt. Das Problem: die Trefferquote mag auf Papier weit über 99 Prozent liegen. Bei Millionen Nachrichten Täglich bleiben aber immer wieder einige hängen. Der elektronische Briefträger ist nicht verlässlich.</p></blockquote>
<p>Schon wieder dieses Märchen von der unzuverlässigen E-Mail..! Es gibt exakt zwei Varianten: Entweder T-Online akzeptiert eine Mail zum Versand &#8211; oder aber eben nicht. Und dann erhält der Absender eine Fehlermeldung. Vielleicht versteht er sie nicht; vielleicht ignoriert er sie; vielleicht zeigt sein Mailclient sie ihm nicht auffällig genug an, aber das ändert nichts daran, dass der &#8220;elektronische Briefträger&#8221; <em>sehr wohl</em> verlässlich ist.</p>
<p>Versuche ich nun also, mein gesamtes bisheriges Wissen über E-Mail zu vergessen und völlig unbefleckt diesen Artikel zu lesen, so habe ich heute gelernt: E-Mail ist ein unzuverlässiges Frickelsystem, in dem laufend Mails veschwinden; es gibt eine Firma namens Spamcop, die genau weiß, welche IP wieviele Spammails verschickt (wofür rein logisch zwingende Voraussetzung ist, dass sie offenbar den gesamten E-Mail-Verkehr des Universums analysiert); und wenn diese Firma namens Spamcop das so will, dann kann sie alle Mails, die T-Online verschickt, als Spam deklarieren &#8211; oder die Mails auch ganz verbannen; der Autor scheint sich da nicht sicher zu sein. Und außerdem hat T-Online sich doch bemüht (man versuche das doch einmal, wie ein &#8220;er hat sich stets bemüht&#8221; in einem Arbeitszeugnis zu verstehen), aber obwohl T-Online doch &#8211; da sind wir uns natürlich alle einig &#8211; ein hochseriöses Unternehmen ist, hat diese patzige Spamcopfirma einen auf dicke Hose gemacht und war so kleinkariert, auf seinen Regeln zu beharren, statt für den womöglich größten Provider Deutschlands doch mal Fünfe gerade sein zu lassen.</p>
<p>Was dem Artikel letzten Endes völlig abgeht, ist der simple Fakt, dass es längst überfällig war, dass T-Online sich seiner hauseigenen Spamproblematik verstärkt annimmt. Ich bezweifele, dass es so zügig dazu gekommen wäre, hätte dieses Blacklisting durch Spamcop nicht stattgefunden. Und ich zolle T-Online meinen Respekt dafür, dass es sich nicht einfach nach Gutsherrenart einen Teufel drum geschert hat, dass irgendeine Firma ihre Mailserver auf einer Blacklist führt, sondern dies zum Anlass genommen hat, tatsächlich aktiv etwas gegen ihr Spamproblem zu tun. Im Endeffekt ist das Internet also ein kleines bisschen besser geworden. Dafür sollten wir nicht nur T-Online für die längst überfällige Spam-Prophylaxe danken, sondern auch Spamcop, die das forciert haben.</p>
<p>Was bleibt, ist meine Enttäuschung über die entsetzliche Qualität des Artikels. Wenn ich nun schon Artikel zu Themen, bei denen ich mich selbst doch recht gut auszukennen glaube, derart haarsträubend finde: Wie könnte ich dann Artikeln aus Themenbereichen, von denen ich weitaus weniger verstehe, noch das Vertrauen schenken, dass mir jene sachlich, korrekt und ausgewogen erklären, was in der Welt gerade so wichtig ist? An einer eigenständigeren, geschärften Medienkompetenz, die einen dazu ermutigt, auch weiterführende und auch alternative Quellen zu berücksichtigen, führt also wieder einmal kein Weg vorbei.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2011/09/24/wenn-klassische-presse-uber-it-themen-berichtet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DNS-Resolving mit persistentem Cache</title>
		<link>http://blog.jonaspasche.com/2011/09/03/dns-resolving-mit-persistentem-cache/</link>
		<comments>http://blog.jonaspasche.com/2011/09/03/dns-resolving-mit-persistentem-cache/#comments</comments>
		<pubDate>Sat, 03 Sep 2011 13:30:23 +0000</pubDate>
		<dc:creator>Jonas Pasche</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[djbdns]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.jonaspasche.com/?p=1105</guid>
		<description><![CDATA[Wir fahren in Bezug auf DNS-Caching eine einfache, aber sehr effektive Strategie: Alle von uns verwalteten Hosts bekommen einen lokalen DNS-Resolver. Zwar haben wir in unseren Netzen jeweils ebenfalls DNS-Resolver, die direkt mit einem Eintrag in der /etc/resolv.conf netzintern genutzt werden können, aber das brauchen wir eigentlich nur während der Installation von Systemen, die wir [...]]]></description>
			<content:encoded><![CDATA[<p>Wir fahren in Bezug auf DNS-Caching eine einfache, aber sehr effektive Strategie: Alle von uns verwalteten Hosts bekommen einen <em>lokalen</em> DNS-Resolver. Zwar haben wir in unseren Netzen jeweils ebenfalls DNS-Resolver, die direkt mit einem Eintrag in der <code>/etc/resolv.conf</code> netzintern genutzt werden können, aber das brauchen wir eigentlich nur während der Installation von Systemen, die wir typischerweise via PXE-Boot und dann über das Netz machen, wofür ein fertig bereitstehender Resolver vonnöten ist. Sobald eine Maschine läuft, bekommt sie einen eigenen Resolver.</p>
<p>Dieser Ansatz mag erstmal ungewöhnlich wirken, gehört doch das Eintragen von klassischerweise zwei DNS-Resolvern in die eigene Netzwerkkonfiguration zum üblichen Standard. Ein Aspekt ist sicherlich eine gewisse Performancesteigerung &#8211; was der gängige Grund sein dürfte, warum oft empfohlen wird, einen lokalen DNS-Cache auf dem heimischen Rechner zu installieren, denn bei gar nicht mal so wenigen Zugangsprovidern sind die von jenen bereitgestellten Resolver oftmals in bedauernswertem Zustand, was die Performance angeht, und gerade die günstigeren Plaste-DSL-Router für Daheim bekleckern sich hier auch oft nicht mit Ruhm &#8211; gelegentlich mag auch mein Linksys-Router einfach keine DNS-Anfragen mehr auflösen oder an den Upstream-Resolver durchreichen, obwohl er den Internetzugang an sich noch bereitstellt &#8211; nur ein Router-Reboot hilft dann noch. &#8220;Stabil&#8221; ist anders.</p>
<p>Im Rechenzentrum zählen diese Argumente weniger. Die dort bereitgestellten DNS-Resolver liegen ja im gleichen Netz wie die anfragenden Hosts, und sie sind zudem mit üppiger Hardware ausgestattet. Was die Performance angeht, liegen wir hier also eher von Optimierungen im Millisekundenbereich, die es wirklich nicht wert wären.</p>
<p>Worum&#8217;s uns viel mehr geht, ist, mögliche Störungsquellen zu minimieren. Das DNS an sich ist voller Redundanz und Lastverteilung: Müssen DNS-Anfragen aufgelöst werden, stehen satte 13 IPv4-Adressen von Root-Nameservern bereit; einige sind auch via IPv6 erreichbar. Hinter den meisten stehen nicht etwa einzelne Hosts, sondern gleich etliche, die via Anycast geografisch verteilt sind. Fragt man jene beispielsweise nach der .de-Delegation, erhält man derzeit immerhin gleich fünf mögliche Nameserver, auch wiederum geografisch verteilt und zum Teil über IPv6 erreichbar. Für jede einzelne .de-Domain sind dann auch wieder mindestens zwei Nameserver zuständig, die gemäß der Vorgaben der DENIC in unterschiedlichen Class-C-Netzen stehen müssen (auch wenn das nicht zwingend eine geografische Trennung bedeutet). Es gibt also Redundanzen, wohin das Auge sieht. In den seltenen Fällen, wo tatsächlich einer dieser Hosts gestört ist, hat ein DNS-Resolver also praktisch immer genug Alternativen, um ans Ziel zu kommen &#8211; und das auch performant, weil er natürlich auch die Information, dass ein bestimmter Host aktuell nicht ansprechbar ist, eine gewisse Zeit lang cachen kann.</p>
<p>Und diese ganze Redundanz soll man nun aufgeben, in dem man alle Hosts in seinem Netzwerk über einen einzigen DNS-Resolver führt? Natürlich, natürlich: Wenigstens zwei sollten es schon sein; mehr als drei sind aber normalerweise schon gar nicht möglich. Wenn nun einer ausfällt, gönnt sich die C-Library aber defaultmäßig stolze <em>fünf</em> Sekunden, bis sie den nächsten Nameserver versucht &#8211; und versucht es ebenso defaultmäßig <em>immer</em> wieder beim ersten. Zwar lässt sich das in gewissen Grenzen anpassen (hint, hint: <code>options timeout:1 rotate</code>), aber so weit, dass dann z.B. ein Resolver, der ein paar Mal nicht antwortet, für eine gewisse Zeit lang gar nicht mehr angesprochen wird, geht die Logik dann eben doch nicht. Es gibt also zwar auch ein bisschen Redundanz, aber wirklich elegant ist sie nicht. Man braucht also wenn dann schon wirklich hoch verfügbare DNS-Resolver im Netz, denn jeder Ausfall zieht empfindliche Probleme nach sich: Logins via SSH brauchen sekundenlang, weil das System versucht, ein Reverse Lookup für die IP durchzuführen und danach auch noch ein Forward Lookup, um zu schauen, ob&#8217;s passt, und wehe dem, der kein <code>HostnameLookups Off</code> in seiner Apache-Konfiguration hat.</p>
<p>Ein <em>lokaler</em> DNS-Resolver hingegen fällt eigentlich nur in einer Situation aus: Nämlich dann, wenn die komplette Maschine ausfällt &#8211; und dann ist&#8217;s ohnehin egal, bzw. dann hat man ohnehin dringendere Probleme. Vor allem aber beträfe ein reiner Resolver-Ausfall dann nur diesen einen Host &#8211; und nicht gleich sämtliche Hosts im Netz, die jenen Resolver benutzen. Insofern fahren wir hier gewissermaßen eine Insel-Strategie: <em>Wenn</em> was kaputtgeht, dann jedenfalls nur sehr begrenzt. Und die Realität zeigt nun im Lauf von Jahren auf Dutzenden von Hosts: Es geht nichts kaputt. Das Setup ist <em>rock-solid</em>.</p>
<p>Als lokalen DNS-Cache benutzen wir hierbei <a href="http://cr.yp.to/djbdns/dnscache.html">dnscache</a> aus dem <a href="http://cr.yp.to/djbdns.html">djbdns</a>-Paket. Das ist, ohne Frage, für jemanden, der sonst nicht mit Software aus dem <a href="http://cr.yp.to/software.html">DJB-Universum</a>, mit einer gewöhnungsbedürften Installation verbunden, die aber schnell ihre Vorzüge ausspielt &#8211; und letztlich punktet dnscache genau wie tinydns eben besonders auch mit hoher Stabilität und Sicherheit. Einige Dinge sind aber zu beachten:</p>
<p>Erstens, errno.</p>
<p>Damit djbdns mit einer aktuellen glibc kompiliert werden kann, muss in <code>conf-cc</code> am Ende des Compileraufrufs <code>-include /usr/include/errno.h</code> angehängt werden; ein Umstand, den Dan Bernstein <a href="http://cr.yp.to/docs/unixport.html#errno">als Bug der glibc ansieht</a>, auch wenn das durchaus <a href="http://thedjbway.b0llix.net/errno.html">diskutiert werden kann</a> (runterscrollen zu &#8220;references&#8221;).</p>
<p>Zweitens, Root-Nameserver.</p>
<p>Die mit djbdns mitgelieferte Liste von Root-Nameservern ist nicht mehr ganz aktuell. Das lässt sich aber schnell fixen, weil natürlich jeder der (noch verfügbaren) Root-Nameserver eine aktuelle Liste liefern kann. Mit</p>
<p><code>dnsip `dnsqr ns . | awk '/^answer: \./ { print $5 }'` &gt;<br />
  /service/dnscache/root/servers/@</code></p>
<p>lässt sie sich fix aktualisieren; ein</p>
<p><code>svc -h /service/dnscache</code></p>
<p>informiert dnscache zur Laufzeit über die neue Serverliste.</p>
<p>Drittens, Cache-Größe.</p>
<p>Die Standardkonfiguration gibt dnscache eine Cache-Größe von gerade mal 1 MB. Das hat zur Folge, dass insbesondere auf Systemen, die viele DNS-Anfragen machen, der Cache möglicherweise eine stärkere Fluktuation aufweist als nötig wäre, mit der Folge, dass DNS-Anfragen, die er eigentlich aus dem Cache hätte beantworten können, wenn jener nicht zu früh wieder hätte aufgeräumt werden müssen, erneut stellen muss. Angesichts heutiger RAM-Dimensionen stellt es mit Sicherheit kein Problem dar, dem Cache 10 MB zu verpassen:</p>
<p><code>echo 10000000 &gt; /service/dnscache/env/CACHESIZE</code></p>
<p>vergrößert den Cache, und</p>
<p><code>echo 12000000 &gt; /service/dnscache/env/DATALIMIT</code></p>
<p>teilt dem dnscache begrenzenden softlimit mit, dass dnscache nun mehr RAM belegen darf. Mit</p>
<p><code>svc -t /service/dnscache</code></p>
<p>wird die laufende dnscache-Instanz beendet, woraufhin svscan den Dienst automatisch neu startet. Welche Cache-Größe wirklich angemessen ist, führt hier zu weit; entsprechende Strategien sind aber bereits an <a href="http://cr.yp.to/djbdns/cachesize.html">verschiedenen</a> <a href="http://thedjbway.b0llix.net/djbdns/cachesize.html">Stellen</a> dokumentiert.</p>
<p>Viertens sind wir kürzlich auf einen Patch gestoßen, der dnscache etwas äußerst Nützliches beibringen, nämlich die Möglichkeit, seinen aktuellen Cacheinhalt in eine Datei zu dumpen &#8211; und bei einem Start seinen Cache auch erstmal direkt aus jener Datei wieder zu befüllen. Auf diese Weise ist der Cache von dnscache auch nach einem Neustart sofort &#8220;warm&#8221;, ohne dass es erstmal wieder damit beginnen muss, von den Root-Nameservern her die TLD-spezifischen-Nameserver aufzulösen, und so weiter.</p>
<p>Der <a href="http://efge.free.fr/djbdns/">ursprüngliche Patch</a> stammt von <a href="http://efge.free.fr/djbdns/">Efgé</a> und bringt die Funktionalität ein, durch Senden eines SIGALRM dnscache dazu zu veranlassen, seinen Cacheinhalt in eine Datei zu dumpen, deren Name durch eine zuvor gesetzte Umgebungsvariable definiert wird, sowie die Funktionalität, jene Datei beim Starten wieder einzulesen. <a href="http://riemann.fmi.uni-sofia.bg/vladov/index.html">Nikola Vladov</a> hat auf dieser Basis noch einen <a href="http://riemann.fmi.uni-sofia.bg/docs/djbdns-dumpcache.html">erweiterten Patch</a> entwickelt, der zum einen dafür sorgt, dass dnscache beim Beenden automatisch einmal seinen Cache speichert, und der selbiges zudem in einem festlegbaren Rhythmus auch von sich aus tut, was insbesondere für Fälle praktisch ist, in denen ein Host crasht und von daher keine Gelegenheit mehr hat, den Cache zu schreiben wie bei einem sauberen Herunterfahren (nicht, dass sowas ständig vorkäme, aber der kluge Mann baut vor).</p>
<p>Lokal ordentlich zu cachen ist in jedem Fall eine gute Praxis, nicht nur der eigenen Performance wegen, sondern auch, um die Last, die man durch DNS-Anfragen auf anderen Hosts erzeugt, gering zu halten &#8211; es gewinnen also beide Seiten. Um so wichtiger ist das, wenn man nicht nur &#8220;gewöhnliche&#8221; DNS-Daten abfragt, sondern auch Datenbanken, die via DNS publiziert werden, wie beispielsweise das <a href="http://www.team-cymru.org/Services/ip-to-asn.html#dns">IP to ASN Mapping</a> der <a href="http://www.team-cymru.org/">Team Cymru Community Services</a> (mit herzlichem Dank an <a href="http://blog.horrendum.de/">Daniel</a> für den Tipp) &#8211; was für uns der Hauptgrund war, uns eingehender mit der Cache-Dumping-Thematik zu befassen. Der konkrete Anlass dafür reicht aber noch problemlos für einen weiteren Blogpost &#8211; stay tuned.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jonaspasche.com/2011/09/03/dns-resolving-mit-persistentem-cache/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

