MariaDB Bugfix sorgt für ein bisschen Ärger

Ein kleiner selbstverursachter Logikfehler bei Datenbankstrukturen macht kleinen Webanwendungen grade ein bisschen Stress. Damit Ihr damit keinen Stress habt, eine kurze Erklärung zum Thema und wie man das behebt und vermeidet.

MariaDB Update

Bis vor kurzem hatten wir auf den Servern noch die MariaDB 10.1.33 laufen, jetzt die 10.2.21 . Beim Wechsel von 10.1 auf  10.2 haben die Devs von MariaDB den globalen SQL-Modus umgestellt, daß er jetzt eher failed, statt tolerant zu sein.

Eine Beispieltabelle:

beispiel

#NameTypKollationAttributeNullStandardKommentareExtra
1 int(11) Neinkein(e)AUTO_INCREMENT
2 int(11) Nein2
3 text utf8_general_ciNein
4 int(11) Neinkein(e)

Jetzt führen wir diesen Insert aus:

INSERT INTO beispiel SET id=NULL, test = 3, name=“Fritz“, counter = 0;

Klappt. Kein Fehler. Nächster Insert :

INSERT INTO beispiel SET name=“Hans“, counter = 0;

Klappt.Tabelle sieht jetzt so aus :

testnamecounterid
3Fritz01
2Hans02

Nun der Insert hier:

INSERT INTO beispiel SET id=NULL, test=9,name=“Killer“;

und schon kommt die Meldung:

ERROR 1364 (HY000): Field ‚counter‘ doesn’t have a default value

Vollkommen zurecht, weil ich im Insert der Datenbank durch Auslassung gesagt habe, nimm den Defaultwert für das ausgelassene Feld.  Da es keinen Defaultwert für das Feld gibt, kann die Datenbank den auch nicht benutzen.

Jetzt ist das aber in MariaDB 10.1 noch möglich gewesen. Das lag daran, daß sich mit 10.2.4 die Defaults des Servermode geändert haben und der Modus „STRICT_TRANS_TABLES“ jetzt aktiv ist, wenn die  Webanwendung das nicht selbst anders haben will. Beweis:

MariaDB [msctest]> INSERT INTO beispiel SET id=NULL, test=9,name=“Killer“;
ERROR 1364 (HY000): Field ‚counter‘ doesn’t have a default value
MariaDB [msctest]> SELECT @@SQL_MODE;
+——————————————————————————————-+
| @@SQL_MODE |
+——————————————————————————————-+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+——————————————————————————————-+
1 row in set (0.00 sec)

MariaDB [msctest]> set sql_mode = „ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION“;
Query OK, 0 rows affected (0.00 sec)

MariaDB [msctest]> INSERT INTO beispiel SET id=NULL, test=9,name=“Killer“;
Query OK, 1 row affected, 1 warning (0.00 sec)

Jetzt die spannende Frage, mit was die Datenbank den Wert aufgefüllt hat, von dem Sie nicht weiß, wie der aussehen müßte:

idtestnamecounter
13Fritz0
22Hans0
59Killer0

Mit „0“ , was bei einem INT ja auch naheliegend ist.

Klare Ansage

Bevor jetzt jemand den MariaDB Entwicklern die Schuld dafür geben will, daß die eigene Webseite nicht mehr so funktioniert: selbst Schuld!

Ihr habt von vornherein einen Logikbug in Eurer Datenbankstruktur + Weblogik gehabt, sich darüber zu beschweren ist heuchlerisch. Da die Webanwendung sich selbst den Modus setzen kann, mit dem die Datenbank mit Ihr arbeiten soll, hätte man das ja auch mal selbst explizit so setzen können, wie man es braucht. Defaults können sich ändern, damit muß man rechnen.

Abhilfe schaffen

  1. Datenbankstruktur so ändern, daß ein Default vorhanden ist.
  2. Im Insert keine Felder auslassen, sondern explizit setzen.
  3. vor der Anwendung set sql_mode = „ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION“;  absetzen, dann hat man wieder das alte Verhalten

