Donnerstag, 20. November 2014

Schutz vor SSH-Bruteforce-Attacken mit Fail2ban

Seit mehreren Jahren setze ich auf meinem aus dem Internet erreichbaren Linux-Server das Paket Fail2ban ein, um Brute-Force-Attacken auf den SSH-Daemon und passwortgeschützte Apache-Verzeichnisse zu verhindern.

Erst kürzlich habe ich dabei die Option aktiviert, dass mir jeder “banned host” per E-Mail gemeldet wird:

/etc/fail2ban/jail.conf

...
destemail = name@domain.tld
sendername = Fail2Ban
sender = fail2ban@domain.tld
...
action = %(action_mwl)s
...

Indem man die Action von action_ auf action_mwl ändert, wird das E-Mail bei jeder verhinderten Attacke ausgelöst.

Auswertung

Eine äusserst rasche Auswertung der attackierenden Quell-IPs zeigt, dass China offenbar gross im Geschäft mit automatisierten Attacken gegen SSH ist. Die meisten geblockten Hosts stammen aus folgenden vier Subnetzen:

inetnum:        61.174.48.0 - 61.174.55.255
netname:        CHINANET-ZJ-HU
country:        CN
descr:          CHINANET-ZJ Huzhou node network
descr:          Zhejiang Telecom
admin-c:        CZ4-AP
tech-c:         CH119-AP
mnt-irt:        IRT-CHINANET-ZJ
status:         ALLOCATED NON-PORTABLE
changed:        15325819758@189.cn 20111231
mnt-by:         MAINT-CHINANET-ZJ
mnt-lower:      MAINT-CN-CHINANET-ZJ-HU
source:         APNIC
...
inetnum:        122.225.109.0 - 122.225.109.127
netname:        DINGQI-NETWORK-TECHNOLOGY
country:        CN
descr:          Shaoxing Dingqi Network Technology Co., Ltd.
descr:
admin-c:        JS2095-AP
tech-c:         CH119-AP
mnt-irt:        IRT-CHINANET-ZJ
status:         ASSIGNED NON-PORTABLE
changed:        auto-dbm@dcb.hz.zj.cn 20110707
mnt-by:         MAINT-CN-CHINANET-ZJ-HU
source:         APNIC
...
inetnum:        218.2.0.0 - 218.4.255.255
netname:        CHINANET-JS
descr:          CHINANET jiangsu province network
descr:          China Telecom
descr:          A12,Xin-Jie-Kou-Wai Street
descr:          Beijing 100088
country:        CN
admin-c:        CH93-AP
tech-c:         CJ186-AP
mnt-by:         MAINT-CHINANET
mnt-lower:      MAINT-CHINANET-JS
mnt-routes:     maint-chinanet-js
changed:        hostmaster@ns.chinanet.cn.net 20020209
changed:        hostmaster@ns.chinanet.cn.net 20030306
status:         ALLOCATED non-PORTABLE
source:         APNIC
...
inetnum:        222.184.0.0 - 222.191.255.255
netname:        CHINANET-JS
descr:          CHINANET jiangsu province network
descr:          China Telecom
descr:          A12,Xin-Jie-Kou-Wai Street
descr:          Beijing 100088
country:        CN
admin-c:        CH93-AP
tech-c:         CJ186-AP
mnt-by:         APNIC-HM
mnt-lower:      MAINT-CHINANET-JS
mnt-routes:     MAINT-CHINANET-JS
remarks:        This object can only modify by APNIC hostmaster
remarks:        If you wish to modify this object details please
remarks:        send email to hostmaster@apnic.net with your
remarks:        organisation account name in the subject line.
changed:        hm-changed@apnic.net 20040223
status:         ALLOCATED PORTABLE
source:         APNIC
...

Kann denen mal jemand die Stecker ziehen?

Tags: ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 20. November 2014

Transakt nach Smartphone-Wechsel neu aktivieren

Vor kurzem habe ich mir ein gebrauchtes iPhone 5S geleistet und das betagte iPhone 4 in den Ruhestand geschickt. Beim Wechsel des Smartphones musste ich unter anderem die PhotoTAN-Applikation von Raiffeisen als auch die Transakt-Applikation von Swisscard AECS AG auf das neue Smartphone bringen.

Während es über die Web-Oberfläche von Raiffeisen Online-Banking äusserst simpel ist, ein neues oder zusätzliches Smartphones für die PhotoTAN-Applikation freizuschalten (vorausgesetzt, man hat den Aktivierungsbrief noch rumliegen), ist es mit Transakt etwas schwieriger.

Erster Anlaufpunkt ist die entsprechende Web-Site von Swisscard AECS AG, dem Kartenunternehmen meiner Hausbank. Eine Google-Suche bringt mich auf folgende Web-Site:

3-D Secure

