Category: administration

CentOS 7 mit Two-Factor-Authentication absichern

11.08.2016 yahe administration legacy linux security

Nach meiner Migration zu CentOS 7 wollte ich Two-Factor-Authentication für SSH-Logins einrichten. Allerdings musste ich feststellen, dass es für CentOS 7 keine aktuellen Pakete des entsprechenden PAM (Pluggable Authentication Module) gibt. So musste ich wohl oder übel das ganze selbst kompilieren. Bevor man jedoch loslegen kann, benötigt man zuerst einmal ein paar zusätzliche Pakete:

sudo yum install autoconf automake libtool make pam-devel unzip wget zip

Nun können wir mit der eigentlichen Installation beginnen:

wget https://github.com/google/google-authenticator/archive/master.zip
unzip ./master.zip
cd ./google-authenticator-master/libpam
./bootstrap.sh
./configure

Bis hierhin sollte alles funktioniert haben. Leider enthält die erstellte Konfiguration einen kleinen Fehler. Deshalb müssen wir händisch an den Anfang der Datei "./Makefile" folgende Zeile einfügen:

LDFLAGS="-lpam"

Nun kann es mit dem Kompilieren weitergehen:

make
sudo make install
sudo cp /usr/local/lib/security/pam_google_authenticator.so /lib64/security
make clean
cd ../..
rm ./master.zip
rm -R ./google-authenticator-master

Um die Nutzer zu markieren, für die die Two-Factor-Authentication aktiviert werden soll, legen wir eine Gruppe "google-auth" an:

sudo groupadd google-auth

Zudem ändern wir in der Datei "/etc/ssh/sshd_conf" eine Einstellung:

ChallengeResponseAuthentication yes

Danach schreiben wir folgendes in die Datei "/etc/pam.d/sshd" (z.B. unter die restlichen "auth"-Einträge):

auth [success=1 default=ignore] pam_succeed_if.so user notingroup google-auth
auth required pam_google_authenticator.so

Mit einem Restart des SSH-Servers sind die Änderungen aktiv:

sudo systemctl restart sshd.service

Nun müssen die Nutzer, für die die Two-Factor-Authentication aktiviert werden soll, das Skript zur Einrichtung der Two-Factor-Authentication in ihrem Account aufrufen:

google-authenticator

Abschließend müssen diese Nutzer noch in die Gruppe "google-auth" aufgenommen werden:

sudo usermod -a -G google-auth <username>

Das war's! Mit diesen Schritten lässt sich unter CentOS 7 eine Two-Factor-Authentication einrichten.


PHP 7 unter CentOS 7 installieren

09.08.2016 yahe administration legacy linux

Ich bin inzwischen mit allen Servern zu CentOS migriert. Das Gute an CentOS ist, dass es eine recht stabile Distribution ist und jedes Major Release 10 Jahre lang Support erhält. Das Schlechte an CentOS ist, dass viele Pakete dadurch in einer recht alten Version vorliegen, die lediglich mit Bug- und Security-Fixes versorgt werden. Bei meinen Webserverinstallationen möchte ich hingegen lieber neue Versionen betreiben, um neue Features zu erhalten.

Bei der Installation einer neueren Version hat man mehrere Möglichkeiten. Entweder, man kompiliert PHP 7 selbst oder man setzt ein Dritt-Repository ein, in dem bereits vorkompilierte Pakete für PHP 7 enthalten sind. In diesem Fall habe ich mich für zweiteres entschieden. Mit ius.io gibt es für CentOS 7 ein Repository, in dem die wichtigsten Pakete enthalten sind und das aufgrund der Unterstützung durch den Hoster Rackspace lange erhalten bleiben sollte. Um das Repository von IUS verwenden zu können, muss man im ersten Schritt deren RPM-Paket installieren, das sich darum kümmert, das Repository im System einzukonfigurieren:

wget "https://centos7.iuscommunity.org/ius-release.rpm"
sudo rpm -i ./ius-release.rpm
rm ./ius-release.rpm

Zusätzlich muss noch der öffentliche Schlüssel importiert werden, mit dessen Hilfe die Signaturen der heruntergeladenen Pakete überprüft werden können:

sudo rpm --import /etc/pki/rpm-gpg/IUS-COMMUNITY-GPG-KEY

Wenn man es noch nicht getan hat, sollte man weiterhin das EPEL-Repository mit einbinden, das weitere hilfreiche und meist aktuellere Software enthält. Das lässt sich durch die Softwareverwaltung realisieren:

sudo yum install epel-release

In meinem Fall installiere ich neben PHP auch immer gleich MariaDB und NGINX. Das IUS-Repository enthält auch eine aktuellere Version von MariaDB. Damit man diese installieren kann, müssen jedoch vorher die bereits vorhandenen "mariadb-libs" entfernt werden. Im Zuge dessen wird auch Postfix deinstalliert. Wir werden es einfach im Anschluss erneut installieren:

sudo yum remove mariadb-libs

Nun können wir die gewünschte Software über die Softwareverwaltung installieren. Pakete, die über IUS installierten werden, enthalten immer den Suffix "u", um sie leichter erkennen zu können und Kollisionen mit Standardpaketen zu vermeiden:

sudo yum install mariadb101u-server nginx php70u-cli php70u-fpm php70u-gd php70u-imap php70u-intl php70u-json php70u-ldap php70u-mbstring php70u-mcrypt php70u-mysqlnd php70u-pdo php70u-pear php70u-pgsql php70u-process php70u-pspell php70u-recode php70u-soap php70u-xml php70u-xmlrpc postfix

haveged: Entropiesammlung unter Linux

02.11.2015 yahe administration legacy linux security

Vor ein paar Tagen hatte ich vorgestellt, wie man den Hardware-Zufallszahlengenerator des Raspberry Pi nutzen kann, um unter Linux weniger Probleme mit hängenden Kryptographievorgängen zu haben. Leider hat nicht jeder Linux-Server einen Hardware-Zufallszahlengenerator, der als Entropiequelle genutzt werden kann. In diesen Fällen muss eine andere Quelle herhalten. Glücklicherweise hat sich das französische Institut IRISA Anfang des Jahrtausends das HAVEGE-Verfahren (HArdware Volatile Entropy Gathering and Expansion) ausgedacht. Dieses basiert darauf, dass in modernen Computersystem unzählige verschiedene Hardwarezustände (Cache-Zustände, das Auftreten von Interrupts, etc.) dafür verantwortlich sind, dass der exakt gleiche Code im Micro- und Nanosekundenbereich unterschiedlich schnell abgearbeitet wird. Die Abweichungen, die bei einer entsprechenden Zeitmessung auftreten, sind, so die Erfinder, nahezu unmöglich zu erahnen oder gar zu reproduzieren. Genau diese Abweichungen wären daher eine gute Quelle für Entropie.

Zwar wird das originale HAVEGE seit Jahren nicht mehr weiterentwickelt, jedoch gibt es den Ableger haveged, der inzwischen in allen großen Distributionen enthalten sein sollte. "Sollte" deshalb, da z.B. RHEL (Red Hat Enterprise Linux) das Paket nicht standardmäßig mit ausliefert. Hier muss auf das EPEL-Projekt (Extra Packages for Enterprise Linux) des Fedora Project zurückgegriffen werden- Die Installation ist dann recht einfach über den rpm-Befehl möglich.

Leider ist haveged zu Unrecht ein wenig in Verruf geraten. Hintergrund ist, dass PolarSSL mbed SSL im Dezember 2011 ein Security Advisory herausgegebene hatte. Diese SSL-Bibliothek verwendete bis dahin HAVEGE als alleinige Entropiequelle für Schlüsselerzeugungen und dergleichen. Jedoch stellte man fest, dass der RDTSC-Befehl, der zum exakten Zeitmessen verwendet wird, auf einigen virtualisierten Maschinen nur schlechte (und damit leicht reproduzierbare) Werte zurücklieferte. Es ist daher potentiell sinnvoll, vor dem produktiven Einsatz zu prüfen, ob der RDTSC-Befehl korrekt funktioniert. Eine Möglichkeit ist, die Ausgabe von haveged durch einen "dieharder"-Testlauf prüfen zu lassen. Hierzu muss man einfach haveged aufrufen und dessen Output in den Eingang von dieharder leiten:

sudo haveged -n 0 -f - | dieharder -g 200 -a

Trotz der Vorsicht hat haveged auch einige Anhänger: So erklärt beispielsweise Heinlein Support, der Betreiber des sicheren E-Mail-Dienstes mailbox.org, den Einsatz von haveged in seinem Linux-Admin-Blog. Die Distribution SLES (SUSE Linux Enterprise Server) geht sogar noch einen Schritt weiter. Dort ist haveged seit der Version 11 SP 1 standardmäßig installiert und seit der Version 11 SP 2 auch standardmäßig aktiviert. Viele Linux-Administratoren verwenden also potentiell bereits haveged in ihrer Produktumgebung, ohne es überhaupt zu wissen.

Natürlich habe auch ich mir angesehen, ob ich haveged einsetzen kann. Um mir eine abschließende Meinung bilden zu können, habe ich auf jedem in Frage kommenden System den dieharder Testlauf durchgeführt. An dieser Stelle veröffentliche ich auch der Vollständigkeit halber die entsprechenden Ergebnisse.

Auf dem BCM2835 des Raspberry Pi sehen die Ergebnisse gut aus:

#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |rands/second|   Seed   |
stdin_input_raw|  8.48e+05  |3348700180|
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.45785536|  PASSED
      diehard_operm5|   0|   1000000|     100|0.60477535|  PASSED
  diehard_rank_32x32|   0|     40000|     100|0.29286920|  PASSED
    diehard_rank_6x8|   0|    100000|     100|0.23237712|  PASSED
   diehard_bitstream|   0|   2097152|     100|0.05506401|  PASSED
        diehard_opso|   0|   2097152|     100|0.77736890|  PASSED
        diehard_oqso|   0|   2097152|     100|0.62599391|  PASSED
         diehard_dna|   0|   2097152|     100|0.28611820|  PASSED