Viel Spaß jetzt damit 🙂

Die Größe von installierten Paketen ermitteln – RPM Edition

Was Niko in seinem Techgruben-Beitrag Größe von installierten Paketen anzeigen für debianbasierte Paketmanager schön gezeigt hat, geht leider bei RPMs nicht ganz so leicht, aber das wird uns nicht aufhalten. @Nico: Guter Beitrag.Weitermachen 🙂  In meinem Beitrag geht es heute nicht nur um die Größe, sondern auch um das „wie man zum Ergebnis kommt“. Wer die Lösung sucht, die ist ganz am Ende.

Die Größe von installierten Paketen ermitteln

Die Option „-q“ steht bei rpm für Query, also die Datenbankabfrage. rpm -q paketname  liefert den vollständigen Paketnamen aus. Einfaches Beispiel:

$ rpm -q firefox
firefox-65.0-4.fc28.x86_64

Wir haben den Paketnamen, klasse. Und nun ? Wenn wir mehr über Firefox wissen möchten, dann müssen wir RPM das sagen:

$ rpm -qi firefox
Name : firefox
Version : 65.0
Release : 4.fc28
Architecture: x86_64
Install Date: Mo 18 Feb 2019 12:01:46 CET
Group : Unspecified
Size : 221446243
License : MPLv1.1 or GPLv2+ or LGPLv2+
Signature : RSA/SHA256, Di 05 Feb 2019 12:51:38 CET, Key ID e08e7e629db62fb1
Source RPM : firefox-65.0-4.fc28.src.rpm
Build Date : Mo 04 Feb 2019 19:07:57 CET
Build Host : buildvm-20.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : https://www.mozilla.org/firefox/
Bug URL : https://bugz.fedoraproject.org/firefox
Summary : Mozilla Firefox Web browser
Description :
Mozilla Firefox is an open-source web browser, designed for standards
compliance, performance and portability.

Die Option „i“ gibt uns also detaillierte Informationen über das Paket aus. Da könnte man mit grep und viel Bashmagie was drehen. Bleibt noch das Problem, daß wir den Paketnamen brauchen. Das können wir leicht umgehen, in dem wir pauschal alle Pakete auflisten lassen. Die Option „-a“ macht es möglich:  rpm -qia  . Probiert es nicht aus, das ist echt viel an Infos 🙂

Das Queryformat

Natürlich geht das besser, denn RPM bietet an, daß es die Infos genauso ausgibt wie man es braucht. Die nötige Option lautet „–queryformat“ :

$ rpm -q firefox –queryformat „%{NAME} uses %{SIZE:humaniec}\n“
firefox uses 211M

Schön, damit kann man arbeiten 🙂 Die Größe nach vorn, Paketname dahinter:

$ rpm -q firefox –queryformat „%{SIZE:humaniec}:%{NAME}\n“
211M:firefox

Das ist schon besser. Da kann man einen Sort drauf ansetzen:

rpm -qa –queryformat „%{SIZE:humaniec}:%{NAME}\n“ | sort -r -n

„-r -n“  Reverse, also groß zuerst, und numerisch sortieren. Sort erkennt automatisch, was keine Zahl mehr ist und sortiert entsprechend. Aber stimmt die Ausgabe auch wirklich?

Schauen wir uns mal die Top 30 an :

$ rpm -qa –queryformat „%{SIZE:humaniec}:%{NAME}\n“ | sort -r -n | head -n 30

