Alle Beiträge von adlerweb

Veeam B&R: „Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname: System.Net.Sockets.Socket“

Tolle Meldung, die das Backupsystem „Veeam Backup&Replication“ da abwirft:

Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname: "System.Net.Sockets.Socket"

…heißt es lapidar in der GUI, die sonst nur darüber informiert, dass kein Backup mehr funktioniert. Zwar ist recht klar, dass es am Netzwerk hängen dürfte, da hier aber pro VM-Sicherung mindestens 5 Server involviert sind gestaltet sich das etwas aufwändiger.  Vor allem wenn alle relevanten Systeme fehlerfrei auf ICMP-Ping reagierten.

Tiefer im Log des Jobs fand sich eine Meldung, welche auf einen Fehler des Backupziels hindeutet. In meinem Fall handelt es sich hierbei um einen Linux-Server, welcher übers Netz beschickt wird.

<19> Info     [Ssh] Server (nas5.lan.adlerweb.info) version string: "SSH-2.0-OpenSSH_7.2"
<19> Info     Channel encryption check: *** to ***
<19> Info             [AP] Starting client agent on 'nas5.lan.adlerweb.info'
<19> Info             [AP] Linux kernel version [uname -r]:
<19> Error    Failed to check kernel version. Supported Linux kernel version is assumed.

Uhmk? Im Monitoring war nichts zu sehen, außerdem kommt ja der SSH-Header. Schnell mal per KVM auf die Kiste und geprüft:

# uname -a
Linux nas5 4.4.10-1-lts #1 SMP Wed May 11 21:03:02 CEST 2016 x86_64 GNU/Linux
#

Also uname sollte also funktionieren. Auch der SSH-Daemon läuft noch. Im Log sind jedoch einige Meldungen, die möglicherweise das Problem beschreiben:

nas5 dbus[**]: [system] Failed to activate service 'org.freedesktop.login1': timed out
nas5 sshd[**]: pam_systemd(sshd:session): Failed to create session: Failed to activate service 'org.freedesktop.login1': timed out
nas5 sshd[**]: pam_systemd(sshd:session): Failed to create session: Failed to activate service 'org.freedesktop.login1': timed out

freedesktop? Das ding ist Xless -.-. Übeltäter ist wieder einmal „Server sind ja nur Ausnahmeerscheinungen“ Systemd. Dessen Loginmanager bekommt Schluckauf wenn, z.B. im Rahmen von Updated, dbus neu gestartet wird. Als Ergebnis lässt sich PAM bei Logins durchaus mal 15 Sekunden Zeit um in den Timeout zu laufen. Je nach Client/Verbindungsart kann dies jedoch bereits zum Timeout der gesamten Verbindung führen – und nichts geht mehr. um den Fehler zu beheben reicht es aus den Logind neu zu starten:

systemctl restart systemd-logind

Warum ein System, was sonst ja auch alles „on demand“ startet/stoppt/überwacht, sowas seit offenbar langer Zeit nicht in den Griff bekommt bleibt offen. Ebenso wie die Frage, warum Veeam keine genaueren Fehlermeldungen liefert.

Passwort-Reset from Hell

(Dieser Artikel beschreibt eine Lücke, welche in der Passwort-Vergessen-Funktion der Webseite eines deutschen Dienstleisters steckte. Der Fehler wurde zwischenzeitlich behoben und ich hoffe, dass euren Systemen selbiges nicht durchgeht. Die Kommunikation mit dem Betreiber soll zudem als eher gutes Beispiel dienen, denn leider ist es eher üblich gemeldete Fehler nicht anzuerkennen oder gar den Anwalt los zu schicken)

