renderd gegen Vandalismus absichern

Renderd stellt über mod_tile eine Schnittstelle über http(s) zur Verfügung, die den Server lahmlegen kann. Denn mit dem Aufruf /dirty wird eine Kachel in die Renderliste aufgenommen. Besonders Metatiles bei kleinen Zoomlevels können durchaus mal den gesamten Arbeitsspeicher benötigen. Fordert ein Nutzer gleichzeitig mehrere Kacheln mit dirty an, kann damit auch der Swap überlaufen und renderd verabschiedet sich. Deshalb lässt man kleine Zoomlevel normalerweise nicht über die “tile expiry” ablaufen und damit neu rendern, sondern erledigt dies z.B. nur wöchentlich und zeitlich verteilt.
Bei der Weiterentwicklung eines Kartenstils ist “dirty” durchaus hilfreich, wenn man die Änderungen komfortabel über seinen Browser neu rendern möchte.

Kennt jemand das Problem und eine Lösung? Vermutlich muss man im Quellcode von mod_tile das “dirty” auf einen nur dem Serverbetreiber bekannten String ändern.

Ein ähnliches Problem beobachte ich beim Neustarten von renderd, nachdem man Änderungen am Kartenstil getätigt hat (service renderd stop; service renderd start): Manchmal läuft direkt danach der Speicher sehr voll, als ob wieder kleine Zoomlevel gerendert werden, obwohl diese ja nie “expiren” sollten…

Ich hab keine Erfahrung mit renderd/mod_tile, sondern nur mit Apache generell. Mein Tipp wäre mit einer htaccess-Direktive den Zugriff auf /dirty nur auf bestimmte IP-Adressen zu beschränken.

edit: Mh, könnte eventuell nicht klappen, weil /dirty ja keine Datei ist. Müsste man ausprobieren.

Was Du meinst, ist nicht “Vandalismus”, sondern ein “Denial-of-Service-Angriff”. Dazu braucht es meistens nicht mal /dirty, es reicht schon das Abrufen sehr vieler Tiles auf hohen Zoomstufen in nicht vorgerenderten Gegenden.

Änderungen am Source sind nicht nötig, stattdessen kannst Du über die Apache-Config die Zugriffe ganz verbieten


    RewriteEngine on
    RewriteRule ^/.*/status$ / [F]
    RewriteRule ^/.*/dirty$ / [F]

oder ggf. auch mit geeigneten -Einstellungen den Zugriff nur für bestimmte IP-Nummern oder authentifizierte User zulassen.

Für das Ausprobieren eines neuen Stils empfiehlt sich statt des Hantierens mit /dirty eher so etwas wie http://svn.openstreetmap.org/applications/rendering/mapnik/livetiles/ - das arbeitet komplett ohne vorgerenderte Tiles, und wenn Du willst, kannst Du das in einen passwortgeschützten Bereich Deines Webservers legen.

Unerwünschte Render-Requests können auch mit einem fehlenden planet-import-complete zu tun haben (ggf. mal im Apache-Errorlog nachschauen, dort loggt mod_tile, wenn es neue Requests macht).

Bye
Frederik

Moins,

Möglicherweise hilft (minimalinvasiv) ein Bandbreitenlimitierungs-Modul (mod_bw oder ähnlich), mit dem man die Zahl der Aufrufe mit /dirty je IP-Adresse und Zeiteinheit beschränkt?

Gruß Wolf

Ich halte auch die Apache-Config für eine passendere Stelle, den Zugriff zu beschränken. Falls es aber mod_tile sein soll, dürfte die Zeile 1374 in mod_tile.c das richtige Stück sein, um statt /dirty den Geheimcode /kartoffelsalat zu verwenden:

if (!strcmp(option, "status")) r->handler = "tile_status";
else if (!strcmp(option, "dirty")) r->handler = "tile_dirty";
else return DECLINED;

ersetzen durch

if (!strcmp(option, "status")) r->handler = "tile_status";
else if (!strcmp(option, "kartoffelsalat")) r->handler = "tile_dirty";
else return DECLINED;

Grüße, Max (der das aber nicht ausprobiert hat)