1024K:python2-coverage
1022K:openssh-server
1019K:xorg-x11-drv-wacom
1019K:libgcrypt
1018K:tix
1016K:libmx
1015K:vte
1015K:python2-simplejson
1010K:pyzy
1009K:ncurses-libs
1008K:libappstream-glib
1007K:libxcb
1007K:libodfgen
1007K:boost-locale
1006K:eris
1006K:dracut
1004K:libxcb
1004K:libtomcrypt
1003:openoffice-brand-impress
1002:openoffice-brand-writer
1000:openoffice-brand-math
1000:openoffice-brand-draw
1000:openoffice-brand-calc
1000:openoffice-brand-base
999K:at-spi
997K:vte3
996K:mdadm
995K:rubberband
995K:ncurses-libs
994K:cjs

Ein Paket mit 1024 KB, also 1 MB, soll das größte Paket in der Liste sein? Das kann nicht sein.  Ist es auch nicht. Schon das Firefoxpaket von oben hat 211 MB. Wo ist da jetzt der Fehler?

Ist klar, wir lassen die Paketgröße mit dem Zusatz „:humaniec“ ausgeben. Das erzeugt die 211M oder 1024K , weil „211M:firefox“ besser lesbar ist für Menschen, also „221446243:firefox“. Nun ist aber 1024 größer als 211 🙂 Sort hat also alles richtig gemacht, aber die sortierten Informationen waren falsch vorbereitet.

So wird es besser

$ rpm -qa –queryformat „%{SIZE}:%{NAME}\n“ | sort -r -n | head -n 30
2104146639:0ad-data
573182723:supertuxkart-data
526795437:wesnoth-data
369138973:wine-debuginfo
346355557:linux-firmware
319608404:naev-data
250326767:wine-staging64
242843598:skypeforlinux
236453994:wine-core
221999655:wine-staging-common
221446243:firefox

Wenig überraschend toppt 0.AD alle anderen Pakete mit seinen 2GB an Grafikdaten 😉 Firefox mit seinen 211 M liegt abgeschlagen auf Platz 11 😉

Es geht auch etwas kürzer, aber nicht viel:

rpm -qa –qf „%{SIZE}:%{NAME}\n“ | sort -rn | head -30

Natürlich habe ich mal rumgeschaut, was zu dem Thema schon mal verfasst wurde. Leider war nichts besseres da, da es wohl schon das Optimum ist. Aber man kann natürlich immer noch was daraus lernen, z.b. wie man mit AWK Bytes in MB umrechnen kann :

rpm -qa –qf ‚%{SIZE} %{NAME}\n‘ | awk ‚{printf(„%sMb %s\n“, $1 / 1000 / 1000, $2)}‘ | sort -k1 -n

Dummerweise funktioniert das Sort in der Ausgabe nicht sauber, aber der AWK Teil ist nett 🙂
(Quelle für den AWK Part: list-all-packages-by-installed-size-bytes-on-rpm-distros )

 

…und TLS 1.3 gebleichenbacht :(

Wenn Du denkst, Du hast gute Krypto installiert, kommt ein Bleichenbacher um die Ecke und was ist die Essenz?

Die X.te Bleichenbacher Attacke funktioniert auch bei TLS 1.3 !

Wie ZDNET heute berichtet, ist einen Team von Forschern mit einem CACHE Timingangriff gelungen, auch im TLS 1.3 die RSA Parameter der Verbindung auszulesen. Ehrlich gesagt, lohnt es nicht mal darüber zu berichten, weil das mit den Bleichenbacherangriffen immer so weiter gehen wird, wenn der uralte RSA Kram da nicht mal rausfliegt.

Gestern habe ich noch die GNU Admins angeprangert, weil die nur TLS 1.0 können, aber falls das eine fatalistische Prognose zur TLS Krypto der Zukunft war, Glückwunsch: Volltreffer, versenkt.  Es lohnt nicht auf neue Versionen zu gehen, wenn die dann doch wie die Fliegen umfallen. Es müßte doch noch mehr Leute geben die was davon verstehen und endlich mal was ohne RSA bauen, daß funktioniert.

Quelle: https://www.zdnet.com/article/new-tls-encryption-busting-attack-also-impacts-the-newer-tls-1-3/