Nach längerer Abstinenz wollte ich heute den Dienst einer deutschen Firma nochmal nutzen. Zwar war mir noch bekannt, dass ich einen Login hatte, jedoch nicht die verwendete E-Mail-Adresse. Beim stöbern durch mein Postfach stieß ich auf eine E-Mail aus dem Jahre 2012, mit welcher ich seinerzeit mein Passwort zurückgesetzt hatte. Um mir Tipparbeit zu sparen klickte ich auf den enthaltenen Link- zwar sollte dieser nicht mehr gültig sein, aber immerhin wäre ich auf der Webseite, oder?

Der Link lautete wie folgt: https://webseitedesdienstes.de/reset-password?email=meine%40email.de&key=HEXCODE&ts=1331229923

Der Timestamp entspricht hierbei 2012-03-08 18:05:23 GMT – dem Datum der E-Mail. Neu generierte vergessen-Links nutzen soweit mir ersichtlich das selbe Format.

Zu meiner Überraschung forderte mich die vorgefundene Seite auf ein neues Kennwort zu vergeben. Challenge Accepted – und siehe da: Ich hatte plötzlich Zugriff auf das besagte Konto und konnte mich mit dem neu vergebenen Passwort anmelden. Auch weitere Aufrufe des Links in der E-Mail erlaubten es mir das Kennwort jedes mal erneut zu ändern. Selbst nach Anforderung einer neuen „Passwort-Vergessen“-Mail behielt die alte E-Mail ihre Gültigkeit, die Hex-Codes unterscheiden sich.

Immerhin: Bei Änderung der E-Mail-Adresse zur Übernahme eines fremden Accounts (im Sinne von gerade angelegtem Testaccount) erscheint zwar ebenfalls das Änderungsformular, jedoch wird die Änderung mit einer Fehlermeldung abgelehnt – eine Übernahme fremder Accounts scheint entsprechend nicht möglich zu sein. Das Risiko besteht also hauptsächlich darin, dass bei Cerlust alter E-Mail der Account dauerhaft gefährdet wäre und keine dem Nutzer möglichen Änderungen den Zugriff unterbinden können. Besonders brisant, da der Dienst auch kostenpflichtige Inhalte bereitstellt und hierzu im Profil die Kreditkartendaten hinterlegt sein müssen.

Das Verhalten wurde umgehend an den Betreiber übermittelt, die Antwort erfolgte 2 Arbeitstage später: Man bedanke sich für die Meldung. Kreditkartendaten würden zwar über die UI eingetragen, die Speicherung erfolge jedoch bei einem externen Zahlungsdienstleister. Im Profil würden diese später nicht mehr angezeigt. Die Probleme des mehrfachen Resets ohne zeitliche oder logische Gültigkeitsbeschränkung der Codes ließe sich nachvollziehen, eine Änderung soll innerhalb von 2 Monaten ungesetzt werden.

Inzwischen sind 6 Monate vergangen und der Fehler ist behoben – ob dies innerhalb der angegebenen Zeitspanne erfolgte habe ich nicht geprüft.

 

QEMU: Festplatten als SATA/AHCI einbinden

Physikalische Remote-Server aufsetzen macht ohne KVM-IP eher wenig Spaß. Groß ist die Gefahr, dass durch Kernel-Updates oder spielen am Bootloader die Kiste nach einem Reboot nicht mehr bootet. Wäre es nicht praktisch, wenn man die Platten nicht kurz in eine VM werfen und da booten könnte?

QEMU ist – spätestens mit KVM – sicher der schnellste Weg, das übliche -hda bindet die Festplatten jedoch als IDE-Geräte ein. Schlecht, wenn man nur AHCI, also SATA, in fstab, Treibern & Co vorgesehen hat.

Abhilfe schaffen folgende Parameter, welche mir bei Rubénerd über den Weg gelaufen sind:

[..]
-drive file=/dev/sda,if=none,id=Disk1 \
-device ich9-ahci,id=ahci \
-device ide-drive,drive=Disk1,bus=ahci.0 \
[..]

