Schlagwort-Archive: Linux

[Linux] Der Zufall und warum Cryptofunktionen manchmal ewig dauern

Wer schon einmal auf einem Embedded-System wie Router oder einer VM versucht hat einen geheimen Schlüssel unter Linux zu erzeugen wird das kennen: Es dauert ewig. Schuld daran ist nicht nur die meist spartanische Leistung des Prozessors, sondern auch die Art, mit welcher Linux seine Zufallsdaten erzeugt.

Wie Zufällig darf es denn sein?

Holen wir mal etwas aus: Viele Verschlüsselungen benötigen – beispielsweise zur Erstellung von Schlüsseln – Zufallswerte. Leider ist ein PC mit seinen An-Aus recht vorhersagbar und das genaue Gegenteil von Zufall. Um trotzdem verschlüsseln zu können kommen Pseudozufallsgeneratoren zum Einsatz. Diese verwenden meist schlecht vorhersagbare Quellen um eine hohe Qualität der Zufallszahlen zu erreichen – also eine Zahl, deren Herleitung man möglichst später nicht mehr nachvollziehen kann. Quelle kann Beispielsweise das Rauschen eines Gerätes, vergleichbar mit einem zu laut eingestellten Eingangs einer Soundkarte, sein.

Von vollen und von leeren Pools

Unter Linux kümmert sich der Kernel selbst um die Sammlung dieses Zufalls, diesen verwaltet er im Entropiepool. Üblicherweise werden maximal 4096 Bit vorgehalten, den aktuellen Füllstand kann man unter /proc/sys/kernel/random/entropy_avail einsehen. Um Zufallszahlen zu erhalten gibt es nun zwei Geräte mit den selben Aufgaben, aber wichtigen Unterschieden:

/dev/random stellt die Daten aus dem Pool zur Verfügung und dabei sicher, dass die Daten eine gewisse Qualität haben. Das bedeutet allerdings auch, dass – wenn die 4096bit aufgebraucht sind – das Lesen so lange pausiert wird, bis neue Zufallswerte vorliegen. Das ist Ideal für Verschlüsselungen und andere kritische Bereiche in denen sensible Daten behandelt werden sollen. Gleichzeitig heißt es auch, dass Systeme mit geringer Nutzung entsprechend lange zum Lesen benötigen. Häufig wird empfohlen für Fesplatten- oder Netzlast zu sorgen oder Maus und Tastatur intensiv zu nutzen um zusätzlichen Zufall zu generieren, ob dies tatsächlich auch für den Linux RNG hilft oder nur einen Placeboeffekt darstellt ist mir nicht bekannt.

/dev/urandom stellt die selben Daten bereit, blockiert allerdings nicht. Hierbei macht man sich eine Eigenheit eines Zufalls zu Nutze: Die Zufallswerte sind nicht wie ein Treibstoff, der durch Nutzung verbrannt wird, sondern eher das geschriebene Wort eines Füllers. Ist die Quelle des Zufalls langsam erschöpft, also die Tinte fast leer, sieht das Geschriebene nicht mehr schön aus, ist aber immer noch deutlich besser als Nichts. Je länger man jedoch mit leerer Patrone schreibt, desto schlechter wird das Ergenis. Aber zurück: Ist der Pool also leer werden die übrigen Daten nochmal in die Mangel genommen und neu gemischt um zumindest irgendwas zu haben. Ganz nach dem Motto: Egal wie, es kommt etwas raus. Die Qualität der herauspurzelnden Werte ist – wie oben schon angerissen – nicht garantiert, vor allem bei leerem Pool und wenig Aktivität steigt die Gefahr, dass die Werte nachvollziehbar werden. Für wichtige Crypto sollte man urandom entsprechend nicht benutzen, reicht aber „etwas Zufall“ aus – beispielsweise um Werte für ein Spiel oder das testen einer Festplatte zu erhalten – ist man hier richtig und kann viel Zeit sparen. Auch kann es als „letzter Ausweg“ genutzt werden, wenn Zeit wichtiger ist als Sicherheit – oder soll der Kunde des Onlineshops mehrere Minuten beim Laden warten, weil grade der Pool leer ist?

Programmdiktatur