diehard_count_1s_str|   0|    256000|     100|0.75847797|  PASSED
diehard_count_1s_byt|   0|    256000|     100|0.27169177|  PASSED
 diehard_parking_lot|   0|     12000|     100|0.91232487|  PASSED
    diehard_2dsphere|   2|      8000|     100|0.94904496|  PASSED
    diehard_3dsphere|   3|      4000|     100|0.21628095|  PASSED
     diehard_squeeze|   0|    100000|     100|0.32795324|  PASSED
        diehard_sums|   0|       100|     100|0.00069872|   WEAK
        diehard_runs|   0|    100000|     100|0.76153066|  PASSED
        diehard_runs|   0|    100000|     100|0.97532990|  PASSED
       diehard_craps|   0|    200000|     100|0.69750059|  PASSED
       diehard_craps|   0|    200000|     100|0.70646049|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.12267708|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.19422474|  PASSED
         sts_monobit|   1|    100000|     100|0.76342910|  PASSED
            sts_runs|   2|    100000|     100|0.41068776|  PASSED
          sts_serial|   1|    100000|     100|0.43901131|  PASSED
          sts_serial|   2|    100000|     100|0.08832557|  PASSED
          sts_serial|   3|    100000|     100|0.84110757|  PASSED
          sts_serial|   3|    100000|     100|0.41468366|  PASSED
          sts_serial|   4|    100000|     100|0.72012668|  PASSED
          sts_serial|   4|    100000|     100|0.36171448|  PASSED
          sts_serial|   5|    100000|     100|0.81674015|  PASSED
          sts_serial|   5|    100000|     100|0.88818478|  PASSED
          sts_serial|   6|    100000|     100|0.97895561|  PASSED
          sts_serial|   6|    100000|     100|0.98733145|  PASSED
          sts_serial|   7|    100000|     100|0.72348815|  PASSED
          sts_serial|   7|    100000|     100|0.11691286|  PASSED
          sts_serial|   8|    100000|     100|0.61923729|  PASSED
          sts_serial|   8|    100000|     100|0.97185433|  PASSED
          sts_serial|   9|    100000|     100|0.75444842|  PASSED
          sts_serial|   9|    100000|     100|0.56167376|  PASSED
          sts_serial|  10|    100000|     100|0.99999103|   WEAK
          sts_serial|  10|    100000|     100|0.94590480|  PASSED
          sts_serial|  11|    100000|     100|0.91257068|  PASSED
          sts_serial|  11|    100000|     100|0.66909798|  PASSED
          sts_serial|  12|    100000|     100|0.86817154|  PASSED
          sts_serial|  12|    100000|     100|0.76794279|  PASSED
          sts_serial|  13|    100000|     100|0.40705505|  PASSED
          sts_serial|  13|    100000|     100|0.50118838|  PASSED
          sts_serial|  14|    100000|     100|0.61229062|  PASSED
          sts_serial|  14|    100000|     100|0.85491685|  PASSED
          sts_serial|  15|    100000|     100|0.91714380|  PASSED
          sts_serial|  15|    100000|     100|0.62863486|  PASSED
          sts_serial|  16|    100000|     100|0.79024560|  PASSED
          sts_serial|  16|    100000|     100|0.46711922|  PASSED
         rgb_bitdist|   1|    100000|     100|0.32027203|  PASSED
         rgb_bitdist|   2|    100000|     100|0.82936629|  PASSED
         rgb_bitdist|   3|    100000|     100|0.32836216|  PASSED
         rgb_bitdist|   4|    100000|     100|0.05014161|  PASSED
         rgb_bitdist|   5|    100000|     100|0.60319043|  PASSED
         rgb_bitdist|   6|    100000|     100|0.46447338|  PASSED
         rgb_bitdist|   7|    100000|     100|0.78238492|  PASSED
         rgb_bitdist|   8|    100000|     100|0.47473097|  PASSED
         rgb_bitdist|   9|    100000|     100|0.96469269|  PASSED
         rgb_bitdist|  10|    100000|     100|0.16923688|  PASSED
         rgb_bitdist|  11|    100000|     100|0.21372692|  PASSED
         rgb_bitdist|  12|    100000|     100|0.80306989|  PASSED
rgb_minimum_distance|   2|     10000|    1000|0.10142178|  PASSED
rgb_minimum_distance|   3|     10000|    1000|0.09184875|  PASSED
rgb_minimum_distance|   4|     10000|    1000|0.75662814|  PASSED
rgb_minimum_distance|   5|     10000|    1000|0.11774862|  PASSED
    rgb_permutations|   2|    100000|     100|0.52525569|  PASSED
    rgb_permutations|   3|    100000|     100|0.56127774|  PASSED
    rgb_permutations|   4|    100000|     100|0.66925921|  PASSED
    rgb_permutations|   5|    100000|     100|0.02115162|  PASSED
      rgb_lagged_sum|   0|   1000000|     100|0.76176860|  PASSED
      rgb_lagged_sum|   1|   1000000|     100|0.96497209|  PASSED
      rgb_lagged_sum|   2|   1000000|     100|0.43298109|  PASSED
      rgb_lagged_sum|   3|   1000000|     100|0.81781736|  PASSED
      rgb_lagged_sum|   4|   1000000|     100|0.62701591|  PASSED
      rgb_lagged_sum|   5|   1000000|     100|0.62074437|  PASSED
      rgb_lagged_sum|   6|   1000000|     100|0.39233421|  PASSED
      rgb_lagged_sum|   7|   1000000|     100|0.88875393|  PASSED
      rgb_lagged_sum|   8|   1000000|     100|0.56490272|  PASSED
      rgb_lagged_sum|   9|   1000000|     100|0.85420827|  PASSED
      rgb_lagged_sum|  10|   1000000|     100|0.90991238|  PASSED
      rgb_lagged_sum|  11|   1000000|     100|0.83617905|  PASSED
      rgb_lagged_sum|  12|   1000000|     100|0.10804203|  PASSED
      rgb_lagged_sum|  13|   1000000|     100|0.01520972|  PASSED
      rgb_lagged_sum|  14|   1000000|     100|0.35537614|  PASSED
      rgb_lagged_sum|  15|   1000000|     100|0.70361276|  PASSED
      rgb_lagged_sum|  16|   1000000|     100|0.57752259|  PASSED
      rgb_lagged_sum|  17|   1000000|     100|0.04567487|  PASSED
      rgb_lagged_sum|  18|   1000000|     100|0.99990241|   WEAK
      rgb_lagged_sum|  19|   1000000|     100|0.59703607|  PASSED
      rgb_lagged_sum|  20|   1000000|     100|0.01424569|  PASSED
      rgb_lagged_sum|  21|   1000000|     100|0.01190246|  PASSED
      rgb_lagged_sum|  22|   1000000|     100|0.28083614|  PASSED
      rgb_lagged_sum|  23|   1000000|     100|0.85922233|  PASSED
      rgb_lagged_sum|  24|   1000000|     100|0.74805305|  PASSED
      rgb_lagged_sum|  25|   1000000|     100|0.33664323|  PASSED
      rgb_lagged_sum|  26|   1000000|     100|0.68550123|  PASSED
      rgb_lagged_sum|  27|   1000000|     100|0.71237718|  PASSED
      rgb_lagged_sum|  28|   1000000|     100|0.47764816|  PASSED
      rgb_lagged_sum|  29|   1000000|     100|0.36902623|  PASSED
      rgb_lagged_sum|  30|   1000000|     100|0.70886921|  PASSED
      rgb_lagged_sum|  31|   1000000|     100|0.86385367|  PASSED
      rgb_lagged_sum|  32|   1000000|     100|0.93629132|  PASSED
     rgb_kstest_test|   0|     10000|    1000|0.16180294|  PASSED
     dab_bytedistrib|   0|  51200000|       1|0.54526159|  PASSED
             dab_dct| 256|     50000|       1|0.01211310|  PASSED
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.28341243|  PASSED
        dab_filltree|  32|  15000000|       1|0.40586913|  PASSED
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.99340648|  PASSED
       dab_filltree2|   1|   5000000|       1|0.94767580|  PASSED
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|0.43391232|  PASSED

Mein Hauptserver wird mit einem "Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz" betrieben. Auch dessen Überprüfung liefert gute Ergebnisse:

#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |rands/second|   Seed   |
stdin_input_raw|  5.53e+07  |3948260661|
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.87942414|  PASSED
      diehard_operm5|   0|   1000000|     100|0.48126438|  PASSED
  diehard_rank_32x32|   0|     40000|     100|0.49454734|  PASSED
    diehard_rank_6x8|   0|    100000|     100|0.57071448|  PASSED
   diehard_bitstream|   0|   2097152|     100|0.05867636|  PASSED
        diehard_opso|   0|   2097152|     100|0.92742494|  PASSED
        diehard_oqso|   0|   2097152|     100|0.87263461|  PASSED
         diehard_dna|   0|   2097152|     100|0.41023900|  PASSED
diehard_count_1s_str|   0|    256000|     100|0.56140444|  PASSED
diehard_count_1s_byt|   0|    256000|     100|0.47686501|  PASSED
 diehard_parking_lot|   0|     12000|     100|0.59549008|  PASSED
    diehard_2dsphere|   2|      8000|     100|0.85268300|  PASSED
    diehard_3dsphere|   3|      4000|     100|0.21177774|  PASSED
     diehard_squeeze|   0|    100000|     100|0.22008717|  PASSED
        diehard_sums|   0|       100|     100|0.27919825|  PASSED
        diehard_runs|   0|    100000|     100|0.28528603|  PASSED
        diehard_runs|   0|    100000|     100|0.88804265|  PASSED
       diehard_craps|   0|    200000|     100|0.50789926|  PASSED
       diehard_craps|   0|    200000|     100|0.44794845|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.85094292|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.87826981|  PASSED
         sts_monobit|   1|    100000|     100|0.34667211|  PASSED
            sts_runs|   2|    100000|     100|0.87692980|  PASSED
          sts_serial|   1|    100000|     100|0.92230630|  PASSED
          sts_serial|   2|    100000|     100|0.42487308|  PASSED
          sts_serial|   3|    100000|     100|0.47201211|  PASSED
          sts_serial|   3|    100000|     100|0.45286777|  PASSED
          sts_serial|   4|    100000|     100|0.99293625|  PASSED
          sts_serial|   4|    100000|     100|0.95982278|  PASSED
          sts_serial|   5|    100000|     100|0.72869396|  PASSED
          sts_serial|   5|    100000|     100|0.15359933|  PASSED
          sts_serial|   6|    100000|     100|0.29986703|  PASSED
          sts_serial|   6|    100000|     100|0.90350707|  PASSED
          sts_serial|   7|    100000|     100|0.82937553|  PASSED
          sts_serial|   7|    100000|     100|0.69745997|  PASSED
          sts_serial|   8|    100000|     100|0.76976576|  PASSED
          sts_serial|   8|    100000|     100|0.94487729|  PASSED
          sts_serial|   9|    100000|     100|0.21190616|  PASSED
          sts_serial|   9|    100000|     100|0.95673394|  PASSED
          sts_serial|  10|    100000|     100|0.28956816|  PASSED
          sts_serial|  10|    100000|     100|0.59407297|  PASSED
          sts_serial|  11|    100000|     100|0.97436422|  PASSED
          sts_serial|  11|    100000|     100|0.68107472|  PASSED
          sts_serial|  12|    100000|     100|0.40336698|  PASSED
          sts_serial|  12|    100000|     100|0.80817356|  PASSED
          sts_serial|  13|    100000|     100|0.89780894|  PASSED
          sts_serial|  13|    100000|     100|0.97992817|  PASSED
          sts_serial|  14|    100000|     100|0.56469700|  PASSED
          sts_serial|  14|    100000|     100|0.75256118|  PASSED
          sts_serial|  15|    100000|     100|0.04120757|  PASSED
          sts_serial|  15|    100000|     100|0.21211072|  PASSED
          sts_serial|  16|    100000|     100|0.38377842|  PASSED
          sts_serial|  16|    100000|     100|0.44555996|  PASSED
         rgb_bitdist|   1|    100000|     100|0.81895044|  PASSED
         rgb_bitdist|   2|    100000|     100|0.64929431|  PASSED
         rgb_bitdist|   3|    100000|     100|0.65870845|  PASSED
         rgb_bitdist|   4|    100000|     100|0.56304051|  PASSED
         rgb_bitdist|   5|    100000|     100|0.75496902|  PASSED
         rgb_bitdist|   6|    100000|     100|0.06767649|  PASSED
         rgb_bitdist|   7|    100000|     100|0.30374549|  PASSED
         rgb_bitdist|   8|    100000|     100|0.65287829|  PASSED
         rgb_bitdist|   9|    100000|     100|0.77464639|  PASSED
         rgb_bitdist|  10|    100000|     100|0.25683681|  PASSED
         rgb_bitdist|  11|    100000|     100|0.65849822|  PASSED
         rgb_bitdist|  12|    100000|     100|0.50805413|  PASSED