Beim Klick auf den Button im Abschnitt “Change your profile”, welcher auf die Web-Seite www.swisscard.ch/credit-suisse/en/customer-service/a-to-z/3-d-secure-change-profile/ zeigt, führt ins Leere, d.h. im Fachjargon es wird ein HTTP 404 generiert.

Nun gut … dann verwenden wir stattdessen halt die Web-Site-Suche des Kreditkartenherausgebers und versuchen die nicht (mehr?) korrekt verlinkte Web-Seite an Hand ihres Seitentitels ausfindig zu machen:

Suche nach “change profile” auf Swisscard.ch

Und tatsächlich: Über folgende Seite kann man sich einloggen und per SMS einen neuen Aktivierungscode für die Transakt 3D-Secure-Anwendung zusenden lassen:

3-D Secure Change Profile

Ursache des Problems (ein Dankeschön-Schöggeli vom Webmaster nehme ich gerne unter meiner Postanschrift entgegen): In der ungültigen URL heisst es swisscard.ch/credit-suisse/en/..., während es in der gültigen URL swisscard.ch/en/credit-suisse/... heisst.

Tags: , , , , , , , , , ,
Labels: Leben

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 13. November 2014

Google Maps in eigene Web-Site integrieren

Damit man Google Maps-Karten in die eigene Web-Site integrieren kann, benötigt man ein Google-Konto und Zugriff auf die Google Developers Console.

Dort findet man im Menupunkt APIs & Auth in der Unterrubrik APIs die “Google Maps Embed API”, welche man dort auch gleich für die Verwendung aktiviert.

Um Missbrauch zu verhindern, sollte man zudem im Menupunkt Credentials unter Public API Access einen API Key für die Google Maps Embed API erstellen und bei Referers dann die Domainnamen erfassen, von welchen die Requests für Kartendaten kommen dürfen (Referer lassen sich selbstverständlich fälschen, aber ich gehe davon aus, dass Google Gegenmassnahmen in seinen serverseitigen Embed-Code eingebaut hat).

Auf der eigenen Web-Site fügt man dann das iFrame beispielsweise folgendermassen ein:

<iframe
  width="850"
  height="550"
  frameborder="0"
  style="border:0"
  class="map"
  src="https://www.google.com/maps/embed/v1/place?key=%ApiKey%&q=Bern+Switzerland&zoom=10">
</iframe>

Quelle: Google Maps Embed API

Tags: , , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 13. November 2014

Der Python-Paketmanager pip

Dann und wann programmiere ich anstelle mit PHP mit Python – wie gestern, als ich meinen Crawler websta-crawler für das (inoffizielle) Instagram-Frontend websta schrieb.

Für dieses Script greife ich auf die zwei Python-Module requests sowie BeautifulSoup zurück, welche bei einer Mac OS X-Standardinstallation nicht mit dabei sind.

Ein einfacher Weg, diese Module nachzurüsten, ist pip, eine Art Paketmanager für Python. Dieses Tool installiert sich folgendermassen:

$ wget https://bootstrap.pypa.io/get-pip.py

Anschliessend führt man das aus dem Internet heruntergeladene Script aus:

# python get-pip.py

Via: Installation

Sobald der Paketmanager ordnungsgemäss installiert wurde, reicht ein Einzeiler, um die zwei gewünschten Module nachzuinstallieren:

# pip install BeautifulSoup requests

Via: How to install multiple python packages at once using pip

Tags: , , , ,
Labels: Programmierung

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 13. November 2014

In Excel-Diagrammen die Zahl 0 als Datenlabel nicht anzeigen

Auf der Arbeit produziere ich hie und da Excel-Diagramme, welche aus gestapelten Balken bestehen. Kürzlich aktivierte ich in einem solchen Diagramm die Datenbeschriftung der einzelnen Balken. Für Balken, deren Wert 0 betrug und deshalb über keine Höhe verfügten, sah das Datenlabel “0” fürchterlich aus und kam teilweise mit den Achsen und deren Beschriftung in Konflikt. Ist es möglich, Datenlabels nur dann anzuzeigen, wenn sie grösser 0 sind? Ja!

Datenbeschriftungen formatieren

Nach einer kurzen Google-Suche hatte ich die Lösung: Man klicke mittels Rechtsklick auf ein Datenlabel, wähle Datenbeschriftung formatieren… und wähle den Punkt Zahl an. Dort ist die Kategorie auf “Benutzerdefiniert” zu setzen und als Formatcode folgendes einzugeben:

0;;;

Noch ein Klick auf Schliessen, und die sprichwörtlichen Nullen werden nicht mehr angezeigt.

Das Endresultat sieht im Excel-Diagramm dann folgendermassen aus:

Excel-Diagramm ohne Nullen

Tags: , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 2. November 2014

mencoder unter Debian neu installieren

Vor knapp einem Monat habe ich meinen Linux-Server mittels apt-get dist-upgrade auf eine neue Version gelüpft. Dabei wurde mencoder deinstalliert. Gestern Abend biss ich mir die Zähne aus, mencoder wieder zu installieren.