Während man als Programmierer die Wahl zwischen den Qualitäten hat ist man als Nutzer meist den Entscheidungen des Programmierers ausgeliefert. Dies macht auch meist Sinn, beispielsweise wenn das Cryptoprotokoll auf dem blockierenden /dev/random beharrt. Arbeitet man jedoch beispielsweise auf einem Testsystem und muss hunderte Schlüssel erzeugen, die ohnehin nur unwichtige Testdaten verarbeiten, wäre ein umschalten auf /dev/urandom hilfreich. Sicher, man könnte den Symlink verbiegen, aber wirklich schön ist das nicht.

Mittelweg Füllhilfen

Eine Lösung kann ein zusätzlicher Zufallsgenerator sein, welcher als weitere Quelle die Füllung des Entropiepools beschleunigen kann. Eine Möglichkeit ist es – wenn vorhanden – die Hardware zu bemühen. Viele aktuelle Rechner haben einen Zusallsgenerator eingebaut, beispielsweise unterstützen Intel-CPUs mit DRNG entsprechende funktionen oder auch das vielfach verbaute TPM-Modul kann hierzu verwendet werden. Nutzer von QEmu können mit virtio_rng auch virtuelle Rechner versorgen. Nutzbar machen lässt sich dies über den rngd, welcher als Dienst gestartet die Vermittlung übernimmt und meist in einem Paket namens rng-tools o.Ä. zu finden ist. Die Gefahr, dass die Hardwareimplementierung eine Lücke hat besteht natürlich immer, denn diese Quellen sind meist fest verdrahtet und Lücken im Algorithmus können nicht „weggepatched“ werden. Auch liegen die Details der Implementierung häufig nicht offen, sodass die Qualität der Zahlen nicht prüfbar ist. Um hier zumindest ein grundsätzliches Fallnetz zu ziehen wird rngd in der Standardeinstellung nur anteilmäßig zur Generierung der Zahlen genutzt.

Steht keine Hardware zur Verfügung, beispielsweise in vielen VM-Umgebungen, ist es auch in Software möglich. Der bekannteste Vertreter ist hierbei haveged. Hierbei wird sich zu nutze gemacht, dass der Prozessor intern einige Operationen durchführt, welche nicht vorhersagbar erscheinen. Der Vorteil: Diese Quelle ist auf jedem Rechner verfügbar – vom normalen PC bis hin zum kleinsten Router. Problem: Nicht jeder Prozessor ist „gleich zufällig“, ob die Qualität also hoch ist lässt sich nur schwer bestimmen.

Pest oder Cholera?

Welchen Weg man wählt, dass muss man für sich selbst entscheiden. Lange Wartezeiten ergeben zwar meist eine höhere Sicherheit, aber in der heutigen Zeit zählen all zu oft andere Werte. Viele Nutzer sind nicht bereit ihen Komfort für Sicherheit zu opfern. Ein Hardware-RNG kann – wenn vorhanden und man der Quelle genug vertraut – eine große Hilfe sein. Auch Software ist als Ausweg eine Option. Am Ende lässt sich Zufall jedoch nie testen, die Qualität der einzelnene Lösungen ist also nur schwer zu bewerten. Am Ende ist es meist eine gute Idee mehrere Quellen zu nutzen und so den Zufall des Zufalls nicht ganz dem Zufall zu überlassen.

Linux: ARP-Cache zurücksetzen

Oops, das war daneben… Durch eine falsche Routerkonfiguration fühlte sich dieser für alle IPs eines Subnetzes zuständig und hat entsprechend brav auf jeden ARP-Requests geantwortet. Ergebnis: Die Systeme im betroffenen Subnet konnten untereinander nicht mehr kommunizieren. Kein Problem: Config rückgängig und schon läuft wieder alles, oder? Nicht ganz, denn die Server fragen nicht jedes mal neu nach der MAC-Adresse. Zum Glück funktionierte der Zugriff von draußen noch – diese läuft ja über den Router, also schnell auf die Shell der Linux-Kisten und den Cache zurücksetzen:

ip neigh flush all

Schon ist wieder Ruhe im Monitoring. Fein.

Mehr Arten den Cahce zu löschen, z.B. nur für bestimmte Netzwerkkarten oder Ziele, finden sich in der Manitu-Wiki.

[Linux/GnuPG] Key-Erstellung nicht möglich: command get_passphrase failed: Operation cancelled