rgb_minimum_distance|   2|     10000|    1000|0.02681610|  PASSED
rgb_minimum_distance|   3|     10000|    1000|0.22801930|  PASSED
rgb_minimum_distance|   4|     10000|    1000|0.27927346|  PASSED
rgb_minimum_distance|   5|     10000|    1000|0.43079185|  PASSED
    rgb_permutations|   2|    100000|     100|0.94898090|  PASSED
    rgb_permutations|   3|    100000|     100|0.11374383|  PASSED
    rgb_permutations|   4|    100000|     100|0.72305706|  PASSED
    rgb_permutations|   5|    100000|     100|0.20417740|  PASSED
      rgb_lagged_sum|   0|   1000000|     100|0.93883915|  PASSED
      rgb_lagged_sum|   1|   1000000|     100|0.38840055|  PASSED
      rgb_lagged_sum|   2|   1000000|     100|0.62008896|  PASSED
      rgb_lagged_sum|   3|   1000000|     100|0.99204256|  PASSED
      rgb_lagged_sum|   4|   1000000|     100|0.52115721|  PASSED
      rgb_lagged_sum|   5|   1000000|     100|0.22550225|  PASSED
      rgb_lagged_sum|   6|   1000000|     100|0.40715772|  PASSED
      rgb_lagged_sum|   7|   1000000|     100|0.58505397|  PASSED
      rgb_lagged_sum|   8|   1000000|     100|0.42592254|  PASSED
      rgb_lagged_sum|   9|   1000000|     100|0.34891085|  PASSED
      rgb_lagged_sum|  10|   1000000|     100|0.67645788|  PASSED
      rgb_lagged_sum|  11|   1000000|     100|0.92966912|  PASSED
      rgb_lagged_sum|  12|   1000000|     100|0.95439791|  PASSED
      rgb_lagged_sum|  13|   1000000|     100|0.39471972|  PASSED
      rgb_lagged_sum|  14|   1000000|     100|0.72890013|  PASSED
      rgb_lagged_sum|  15|   1000000|     100|0.22923887|  PASSED
      rgb_lagged_sum|  16|   1000000|     100|0.09437301|  PASSED
      rgb_lagged_sum|  17|   1000000|     100|0.03021647|  PASSED
      rgb_lagged_sum|  18|   1000000|     100|0.06593268|  PASSED
      rgb_lagged_sum|  19|   1000000|     100|0.73484274|  PASSED
      rgb_lagged_sum|  20|   1000000|     100|0.97718590|  PASSED
      rgb_lagged_sum|  21|   1000000|     100|0.83580287|  PASSED
      rgb_lagged_sum|  22|   1000000|     100|0.68984098|  PASSED
      rgb_lagged_sum|  23|   1000000|     100|0.34944142|  PASSED
      rgb_lagged_sum|  24|   1000000|     100|0.76720893|  PASSED
      rgb_lagged_sum|  25|   1000000|     100|0.99808427|   WEAK
      rgb_lagged_sum|  26|   1000000|     100|0.20922699|  PASSED
      rgb_lagged_sum|  27|   1000000|     100|0.18887164|  PASSED
      rgb_lagged_sum|  28|   1000000|     100|0.45387763|  PASSED
      rgb_lagged_sum|  29|   1000000|     100|0.31425341|  PASSED
      rgb_lagged_sum|  30|   1000000|     100|0.72639892|  PASSED
      rgb_lagged_sum|  31|   1000000|     100|0.69995471|  PASSED
      rgb_lagged_sum|  32|   1000000|     100|0.84789350|  PASSED
     rgb_kstest_test|   0|     10000|    1000|0.62218468|  PASSED
     dab_bytedistrib|   0|  51200000|       1|0.37714207|  PASSED
             dab_dct| 256|     50000|       1|0.81750713|  PASSED
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.30697178|  PASSED
        dab_filltree|  32|  15000000|       1|0.70930339|  PASSED
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.87225976|  PASSED
       dab_filltree2|   1|   5000000|       1|0.78581557|  PASSED
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|0.00837857|  PASSED

Selbst auf meinen alten Mac Minis mit "PowerMac10,1 MacRISC3 Power Macintosh", die bei mir Zuhause in einem Testcluster laufen, läuft haveged und liefert auch dort gute Ergebnisse:

#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |rands/second|   Seed   |
stdin_input_raw|  3.14e+06  |4220874249|
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.57621219|  PASSED
      diehard_operm5|   0|   1000000|     100|0.32030487|  PASSED
  diehard_rank_32x32|   0|     40000|     100|0.50211874|  PASSED
    diehard_rank_6x8|   0|    100000|     100|0.33856755|  PASSED
   diehard_bitstream|   0|   2097152|     100|0.23514061|  PASSED
        diehard_opso|   0|   2097152|     100|0.99635255|   WEAK
        diehard_oqso|   0|   2097152|     100|0.07666882|  PASSED
         diehard_dna|   0|   2097152|     100|0.28750274|  PASSED
diehard_count_1s_str|   0|    256000|     100|0.31583844|  PASSED
diehard_count_1s_byt|   0|    256000|     100|0.53449657|  PASSED
 diehard_parking_lot|   0|     12000|     100|0.79252967|  PASSED
    diehard_2dsphere|   2|      8000|     100|0.67882318|  PASSED
    diehard_3dsphere|   3|      4000|     100|0.31379788|  PASSED
     diehard_squeeze|   0|    100000|     100|0.28002382|  PASSED
        diehard_sums|   0|       100|     100|0.18598691|  PASSED
        diehard_runs|   0|    100000|     100|0.98976058|  PASSED
        diehard_runs|   0|    100000|     100|0.94358199|  PASSED
       diehard_craps|   0|    200000|     100|0.78532168|  PASSED
       diehard_craps|   0|    200000|     100|0.71640173|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.93759598|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.88657019|  PASSED
         sts_monobit|   1|    100000|     100|0.36848114|  PASSED
            sts_runs|   2|    100000|     100|0.55771580|  PASSED
          sts_serial|   1|    100000|     100|0.96608134|  PASSED
          sts_serial|   2|    100000|     100|0.84005443|  PASSED
          sts_serial|   3|    100000|     100|0.81443597|  PASSED
          sts_serial|   3|    100000|     100|0.10575160|  PASSED
          sts_serial|   4|    100000|     100|0.32914026|  PASSED
          sts_serial|   4|    100000|     100|0.21924627|  PASSED
          sts_serial|   5|    100000|     100|0.22875732|  PASSED
          sts_serial|   5|    100000|     100|0.78557652|  PASSED
          sts_serial|   6|    100000|     100|0.21487008|  PASSED
          sts_serial|   6|    100000|     100|0.14747939|  PASSED
          sts_serial|   7|    100000|     100|0.16517074|  PASSED
          sts_serial|   7|    100000|     100|0.84180240|  PASSED
          sts_serial|   8|    100000|     100|0.36482950|  PASSED
          sts_serial|   8|    100000|     100|0.27419346|  PASSED
          sts_serial|   9|    100000|     100|0.12233420|  PASSED
          sts_serial|   9|    100000|     100|0.16885151|  PASSED
          sts_serial|  10|    100000|     100|0.03902614|  PASSED
          sts_serial|  10|    100000|     100|0.18952175|  PASSED
          sts_serial|  11|    100000|     100|0.94410153|  PASSED
          sts_serial|  11|    100000|     100|0.59201848|  PASSED
          sts_serial|  12|    100000|     100|0.33965647|  PASSED
          sts_serial|  12|    100000|     100|0.52757585|  PASSED
          sts_serial|  13|    100000|     100|0.34009610|  PASSED
          sts_serial|  13|    100000|     100|0.99834388|   WEAK
          sts_serial|  14|    100000|     100|0.96198264|  PASSED
          sts_serial|  14|    100000|     100|0.39290279|  PASSED
          sts_serial|  15|    100000|     100|0.97548718|  PASSED
          sts_serial|  15|    100000|     100|0.93903378|  PASSED
          sts_serial|  16|    100000|     100|0.98534676|  PASSED
          sts_serial|  16|    100000|     100|0.39565376|  PASSED
         rgb_bitdist|   1|    100000|     100|0.20773717|  PASSED
         rgb_bitdist|   2|    100000|     100|0.85032130|  PASSED
         rgb_bitdist|   3|    100000|     100|0.50838307|  PASSED
         rgb_bitdist|   4|    100000|     100|0.57233304|  PASSED
         rgb_bitdist|   5|    100000|     100|0.91002860|  PASSED
         rgb_bitdist|   6|    100000|     100|0.78087088|  PASSED
         rgb_bitdist|   7|    100000|     100|0.40799300|  PASSED
         rgb_bitdist|   8|    100000|     100|0.00745902|  PASSED
         rgb_bitdist|   9|    100000|     100|0.30916578|  PASSED
         rgb_bitdist|  10|    100000|     100|0.57590644|  PASSED
         rgb_bitdist|  11|    100000|     100|0.80634610|  PASSED
         rgb_bitdist|  12|    100000|     100|0.54261773|  PASSED
