Archiv der Kategorie: Software

Alles was mit Software zu tun hat

Windows/GPG/Smartcard – GPG mit Powershell bei SC-Verbindung neu starten

Beim Thema E-Mail-Verschlüsselung ist GPG weit verbreitet. Die Gundfunktionen sind z.B. mit Thunderbird und Enigmail oder gar eine Appliance auch für Einsteiger nutzbar und durch das WoT erstpart man sich die Abhängigkeit von – teils Zweifelhaften – zentralen Zertifizierungsstellen. Ich selbst nutze seit einiger Zeit keinen Softwareschlüssel sondern ein dediziertes HSM (Hardware Security Module) in Form eines YubiKey. Hiermit befindet sich der Key nicht mehr auf dem PC und auch die Verschlüsselung/Signierung läuft in Teilen auf dem Prozessor des YubiKey. Was unter Linux ohne große Änderungen funktioniert macht bei Windows eher wenig Spaß. Zwar ist auch GPG4Win in der Lage mit CryptoCards & Co umzugehen, häufiges Ein- und Ausstecken führt jedoch schnell zu einem hängenden GPG-Agent oder Absturzen der scdaemon.exe (GPG SmartCard Daemon). Einzige Abhilfe: Alle GPG-Prozesse beenden und neu starten. Da Verschlüsselung und Windows ohnehin eher selten zu finden ist sind auch Informationen dazu dünn gesät. Da ich teilweise um das System aus Redmond nicht herum komme und ein Fix in GPG4Win nicht in Sichtweite ist muss also wieder einmal der Holzhammer her: Irgendwie muss beim Einstecken des USB-Gerätes das GPG-System zurückgesetzt werden.

Also frisch ans Werk. Als Sprache soll mal wieder Powershell herhalten – direkt verfügbar, halbwegs systemnah, sollte passen. Über WMI kann man sich auch über ab- und angesteckte Geräte informieren lassen. Leider konnte ich keine Möglichkeit finden weitere Infos wie z.B. Hersteller oder Treiber gleich mit zu erhalten. Da sonst eher wenig Gerätefluktuation zu erwarten ist ziehe ich die „passt scho“-Karte und werde das GPG-System bei jedem neu auftauchenden Gerät einmal zurücksetzen.