Beim Versuch einen GPG-Key für eine Backupverschlüsselung zu erzeugen bricht GPG an der Stelle, an der nach einem Kennwort gefragt werden müsste, mit folgender Meldung ab:

can't connect to `/home/user/.gnupg/S.gpg-agent': No such file or directory
gpg-agent[4854]: command get_passphrase failed: Operation cancelled
gpg: cancelled by user
gpg: Key generation canceled.

Grund dafür ist offenbar die Art, mit welcher die aktuelle Shell gestartet wurde. Ich nutzte su um von root, mit dem ich die nötigen Pakete installiert hatte, in den Benutzerkontext des Backupnutzers zu wechseln. Dies seint allerdings etwas Chaos bei der Umgebungsdefinition zu verursachen und wird von GPG offenbar nicht unterstützt. Mann muss sich mit dem User direkt auf der Konsole oder per SSH anmelden, dann lässt sich der Schlüssel fehlerfrei generieren. (via christian-stankowic.de)

Intel Haswell-ULT Integrated Graphics: Performance vs. Battery unter Linux

Mal wieder geht es um die interne Grafik der Haswell-CPUs: Ich arbeite häufig am Laptop, dieser ist mit i5 und der der internen Grafik ausreichend schnell um auf dem Sofa etwas zu Arbeiten und nebenbei HD-Videos per HDMI auf dem TV darzustellen. Etwas verwundert war ich, als ich vor kurzem Unterwegs war. Ein kleiner Film zwischendurch sollte ja passen, aber selbst 720p-Material auf dem internen Montior war nicht ruckelfrei zu schaffen.

Das Problem scheinen die Stromsparfunktionen zu sein: Startet oder Resumed man das System im Akkubetrieb nimmt die Grafikleistung massiv ab. Auch ein späterer Wechsel auf Netzbetrieb bringt hier keine Änderung. Einzige  Lösung: System ausschalten oder in StBy versetzen, Netzkabel anschließen und starten, schon hat man wieder volle Performance – auch im Akkubetrieb. Sehr ärgerlich, vor allem da man hierzu  nahezu keine Dokumentation im Netz findet. Einige behaupten, es wäre eine Funktion des SpeedStep/EIST-Treibers, dieser wird jedoch eigentlich unterstützt, scheint aber keine Grafikfunktionen zu implementieren.

Da offenbar das Umschalten bisher (3.19.2) nicht sauber funktioniert würde ich  fast empfehlen die Stromsparfunktionen der Grafikkarte fürs erste im BIOS abzuschalten.

[Gentoo] Fehler bei der Installation von net-libs/webkit-gtk-2.4.7

Während eines Updates brach ein Rechner regelmäßig bei der Aktualisierung bzw. Installation von net-libs/webkit-gtk-2.4.7 mit einem Linkerfehler(?) ab. Ursache ist die verwendete GCC-Version (x86_64-pc-linux-gnu-4.7.3) – nach einem Wechsel auf x86_64-pc-linux-gnu-4.8.3 per gcc-config ließ sich das Paket fehlerfrei kompilieren.

Unreal Tournament (1999) unter Arch Linux

Zugegeben, mit über 15 Jahren ist das originale UT etwas betagt, aber wenn man die Installationsmedien findet weckt das doch das Bastlerego – ob es auf einem aktuellen Linux läuft? Sollte eigentlich – das Spiel selbst kann bereits seit längerem über den Loki Installer auf Linux lauffähig zu bekommen. Eher Bedenken hatte ich da bei den Libraries: Sound in Kombination mit Pulseaudio hat mir schon bei RTCW:ET eine Menge Bastelzeit gekostet. Auch der Installer setzt GTK1.2 voraus – findet man heute eher nicht mehr. Glücklicherweise bin ich bei Arch da gleich doppelt im Vorteil: Während man bei Ubuntu & Co. das alte GTK manuell installieren muss kann ich auf ein passendes AUR-Paket zurückgreifen. Oder es sein lassen, denn ein Paket namens „UT1999“ erlaubt die Installation ohne den GUI-Installer. Leider ist auch das Paket nur ein Ansatz, aber keine Lösung. Nachdem die Installations-CDs vom Paket erfolgreich in /opt/ut platziert wurde folgte schnell Ernüchterung. Der Befehl wird ohne Meldung beendet, als Exitcode erscheint ein Fehler.