rgb_minimum_distance|   2|     10000|    1000|0.59111346|  PASSED
rgb_minimum_distance|   3|     10000|    1000|0.46887953|  PASSED
rgb_minimum_distance|   4|     10000|    1000|0.94865190|  PASSED
rgb_minimum_distance|   5|     10000|    1000|0.28414726|  PASSED
    rgb_permutations|   2|    100000|     100|0.75820306|  PASSED
    rgb_permutations|   3|    100000|     100|0.90669743|  PASSED
    rgb_permutations|   4|    100000|     100|0.47793456|  PASSED
    rgb_permutations|   5|    100000|     100|0.69969764|  PASSED
      rgb_lagged_sum|   0|   1000000|     100|0.26143346|  PASSED
      rgb_lagged_sum|   1|   1000000|     100|0.89175049|  PASSED
      rgb_lagged_sum|   2|   1000000|     100|0.96527229|  PASSED
      rgb_lagged_sum|   3|   1000000|     100|0.99757952|   WEAK
      rgb_lagged_sum|   4|   1000000|     100|0.47083477|  PASSED
      rgb_lagged_sum|   5|   1000000|     100|0.93046056|  PASSED
      rgb_lagged_sum|   6|   1000000|     100|0.09962939|  PASSED
      rgb_lagged_sum|   7|   1000000|     100|0.07011501|  PASSED
      rgb_lagged_sum|   8|   1000000|     100|0.23763444|  PASSED
      rgb_lagged_sum|   9|   1000000|     100|0.09943310|  PASSED
      rgb_lagged_sum|  10|   1000000|     100|0.79942404|  PASSED
      rgb_lagged_sum|  11|   1000000|     100|0.02056793|  PASSED
      rgb_lagged_sum|  12|   1000000|     100|0.56717544|  PASSED
      rgb_lagged_sum|  13|   1000000|     100|0.20265247|  PASSED
      rgb_lagged_sum|  14|   1000000|     100|0.90095804|  PASSED
      rgb_lagged_sum|  15|   1000000|     100|0.51364566|  PASSED
      rgb_lagged_sum|  16|   1000000|     100|0.36926201|  PASSED
      rgb_lagged_sum|  17|   1000000|     100|0.46713667|  PASSED
      rgb_lagged_sum|  18|   1000000|     100|0.94256711|  PASSED
      rgb_lagged_sum|  19|   1000000|     100|0.94338929|  PASSED
      rgb_lagged_sum|  20|   1000000|     100|0.92997203|  PASSED
      rgb_lagged_sum|  21|   1000000|     100|0.36046015|  PASSED
      rgb_lagged_sum|  22|   1000000|     100|0.83868968|  PASSED
      rgb_lagged_sum|  23|   1000000|     100|0.52879240|  PASSED
      rgb_lagged_sum|  24|   1000000|     100|0.61314936|  PASSED
      rgb_lagged_sum|  25|   1000000|     100|0.37027362|  PASSED
      rgb_lagged_sum|  26|   1000000|     100|0.81581312|  PASSED
      rgb_lagged_sum|  27|   1000000|     100|0.66953730|  PASSED
      rgb_lagged_sum|  28|   1000000|     100|0.28398670|  PASSED
      rgb_lagged_sum|  29|   1000000|     100|0.95750904|  PASSED
      rgb_lagged_sum|  30|   1000000|     100|0.94730710|  PASSED
      rgb_lagged_sum|  31|   1000000|     100|0.38254527|  PASSED
      rgb_lagged_sum|  32|   1000000|     100|0.88603434|  PASSED
     rgb_kstest_test|   0|     10000|    1000|0.41777521|  PASSED
     dab_bytedistrib|   0|  51200000|       1|0.51678719|  PASSED
             dab_dct| 256|     50000|       1|0.48530283|  PASSED
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.09009306|  PASSED
        dab_filltree|  32|  15000000|       1|0.42145861|  PASSED
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.92140518|  PASSED
       dab_filltree2|   1|   5000000|       1|0.30032656|  PASSED
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|0.80367392|  PASSED

Gespannt war ich auf die Ergebnisse meiner vServer, da diese bei PolarSSL mbed SSL ja der Ursprung des Problems waren. Ich verwende einerseits ein System mit einem KVM-virtualisierten "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz". Dessen Ergebnisse sehen gut aus:

#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |rands/second|   Seed   |
stdin_input_raw|  3.91e+07  |2403861751|
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.39303888|  PASSED
      diehard_operm5|   0|   1000000|     100|0.74496497|  PASSED
  diehard_rank_32x32|   0|     40000|     100|0.13162974|  PASSED
    diehard_rank_6x8|   0|    100000|     100|0.72631428|  PASSED
   diehard_bitstream|   0|   2097152|     100|0.86273136|  PASSED
        diehard_opso|   0|   2097152|     100|0.56491165|  PASSED
        diehard_oqso|   0|   2097152|     100|0.72849597|  PASSED
         diehard_dna|   0|   2097152|     100|0.99485750|  PASSED
diehard_count_1s_str|   0|    256000|     100|0.43930506|  PASSED
diehard_count_1s_byt|   0|    256000|     100|0.50458767|  PASSED
 diehard_parking_lot|   0|     12000|     100|0.99584501|   WEAK
    diehard_2dsphere|   2|      8000|     100|0.26711806|  PASSED
    diehard_3dsphere|   3|      4000|     100|0.29934754|  PASSED
     diehard_squeeze|   0|    100000|     100|0.80469876|  PASSED
        diehard_sums|   0|       100|     100|0.87202688|  PASSED
        diehard_runs|   0|    100000|     100|0.48564911|  PASSED
        diehard_runs|   0|    100000|     100|0.72922679|  PASSED
       diehard_craps|   0|    200000|     100|0.33032863|  PASSED
       diehard_craps|   0|    200000|     100|0.83274474|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.29574332|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.05451073|  PASSED
         sts_monobit|   1|    100000|     100|0.77549456|  PASSED
            sts_runs|   2|    100000|     100|0.04823761|  PASSED
          sts_serial|   1|    100000|     100|0.64803972|  PASSED
          sts_serial|   2|    100000|     100|0.82585541|  PASSED
          sts_serial|   3|    100000|     100|0.30137477|  PASSED
          sts_serial|   3|    100000|     100|0.87316871|  PASSED
          sts_serial|   4|    100000|     100|0.62677898|  PASSED
          sts_serial|   4|    100000|     100|0.59645336|  PASSED
          sts_serial|   5|    100000|     100|0.35557699|  PASSED
          sts_serial|   5|    100000|     100|0.11323982|  PASSED
          sts_serial|   6|    100000|     100|0.21809822|  PASSED
          sts_serial|   6|    100000|     100|0.19746310|  PASSED
          sts_serial|   7|    100000|     100|0.97678137|  PASSED
          sts_serial|   7|    100000|     100|0.96862353|  PASSED
          sts_serial|   8|    100000|     100|0.27733624|  PASSED
          sts_serial|   8|    100000|     100|0.47827497|  PASSED
          sts_serial|   9|    100000|     100|0.26196595|  PASSED
          sts_serial|   9|    100000|     100|0.20901634|  PASSED
          sts_serial|  10|    100000|     100|0.69320465|  PASSED
          sts_serial|  10|    100000|     100|0.50087708|  PASSED
          sts_serial|  11|    100000|     100|0.87279703|  PASSED
          sts_serial|  11|    100000|     100|0.43184814|  PASSED
          sts_serial|  12|    100000|     100|0.74743591|  PASSED
          sts_serial|  12|    100000|     100|0.92912813|  PASSED
          sts_serial|  13|    100000|     100|0.76446984|  PASSED
          sts_serial|  13|    100000|     100|0.41474394|  PASSED
          sts_serial|  14|    100000|     100|0.43600274|  PASSED
          sts_serial|  14|    100000|     100|0.34892825|  PASSED
          sts_serial|  15|    100000|     100|0.39514554|  PASSED
          sts_serial|  15|    100000|     100|0.91420886|  PASSED
          sts_serial|  16|    100000|     100|0.12891027|  PASSED
          sts_serial|  16|    100000|     100|0.25502730|  PASSED
         rgb_bitdist|   1|    100000|     100|0.47587315|  PASSED
         rgb_bitdist|   2|    100000|     100|0.88458605|  PASSED
         rgb_bitdist|   3|    100000|     100|0.93845118|  PASSED
         rgb_bitdist|   4|    100000|     100|0.47849575|  PASSED
         rgb_bitdist|   5|    100000|     100|0.94374456|  PASSED
         rgb_bitdist|   6|    100000|     100|0.86572499|  PASSED
         rgb_bitdist|   7|    100000|     100|0.36333630|  PASSED
         rgb_bitdist|   8|    100000|     100|0.86103915|  PASSED
         rgb_bitdist|   9|    100000|     100|0.85522176|  PASSED
         rgb_bitdist|  10|    100000|     100|0.80240762|  PASSED
         rgb_bitdist|  11|    100000|     100|0.26687750|  PASSED
         rgb_bitdist|  12|    100000|     100|0.16549648|  PASSED