Damit dieses Paket auf ein Debian-System kommt, muss man dieses über ein inoffizielles Repository beziehen:

/etc/apt/sources.list

...
# mplayer
deb		http://www.deb-multimedia.org squeeze main non-free
deb-src		http://www.deb-multimedia.org squeeze main non-free

Wenn ich in der Folge aber das Paket mencoder erneut installieren wollte, erhielt ich folgende Fehlermeldung:

# apt-get install mencoder
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 mencoder : Depends: libdvdnav4 but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

Was zum Teufel … dann installieren wir halt dieses ominöse libdvdnav4 nach — denkste:

# apt-get install libdvdnav4
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libdvdnav4 is already the newest version.
libdvdnav4 set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 577 not upgraded.

Nach einigen Recherchen hatte ich dann die Lösung — ganz simpel, im Grunde:

# apt-get install -t squeeze mencoder
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  libdirac-decoder0 libtwolame0 libx264-112
Suggested packages:
  w32codecs libdvdcss mplayer-doc nvidia-vdpau-driver
The following packages will be REMOVED:
  libdvdnav4
The following NEW packages will be installed:
  libdirac-decoder0 libtwolame0 libx264-112 mencoder
0 upgraded, 4 newly installed, 1 to remove and 576 not upgraded.
Need to get 6,198 kB of archives.
After this operation, 13.3 MB of additional disk space will be used.
Do you want to continue? [Y/n]
...

Via: How to only install updates from a specific repository?

Mittels des Switches -t squeeze sage ich apt, das Paket aus dem Repository www.deb-multimedia.org zu beziehen und nicht von den offiziellen Debian-Repositories.

Und nun generiert mencoder wieder ganz brav animierte Slideshows von Radardaten.

Weiterführende Links

How to install the transcoding tools on Debian 7 “Wheezy”?

Tags: , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 2. November 2014

SNMP-Proxy einrichten

Seit Jahren zeichne ich minütlich Vitalwerte meiner IT-Infrastruktur auf. Dafür verwende ich das quelloffene cacti, dessen Entwicklung zwar seit mehr als einem Jahr stillsteht, meine Bedürfnisse aber immer noch abdeckt. An der Code-Qualität hege ich meine Zweifel, habe mich bisher aber damit arrangiert, insbesondere weil aus meiner Sicht derzeit keine Alternative zur Verfügung steht. Item!

Seit einigen Monaten habe ich das Netzwerk hier in unserer gemeinsamen Wohnung in Bern mittels OpenVPN mit dem Netzwerk im Elternhaus verbunden. Zum Einsatz kommen zwei Router, welche mit DD-WRT geflasht sind (die Konfiguration von OpenVPN auf diesen Kisten ist eine weitere Pendenz in der Liste der geplanten Blog-Artikel).

Der Linux-Server, auf welchem cacti installiert ist und der Poller läuft, befindet sich im Elternhaus. Meine OpenVPN-Konfiguration hat es nun an sich, dass ich den Router in meiner Wohnung nicht per SNMP abfragen kann, weil dessen interne IP aus dem entfernten Netzwerk nicht ansprechbar ist.

Vor einer Woche hatte ich deshalb die zündende Idee, mich auf die Suche nach einem SNMP-Proxy zu machen, welchen ich auf einem Client im LAN unserer Wohnung aufsetze und mittels cacti via SNMP darüber die SNMP-Werte des Routers abfragen kann. Die Wahl fiel auf meinen Mac mini, auf dem SNMP bereits aktiviert ist und bereits von cacti abgefragt wird.

Nach einigen Recherchen mit Google war rasch klar, dass net-snmp die Funktionalität mit sich bringt, einzelne OIDs oder einen ganzen OID-Baum von einem SNMP-fähigen Drittsystem einzubinden und so als Proxy zu wirken.

Die Anleitungen, die man im Netz findet, sind leider etwas holprig, weshalb ich hier für die Nachwelt festhalten möchte, wie ich das Setup schlussendlich zum Laufen gekriegt habe — im Grunde ist es äusserst simpel:

/etc/snmp/snmpd.conf

(Auf dem Rechner, welcher im selben Subnetz wie der abzufragende Router steht)

...
# Proxy to let remote cacti retrieve local router SNMP information

# Define a simple view 'systemview', which includes everthing under .1.3.6.1
view    systemview     included      .1.3

# Map 'public' community to the 'notConfigUser'
com2sec notConfigUser  default       public

# Map 'notConfigUser' to 'notConfigGroup'
group   notConfigGroup v1            notConfigUser
group   notConfigGroup v2c           notConfigUser

# Give 'notConfigGroup' read access to objects in the view 'systemview'
access  notConfigGroup ""            any       noauth    exact  systemview none none

# v1/v2c community string for each proxied host
com2sec -Cn my_router_int notConfigUser  default       my_router