adlerweb@zeus /opt/ut/System $ ./ut-bin
adlerweb@zeus /opt/ut/System $ echo $?
1

Könnte natürlich eine Library sein, da UT99 eine 32-Bit Binary ist und ich auf einem 64-Bit System arbeite. Kurzer Blick: libgl, SDL, openal – alles genannte ist auch in 32-Bit bereits vorhanden. Nach etwas Suchen half dann der Parameter „-log“ den Fehler genauer zu identifizieren:

adlerweb@zeus /opt/ut/System $ ./ut-bin -log
Unreal engine initialized
Bound to SDLDrv.so
Joystick [0] : Unknown Joystick
SDLClient initialized.
Bound to Render.so
Lighting subsystem initialized
Rendering initialized
LoadMap: Entry
Failed to load 'Entry': Can't find file 'Entry'
Failed to load 'Level None.MyLevel': Can't find file 'Entry'
appError called:
Failed to enter Entry: Can't find file 'Entry'
Executing UObject::StaticShutdownAfterError
Executing USDLClient::ShutdownAfterError
UGameEngine::Init
InitEngine
Preparing to exit.
Purging garbage
Unbound to Engine.so
Unbound to Core.so
-0.0ms Unloading: Package Engine
-0.0ms Unloading: Package Core
Game engine shut down
Unbound to SDLDrv.so
SDL client shut down.
Unbound to Render.so
-0.0ms Unloading: Package Render
Lighting subsystem shut down
Rendering shut down
Garbage: objects: 231->0; refs: 0
Object subsystem successfully closed.
Exiting.
Name subsystem shut down

Hintergrund: Das Paket kopiert die Daten an die falsche Stelle. Doll. (Der offizielle Installer veranstaltet angeblich das selbe). Also räumen wir mal auf:

cd /opt/ut/System/
cp -Rv Entry.unr Entry
cp -Rv AS-* CTF-* DM-* DOM-* EOL_* ../Maps

Und siehe da – kurz darauf sieht man das gute, alte

In 2291, in an attempt to control violence among deep space miners, the New Earth Government legalized no-holds-barred fighting.

Ja, sieht. Denn Ton ist wie erwartet ein Problem. Dankenswerterweise muss man sich hier nicht mit PunkBuster o.Ä. herumärgern und darf direkt herumdoktern. Zuerst wird das Audiosystem auf OSS erzwungen, so ist das Basteln einfacher. Hierzu unter /home/[user]/.loki/System/UnrealTournament.ini die Zeile

AudioDevice=ALAudio.ALAudioSubsystem

durch

AudioDevice=Audio.GenericAudioSubsystem

ersetzen. Danach würde ich eigentlich mit padsp starten, aber dieser lädt lediglich die 64Bit-Version, welche der UT-Binary nichts anhaben kann. Dann machen wir es halt manuell:

LD_PRELOAD="/usr/lib32/pulseaudio/libpulsedsp.so"

Viola:

Liandri Mining Corporation, working with the NEG, established a series of leagues and bloody public exhibitions.

– diesmal aus den Boxen. Auch eine kleine Testrunde lief selbst auf 1920×1080 in bester Qualität (für ’99). Da steht einem Onlinespiel auf einem der über 600 aktiven Gameservern ja nichts im Wege…

[ZFS/Linux] Priorisierung und Systemlast durch Scrubbing kontrollieren

Das Scrubbing ist ein wichtiger Part der regelmäßigen Pflege eines ZFS-Systems. Hierbei liest das System alle belegten Dateisystemblöcke, vergleicht den Inhalt mit der hinterlegten Prüfsumme und korrigiert – wenn nötig – Fehler auf dem Speicher. Hierdurch ist sichergestellt, dass kippende Bits auf den Festplatten nicht den Inhalt der Datei beschädigen und Fehler frühzeitig erkannt werden. Ein Scrub wird hierbei über den Befehl „zpool scrub poolname“ gestartet.

Um Wöchentlich ein Scrubbing aller zpools durchzuführen nutze ich etwas Bash-Magie – das folgende Script erstellt eine Liste aller im System bekannten zpools und führt ein scrubbing dieser durch. Da ich zum Teil mehrere zpools auf Partitionen einer Platte habe wird immer nur ein Scrub simultan durchgeführt, so wird das Storage nicht zu stark belastet.