rgb_minimum_distance|   2|     10000|    1000|0.14846931|  PASSED
rgb_minimum_distance|   3|     10000|    1000|0.19988545|  PASSED
rgb_minimum_distance|   4|     10000|    1000|0.80019487|  PASSED
rgb_minimum_distance|   5|     10000|    1000|0.95158568|  PASSED
    rgb_permutations|   2|    100000|     100|0.78900739|  PASSED
    rgb_permutations|   3|    100000|     100|0.92360523|  PASSED
    rgb_permutations|   4|    100000|     100|0.06140726|  PASSED
    rgb_permutations|   5|    100000|     100|0.70150773|  PASSED
      rgb_lagged_sum|   0|   1000000|     100|0.23235455|  PASSED
      rgb_lagged_sum|   1|   1000000|     100|0.52120656|  PASSED
      rgb_lagged_sum|   2|   1000000|     100|0.22766934|  PASSED
      rgb_lagged_sum|   3|   1000000|     100|0.35038622|  PASSED
      rgb_lagged_sum|   4|   1000000|     100|0.26125845|  PASSED
      rgb_lagged_sum|   5|   1000000|     100|0.90298763|  PASSED
      rgb_lagged_sum|   6|   1000000|     100|0.61490761|  PASSED
      rgb_lagged_sum|   7|   1000000|     100|0.60879059|  PASSED
      rgb_lagged_sum|   8|   1000000|     100|0.95659464|  PASSED
      rgb_lagged_sum|   9|   1000000|     100|0.74259826|  PASSED
      rgb_lagged_sum|  10|   1000000|     100|0.16243170|  PASSED
      rgb_lagged_sum|  11|   1000000|     100|0.23525439|  PASSED
      rgb_lagged_sum|  12|   1000000|     100|0.06598475|  PASSED
      rgb_lagged_sum|  13|   1000000|     100|0.37754865|  PASSED
      rgb_lagged_sum|  14|   1000000|     100|0.83798493|  PASSED
      rgb_lagged_sum|  15|   1000000|     100|0.68802937|  PASSED
      rgb_lagged_sum|  16|   1000000|     100|0.75693641|  PASSED
      rgb_lagged_sum|  17|   1000000|     100|0.38717555|  PASSED
      rgb_lagged_sum|  18|   1000000|     100|0.98063976|  PASSED
      rgb_lagged_sum|  19|   1000000|     100|0.63458041|  PASSED
      rgb_lagged_sum|  20|   1000000|     100|0.50550447|  PASSED
      rgb_lagged_sum|  21|   1000000|     100|0.58518588|  PASSED
      rgb_lagged_sum|  22|   1000000|     100|0.67293855|  PASSED
      rgb_lagged_sum|  23|   1000000|     100|0.36934247|  PASSED
      rgb_lagged_sum|  24|   1000000|     100|0.24675910|  PASSED
      rgb_lagged_sum|  25|   1000000|     100|0.83818181|  PASSED
      rgb_lagged_sum|  26|   1000000|     100|0.07111015|  PASSED
      rgb_lagged_sum|  27|   1000000|     100|0.50390287|  PASSED
      rgb_lagged_sum|  28|   1000000|     100|0.07887294|  PASSED
      rgb_lagged_sum|  29|   1000000|     100|0.75449287|  PASSED
      rgb_lagged_sum|  30|   1000000|     100|0.99969858|   WEAK
      rgb_lagged_sum|  31|   1000000|     100|0.62793868|  PASSED
      rgb_lagged_sum|  32|   1000000|     100|0.44864440|  PASSED
     rgb_kstest_test|   0|     10000|    1000|0.25821702|  PASSED
     dab_bytedistrib|   0|  51200000|       1|0.65332597|  PASSED
             dab_dct| 256|     50000|       1|0.51773051|  PASSED
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.99425590|  PASSED
        dab_filltree|  32|  15000000|       1|0.62049359|  PASSED
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.74836623|  PASSED
       dab_filltree2|   1|   5000000|       1|0.83701400|  PASSED
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|0.80371447|  PASSED

Und auch beim zweiten System mit einem KVM-virtualisierten "Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz" gibt es laut dieharder keine Beanstandungen:

#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |rands/second|   Seed   |
stdin_input_raw|  1.88e+07  |3966886010|
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.86802201|  PASSED
      diehard_operm5|   0|   1000000|     100|0.93857016|  PASSED
  diehard_rank_32x32|   0|     40000|     100|0.21554659|  PASSED
    diehard_rank_6x8|   0|    100000|     100|0.02393864|  PASSED
   diehard_bitstream|   0|   2097152|     100|0.72146650|  PASSED
        diehard_opso|   0|   2097152|     100|0.75580499|  PASSED
        diehard_oqso|   0|   2097152|     100|0.12630607|  PASSED
         diehard_dna|   0|   2097152|     100|0.08318236|  PASSED
diehard_count_1s_str|   0|    256000|     100|0.83369544|  PASSED
diehard_count_1s_byt|   0|    256000|     100|0.98448502|  PASSED
 diehard_parking_lot|   0|     12000|     100|0.74074906|  PASSED
    diehard_2dsphere|   2|      8000|     100|0.27217962|  PASSED
    diehard_3dsphere|   3|      4000|     100|0.93449392|  PASSED
     diehard_squeeze|   0|    100000|     100|0.79591941|  PASSED
        diehard_sums|   0|       100|     100|0.08260342|  PASSED
        diehard_runs|   0|    100000|     100|0.55360622|  PASSED
        diehard_runs|   0|    100000|     100|0.10557804|  PASSED
       diehard_craps|   0|    200000|     100|0.77589877|  PASSED
       diehard_craps|   0|    200000|     100|0.85530453|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.98866347|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.68766275|  PASSED
         sts_monobit|   1|    100000|     100|0.61721117|  PASSED
            sts_runs|   2|    100000|     100|0.93200830|  PASSED
          sts_serial|   1|    100000|     100|0.74699081|  PASSED
          sts_serial|   2|    100000|     100|0.00364348|   WEAK
          sts_serial|   3|    100000|     100|0.09215616|  PASSED
          sts_serial|   3|    100000|     100|0.78527182|  PASSED
          sts_serial|   4|    100000|     100|0.12680579|  PASSED
          sts_serial|   4|    100000|     100|0.61424014|  PASSED
          sts_serial|   5|    100000|     100|0.16770237|  PASSED
          sts_serial|   5|    100000|     100|0.42085097|  PASSED
          sts_serial|   6|    100000|     100|0.75700309|  PASSED
          sts_serial|   6|    100000|     100|0.63826119|  PASSED
          sts_serial|   7|    100000|     100|0.59100282|  PASSED
          sts_serial|   7|    100000|     100|0.78513054|  PASSED
          sts_serial|   8|    100000|     100|0.69352480|  PASSED
          sts_serial|   8|    100000|     100|0.49332202|  PASSED
          sts_serial|   9|    100000|     100|0.68905397|  PASSED
          sts_serial|   9|    100000|     100|0.61441861|  PASSED
          sts_serial|  10|    100000|     100|0.85033554|  PASSED
          sts_serial|  10|    100000|     100|0.82637215|  PASSED
          sts_serial|  11|    100000|     100|0.87559146|  PASSED
          sts_serial|  11|    100000|     100|0.81872729|  PASSED
          sts_serial|  12|    100000|     100|0.24838052|  PASSED
          sts_serial|  12|    100000|     100|0.99588877|   WEAK
          sts_serial|  13|    100000|     100|0.93714484|  PASSED
          sts_serial|  13|    100000|     100|0.76441555|  PASSED
          sts_serial|  14|    100000|     100|0.88325579|  PASSED
          sts_serial|  14|    100000|     100|0.78308466|  PASSED
          sts_serial|  15|    100000|     100|0.70135646|  PASSED
          sts_serial|  15|    100000|     100|0.92951300|  PASSED
          sts_serial|  16|    100000|     100|0.33861480|  PASSED
          sts_serial|  16|    100000|     100|0.51384470|  PASSED
         rgb_bitdist|   1|    100000|     100|0.64691596|  PASSED
         rgb_bitdist|   2|    100000|     100|0.36340761|  PASSED
         rgb_bitdist|   3|    100000|     100|0.13662446|  PASSED
         rgb_bitdist|   4|    100000|     100|0.90561258|  PASSED
         rgb_bitdist|   5|    100000|     100|0.09774341|  PASSED
         rgb_bitdist|   6|    100000|     100|0.59992552|  PASSED
         rgb_bitdist|   7|    100000|     100|0.12886912|  PASSED
         rgb_bitdist|   8|    100000|     100|0.93601521|  PASSED
         rgb_bitdist|   9|    100000|     100|0.52751789|  PASSED
         rgb_bitdist|  10|    100000|     100|0.31254677|  PASSED
         rgb_bitdist|  11|    100000|     100|0.82136358|  PASSED
         rgb_bitdist|  12|    100000|     100|0.92595382|  PASSED
rgb_minimum_distance|   2|     10000|    1000|0.79518024|  PASSED
rgb_minimum_distance|   3|     10000|    1000|0.51397031|  PASSED
rgb_minimum_distance|   4|     10000|    1000|0.47960772|  PASSED
rgb_minimum_distance|   5|     10000|    1000|0.85165830|  PASSED
    rgb_permutations|   2|    100000|     100|0.50745829|  PASSED
    rgb_permutations|   3|    100000|     100|0.03006811|  PASSED
    rgb_permutations|   4|    100000|     100|0.59388689|  PASSED
    rgb_permutations|   5|    100000|     100|0.23065839|  PASSED
      rgb_lagged_sum|   0|   1000000|     100|0.67210966|  PASSED
      rgb_lagged_sum|   1|   1000000|     100|0.33918884|  PASSED
      rgb_lagged_sum|   2|   1000000|     100|0.75190558|  PASSED
      rgb_lagged_sum|   3|   1000000|     100|0.74416904|  PASSED
      rgb_lagged_sum|   4|   1000000|     100|0.70682671|  PASSED
      rgb_lagged_sum|   5|   1000000|     100|0.49242189|  PASSED
      rgb_lagged_sum|   6|   1000000|     100|0.84792761|  PASSED
      rgb_lagged_sum|   7|   1000000|     100|0.89892157|  PASSED
      rgb_lagged_sum|   8|   1000000|     100|0.38757664|  PASSED
      rgb_lagged_sum|   9|   1000000|     100|0.87685081|  PASSED
      rgb_lagged_sum|  10|   1000000|     100|0.87448998|  PASSED
      rgb_lagged_sum|  11|   1000000|     100|0.94552468|  PASSED
      rgb_lagged_sum|  12|   1000000|     100|0.69899097|  PASSED
      rgb_lagged_sum|  13|   1000000|     100|0.61052074|  PASSED
      rgb_lagged_sum|  14|   1000000|     100|0.40428246|  PASSED
      rgb_lagged_sum|  15|   1000000|     100|0.41357249|  PASSED
      rgb_lagged_sum|  16|   1000000|     100|0.50608073|  PASSED
      rgb_lagged_sum|  17|   1000000|     100|0.73579529|  PASSED
      rgb_lagged_sum|  18|   1000000|     100|0.88116866|  PASSED
      rgb_lagged_sum|  19|   1000000|     100|0.01969011|  PASSED
      rgb_lagged_sum|  20|   1000000|     100|0.93329549|  PASSED
      rgb_lagged_sum|  21|   1000000|     100|0.06482253|  PASSED
      rgb_lagged_sum|  22|   1000000|     100|0.67360224|  PASSED
      rgb_lagged_sum|  23|   1000000|     100|0.11912063|  PASSED
      rgb_lagged_sum|  24|   1000000|     100|0.62730850|  PASSED
      rgb_lagged_sum|  25|   1000000|     100|0.92150416|  PASSED
      rgb_lagged_sum|  26|   1000000|     100|0.88313859|  PASSED
      rgb_lagged_sum|  27|   1000000|     100|0.17009240|  PASSED
      rgb_lagged_sum|  28|   1000000|     100|0.52599929|  PASSED
      rgb_lagged_sum|  29|   1000000|     100|0.99966442|   WEAK
      rgb_lagged_sum|  30|   1000000|     100|0.66724337|  PASSED
      rgb_lagged_sum|  31|   1000000|     100|0.29408784|  PASSED
      rgb_lagged_sum|  32|   1000000|     100|0.67994300|  PASSED
     rgb_kstest_test|   0|     10000|    1000|0.09623650|  PASSED
     dab_bytedistrib|   0|  51200000|       1|0.97246947|  PASSED
             dab_dct| 256|     50000|       1|0.22118329|  PASSED
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.89757812|  PASSED
        dab_filltree|  32|  15000000|       1|0.36526583|  PASSED
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.89963029|  PASSED
       dab_filltree2|   1|   5000000|       1|0.67162245|  PASSED
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|0.21033599|  PASSED