Wichtig: Hierbei sollte das System im Haupt-OS nicht eingehangen oder Read-Only sein. Sowas ist üblicherweise nur mit einem Rettungssystem möglich, andernfalls kann es zu Dateisystemschäden kommen. Alternativ könnte confinedrv helfen eine Testumgebung zu schaffen.

Symantec Backup Exec/PowerShell: Bandstatus aus Streamer lesen

Symantec Backup Exec ist als Backupsoftware vor allem in Umgebungen mit vielen physikalischen Systemen immer noch recht weit verbreitet. Über das mitgelieferte PowerShell-Modul lassen sich viele Aufgaben automatisieren und Informationen abrufen. Um die Funktion nutzen zu können muss das Modul in die aktuelle PowerShell-Sitzung importiert werden:

Import-Module 'C:\Program Files\Symantec\Backup Exec\Modules\BEMCLI\BEMCLI'

Als Beispiel lese ich hier den Magazininhalt eines angebundenen Bandroboters aus:

Get-BERoboticLibrarySlot -RoboticLibraryDevice "Wechsler 0001"

Name       SlotNumber IsCleaningSlot  Media
----       ---------- --------------  -----
Schacht 1  1          False           A003L5
Schacht 2  2          False           A005L5
Schacht 3  3          False           A011L5
Schacht 4  4          False           A013L5
Schacht 5  5          False           A024L5
Schacht 6  6          False           A031L5
Schacht 7  7          False           A033L5
Schacht 8  8          False           A048L5
Schacht 9  9          False           A034L5
Schacht 10 10         False           A041L5
Schacht 11 11         False           A049L5
Schacht 12 12         False           A060L5
Schacht 13 13         False           A061L5
Schacht 14 14         False           A062L5
Schacht 15 15         False           A063L5
Schacht 16 16         False
Schacht 17 17         False
Schacht 18 18         False           A064L5
Schacht 19 19         False
Schacht 20 20         False
Schacht 21 21         False
Schacht 22 22         False
Schacht 23 23         False

Ebenso ist es möglich Details der aktuell zugreifbaren Bänder auszulesen:

Get-BEMedia -MediaVault "Online-Bandmedien" -Verbose | Format-List Name,MediaSet,OverwriteProtectedUntilDate,OverwriteProtectedUntilDate -Force

Name                        : A003L5
MediaSet                    : Monatssicherungen (12 Monate schreibschutz)
OverwriteProtectedUntilDate : 01.02.3456 18:39:53
OverwriteProtectedUntilDate : 07.08.9012 18:39:53

In meinem Auftrag wurden diese Informationen verwendet um in regelmäßigen Zeitabständen eine „Idiotensichere“ Mail zu generieren, welche den „Bandwechselmitarbeitern“ mitteile welche Bänder aus dem Roboter entnommen und abtransportiert bzw. welche neuen Bänder in welche Slots eingelegt werden müssen.

policyd-weight: warning: child: err: Undefined subroutine &main::dn_expand called

Örks – nach dem letzten Neustart hatte einer meiner Mailserver etwas Schluckauf an den Tag gelegt: Mails wurden nicht mehr angenommen, im Log zeigte sich policyd-weight als Verursacher:

warning: child: err: Undefined subroutine &main::dn_expand called at /usr/libexec/postfix/policyd-weight line 3591, ...

Ursache ist offenbar ein veralteter Aufruf der Library Net::DNS dieses Perl-Monsters. Ein passender Patch ist bei Debian zu finden, mit 3 geänderten Zeilen ist der Fehler erledigt und die Software wieder lauffähig.

+++ policyd-weight
72 -use Net::DNS::Packet qw(dn_expand);
3591 -            my ($dn, $offset) = dn_expand(\$qb, 0);
3591 +	    my ($decoded, $offset) = decode Net::DNS::DomainName(\$qb);
3592 +            my $dn = $decoded->name;

 

Microsoft SQL Server: Zugangsdaten wiederherstellen