#!/bin/bash
date
for i in `zpool list | cut -d ' ' -f 1 | tail -n +2` ;do
    echo $i
    zpool scrub $i

    #Voodoo to prevent simultanous scrubs
    while (zpool status audio | grep scan: | grep scrub > /dev/null) ;do
        sleep 60
        #Scrub still running
    done
done
date

Aber auch ein einzelner Scrub stellt für das System eine nicht unerhebliche Last dar, welche sich negativ bemerkbar machen kann. In meinem Fall ist es eine Datenbank mit vielen kleinen Schreiboperationen, welche während des Scrubs nicht hinzunehmende Delays aufweist. Um hier Abhilfe zu schaffen kann ZFS eine Pause einlegen, sobald IO-Aktivität auf dem Pool entdeckt wird. Kontrolliert wird dieser Wert unter Linux mit dem Parameter /sys/module/zfs/parameters/zfs_scrub_delay – dieser ist per Default auf 4 eingestellt. Die Angabe bezieht sich hierbei laut Dokumentation auf Systemticks, bei den meisten Desktop-PCs ist Tickrate von 1000Hz, bei Server meist 100Hz, üblich. Um zu Prüfen wie das eigene System eingestellt ist kann meist folgender Einzeiler verwendet werden:

zcat /proc/config.gz | grep -E "^CONFIG_HZ_.*=y$"
CONFIG_HZ_250=y

Wie zu sehen ist läuft mein System auf 250Hz. Zusammen mit der Angabe oben würde ZFS bei IO also für 16ms (1s/250Hz*4) pausieren. Um mir etwas Zeit zu verschaffen möchte ich diesen Wert auf 250ms erhöhen:

1 Sekunde / 250Hz = 0,004 Sekunden/Tick = 4 Millisekunden/Tick
250 Millisekunden / 4 Millisekunden ~= 63 Ticks

Dieser Wert wird entsprechend dem Parameter zugewiesen.

echo 63 > /sys/module/zfs/parameters/zfs_scrub_delay

Wirklich messbar ist der Unterschied nur schwer, da er sich nur bei kleinen, zeitlich verteilten Operationen und nicht bei den benchmarküblichen und konstanten Sequential und Random-Operationen bemerkbar macht, gefühlt ist die Reaktion jedoch trotz scrub besser geworden.

Natürlich sollte man bedenken, dass der Scrub entsprechend länger dauert, die Werte sollten also nur temporär oder mit viel Vorsicht geändert werden.

Interfacebasiertes OpenVPN-Routing und martian packets

Ab und an sehen meine Wünsche recht speziell aus, ich weiß. Heut sieht die Aufgbe wie folgt aus:

Ein Router besitzt 3 Netzwerkkarten, eth0 ist direkt an das Internet angeschlossen, eth1 versogt das Netzwerk A und eth2 das Netzwerk B. Zusätzlich gibt es über OpenVPN (tap0) einen Link zu einem externen Internetzugang. Ziel ist nun, dass alle Internetanfragen von Netzwerk B (eth2) über das VPN versendet werden, der Rest jedoch nicht.

Der (zusammenkopierte) Entwurf lautete wie folgt:

iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-xmark 0x1/0xffffffff
-> Alles was aus Netzwerk B kommt wird mit Flag 0x1 versehen

iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
-> Alles was über tap0 raus geht wird per NAT maskiert

ip route add unreachable default table 42
-> Alles auf der Routingtabelle 42 wird per default abgelehnt

ip rule add from all fwmark 0x1 table 42
-> Alles mit der Markierung 0x1 gehört zur Tabelle 42

ip route replace 0.0.0.0/1 via *OpenVPN-IP* table 42
ip route replace 128.0.0.0/1 via *OpenVPN-IP* table 42
-> Alles auf Tabelle 42 wird über den VPN-Server abgewickelt

net.ipv4.ip_forward ist auf 1

Auf den ersten Blick ist auch alles OK, Netzwerk A und der Server funktionieren fehlerfrei. Vom Netzwerk B ist jedoch kein Internetzugriff möglich. Getreu dem guten alten Troubleshooting-Guide also auf die Suche.