Warum also auf diese zusätzliche Entropiequelle verzichten? Diese wird sowieso nicht direkt genutzt, sondern nach "/dev/random" eingeleitet, mit dessen restlichen Entropiequellen gemischt, durch einen CSPRNG (Cryptographically Secure PseudoRandom Number Generator) geleitet und erst dieser Output wird verwendet. Bis ein Problem mit dem eigentlichen Verfahren von haveged gefunden wird, werde ich dieses jedenfalls nun auf meinen Systemen einsetzen.

P.S.: Dass der Entropiepool leerläuft, kann man über folgenden Befehl beobachten:

cat /proc/sys/kernel/random/entropy_avail

Hardware-Zufallszahlengenerator des Raspberry Pi nutzen

29.10.2015 yahe administration legacy linux security

Bei Serversystemen hat man häufig das Problem, dass dem Zufallszahlengenerator nicht genug Nutzerinteraktionen zur Verfügung stehen, um ausreichend Entropie für den Zufallszahlengenerator zu sammeln. Das führt dann, je nach eingesetzter Software, zu hängenden SSH-Verbindungen, zu Timeouts bei HTTPS-Verbindungen oder anderen nicht reproduzierbaren Fehlern. Aus diesem und anderen Gründen haben CPU-Hersteller begonnen, Hardware-Zufallszahlengeneratoren direkt in ihre Prozessoren zu integrieren. Bei Intel nennt sich diese Technologie "Secure Key" (vormals "Bull Mountain"), bei VIA ist sie als "PadLock" bekannt, einige Broadcom-SOCs haben einen Hardware-Zufallszahlengenerator und auch AMD Zen unterstützt RdRand.

Auch der Broadcom-Chip des Raspberry Pi bietet einen Hardware-Zufallszahlengenerator, dessen erzeugte Zufallszahlen man in den Linux-Zufallszahlenpool einfließen lassen kann. Hierfür sind nur wenige Schritte notwendig. Als erstes muss das entsprechende Kernel-Modul geladen werden. Die Distribution Raspbian liefert zwei Broadcom-Random-Number-Generator-Module mit den Namen "bcm2708_rng" und "bcm2835_rng". Obwohl im Raspberry Pi ein Broadcom 2835 steckt, funktioniert in Raspbian nur das "bcm2708_rng"-Kernelmodul korrekt. BCM2708 ist die SOC-Familie, zu der auch der BCM2835 gehört. Überprüfen kann man das auch nochmal anhand der Ausgabe des Befehls:

cat /proc/cpuinfo

In der erscheinenden Ausgabe wird die Hardware explizit als BCM2708 benannt:

processor  : 0
model name  : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS  : 2.00
Features  : half thumb fastmult vfp edsp java tls
CPU implementer  : 0x41
CPU architecture: 7
CPU variant  : 0x0
CPU part  : 0xb76
CPU revision  : 7

Hardware  : BCM2708
Revision  : 000e
Serial    : ****************

Nun heißt es, das passende Kernelmodul zu laden. Testweise könnt ihr das mit folgendem Befehl tun:

sudo modprobe bcm2708_rng

Wenn das ohne Fehler funktioniert hat, sollte nun das Character-Device-File "/dev/hwrng" existieren. Ist das der Fall, benötigt ihr noch die "rng-tools", die ihr einfach per "apt-get" installieren könnt:

sudo apt-get install rng-tools

Nach der Installation sollten diese direkt automatisch starten. Ihr könnt zudem testen, ob diese auch ihre Arbeit verrichten. Dazu ruft ihr das "rngd" Tool im Foreground-Modus auf und beendet es nach ein wenig Warten wieder per "CTRL+C":

sudo rngd -f
^C

Euch sollten nun die verschiedensten Statistiken angezeigt werden, unter anderem, wieviele FIPS 140-2 Tests erfolgreich bestanden wurden. Mit diesen wird die Qualität der generierten Zufallszahlen ermittelt:

rngd 2-unofficial-mt.14 starting up...
entropy feed to the kernel ready
stats: bits received from HRNG source: 60064
stats: bits sent to kernel pool: 512
stats: entropy added to kernel pool: 512
stats: FIPS 140-2 successes: 3
stats: FIPS 140-2 failures: 0
stats: FIPS 140-2(2001-10-10) Monobit: 0
stats: FIPS 140-2(2001-10-10) Poker: 0
stats: FIPS 140-2(2001-10-10) Runs: 0
stats: FIPS 140-2(2001-10-10) Long run: 0
stats: FIPS 140-2(2001-10-10) Continuous run: 0
stats: HRNG source speed: (min=752.012; avg=782.220; max=807.043)Kibits/s
stats: FIPS tests speed: (min=5.249; avg=5.533; max=6.076)Mibits/s
stats: Lowest ready-buffers level: 2
stats: Entropy starvations: 0
stats: Time spent starving for entropy: (min=0; avg=0.000; max=0)us
Exiting...

Wenn das alles funktioniert hat, könnt ihr die Verwendung des Kernel-Moduls permanent machen, indem ihr in die Datei "/etc/modules" eine neue Zeile mit dem Namen des Kernel-Moduls einfügt:

bcm2708_rng

Um sicherzugehen, dass die bereitgestellten Zufallszahlen wirklich eine gute Qualität haben, habe ich den vollständigen Satz an Dieharder-Tests laufen lassen. Hierzu habe ich erst einmal Dieharder selbst installiert:

sudo apt-get install dieharder

Da der Zufallszahlengenerator nicht sonderlich schnell ist, musste ich den Dieharder-Test via "nohup" starten. Dieses sorgt dafür, dass der Prozess weiterläuft, obwohl die SSH-Session, in der der Aufruf erfolgte, bereits geschlossen wurde. Der gesamte Dieharder-Testlauf dauerte etwa einen Monat:

sudo nohup sh -c "cat /dev/hwrng | dieharder -g 200 -a"

Die Ergebnisse der Dieharder-Tests sind aus meiner Sicht vielversprechend. Fast alle Testläufe wurden ohne Probleme bestanden. Lediglich zwei Testläufe zeigen ein "weak"-Ergebnis, was bei einem echten Zufallszahlengenerator durchaus mal vorkommen kann:

#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |rands/second|   Seed   |
stdin_input_raw|  2.49e+04  |1848243654|
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.80754184|  PASSED
      diehard_operm5|   0|   1000000|     100|0.46154223|  PASSED
  diehard_rank_32x32|   0|     40000|     100|0.24741511|  PASSED
    diehard_rank_6x8|   0|    100000|     100|0.98544914|  PASSED
   diehard_bitstream|   0|   2097152|     100|0.74214657|  PASSED
        diehard_opso|   0|   2097152|     100|0.62926414|  PASSED
        diehard_oqso|   0|   2097152|     100|0.65459762|  PASSED
         diehard_dna|   0|   2097152|     100|0.05329859|  PASSED
diehard_count_1s_str|   0|    256000|     100|0.93984253|  PASSED
diehard_count_1s_byt|   0|    256000|     100|0.73264960|  PASSED
 diehard_parking_lot|   0|     12000|     100|0.82688871|  PASSED
    diehard_2dsphere|   2|      8000|     100|0.81340970|  PASSED
    diehard_3dsphere|   3|      4000|     100|0.81943245|  PASSED
     diehard_squeeze|   0|    100000|     100|0.20437793|  PASSED
        diehard_sums|   0|       100|     100|0.01259559|  PASSED
        diehard_runs|   0|    100000|     100|0.40514608|  PASSED
        diehard_runs|   0|    100000|     100|0.83339986|  PASSED
       diehard_craps|   0|    200000|     100|0.11679660|  PASSED
       diehard_craps|   0|    200000|     100|0.42675629|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.96356183|  PASSED
 marsaglia_tsang_gcd|   0|  10000000|     100|0.84443650|  PASSED
         sts_monobit|   1|    100000|     100|0.86875820|  PASSED
            sts_runs|   2|    100000|     100|0.76068017|  PASSED
          sts_serial|   1|    100000|     100|0.44501629|  PASSED
          sts_serial|   2|    100000|     100|0.08213384|  PASSED
          sts_serial|   3|    100000|     100|0.40056497|  PASSED
          sts_serial|   3|    100000|     100|0.84781124|  PASSED
          sts_serial|   4|    100000|     100|0.67540322|  PASSED
          sts_serial|   4|    100000|     100|0.67479165|  PASSED
          sts_serial|   5|    100000|     100|0.93910920|  PASSED
          sts_serial|   5|    100000|     100|0.78108786|  PASSED
          sts_serial|   6|    100000|     100|0.36072231|  PASSED
          sts_serial|   6|    100000|     100|0.10943079|  PASSED
          sts_serial|   7|    100000|     100|0.33454672|  PASSED
          sts_serial|   7|    100000|     100|0.84662732|  PASSED
          sts_serial|   8|    100000|     100|0.56239211|  PASSED
          sts_serial|   8|    100000|     100|0.85989154|  PASSED
          sts_serial|   9|    100000|     100|0.09053360|  PASSED
          sts_serial|   9|    100000|     100|0.76921152|  PASSED
          sts_serial|  10|    100000|     100|0.65164012|  PASSED
          sts_serial|  10|    100000|     100|0.98802936|  PASSED
          sts_serial|  11|    100000|     100|0.16490199|  PASSED
          sts_serial|  11|    100000|     100|0.43350451|  PASSED
          sts_serial|  12|    100000|     100|0.97347736|  PASSED
          sts_serial|  12|    100000|     100|0.35755776|  PASSED
          sts_serial|  13|    100000|     100|0.61727927|  PASSED
          sts_serial|  13|    100000|     100|0.70426071|  PASSED
          sts_serial|  14|    100000|     100|0.96653473|  PASSED
          sts_serial|  14|    100000|     100|0.72003802|  PASSED
          sts_serial|  15|    100000|     100|0.33951664|  PASSED
          sts_serial|  15|    100000|     100|0.65324653|  PASSED
          sts_serial|  16|    100000|     100|0.79539647|  PASSED
          sts_serial|  16|    100000|     100|0.29465210|  PASSED
         rgb_bitdist|   1|    100000|     100|0.29377788|  PASSED
         rgb_bitdist|   2|    100000|     100|0.26581318|  PASSED
         rgb_bitdist|   3|    100000|     100|0.68619130|  PASSED
         rgb_bitdist|   4|    100000|     100|0.65469598|  PASSED
         rgb_bitdist|   5|    100000|     100|0.94194728|  PASSED
         rgb_bitdist|   6|    100000|     100|0.06186682|  PASSED
         rgb_bitdist|   7|    100000|     100|0.99989483|   WEAK
         rgb_bitdist|   8|    100000|     100|0.94851172|  PASSED
         rgb_bitdist|   9|    100000|     100|0.55403191|  PASSED
         rgb_bitdist|  10|    100000|     100|0.42372957|  PASSED
         rgb_bitdist|  11|    100000|     100|0.69930031|  PASSED
         rgb_bitdist|  12|    100000|     100|0.10435458|  PASSED