Wer ein System verwalten will benötigt ein passendes Administrationspasswort. Dumm, wenn das System von nicht mehr erreichbaren Dritten eingerichtet wurde und keine brauchbare Dokumentation existiert. So  geschehen bei einem System mit Microsoft SQL Server, zu welchem kein sa-Passwort vorlag und die Windows-Zugänge offenbar gesperrt wurden.

Falls es nicht ohnehin klar ist: All diese Schritte solltet ihr natürlich nur an Systemen durchführen, welche euch gehören bzw. in nur nach (schriftlicher) Absprache mit dem Besitzer. Wer sich an fremden Systemen vergeht bekommt Probleme  mit der jeweiligen Staatsanwaltschaft und/oder dem zuständigen Admin und die möchtet ihr beide nicht kennen lernen ;).

Erster Anlaufpunkt: Windows-Logins. Üblicherweise sollten lokale Windows-Administratoren immer Administrationszugang zum SQL-Server haben. Hierzu einfach als lokaler Admin anmelden und im SQL Management Studio (oder der jeweils anderen Managementsoftware) die Windows-Authentifizierung nutzen.
Bild: https://www.adlerweb.info/blog/wp-content/uploads/2016/05/sql1-300×226.png

Hat der vorherige Admin die Windows-Zugänge herausoperiert muss man etwas tiefer eingreifen:

  1. Stoppt alle Dienste und beendet alle Clients, welche den Datenbankserver nutzen
  2. Öffnet den „Sql Server Configuration Manager“
  3. Stoppt unter „SQL Server-Dienste“ alle laufenden Dienste
    Bild: https://www.adlerweb.info/blog/wp-content/uploads/2016/05/sql2-300×53.png
  4. Doppelklick auf den Dienst SQL Server (nicht Agent oder Browser) um die Einstellungen zu öffnen
  5. Unter „Erweitert“ findet sich der Punkt „Startparameter“. Diesen durch Doppelklick editierbar machen. Am Anfang der Zeile „-m;“ einfügen
    Bild: https://www.adlerweb.info/blog/wp-content/uploads/2016/05/sqlfix-300×62.png
    Hintergrund: Mit -m wird der Server in den „single user maintenance mode“ geschaltet. Hierbei können Windows-Admins eine Verbindung zum Server aufbauen, es ist jedoch nur eine Sitzung zulässig. Sollte sich also ein anderes Programm verbinden ist kein Zugriff zur Verwaltung mehr möglich.
  6. Einstellungsfenster schließen und nur den SQL Server-Dienst wieder Starten
  7. Eine Eingabeaufforderung/cmd mit Administrationsrechten starten und per sqlcmd mit dem Server verbinden. Da der Server-Browser gestoppt ist müssen die Serverdaten manuell angegeben werden:
    sqlcmd -E -S tcp:localhost\INSTANZNAME
  8. Nun erstellen wir uns einen entsprechenden Zugang zum Server. Ich verwende den lokalen Systemadministrator, es ist jedoch auch möglich andere Nutzer, auch z.B. aus einer Domäne, so hinzuzufügen
    create login [SERVERNAME\Administrator] from windows;
    EXEC sp_addsrvrolemember 'SERVERNAME\Administrator','sysadmin';
    GO;
  9. Sollte der Befehl ohne Fehlermeldungen abschließen ist der Nutzer eingerichtet. Das sqlcmd-Fenster kann geschlossen werden
  10. Um den Wartungsmodus abzuschalten stoppen wir im Sql Server Configuration Manager den Serverdienst, gehen wieder wie zuvor in die Eigenschaften und entfernen das „-m;“ wieder aus den Startparametern
  11. Zuletzt werden alle zuvor aktiven SQL-Serverdienste wieder gestartet. Da an den bestehenden Logins keine Änderung vorgenommen wurde sollten Clients und Dienste unverändert wieder funktionieren. Zusätzlich sollte der angegebene Nutzer nun über Windows-Authentifizierung volle Administrationsrechte auf den Server besitzen.