#Requires -version 2.0
Register-WmiEvent -Class Win32_DeviceChangeEvent -SourceIdentifier deviceChange
write-host (get-date -format s) " Beginning script..."
do {
    $newEvent = Wait-Event -SourceIdentifier deviceChange
    $eventType = $newEvent.SourceEventArgs.NewEvent.EventType
    $eventTypeName = switch($eventType) {
        1 {"Configuration changed"}
        2 {"Device arrival"}
        3 {"Device removal"}
        4 {"docking"}
    }
    write-host (get-date -format s) " Event detected = " $eventTypeName

    $newEvent.SourceEventArgs.NewEvent | fl

    if ($eventType -eq 2) {
            write-host (get-date -format s) " Starting task in 3 seconds..."
            start-sleep -seconds 3
            taskkill /T /F /IM gpg-agent.exe
            taskkill /T /F /IM scdaemon.exe
            taskkill /T /F /IM kleopatra.exe

            start -FilePath 'C:\Program Files (x86)\GNU\GnuPG\gpg-agent.exe' -ArgumentList '--daemon' -WorkingDirectory 'C:\Program Files (x86)\GNU\GnuPG\' -LoadUserProfile -WindowStyle Minimized
    }
    Remove-Event -SourceIdentifier deviceChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier deviceChange

Das Grundkonstrukt selbst scheint von Andy.L13 zu stammen, die kläglichen versuche von Mass-Storage auf andere USB-Geräte umzustellen stammen von mir. In Zeile 24 kann man für WindowStyle statt Minimized auch Hidden nutzen um das Ganze im Hintergrund laufen zu lassen – ich bevorzuge ein optisches Feedback. Das Script kann passend in Autostart oder als geplanter Task verstaut werden.

Sicher keine saubere Lösung, aber „works for me“.


Edit: Stackoverflow (bzw warriorpostman) liefert

Das folgende Script reagiert nur noch auf den vom YubiKey emulierten Smartcard-Reader. Das Objekt $Event.SourceEventArgs.NewEvent.TargetInstance sieht wie folgt aus – die Informationen für’s Query sollten sich im Gerätemanager finden lassen:

__GENUS                     : 2
__CLASS                     : Win32_PnPEntity
__SUPERCLASS                : CIM_LogicalDevice
__DYNASTY                   : CIM_ManagedSystemElement
__RELPATH                   : Win32_PnPEntity.DeviceID="USB\\VID_1050&PID_0116&MI_02\\6&***&0&0002"
__PROPERTY_COUNT            : 24
__DERIVATION                : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER                    : TESTRECHNER
__NAMESPACE                 : root\CIMV2
__PATH                      : \\TESTRECHNER\root\CIMV2:Win32_PnPEntity.DeviceID="USB\\VID_1050&PID_0116&MI_02\\6&***&0&0002"
Availability                : 
Caption                     : Microsoft Usbccid-Smartcard-Leser (WUDF)
ClassGuid                   : {50dd5230-ba8a-11d1-bf5d-0000f805f530}
CompatibleID                : {USB\Class_0b&SubClass_00&Prot_00, USB\Class_0b&SubClass_00, USB\Class_0b}
ConfigManagerErrorCode      : 0
ConfigManagerUserConfig     : False
CreationClassName           : Win32_PnPEntity
Description                 : Microsoft Usbccid-Smartcard-Leser (WUDF)
DeviceID                    : USB\VID_1050&PID_0116&MI_02\6&***&0&0002
ErrorCleared                : 
ErrorDescription            : 
HardwareID                  : {USB\VID_1050&PID_0116&REV_***&MI_02, USB\VID_1050&PID_0116&MI_02}
InstallDate                 : 
LastErrorCode               : 
Manufacturer                : Microsoft
Name                        : Microsoft Usbccid-Smartcard-Leser (WUDF)
PNPDeviceID                 : USB\VID_1050&PID_0116&MI_02\6&***&0&0002
PowerManagementCapabilities : 
PowerManagementSupported    : 
Service                     : WUDFRd
Status                      : OK
StatusInfo                  : 
SystemCreationClassName     : Win32_ComputerSystem
SystemName                  : TESTRECHNER
PSComputerName              : TESTRECHNER

Ich werde mich am Service WUDFRd (aka Gerät mit Windows SmartCard-Treber) orientieren. Prinzipiell könne man aber auch auf die USB-ID triggern uns so Scripte bauen, welche bei einstecken eines USB-Sticks ein Backup durchführen oder bei verbinden einer unbekannten USB-Tastatur entsprechend reagieren (böse Ente). Das zugehörige Script:

$query =  "Select * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity' AND TargetInstance.Service = 'WUDFRd'"

if( Get-EventSubscriber | Where-Object {$_.SourceIdentifier -eq "YubiHammer"}) {
    Unregister-Event YubiHammer
}

Register-WmiEvent -Query $query -SourceIdentifier YubiHammer -Action{
    $Global:RemoteProcMon=$event 

    start-sleep -seconds 3
    taskkill /T /F /IM gpg-agent.exe
    taskkill /T /F /IM scdaemon.exe
    taskkill /T /F /IM kleopatra.exe

    start -FilePath 'C:\Program Files (x86)\GNU\GnuPG\gpg-agent.exe' -ArgumentList '--daemon' -WorkingDirectory 'C:\Program Files (x86)\GNU\GnuPG\' -LoadUserProfile -WindowStyle Minimized
}

 

Kurztest VP9 vs. X.265

Rendering fertig und nächstes Projekt kopiert noch, also mal ein schneller Blick wie sich VP9 inzwischen schlägt.

Quellmaterial sind 85 Sekunden Video, davon 8 Sekunden Standbild und 12 Sekunden 50:50. Das Rendering erfolgt über MLT mit x265 1.9 bzw. libvpx 1.5.0 auf einem Intel Xeon W3680 Hexacore. Beide werden mit einem CRF von 23 angesteuert (jaja, ist übertrieben hoch).

VP9 ist beim Encoding klar im Nachteil, da standardmäßig nur ein einziger Kern genutzt werden kann.

VP9 benötigt für das Rendering 18:40 Minuten, die Zieldatei belegt 141MB. Die Bitrate liegt bei durchschnittlich 13491kb/s.

X265 liegt mit 09:40 Minuten knapp darunter. Die Zieldatei ist mit 37MB jedoch deutlich kleiner. Die Bitrate liegt im Schnitt bei 3475kb/s.

Die Bildqualität können andere beurteilen, ich sehe mit dem Auge nichts.

 

Windows Server 2012R2: Dienststörung durch Shellhardwareerkennung (ShellHWDetection)

Wieder ein roter Kasten im Server Manager: Ein kritischer Fehler bei den Diensten mehrerer Server: Die „Shellhardwareerkennung“ aka „ShellHWDetection“ wäre nicht gestartet.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2016/09/shellhw01-300×214.png

Dienstkunde

Erste Frage: Was macht der Dienst denn? Nunja, er kümmert sich um „lebenswichtige“ Dinge wie Autostart von CD, Erkennung von SD-Karten oder das Management von Dockingstationen eines Laptops. Wegen seiner Kritikalität wird der Dienst unter Windows auch nur dann gestartet, wenn ein Nutzer aktiv am Rechner oder per RDP angemeldet ist. Der Fehler im Servermanager wird also immer dann ausgelöst, wenn kein Nutzer interaktiv am Rechner arbeitet.

Stummschaltung

Kurzfassung: Ruhe bitte. Der gestoppte Dienst ist ein Normalzustand und sollte folglich auch nicht als Fehler angekreidet werden. Um die Meldung zu unterdrücken öffnen wir im Servermanager das Dashboard und suchen die Gruppe/Box „Alle Server„. Durch einen Klick auf „Dienste“ öffnet sich die Detailansicht in einem neuen Fenster. Dort kann man im Dropdown-Menü „Dienste“ den Haken der Shellhardwareerkennung entfernen. Die Meldungen sollten nun verschwinden und fortan bei keinem Entscheider mehr Stirnrunzeln verursachen können.

Bild: https://www.adlerweb.info/blog/wp-content/uploads/2016/09/shellhw02-300×214.png

Hat man selbst weitere Servergruppen definiert muss man die Schritte für jede entsprechend wiederholen.

Windows Server 2012R2: „Ereignisdaten können nicht abgerufen werden“ durch LDS-Rolle

Eigentlich ist der Server Manager ja eine tolle Idee: Windows-Server können hiermit auch von Personen ohne Textkonsolenaffinität in großen Teilen zentral verwaltet werden. Dumm nur, wenn entscheiderabweisende, rote Fehlermeldungen das Dashboard zieren. Klickt man eine dieser Warnungen an erscheint als Serverstatus

Online – Ereignisdaten können nicht abgerufen werden

Auch die Details sind nicht wesentlich aussagekräftiger:

Ereignisse aus adam.events.xml konnten nicht aufgezählt werden

Ursache in meinem Fall: Microsoft Active Directory Lightweight Directory Services (AD LDS). Diesen hatte ich seinerzeit,in der Vermutung, dass er für einen LDAP-Zugriff auf das AD notwendig wäre, mit angeklickt. Knackpunkt: Er wurde nie fertig eingerichtet. Der hierzu nötige Wizzard ist nur im Startmenü zu finden und wird nicht, wie bei anderen Rollen üblich, direkt im Servermanager verlinkt. Durch die fehlende Konfiguration wird eine Warnung generiert, welche ihrerseits wegen eines Fehlers im Servermanager nicht korrekt angezeigt wird.

Als Lösung kann man entweder die LDS-Rolle über das Startmenü fertig konfigurieren oder – wenn man sie wie ich wegen falscher Vermutungen installierte – einfach entfernen. Ein LDAP-Zugriff auf das AD ist auch ohne sie möglich.

Graylog: Informationen durch Regex-Pipeline extrahieren

Graylog ist ein System zum zentralen Sammeln und Auswerten von Log-Meldungen. Das System selbst ist open source und basiert auf Java. Mit der neuen Version wurde die Funktion „Processing Pipelines“ eingeführt, welche es erlaubt eingehende Log-Meldungen durch Scripte weiter anzureichern.

In meinem Fall lasse ich den Proxyserver Squid seine Zugriffe auf den Graylog-Server protokollieren, dort kommt hierdurch jedoch ausschließlich die nicht weiter aufgeschlüsselte Zeile im Squid Log Format an. Über eine Pipeline mit Regex wird diese weiter zerlegt und in einzelne Felder aufgeteilt, sodass ein granulareres Suchen möglich ist.

Das Ganze ist nur als Testaufbau zu sehen, es fehlt eine Fehlerbehandlung etc. Da ich aber etwas an der Syntax hing hilft es eventuell ja anderen Suchenden. Wichtig ist es die Backslashes selbst zu escapen um als gültiger Java-Code angenommen zu werden. Die Benennung der Treffer durch das letzte Array im Regex-Aufruf ist optional – ohne werden die Treffer mit 0 beginnend durchnummeriert.

rule "test squid"
when
    contains(to_string($message.message), "HIER_DIRECT")
then
    let sqmat = regex(".*([\\d\\.]+)\\s+(\\d+) ([\\d\\.\\:A-Fa-f]+) (\\w+)/(\\d+) (\\d+) (\\w+) ([^ ]+) \\- HIER_DIRECT/([\\d\\.\\:A-Fa-f]+) ([^\\s]+).*", to_string($message.message), ["timestamp", "duration", "user", "result", "status", "bytes", "method", "url", "mime"]);
    set_field("squid_request", true);
    set_field("squid_duration", sqmat.groups.duration);
    set_field("squid_user", sqmat.groups.user);
    set_field("squid_result", sqmat.groups.result);
    set_field("squid_status", sqmat.groups.status);
    set_field("squid_bytes", sqmat.groups.bytes);
    set_field("squid_method", sqmat.groups.method);
    set_field("squid_url", sqmat.groups.url);
    set_field("squid_mime", sqmat.groups.mime);
end

Arch Linux/Aur: stcgal zur Programmierung von STC 8051-Klonen

stcgal ist ein in Python geschriebenes Tool um 8051-Nachbauten der Firma STCMicro zu programmieren. Die MCUs verfügen über einen seriellen Bootloader und kommen vor allem in Produkten und Bausätzen aus Fernost als günstige Zentraleinheit zum Einsatz.

Da mit sdcc und MCU 8051 IDE bereits ein großer Teil des Toolsets im Repo und auf AUR rumfliegt habe ich stcgal nun auch mal hinzugefügt, so kann man ohne großes Gefummel eine komplette Bastelumgebung aufsetzen.

OnePlusOne / TWRP / Android 6.0.x: Entschlüsseln nicht möglich

…und nur noch schnell ein Backup machen – oder auch nicht. Während der Erstellung eines Handy-Backups über TWRP auf meinem OPO konnte ich plötzlich den verschlüsselten Datenbereich nicht mehr freischalten. Zuletzt nutzte ich diese Funktion unter Android 5, entsprechend dürfte wohl Marshmallow der Verursacher sein.

Bei der Verschlüsselung wird beim OPO eine Funktion des Prozessors genutzt. Die hierzu verwendete API wurde offenbar in CM13 geändert, sodass TWRP an dieser Stelle in’s leere greift. Im passenden Bug-Report wurde das Problem bereits ausführlich behandelt, ein Patch für die Version 3.0.3 angekündigt – welche weiterhin auf sich warten lässt. Für die Übergangszeit hat AtAM1 ein passendes Image bereitgestellt. Mit dem konnte dann auch die Recovery an die Daten ran und ein Backup erstellen. Fein.

virt-manager/libvirt: Installation nicht möglich: virtlogd-sock

Beim Erstellen einer neuen VM über virt-manager erhielt ich heute folgende Meldung:

Installation konnte nicht fertiggestellt werden: «Socket-Erstellung zu '/var/run/libvirt/virtlogd-sock' fehlgeschlagen: Datei oder Verzeichnis nicht gefunden»

Traceback (most recent call last):
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 88, in cb_wrapper
callback(asyncjob, *args, **kwargs)
File "/usr/share/virt-manager/virtManager/create.py", line 2288, in _do_async_install
guest.start_install(meter=meter)
File "/usr/share/virt-manager/virtinst/guest.py", line 461, in start_install
doboot, transient)
File "/usr/share/virt-manager/virtinst/guest.py", line 396, in _create_guest
self.domain = self.conn.createXML(install_xml or final_xml, 0)
File "/usr/lib/python2.7/site-packages/libvirt.py", line 3777, in createXML
if ret is None:raise libvirtError('virDomainCreateXML() failed', conn=self)
libvirtError: Socket-Erstellung zu '/var/run/libvirt/virtlogd-sock' fehlgeschlagen: Datei oder Verzeichnis nicht gefunden