# Allow the 'notConfigUser' (a member of 'notConfigGroup') access for these contexts
access  notConfigGroup my_router_int        any     noauth  prefix  systemview none none

# Proxy configuration
proxy -Cn my_router_int -v 1 -c public 192.168.168.168 .1.3

Via: [HOWTO] Graph multiple servers using an SNMP proxy

Diese Konfiguration kann problemlos in die eigene Konfiguration eingepflegt werden, anzupassen sind einzig die IP des Routers (hier: 192.168.168.168), der über den Proxy abgefragt werden können soll, sowie dessen Community-Namen (hier fahrlässigerweise public).

Aus ästhetischen und verständlichen Gründen anzupassen sind zudem die Bezeichnungen my_router_int sowie my_router. my_router ist der Community-Name, mit welchem die SNMP-Daten des Drittsystems abgefragt werden können. my_router_int wiederum scheint eine Rolle bei der internen Zugriffsverwaltung zu spielen.

Unter Mac OS X verwende ich das von mir auf Github geteilten Restart-Script, um den SNMP-Server neu zu starten.

Test

Mittels des Tools snmpwalk prüfen wir in einer Shell direkt auf dem Proxy, ob net-snmp den OID-Baum tatsächlich einbindet:

$ snmpwalk -v 1 -c my_router localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux DD-WRT 3.X.X #110 Sun Mar 24 15:46:47 CET 2013 mips
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12623972) 1 day, 11:03:59.72
SNMPv2-MIB::sysContact.0 = STRING: user@domain.tld
...

Klappt!

cacti

Schlussendlich muss das neue Gerät noch in cacti erfasst werden. Das stellt den erfahrenen cacti-Benutzer vor keine Probleme, einzig muss darauf geachtet werden, dass man nicht die IP des Routers, sondern diejenige des Proxys und der in snmpd.conf definierte Community-String (im obigen Beispiel -c my_router, also my_router) angibt. Belässt man den Community-Wert auf public frägt man stattdessen die Werte des Proxys selber ab — und nicht diejenigen des zu überwachenden Routers.

Weiterführende Links

Ein ETH-Mitarbeiter hat aufgeschrieben, wie man so etwas via SSH-Tunnel hinkriegt, wenn man keinen VPN-Tunnel hat.

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 29. Oktober 2014

Mac bootet nach Upgrade auf Yosemite und TimeMachine-Restore nicht mehr

Kürzlich durfte ich einem Arbeitskollegen helfen, welcher sein neues Retina MacBook-Pro bei der Installation von Mac OS X Yosemite und dem anschliessenden Restore des TimeMachine-Backups zerschossen hatte.

Bootete der Kollege den Mac, erschien alsbald das blinkende Fragezeichen, welches darauf hindeutete, dass im System kein brauchbares Boot-Volume gefunden wurde.

Wir booteten deshalb in den Recovery-Modus und ich sah mir anschliessend die Situation genauer an. Im Disk Utility erschien die Festplatte zwar, uns war es aber nicht möglich, Partitionen auf der Festplatte zu erstellen oder zu löschen. Wählten wird die Systempartition an, blieb der “-“-Knopf (für “Löschen”) ausgegraut.

Ich wechselte deshalb in Terminal.app und startete auf einem anderen PC einige Google-Suchen zur Thematik. Äusserst rasch stiess ich auf folgende Ask Different/Stackexchange-Frage:

Can’t ever remove partition?

Wie in der Frage dargelegt führte ich ebenfalls folgendes Kommando aus:

# diskutil list
    ~ - Tue Aug 14 10:12:00: diskutil list
    /dev/disk0
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *512.1 GB   disk0
       1:                        EFI                         209.7 MB   disk0s1
       2:                  Apple_HFS MacSSD                  425.7 GB   disk0s2
       3:                 Apple_Boot Recovery HD             784.2 MB   disk0s5
       4:          Apple_CoreStorage MacSSD 2                85.3 GB    disk0s4   <--- Want to remove this
       5:                 Apple_Boot Boot OS X               134.2 MB   disk0s6
    /dev/disk1
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:                  Apple_HFS MacSSD2                *84.9 GB    disk1

(Symbolauszug) Wie auch bei dem Terminalauszug auf Stackexchange lag das Problem bei uns auch bei einer Partition, die als "Apple_CoreStorage" gekennzeichnet war. Dies bedeutet, dass die Partition mit FileVault verschlüsselt ist.

Der Kollege gab mir sein OK, dass ich die Partition löschen konnte, da er ja ein aktuelles Backup auf seiner TimeCapsule liegen hatte. Wie in der Antwort auf Stackexchange beschrieben listet ich zuerst alle File Vault-Partitionen auf:

# diskutil cs list

Anschliessend kopierte ich die Volume ID des Logical Volumes, eine Zeichenkette aus den Buchstaben und Zahlen A-F0-9. Als nächstes löschte ich die Volumengruppe:

# diskutil cs delete <Volume ID>

Nach dieser Aktion starteten wir Disk Utility wieder - und siehe da, die Festplatte konnte neu partitioniert werden.

Meine Vermutung war daraufhin, dass der Restore mit Time Machine eine fehlerhafte Manipulation an der Festplattenverschlüsselung vorgenommen und die Partition unlesbar gemacht hatte.

Tags: , , , , ,
Labels: Apple

1 Kommentar | neuen Kommentar verfassen

Mittwoch, 29. Oktober 2014

Alle Seiten von PDF-Dateien unter Windows in Grafikdateien umwandeln

Kürzlich nahm ich mir vor, besonders visuell ansprechende Folien von Abschlusspräsentationen im Powerpoint-Format in einer Galerie zu sammeln, damit sich künftige Autoren an guten Beispielen inspirieren lassen können.

Als erstes sammelte ich alle Präsentationen, die mir auf unserem Netzlaufwerk bei der Durchsicht begegneten. Anschliessend öffnete ich jede Präsentation von Hand in Powerpoint und speicherte diese als PDF-Datei in einem zentralen Verzeichnis ab.

Da die Foliensätze nun in einem elektronischen Standardformat vorlagen, machte ich mich hinter ein Bash-Script, mit welchem ich alle Seiten der PDF-Dateien mittels ImageMagicks convert in einzelne Grafiken umwandeln konnte. Das Resultat:

# /bin/sh

DESTEXT="jpg"
DESTEXT="png"

echo "Starting up ..."
echo ""

echo "Working in directory $PWD ..."
echo ""

CONVERT=$(which convert)

if [ ! -f "$CONVERT" ]
then
echo "ERROR: convert binary 'convert' not found ($CONVERT). Aborting"
exit 1
fi

echo "Using convert binary at $CONVERT"
echo ""

# Ghostscript not in path in WIN32, won't succeed
# This is how imagemagick does it: http://trac.imagemagick.org/browser/ImageMagick/branches/ImageMagick-6/magick/nt-base.c?rev=13427
# https://www.google.ch/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=site%3Atrac.imagemagick.org%20gswin32c.exe
#GS32=$(which gswin32c.exe)
#GS64=$(which gswin64c.exe)
#if [ ! -f "$GS32" ] && [ ! -f "$GS64" ]
#then
#	echo "ERROR: Ghostscript binary 'gswin[32|64]c.exe' not found (32-bit: $GS32, 64-bit: $GS64). Aborting"
#	exit 1
#fi

#echo "All binaries exist, continuing conversion process."
#echo ""

echo "Using convert binary at $CONVERT"
echo ""

# http://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names
find . -type f -iname "*.pdf" -print0 | while IFS= read -r -d '' PDF; do
echo "Converting $PDF ..."
SOURCE="$PDF"
DEST="$PDF.$DESTEXT"

CMD="\"$CONVERT\" -density 72 \"$SOURCE\" \"$DEST\""
echo "Command: $CMD"
eval $CMD
echo "Done"
echo ""
done

exit 0

Siehe auch:

Probleme

Fehlendes bash

Ich verwende die Git for Windows, um auch unter Windows auf eine bash zugreifen zu können. Git for Windows bringt unter anderem eine bash-Shell mit sich. Im Windows-Explorer öffnet man bash im aktuellen Verzeichnis, indem man nach einem Rechtsklick auf eine leere Fläche im Zielordner im Kontextmenu auf Git Bash klickt.

Fehlendes ImageMagick

ImageMagick steht auch als kompilierte Windows-Binaries zur Verfügung. Bei mir hat das Script mit folgendem Paket funktioniert:

C:\Users\USER>convert --version
Version: ImageMagick 6.8.9-6 Q16 x64 2014-07-22 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo freetype jbig jng jp2 jpeg lcms lqr pangocairo png ps rsv
g tiff webp xml zlib

Fehlendes Ghostscript

Wenn ImageMagick folgenden Fehler meldet …