Getestet mit 2008R3, sollte aber auch mit allen anderen zwischen 2005 und 2016 funktionieren.

Now fail already! Wenn der Browser über Umwege XOrg lahmlegt

Ugh. Schon wieder. Das Rattern in der Ecke hat meist eine recht konstante Ursache: Die CPU meines Laptops läuft auf 100% und sorgt für ordentliche Lüfterdrehzahlen. Gehen wir mal auf Ursachensuche:

Bei CPU-Last ist erster Anlaufpunkt natürlich top/htop. In meinem Fall aber leider nicht sehr Hilfreich: Xorg sei der Verursacher. Weites Feld. Aus meiner Erfahrung geht dann der Blick erst mal auf die laufenden Programme. Nicht selten hat sich auf einer geöffneten Webseite eine Flash-Werbung, ein HTML5-Video oder sonstige zappelnde Dinge mit Nervfaktor versteckt und bringen das Rendering in Gang. Leider konnte ich dieses mal nichts finden. Auch der interne Taskmanager von Google Chrome zeigt – anders als in solchen Fällen üblich – keine auffällig hohen Lasten. Um sicher zu gehen halte ich per SIGSTOP alle UI-Programme kurz an – keine Änderung. Es ist also mit hoher Wahrscheinlichkeit keine Grafikausgabe, welche die Probleme auslöst.

Zurück zum Start. Wir wissen, dass Xorg die Last bringt, allerdings vermutlich nicht im Grafikbereich. Schauen wir uns top nochmal genauer an. Die Browser sind noch in SIGSTOP und entsprechend verschwunden. Hinter XOrg macht sich nun dbus breit. Dbus? Kurze Lastspitzen OK, aber Dauerlast? Ein Blick mit dbus-monitor bringt eine Wall-of-log zum Vorschein:

method call time=1462212788.744495 sender=:1.1259306 -> destination=org.freedesktop.DBus serial=6 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=RemoveMatch
   string "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',path='/org/freedesktop/DBus',arg0='org.gtk.vfs.Daemon'"
method return time=1462212788.744507 sender=org.freedesktop.DBus -> destination=:1.1259306 serial=6 reply_serial=6
method call time=1462212788.744535 sender=:1.1259306 -> destination=org.freedesktop.DBus serial=7 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
   string "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',path='/org/freedesktop/DBus',arg0='org.gtk.vfs.Daemon'"
method return time=1462212788.744544 sender=org.freedesktop.DBus -> destination=:1.1259306 serial=7 reply_serial=7
method call time=1462212788.744600 sender=:1.1259306 -> destination=org.freedesktop.DBus serial=8 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=StartServiceByName
   string "org.gtk.vfs.Daemon"
   uint32 0
method return time=1462212788.744611 sender=org.freedesktop.DBus -> destination=:1.1259306 serial=8 reply_serial=8
   uint32 2
method call time=1462212788.744748 sender=:1.1259306 -> destination=org.freedesktop.DBus serial=9 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=GetNameOwner
   string "org.gtk.vfs.Daemon"
method return time=1462212788.744761 sender=org.freedesktop.DBus -> destination=:1.1259306 serial=9 reply_serial=9
   string ":1.1258771"
method call time=1462212788.744895 sender=:1.1259306 -> destination=:1.1258771 serial=10 path=/org/gtk/vfs/mounttracker; interface=org.gtk.vfs.MountTracker; member=LookupMount
   struct {
      array of bytes "/NAME@DOMAIN.org" + \0
      array [
         dict entry(
            string "query"
            variant                array of bytes "subject=blabla&body=blabla" + \0
         )
         dict entry(
            string "type"
            variant                array of bytes "mailto" + \0
         )
      ]
   }
error time=1462212788.745079 sender=:1.1258771 -> destination=:1.1259306 error_name=org.gtk.GDBus.UnmappedGError.Quark._g_2dio_2derror_2dquark.Code15 reply_serial=10
   string "Der angegebene Ort wird nicht unterstützt"