Ursache ist das Logging, welches in einen eigenen Dienst ausgelagert wurde. Neben libvirtd muss nun auch virtlogd vor dem Start der VM geladen werden. Für systemd-Nutzer heißt das also…

systemctl start virtlogd
systemctl enable virtlogd

 

Gentoo: Pakete von Distcc/pump ausnehmen

Verteiltes Kompilieren mit distcc und pump macht vor allem auf langsamen Systemen eine Menge Sinn. Leider vertragen nicht alle Pakete diese Lastverteilung, so z.B. mysql/mariadb. Um einzelne Pakete von distcc oder pump auszunehmen geht man wie folgt vor:

Folgende Dateien erstellen:

FEATURES="${FEATURES} -distcc -distcc-pump"
FEATURES="${FEATURES} -distcc-pump"

Nun ggf. den Ordner /etc/portage/package.env anlegen und dort – analog zu package.use/package.keywords/… – dateien für die Pakete anlegen, z.B.

dev-db/mariadb no-distcc-pump.conf

So wird z.B. für MariaDB der Pump-Modus abgeschaltet, distcc bleibt jedoch aktiv. Alternativ kann die ebenfalls erstellte no-distcc.conf verwendet werden um das verteilte Kompilieren komplett zu unterbinden.

Gentoo: OpenSSL ohne ECDHE

Unter Gentoo unterstützt OpenSSL standardmäßig kein ECDHE, welches für aktuelle Crypto kaum wegzudenken ist. Ursache sind die Lizenzbestimmungen bzw. Patente: Teile der Quellen dürfen ausschließlich als Sourcecoude verteilt werden und müssen daher aus vorkompilierten Teilen wie z.B. der Stage3 entfernt werden. Dieses entfernen wird über die USE-Flag „bindist“ (Binary distribution) gesteuert, welche standardmäßig eingeschaltet ist. Um OpenSSL mit EC-Cryoto zu bauen muss bindist entfernt werden – z.B. durch ein „-bindist“ in der globalen make.conf. Nach rebuild von OpenSSL und OpenSSH (sowie ggf anderer Abhängigkeiten und darauf aufbauende Software wie der Webserver) per

emerge -vuaDN openssl openssh

sollte die Crypto auch unter Gentoo verfügbar sein.