convert.exe: FailedToExecuteCommand `"gswin32c.exe" -q -dQUIET -dSAFER -dBATCH -
dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEV
ICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile=C
:/Users/USER/AppData/Local/Temp/magick-4444uMzVadN1QsOl%d" "-fC:/Users/USER/AppData/Local/Temp/magick-4444-MgLEhwrf1qK" "-fC:/Users/USER/AppData/Loc
al/Temp/magick-4444WnOaJKpe5I_Y"' (-1) @ error/utility.c/SystemCommand/2051.

… bedeutet dies, dass auf dem lokalen Windows-System die Installation von Ghostscript (gswin32c.exe) fehlt.

Ghostscript steht natürlich auch in Form von Windows-Binaries zur Verfügung und lässt sich mit einigen wenigen Mausklicks installieren.

Beim Debugging des oben genannten Problems drang ich tief in den Source Code ein, um die Stelle zu finden, wo ImageMagick herausfindet, wo die Ghostscript-Executables liegen:

Man schaue sich die Funktion NTLocateGhostscript() in nt-base.c genauer an: Die Pfade sind nicht hardkodiert, sondern werden aus der Windows-Registry ausgelesen. Dies bedingt, dass Ghostscript ordnungsgemäss installiert wurde.

Labels: Programmierung

Keine Kommentare | neuen Kommentar verfassen

Samstag, 20. September 2014

(Verhinderte) Abzocke beim Mietwagenverleih in den USA

Seit ich im Januar 2007 das erste zweite Mal in die USA gereist bin und in Kalifornien mit einem Mietwagen unterwegs war, weiss ich über die Tücken, die unbedarften Touristen beim us-amerikanischen Mietwagenverleih drohen: Man läuft, sozusagen als Touristenfreiwild, Gefahr, unnötige Versicherungen abzuschliessen und auf ein besseres Auto upgegradet zu werden — für wenige Dollars (pro Tag).

Anbieter meiner Wahl: Holidayautos

Damals entschied ich mich nach der Lektüre unzähliger warnender Forumsbeiträge dafür, über den europäischen Wiederverkäufer Holidayautos einen Mietwagen zu buchen, statt direkt über die Web-Siten der einschlägig bekannten Anbieter wie Budget, National, Enterprise und Alamo. Die Vorteile sind mannigfaltig; unter anderem enthalten die von Holidayautos vertriebenen Pakete über keinen Selbstbehalt bei Schäden und der Gerichtsstand ist in Europa.

Die Anpreisungen auf Holidayautos Web-Site bewahrheiteten sich 2007: Bei der Abholung des Mietautos beim Los Angeles International Airport LAX musste ich zwar immer noch Upselling-Versuche der unter Verkaufs- und Provisionsdruck stehenden Verkäufer abwehren, doch weder bei der Entgegennahme des Mietautos noch bei dessen Rückkgabe musste ich noch irgendwelche Gebühren entrichten. Was man als Schweizer halt erwartet: Man bezahlt den angeschriebenen Preis und erhält nicht noch hunderte Gebühren und Steuern auf den Nettopreis geschlagen, welche sich im Kleingedruckten verstecken.

Mietwagen für Kalifornien 2014-2 (Juli 2014)

Im Juli 2014 war es wieder einmal so weit: Stephanie und ich flogen für zwei Wochen nach Kalifornien und leisteten uns über Holidayautos einen SUV-Mietwagen, um den geplanten zweiwöchigen Road Trip zu bestreiten. Einen SUV deshalb, weil eine Reise von San Francisco über Santa Barbara nach Los Angeles bis hinunter nach Dana Point anstand, wo wir an einer Hochzeit teilnahmen, und anschliessend die Rückfahrt mit Zwischenhalten in Yosemite und Napa. Mit dabei hatten wir Ausrüstung, um Hochzeiten und Wanderungen bis auf fast 2000 Meter zu bestreiten.

Am 21. April 2014 erstanden wir über die Internet-Site von Holidayautos ein günstiges Mietwagenangebot, welches wir am 11. Juli 2014 beim Budget Rent A Car Mietwagenverleih am Flughafen San Francisco International SFO einlösten. Bei der Übergabe achteten Stephanie und ich — wie in den USA leider antrainiert — darauf, dass uns kein zusätzlicher Schmarren angedreht wurde. Unser Kundenberater Andrei, dem Akzent nach aus Osteuropa eingewandert, war höflich, verschonte uns mit nicht enden wollenden Verkaufsgesprächen und wickelte die Abholung speditiv ab. Am Schluss witzelte er noch etwas über Upselling, wir lächelten und zogen mitsamt dem unterschriebenen Vertrag Richtung des roten Mitsubishis von dannen.

Fünfzehn Tage später retournierte ich das Fahrzeug am selben Ort. Wie gewohnt fuhr ich in das Parkhaus hinein, navigierte zum richtigen Stockwerk, lud das Gepäck aus und nahm vom Budget Rent A Car-Handlanger die Rückgabequittung entgegen, nachdem dieser den den Barcode am Auto gescannt und den Füllstand des Tanks geprüft hatte (natürlich hatten wir das Fahrzeug in Millbrae, zwei Autominuten vom Flughafen entfernt, frisch aufgetankt).

Für einige Sekunden stutzte ich, als ich einen Betrag von $206.37 vermerkt sah, machte mir aber keine weiteren Gedanken, weil ich wusste, dass die Kosten von Holidayautos bereits Ende April 2014 vollständig von unserer Kreditkarte abgebucht worden waren und wir uns sicher waren, mit Budget einen Vertrag abgeschlossen zu haben, welcher keine Zusatzkosten beinhaltete.

Kreditkartenabrechnung

Ende August kam das böse Erwachen: Auf der Kreditkartenabrechnung fand sich für den 26. Juli 2014 ein Posten von “Budget Rent A Car, Kahului” (steueroptimierter Firmensitz auf Hawaii?) in der Höhe von 192.40 CHF:

2014-08-25 Credit Card Charge

(Schweizer Franken deshalb, weil ich bei der Übergabe des Fahrzeugs aus lauter Blödheit die Abrechnung in meiner Landeswährung angekreuzt hatte — bei der Währungsumrechnung profitiert dann zwar nicht Swisscard AECS AG, hingegen aber der Rechnungssteller).

Studium des Vertrags und der Rückgabequittung

Zum Glück hatte ich den am 11. Juli unterzeichnete Vertrag mit in die Schweiz gebracht. Auch die Rückgabequittung vom 26. Juli fand sich noch in den Reiseunterlagen. Als erstes fertigte ich in weiser Voraussicht Scans der beiden Dokumente an und legte die PDFs anschliessend auf meinem Computer ab.

Nun begann das Entziffern der Rückgabequittung und der Vergleich mit dem Mietvertrag. Der Mietvertrag machte unmissverständlich klar, dass uns nach Abzug der über Holidayautos getätigten Buchung Gesamtkosten in der Höhe von sagenhaften $0.01 anfielen:

YOUR ESTIMATED TOTAL CHARGES: X_AGREED__: .01

Ein US-Cent wohl deshalb, weil das Computersystem vom Budget nicht mit kostenlosen Mieten klarkommt:

2014-07-11 Your Estimated Total Charges

Auf dem Rückgabeschein las ich:

2014-07-26 Your Vehicle Charges

Für Laien völlig unverständlich, musste ich mich im Internet erst schlau machen, wie dieses Gibberish aufgeschlüsselt wird. Wichtig war zuerst einmal folgende Linie:

@NON PKG ITEMS 206.38

Mir wurden also irgendwie “nicht paketierte Optionen” in der Höhe von $206.37 verrechnet. Doch was verbirgt sich dahinter? Etwas weiter unten auf dem Zettel folgt die Auflösung:

PAE/ESP/SLI CHG NON PKG
TRANSP FEE 20.00/RNTL 20.00

Kundenunfreundlicher kann eine Abrechnung nicht daherkommen — aber das hat sicherlich System. Die Zeile PAE/ESP/SLI CHG NON PKG bedeutet, dass die Optionen PAE/ESP/SLI CHG auf NON PKG gebucht wurden. NON PKG sieht man weiter oben referenziert und beträgt $206.37. Excel würde hier wohl wegen einer zu komplexen Referenzierung motzen …

Im Abkürzungsdschungel

Doch was sind PAE/ESP/SLI? Ausgeschrieben:

  • PAE Personal Accident and Effects
  • ESP Emergency Sickness Plan
  • SLI Supplemental Liability Insurance

Siehe auch: PSA…

Soso, eben genau all diesen Schrott, den kein Tourist wirklich braucht, den Mietwagenverleihern aber eine satte Marge einbringt. Der Vergleich mit dem Vertrag brachte folgenden Abschnitt zu Tage:

2014-07-11 PAE ESP SLI

Wie man erkennen kann, hatte ich die Punkte PAE sowie ESP abgelehnt, da diese mit $6.95/Tag respektive $5.00/Tag zu Buche geschlagen hätten. Den Loss Damage Waiver sowie SLI hatte ich zwar akzeptiert, doch mit $0.00/Tag war diese Optionen auch harmlos.

Sonderfall SFO

Die TRANSP FEE 20.00/RNTL ist eine Eigenheit des Regimes der Mietwagenverleiher am Flughafen SFO: In Verträgen mit dem Flughafenbetreiber haben die Mietwagenverleiher vereinbart, dass für jeden Mieter $20 zu entrichten sind, sofern dieser mittels dem AirTrain vom Flughafengebäude zum Mietwagenkomplex transportiert wird. Dies war bei mir zwar der Fall, doch im Original meines Mietvertrags stand diesbezüglich:

2014-07-11 Transportation Fee Included

Dieser Betrag, welcher pro Mietvertrag einmal erhoben werden darf, war glücklicherweise im Holidayautos-Paket enthalten.

Mir schauderte es langsam — wie konnte diese Firma so dreist sein, mir trotz den im Vertrag schwarz-auf-weiss abgelehnten Gebühren Kosten dafür zu berechnen?

Kundendienst

Nun war es Zeit, mich an die Mietwagenverleihfirma selber zu wenden. Budget bietet seinen Kunden über ihre Web-Site an, eine elektronische Quittung (sog. “e-Receipt”) für eine bereits abgeschlossene Vermietung einzuverlangen. Hierzu geht man in die Rubrik contact us und wählt im Abschnitt E-mail Assistance im Dropdown billing question aus. Unter Angabe meiner Vertragsnummer bat ich den Kundendienst, mir doch bitte eine elektronische Kopie der Quittung zuzustellen.

Nach zwei Tagen traf die Antwort mitsamt PDF endlich ein. Und da staunte ich nicht schlecht:

2014-09-05 PAE ESP SLI

Dampfende Scheisse! Ich legte die beiden Verträge — den physischen, mit meiner Unterschrift sowie den elektronischen — nebeneinander, und irgendwie schienen sich nach der Unterzeichnung wie von Geisterhand zwei Optionen von “Declined” auf “Accepted” gewechselt zu haben.

Wer der Urheber dieser Urkundenfälschung — anders lässt es sich nicht sagen — ist, lässt sich nur vermuten. Entweder ist es Andrei, der seine monatlichen Verkaufsziele erreichen muss und aus Erfahrung weiss, dass viele dummen Touristen ihre Verträge nicht mit nach Hause nehmen — oder es ist sein Vorgesetzter, der entgegen jeglicher Logik Verträge nach der Unterzeichnung im Computersystem anpassen kann. Ein Fall für den Internal IT Audit!

Am Rande sei noch erwähnt, dass der e-Receipt für diese Zusatzdienstleistungen Kosten von $314.25 ausweist, weiter unten auf dem Beleg dann aber der effektiv abgebuchte Betrag von $206.37 steht. Wohin verschwanden die $107.88, welche mir nicht verbucht wurden? Auch dieser Widerspruch bestätigte mich in der Annahme, dass die Jungs ihre IT-Systeme nicht unter Kontrolle haben.

Reklamation

Ausgerüstet mit diesen Unterlagen brauchte es danach drei Anläufe, um von Budget häppchenweise zur Rückzahlung des abgebuchten Betrags zu bewegen. Zuerst erfolgte eine Rücküberweisung von $186.74, doch getreu dem Shareholdervalue und der Gewinnmaximierung verpflichtet, behielt Budget den Restbetrag aus mir unerfindlichen Gründen zurück. Nach erneuter Intervention wurden mir kürzlich noch weitere $19.63 rückerstattet (diese aber nicht von BUDGET RENT A CAR, KAHULUI, sondern von BUDGET RENT-A-CAR, SAN FRANCISCO — wahrscheinlich, weil es sich um die “irrtümlich” ebenfalls verrechneten Transportkosten handelt, die spezifisch in SFO erhoben werden. Sonst käme ja deren Buchhaltung durcheinander!). $186.74 + $19.63 = $206.10, sprich ich zahlte unter dem Strich 27 US-Cent drauf, um zu meinem Recht zu kommen (meine Opportunitätskosten von mindestens zwei Stunden Informationen zusammentragen, recherchieren und E-Mails schreiben nicht eingerechnet).

Eine Antwort auf mein letztes gehässigtes E-Mail mit einem Ultimatum für die Rückzahlung erhielt ich nicht. Einzig wurde ich danach noch zwei Mal von automatisch generierten E-Mails belästigt, welche mich zu meiner Kundenzufriedenheit befragen wollten, doch mit meiner klaren Meinung wollte ich Budget dann doch verschonen.

Chargeback über Swisscard AECS AG

Da die Überweisung etwas auf sich warten liess, schaltete ich zur Sicherheit auch noch meine Kreditkartenfirma Swisscard AECS AG ein, um einen sog. Chargeback einzuleiten. Hierzu hatte ich über die (für einmal völlig unprofessionelle und unmotivierte) Hotline ein entsprechendes Formular verlangt, welches mir in den folgenden Tagen physisch (!) per Post zugestellt wurde.

Hintergrund: Das Kleingedruckte der Kreditkartenabrechnungen liest sich so, dass eine Abrechnung 30 Tage nach Erhalt als akzeptiert gilt, wenn man nicht widerspricht. Diesbezüglich wollte ich auf Nummer sicher gehen, wenn die Transaktion effektiv wie von Budget gewarnt 30 bis 60 Tage zur Verarbeitung benötigt hätte. Zum Glück ist das Geld bereits 14 Tage nach der Intervention vollständig angekommen.

Merke

  • Amerikanischen Unternehmen und deren Mitarbeitern ist schlicht nicht (mehr) zu trauen. Im Zeichen des Shareholder Values werden Kunden auf dreiste Art verarscht und geschröpft.
  • Aus diesem Grund sind auf USA-Reisen alle physischen Verträge und Belege, die man erhält, aufzubewahren, in die Heimat überzuführen und zu Hause sicher zu lagern, bis die Kreditkartenrechnung für den gesamten Reisezeitraum erfolgt ist.
  • Jegliche Abklärungen und Kommunikation mit Dienstleistungsunternehmen sollten in solchen Fällen schriftlich resp. elektronisch erfolgen, damit man das Bündel an Dokumenten kommentarlos an den Kreditkartenanbieter senden kann.

Tags: , , , , , , , , , ,
Labels: Leben

Keine Kommentare | neuen Kommentar verfassen