…und das in Endlosschleife. Uhm, ja. mailto? Das sind üblicherweise Links in Webseiten oder Dokumenten um E-Mails zu versenden. Stimmt, ich hatte vor einigen Stunden auf einer Webseite einen Mail-Link angeklickt. Ohne Reaktion.

Offenbar hat sich die DE an eben diesem Maillink festgefressen. „Der angegebene Ort wird nicht unterstützt“. Kein Wunder, denn in den „Standardprogrammen“ ist für E-Mails nichts hinterlegt. Anstatt das Ganze aber einfach als Fehlschlag einzuordnen und abzubrechen wird die Aktion in Endlossschleife ständig wiederholt. Da auch Xorg an Dbus hängt (und offenbar nicht sonderlich effizient auf dessen Events reagiert) geht auch dieser in die Knie. Da ich auf die Schnelle keine Möglichkeit fand das dbus-event rauszuwerfen musste ein Dummy-Mailprogramm hinhalten. Event geht rein, Returncode kommt, Dbus gibt Ruhe. Warum nicht gleich so?

Ranttime #10 – Übertriebene Usability: FreeDownloadManager

Der FreeDownloadManager war immer meine Software der Wahl wenn es darum ging unter Windows größere Mengen an Dateien aus dem Internet zu laden. Mit der neuen Version hat man aber „die Usability verbessert“. Oder anders gesagt: Alle Funktionen entfernt um die Oberfläche Idiotensicher zu machen.

PHP: Binärdaten als Float interpretieren

Aktuell arbeite ich daran Binärdaten einer Steuerung für ein Logging-System zu übersetzen. Die Daten werden – mit verschiedenen Formaten – per TCP angeliefert und kommen in etwas ungewöhnlichen Formaten (MSB/LSB, Füllbits, etc) herein. Die erste Aufgabe meines Scriptes besteht entsprechend darin die Daten in Binärform aufzubereiten. Das meiste sind ASCII-Werte, welche per chr() schnell übersetzt sind. Auch das Zusammensetzen von vorzeichenlosen Integern ist mit etwas Shiften kein Problem.

Gegen die Wand lief ich dann allerdings bei Kommawerten. Zwar nutzt sowohl die Steuerung als auch PHP Gleitkommazahlen nach IEEE754, allerdings lässt sich PHP mit dem üblichen Type-juggling/casting nicht dazu überreden die Binärdaten als Float zu interpretieren. Die Lösung fand sich (wie üblich) auf Stackoverflow: pack/unpack.

$input = 0xbf9e0419;
var_dump(unpack('f', pack('i', $input)));

Und schon weiß auch PHP, dass 0xbf9e0419 eine -1.2345 ist. Commence logging.

Script: Automatisches LetsEncrypt-Renewal

In BitBastelei #178 hatte ich schon das Anfordern von Zertifikaten über LetsEncrypt gezeigt. Leider konnte ich bisher keine vernünftige Möglichkeit finden Zertifikaten automatisch erneuern zu können. Glücklicherweise hilft hier ein Bash-Script von Stefan Beckers weiter: Es sucht die installierten Zertifikate, prüft welche bald ablaufen und erneuert diese. Guter Startpunkt, aber nicht ganz für meine Anforderungen geeignet: Im Script wird letsencrypt-auto verwendet, welches in meinem System nicht installiert ist. Auch die Syntax des Clients scheint sich geändert zu haben. Weiterhin ist das Script stark auf Debian fixiert.

Etwas Bash-Foo selbst ist alles auf meine Bedürfnisse angepasst: Pfade & Binaries lassen sich einfacher ändern, die Syntax ist aktuell wieder lauffähig und es lässt sich pro Domain angeben welche Dienste bei einem Renew neu gestartet werden müssen. Nicht groß getestet, bisher scheinen aber noch keine Katzen geplatzt zu sein. Vielleicht hifts ja…