rgb_minimum_distance|   2|     10000|    1000|0.06686667|  PASSED
rgb_minimum_distance|   3|     10000|    1000|0.73245892|  PASSED
rgb_minimum_distance|   4|     10000|    1000|0.21902555|  PASSED
rgb_minimum_distance|   5|     10000|    1000|0.98142677|  PASSED
    rgb_permutations|   2|    100000|     100|0.52202354|  PASSED
    rgb_permutations|   3|    100000|     100|0.01765637|  PASSED
    rgb_permutations|   4|    100000|     100|0.54444953|  PASSED
    rgb_permutations|   5|    100000|     100|0.98885119|  PASSED
      rgb_lagged_sum|   0|   1000000|     100|0.19012074|  PASSED
      rgb_lagged_sum|   1|   1000000|     100|0.52956823|  PASSED
      rgb_lagged_sum|   2|   1000000|     100|0.95958846|  PASSED
      rgb_lagged_sum|   3|   1000000|     100|0.95145243|  PASSED
      rgb_lagged_sum|   4|   1000000|     100|0.13284355|  PASSED
      rgb_lagged_sum|   5|   1000000|     100|0.50651321|  PASSED
      rgb_lagged_sum|   6|   1000000|     100|0.67578443|  PASSED
      rgb_lagged_sum|   7|   1000000|     100|0.28159075|  PASSED
      rgb_lagged_sum|   8|   1000000|     100|0.70439598|  PASSED
      rgb_lagged_sum|   9|   1000000|     100|0.95701984|  PASSED
      rgb_lagged_sum|  10|   1000000|     100|0.11591970|  PASSED
      rgb_lagged_sum|  11|   1000000|     100|0.79622842|  PASSED
      rgb_lagged_sum|  12|   1000000|     100|0.30363114|  PASSED
      rgb_lagged_sum|  13|   1000000|     100|0.66673746|  PASSED
      rgb_lagged_sum|  14|   1000000|     100|0.08939797|  PASSED
      rgb_lagged_sum|  15|   1000000|     100|0.15096120|  PASSED
      rgb_lagged_sum|  16|   1000000|     100|0.31977071|  PASSED
      rgb_lagged_sum|  17|   1000000|     100|0.27180216|  PASSED
      rgb_lagged_sum|  18|   1000000|     100|0.69988188|  PASSED
      rgb_lagged_sum|  19|   1000000|     100|0.47622405|  PASSED
      rgb_lagged_sum|  20|   1000000|     100|0.69420826|  PASSED
      rgb_lagged_sum|  21|   1000000|     100|0.99297760|  PASSED
      rgb_lagged_sum|  22|   1000000|     100|0.60131473|  PASSED
      rgb_lagged_sum|  23|   1000000|     100|0.62287604|  PASSED
      rgb_lagged_sum|  24|   1000000|     100|0.70013973|  PASSED
      rgb_lagged_sum|  25|   1000000|     100|0.65860222|  PASSED
      rgb_lagged_sum|  26|   1000000|     100|0.93448843|  PASSED
      rgb_lagged_sum|  27|   1000000|     100|0.99635422|   WEAK
      rgb_lagged_sum|  28|   1000000|     100|0.29584189|  PASSED
      rgb_lagged_sum|  29|   1000000|     100|0.81313054|  PASSED
      rgb_lagged_sum|  30|   1000000|     100|0.64124408|  PASSED
      rgb_lagged_sum|  31|   1000000|     100|0.94116582|  PASSED
      rgb_lagged_sum|  32|   1000000|     100|0.96364896|  PASSED
     rgb_kstest_test|   0|     10000|    1000|0.13971491|  PASSED
     dab_bytedistrib|   0|  51200000|       1|0.65378962|  PASSED
             dab_dct| 256|     50000|       1|0.86099385|  PASSED
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.80254877|  PASSED
        dab_filltree|  32|  15000000|       1|0.56933154|  PASSED
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.71661701|  PASSED
       dab_filltree2|   1|   5000000|       1|0.34205581|  PASSED
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|0.80589488|  PASSED

IPFire via Mac OS X auf ALIX 2D13 installieren

01.10.2015 yahe administration legacy linux security

Lange Zeit habe ich die kleine Firewall-Distribution m0n0wall eingesetzt, um die Edge-Firewall, sprich, die äußerste Firewall zwischen dem eigenen Netz und dem Internet, in meinem heimischen Netzwerk zu betreiben. Leider wurde die Weiterentwicklung von m0n0wall vor einer Weile eingestellt. Ich musste also früher oder später einen Ersatz finden. Ich sah mich ein wenig um und fand das deutsche Projekt IPFire, einen Fork des sehr bekannten, aber nicht mehr gepflegten IPCop.

Als Hardware sollte mein bereits vorhandenes ALIX 2D13 von PC Engines zum Einsatz kommen. Dabei handelt es sich um ein Embedded-Board mit CF-Kartenleser, serieller Schnittstelle und einer 500MHz AMD Geode LX800 CPU. Von seinem Bruder, dem ALIX 2D3, unterscheidet es sich eigentlich nur durch die Pufferbatterie für die BIOS-Uhrzeit.

Um mit der seriellen Schnittstelle kommunizieren zu können, braucht man einen USB-zu-Seriell-Adapter, den man problemlos bei Amazon finden kann. Diese enthalten typischerweise den Prolific PL2303 Chipsatz, für den man die passenden Treiber beim Hersteller finden kann. Vergesst nicht das Nullmodem-Kabel, das ihr ebenfalls brauchen werdet. Auch das findet man bei Amazon. Um die CF-Karte beschreiben zu können, braucht man weiterhin einen CF-Kartenleser, den man ebenfalls bei Amazon findet. Abschließend braucht man noch eine ordentliche Terminalemulation. Hier habe ich dieses Mal ZOC ausprobiert, das man 30 Tage lang kostenlos testen kann.

Bevor wir mit dem Installieren von IPFire anfangen können, müssen wir wahrscheinlich erst einmal die Firmware des ALIX-Boards aktualisieren. Alle wichtigen Informationen zum ALIX-Board findet man auf der dazugehörigen Support-Seite, inklusive der Firmware-Version 0.99m. Mit dieser allein können wir jedoch noch nichts anfangen. Wir benötigen noch ein Betriebssystem, das wir auf dem ALIX-Board booten können, um das Firmware-Image flashen zu können. Auf der Webseite von PC Engines sind mehrere Möglichkeiten beschrieben, wie man das mit einem FreeDOS-Image lösen kann. Die aus meiner Sicht einfachste Variante ist es, das fertige Image herunterladen, dieses auf eine CF-Karte flashen, die Dateien aus der ebenfalls heruntergeladenen Firmware-Version 0.99m mit auf die CF-Karte kopieren und das ganze Paket anschließend booten und verwenden:

  1. Wenn wir das FreeDOS-Image entpackt haben, haben wir eine Datei namens "./freedos_alixupdate_0.99.img".
  2. Um die Datei zu flashen, stecken wir die CF-Karte in den CF-Kartenleser.
  3. Wir öffnen die Terminal-Anwendung von macOS und wechseln in den Ordner, in dem das FreeDOS-Image liegt.
  4. Nun lassen wir uns mit dem Befehl "diskutil list" die Liste der gemounteten Speichermedien anzeigen.
  5. In dieser Liste müssen wir den Namen der CF-Karte ausfindig machen, der die Form "/dev/disk<Zahl>" haben sollte. Man kann sich dabei z.B. an der Größe der CF-Karte orientieren.
  6. Wenn wir den Namen der CF-Karte ausfindig gemacht haben, können wir die entsprechende Disk mit dem Befehl "diskutil unmountDisk /dev/disk<Zahl>" unmounten.
  7. Nun sind wir soweit, dass wir das FreeDOS-Image mit dem Befehl "sudo dd if=./freedos_alixupdate_0.99.img of=/dev/disk<Zahl>" auf die CF-Karte flashen können.
  8. Das Flashen sollte relativ schnell gehen. Danach sollte macOS die Karte wieder erkennen und euch ermöglichen, die Dateien darauf zu bearbeiten.
  9. Nun könnt ihr die Dateien aus dem entpackten ALIX-Firmware-Download auf die CF-Karte kopieren ("./alix1.bin", "./ALIX1.IMG", "./alix2.bin", "./ALIX2.IMG", "./alix5.bin", "./ALIX5.IMG", "./alixbios.txt" und "./sb.com").
  10. Abschließend könnt ihr die CF-Karte mit dem Befehl "diskutil eject /dev/disk<Zahl>" auswerfen.

Die so vorbereitete Karte könnt ihr nun verwenden, um die Firmware eures ALIX-Boards zu aktualisieren. Das geht leider nicht vollkommen automatisch. Deshalb müssen wir nun alles vorbereiten, um die serielle Konsole des ALIX-Boards verwenden zu können. Hierfür solltet ihr als erstes mal die Treiber eures USB-zu-Seriell-Adapters installieren. Bei mir musste das Systems dabei neu gestartet werden. Nach der Installation sollten zwei neue Devices im System erscheinen ("/dev/cu.usbserial" und "/dev/tty.usbserial"). Wenn das der Fall ist, könnt ihr nun euren Terminalemulator starten. Hier müsst ihr nun konfigurieren, dass sich der Emulator mit der seriellen Schnittstelle des ALIX-Boards verbinden kann. Hier Schritt für Schritt das Vorgehen für ZOC:

  1. Verbindet den USB-Stecker eures USB-zu-Seriell-Adapters mit eurem Mac.
  2. Öffnet ZOC und startet eine neue Verbindung.
  3. Im sich neu öffnenden Einstellungsfenster gebt ihr ein, dass ihr das Verbindungsprofil "Standard.zoc" verwenden wollt, als Verbindungstyp setzt ihr "Serial/Direct" und als Emulation nehmt ihr "Xterm".
  4. Nun klickt ihr auf den "Bearbeiten..."-Button neben dem Verbindungsprofil, wodurch sich ein weiteres Fenster öffnet.
  5. Im neuen Fenster geht ihr links in der Liste auf "Verbindungstyp" und wählt "Serial/Direct" aus. Beim COM-Port drückt ihr nun auf "Scan..." und solltet einen Eintrag in der Form "/dev/cu.usbserial" angezeigt bekommen, den ihr auswählt. Weiterhin wählt ihr als Baud-Geschwindigkeit den Wert "38400". Das ist der Standardwert für ALIX-2-Boards gemäß des Handbuchs.
  6. Wenn ihr das soweit habt, könnt ihr nun auf "Speichern" klicken und im vorherigen Dialog auf "Verbinden" gehen. Euch sollte nun eine Fehlermeldung angezeigt werden, die ihr einfach mit "Abbruch" wegklicken könnt.