Wenn ich von einem Client in Netzwerk B pinge kommt das Paket am Router auf eth2 an:

[eth2] 10.222.100.53 > 8.8.8.8: ICMP echo request

…und wird auf tap0 nach draußen gesendet:

[tap0] 10.8.0.16 > 8.8.8.8: ICMP echo request

Kurz drauf trifft auch von draußen über das VPN eine Antwort ein:

[tap0] 8.8.8.8 > 10.8.0.16: ICMP echo reply

und dann hing es… Die Antwort wird nicht auf eth2 wieder weitergegeben, dort ist kein Traffic erkennbar. Scheint, als ob irgendwas beim NAT schief geht. Wenn ich logging auf Maximum stelle (net.ipv4.conf.tap0.log_martians=1) ist im syslog folgendes zu lesen:

kernel: IPv4: martian source 10.222.100.53 from 8.8.8.8, on dev tap0

Ich vermute, dass hier das NAT durch die verschiedenen Routing-Tabellen ein zu großes Chaos verursacht. Als „Workarround“ ist auf dem VPN-Interface jetzt Source-Filterung ausgeschaltet (net.ipv4.conf.tap0.rp_filter=0). Da die Gegenseite ohnehin nochmals nattet sollte da nichts böses(™) drüber eintrudeln.

Sollte jemand genauer erklären können was hier passiert freue ich mich über einen Kommentar.

BitBastelei #129 – Dancing USB Robot

BitBastelei #129 - Dancing USB Robot

(44 MB) 00:20:19

2014-12-28 11:00 🛈

Spielzeug… Zu Weihnachten gab es einen tanzenden USB-Roboter der Firma „Dream Cheeky“. Windows only versteht sich. Ohne weitere Ahnung wird also „mal schnell“ ein Linux-Tool zur Ansteuerung improvisiert.

https://github.com/adlerweb/ctlrobot

Xrandr: Manuelle Wahl der Auflösung

Xrandr ist auf Laptops und 1-GPU-Setups die einfachste und zuverlässigste Methode zur Steuerung der Bildausgabe. Monitorposition, Auflösung, Drehung – alles lässt sich über die Konsole oder die zahlreichen GUIs steuern – wenn die Hardware mitmacht. Für wenig Geld habe ich vor kurzem einen Acer P191w (Video folgt) in die Finger bekommen, dieser sollte nun „mal kurz“ mein Netbook-Display erweitern. Eigentlich kein Problem: Anklemmen, einschalten, fertig. Leider scheint die DCC-Info des Monitors, welche dem Rechner u.A. die möglichen Auflösungen mitteilt, fehlerhaft und es zeigt sich dieses Bild:

> xrandr
Screen 0: minimum 8 x 8, current 1824 x 600, maximum 32767 x 32767
LVDS1 connected 1024x600+800+0 (normal left inverted right x axis y axis) 190mm x 110mm
1024x600 60.00*+
800x600 60.32 56.25
640x480 59.94
VGA1 connected 800x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1024x768 60.00
800x600 60.32* 56.25
848x480 60.00
640x480 59.94
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Wie man im mittleren Bereich sieht ist die maximal wählbare Auflösung 1024×768 Pixel. Laut Datenblatt sollte das Panel nativ mit 1440×900 Pixeln arbeiten, entsprechend verzerrt und unscharf sieht auch das Bild aus.

Mit ein paar Befehlen kann man xrandr die nicht erkannte Auflösung beibringen. Hierzu benötigen wir erst mal eine Modeline – diese lässt sich mit dem Tool „cvt“ berechnen. Hier für 1440×900 Pixel bei 60Hz:

> cvt 1440 900 60
# 1440x900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz
Modeline "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync

Diese Info muss man nun in xrandr bekannt machen und dem Monitor zuweisen:

> xrandr --newmode "1440x900_60.00" 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync
> xrandr --addmode VGA1 "1440x900_60.00"

Im Anschluss sollte sich die Auflösung mit dem Tool der Wahl einstellen lassen, auf der Konsole also wie folgt:

xrandr --output VGA1 --auto --mode 1440x900_60.00 --left-of LVDS1

Schon kann auch dieser Monitor mit seiner korrekten Auflösung arbeiten und in den nächsten Tagen mir diverse Metadaten des 31c3 anzeigen.