ZOC Serial Konfiguration ZOC Serial Konfiguration ZOC Serial Konfiguration

Euch sollte nun angezeigt werden, dass die Verbindung aufgebaut werden konnte. Daher könnt ihr nun das ALIX-Board vorbereiten. Steckt die vorbereitete CF-Karte in den dafür vorgesehenen Schacht, verbindet das Nullmodem-Kabel mit dem ALIX-Board und mit dem USB-zu-Seriell-Adapter, der bereits mit eurem Mac verbunden ist. Verbindet nun abschließend das ALIX-Board mit seinem Netzteil. Das ALIX-Board sollte nun eine Speicherprüfung machen und anschließend FreeDOS booten. Das sieht im Terminalemulator in etwa so aus:

PC Engines ALIX.2 v0.99h
640 KB Base Memory
261120 KB Extended Memory

01F0 Master 848A TS4GCF133
Phys C/H/S 7769/16/63 Log C/H/S 971/128/63
FreeDOS kernel build 2036 cvs [version Aug 18 2006 compiled Aug 18 2006]...................123
Kernel compatibility 7.10 - WATCOMC - 80386 CPU required - FAT32 support

(C) Copyright 1995-2006 Pasquale J. Villani and The FreeDOS Project.
All Rights Reserved. This is free software and comes with ABSOLUTELY NO
WARRANTY; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2, or (at your option) any later version.
 - InitDiskWARNING: using suspect partition Pri:1 FS 06: with calculated values    3-113-49 instead of    1-242-49
C: HD1, Pri[ 1], CHS=    0-1-1, start=     0 MB, size=    15 MB
FreeDOS HIMEM64 3.26 [Aug 25 2006] (c) 1995, Till Gerken 2001-2006 tom ehlert
HIMEM - Always On A20 method used
Kernel: allocated 43 Diskbuffers = 22876 Bytes in HMA

FreeCom version 0.84-pre2 XMS_Swap [Aug 28 2006 00:29:00]
C:\>

Startet nun das Programm "sb.com" aus, das sich um das Firmware-Update kümmert:

C:\>sb.com
ALIX flash update (C)2007-2011 PC Engines GmbH
Flash ID = 2 FFFF GPI = FF
Flash ID = 1 FFFF GPI = FF
Flash ID = 0 9D37 GPI = 01
Reading 512KB flash image alix1.bin................
Compare Erase Program Verify - update OK.
C:\>

Weiterhin könnt ihr nun schonmal die Baud-Rate des ALIX-Boards neu setzen, damit ihr später IPFire problemlos über die serielle Konsole verwenden könnt. Dazu rebootet ihr das Board (z.B. indem ihr es kurz stromlos schaltet). Während beim Hochfahren noch der Speichertest des ALIX-Boards läuft, drückt ihr schnell die "S"-Taste, woraufhin das ALIX-Board zur BIOS-Konfiguration wechseln sollte, was in etwa so aussieht:

PC Engines ALIX.2 v0.99h
640 KB Base Memory
261120 KB Extended Memory

01F0 Master 848A TS4GCF133
Phys C/H/S 7769/16/63 Log C/H/S 971/128/63

BIOS setup:

(9) 9600 baud (2) 19200 baud *3* 38400 baud (5) 57600 baud (1) 115200 baud
*C* CHS mode (L) LBA mode (W) HDD wait (V) HDD slave (U) UDMA enable
(E) PXE boot enable
*M* Memory test
(P) late PCI init
*R* Serial console enable
(X) Xmodem upload
(Q) Quit

Hier gebt ihr nun die "1"-Taste ein, denn IPFire wird später für die serielle Ausgabe die Geschwindigkeit von 115200 Baud verwenden. So könnt ihr dann den Bootvorgang des ALIX-Boards und die Ausgabe von IPFire ohne Probleme verfolgen. Nach Eingabe der Taste wechselt das ALIX-Board in eine andere Ansicht, in der ihr mit der "Q"-Taste und anschließendem Druck auf die "Y"-Taste die Änderung bestätigen müsst:

(9) 9600 baud (2) 19200 baud (3) 38400 baud (5) 57600 baud *1* 115200 baud
*C* CHS mode (L) LBA mode (W) HDD wait (V) HDD slave (U) UDMA enable
(E) PXE boot enable
*M* Memory test
(P) late PCI init
*R* Serial console enable
(X) Xmodem upload
(Q) Quit

Save changes Y/N ?
Writing setup to flash... OK

Wenn ihr das geschafft habt, könnt ihr das ALIX-Board erst einmal wieder vom Strom trennen und die CF-Karte entfernen. Auf diese werden wir als nächstes das IPFire-Image installieren, das man von deren Webseite herunterladen kann. Die CF-Karte, die für IPFire verwendet wird, muss mindestens 1GB groß sein. Größere Karten sind in Ordnung. IPFire wird bei der Installation dafür sorgen, dass der größere Speicherplatz mit verwendet wird. Beim Flashen des IPFire-Images gehen wir im Grunde genauso vor, wie auch vorhin schon:

  1. Wenn wir das IPFire-Image entpackt haben, haben wir eine Datei namens "./ipfire-2.21.2gb-ext4.i586-full-core124.img".
  2. Um die Datei zu flashen, stecken wir die CF-Karte in den CF-Kartenleser.
  3. Wir öffnen die Terminal-Anwendung von macOS und wechseln in den Ordner, in dem das IPFire-Image liegt.
  4. Nun lassen wir uns mit dem Befehl "diskutil list" die Liste der gemounteten Speichermedien anzeigen.
  5. In dieser Liste müssen wir den Namen der CF-Karte ausfindig machen, der die Form "/dev/disk<Zahl>" haben sollte. Man kann sich dabei z.B. an der Größe der CF-Karte orientieren.
  6. Wenn wir den Namen der CF-Karte ausfindig gemacht haben, können wir die entsprechende Disk mit dem Befehl "diskutil unmountDisk /dev/disk<Zahl>" unmounten.
  7. Nun sind wir soweit, dass wir das IPFire-Image mit dem Befehl "sudo dd if=./ipfire-2.21.2gb-ext4.i586-full-core124.img of=/dev/disk<Zahl>" auf die CF-Karte flashen können.
  8. Das Flashen sollte dieses Mal etwas mehr Zeit in Anspruch nehmen, da es mit 1GB doch recht groß ist, habt also Geduld. macOS wird den Inhalt der CF-Karte nach dem Flash-Vorgang wahrscheinlich nicht erkennen, aber das ist okay.
  9. Wir werfen die CF-Karte einfach mit dem Befehl "diskutil eject /dev/disk<Zahl>" aus.

Bevor wir weitermachen können, müssen wir noch den Terminalemulator umkonfigurieren, damit er die Geschwindigkeit von 115200 Baud verwendet. Bei ZOC gehen wir wieder so vor, dass wir das Programm starten, eine neue Verbindung aufbauen und im Einstellungsdialog neben dem Verbindungsprofil auf "Bearbeiten..." klicken. Im neuen Dialog gehen wir wieder auf "Verbindungstyp", danach auf "Serial/Direct" und wählen die Geschwindigkeit 115200 Baud aus. Abschließend klicken wir auf "Speichern" und klönnen nunim vorherigen Dialog auf "Verbinden" gehen.

ZOC Serial Konfiguration

Nun können wir die neu geflashte CF-Karte wieder in den CF-Kartenslot des ALIX-Boards schieben und dieses mit dem Strom verbinden. Nach dem obligatorischen Speichercheck sollte nun der Bootloader GRUB geladen werden, in dem IPFire standardmäßig nach wenigen Sekunden gebootet wird. Beim ersten Hochfahren reformatiert IPFire die CF-Karte automatisch und startet dann direkt wieder neu. Beim zweiten Hochfahren sollte dann eine pseudografische Oberfläche gestartet werden, die ihr mit der Tastatur steuern könnt. Dort werden Dinge wie das Root-Passwort der seriellen Konsole und des SSH-Zugangs, das Passwort des "admin"-Accounts der Weboberfläche, sowie der Netzwerktyp und die zugehörigen Netzwerkadressen erfragt. Das initiale Setup ist im Wiki von IPFire noch ausführlicher beschrieben.

Wenn ihr das initiale Setup erfolgreich absolviert habt, könnt ihr euren Mac mit einem Ethernet-Kabel mit dem von euch konfigurierten "grünen" LAN-Anschluss (also dem Anschluss, dem ihr das interne Netzwerk zugeordnet habt) verbinden und anschließend die webbasierte Konfigurationsoberfläche von IPFire aufrufen. Dazu müsst ihr euch erinnern, welche IP-Adresse ihr dem internen Netzwerkanschluss der Firewall gegebenen habt (typischerweise sowas wie "192.168.0.1") und könnt anschließend im Browser die URL "https://<ip>:444" aufrufen. Ihr solltet per HTTP-Basic-Authentication nach den Zugangsdaten des "admin"-Account gefragt werden und anschließend auf der Startseite der Weboberfläche landen.

IPFire Weboberfläche IPFire Weboberfläche

Ist das der Fall? Dann herzlichen Glückwunsch! Ihr habt soeben die Firmware eures ALIX-Boards aktualisiert und anschließend erfolgreich IPFire darauf installiert. Die weitere Konfiguration lässt sich durch die moderne Weboberfläche ziemlich schnell erledigen.


Search

Links

RSS feed

Categories

administration (43)
arduino (12)
calcpw (2)
code (37)
hardware (16)
java (2)
legacy (113)
linux (29)
publicity (7)
review (2)
security (62)
thoughts (22)
update (9)
windows (17)
wordpress (19)