BIND - Error: loading from master file managed-keys.bind failed: file not found

Die derzeit aktuelle Debian Distribution (6.0.5, Debian Squeeze) enthält einen kleinen Fehler in der Standardkonfiguration des DNS-Server’s BIND. Wer BIND als DNS Server in der Distribution einsetzen will, erhält folgende Fehlermeldungen im Syslog:

general: error: managed-keys-zone ./IN: loading from master file managed-keys.bind failed: file not found

Der Fehler besagt, dass ein Sicherheitsschlüssel fehlt und die Root-Zone (./IN) nicht validiert werden kann. Konkret betrifft es DNSSEC (DNS-Secure) welche über IPv6 abgefragt werden.

Falscher Lösungsansatz:

Wie wir in einigen Selbsthilfeforen lesen mussten, wurde als Lösungsansatz vorgeschlagen die Defaults „dnssec-enable“ und „dnssec-validation“ zu deaktivieren. Dies ist aber definitiv nicht der richtige Weg, da es sich hierbei um ein sehr gutes Sicherheitsfeature handelt.

Warum dieses Feature?

Da die sogenannte ROOT-Zone seit einiger Zeit signiert ist (Schweden war hier der Vorreiter und hat dies als erstes Land überhaupt umgesetzt), ist die DNSSEC-Validierung standardmäßig aktiviert. Der Sinn dahinter ist, dass es damit nicht mehr möglich ist, den Cache eines DNS-Servers mit falschen Zonendaten zu verfälschen, womit ein „Internetangreifer“ DNS-Abfragen einfach auf andere Server umleiten kann. Bestes Beispiel dafür ist das Pishing von Bankdaten, in der ein Angreifer einfach den DNS-Namen Ihrer Hausbank auf einen eigenen gefälschten Server umleitet. Angriffe dieser Art sind dafür bekannt, dass die angezeigte Seite nahezu identisch mit der originalen ist. Wer dies nicht genau prüft wird hier schnell zum Opfer. DNS-SEC kann also einen Teilnehmer damit verifizieren, dass die durch den Server übermittelten Zonendaten tatsächlich identisch mit denen sind, die der für die Zone autorisierte und signierende Server ausliefert. Dies ist ein sehr wichtiges Sicherheitsfeature und sollte daher nicht deaktiviert werden. Die Lösung von Problemen sollte auch Grundsätzlich nicht darin bestehen, Features wegen Fehler zu deaktivieren, sondern den Fehler zu beseitigen. Der Lösungsansatz ist daher auch voller Käse

Richtige Lösung

Damit BIND die Signaturprüfung auch durchführen kann, benötigt BIND auch eine verlässliche Kopie des öffentlichen Schlüssels. Diese Kopie kann aber nicht über eine DNS-Abfrage bezogen werden sondern muss auf dem Datenträger vorhanden sein. Die Kopie des öffentlichen ISC-Schlüssels wurde auch ordnungsgemäß ausgeliefert und in der Datei /etc/bind/bind.keys abgelegt. Dummerweise hat der Programmierer bei der Erstellung der Standardkonfigurationsdatei dabei vergessen, diesen auch per Default zu verlinken. Die Verlinkung wird in der Datei /etc/bind/named.conf angegeben. In der Standardkonfiguration stehen folgende Anweisungen:

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
In diese Datei muss einfach folgende Zeile an hinzugefügt werden:
include "/etc/bind/bind.keys";
Bitte daran denken, eine Leerzeile nach der letzten Zeile einzufügen, sonst erkennt BIND das Ende der Konfigurationszeile nicht. Die Konfiguration wird gespeichert und BIND danach neu gestartet und schon verschwindet die Fehlermeldung aus dem Syslog und DNSSEC-Validierung wird funktionieren.

Ergänzung zu Server, welche keine IPv6 Anbinden oder Routen.

Bei aktiviertem IPSEC wird BIND in regelmäßigen Abständen ihm bekannte Rootserver kontaktieren. Dies sind sowohl IPv4 als auch IPv6 Adressen. Wenn er diese auf Grund der fehlenden IPv6 Anbindung nicht kann oder IPv6 nicht geroutet wird, erstellt BIND für jeden dieser Server einen Eintrag im Syslog. Um dies zu verhindern kommentiert man einfach alle IPv6-Einträge in der Datei /etc/bind/db.root mit einem Semikolon am Anfang der Zeile aus. Auch wenn man es nicht möchte, aber man sollte sich langsam mit dem Gedanken abfinden, dass für IPv4 im Internet das letzte Stündlein geschlagen hat und seine Server (DNS, Router etc) IPv6 tauglich machen. Ob sie bereits Fit für IPv6 sind können Sie hier überprüfen: http://test-ipv6.de

Sollten wir vergessen haben, etwas wichtiges zu erwähnen, dann kommentiert den Beitrag einfach. Sonst bleibt uns nur der Dank für's lesen.


Euer Entwicklteam

 
( 8 Votes ) 
{jcomments on}

Einen Heuhaufen in einer Nadel suchen - PHP Haystack in a Needle

Habt ihr das schon mal versucht? Macht eigentlich auch kein Schwein, außer dass Entwicklteam! Wir suchen einen Heuhaufen in einer Nadel! Zugegeben, dass ist sehr schwierig aber wer auf die schlechte Grammatik von PHP stößt und diese ein bisschen versteht, kann diese Aufgabe problemlos lösen.

Wir standen heute vor einer solchen Aufgabe und sind fast ausgeflippt, eh der Mist so funktioniert hat, wie wir uns das vorgestellt haben. Am liebsten hätten wir einen Total-Blackout simmuliert, wären Heim gegangen und hätten unseren Frust bei einer Runde FIFA gegen schwächere Gegner auf der PS3 raus gelassen. Unser halbes Mitglied hatte aber was dagegen. Fuck!

Nun gut! Ihr müsst euch folgendes Vorstellen. Wir haben viele viele viele Rollenketten. Jede dieser Ketten hat eine andere Bezeichnung aber je nach Serie doch etwas gemeinsam. Allein das ist schon richtig Kacke. Nun haben wir aber auch keinen Bock für jede dieser möglichen Typen ein eigenes PHP-Scriptfile zu schreiben. Macht bei dynamischen Webseiten auch keinen Sinn. Nach ein bisschen überlegen sind wir also auf die PHP-Funktion $strpose und $haystack gestoßen. Als Heuhaufen haben wir jetzt unsere Sammlung von vielen Ketten und wollen aber eine bestimmte aus dem Haufen entnehmen, was wir die Nadel nennen.

Auf Deutsch würden wir unsere Frage an den PHP-Core wie folgt stellen: Liebes PHP, befindet sich zufällig die Nadel XY im Heuhaufen? Damit kann PHP aber nichts anfangen. PHP möchte die Frage gerne wie folgt gestellt bekommen: Liebes PHP, in diesem Heuhaufen, kann die Nadel XY dort gefunden werden? PHP ist grammatisch gesehen also sehr eigenartig. Warum das so ist? Beantworten wir nicht, das ist ein langweiliges Thema und geht uns nichts an.


Was wollen wir damit erreichen?

Also, je nachdem welche Rollenkette der Kunde auf unserer Seite betrachten möchte, soll ein Datenblatt generiert werden. Bei den Ketten mit Anbauteilen welche die Zeichen M1x1, M1x2, M2x1, M2x2, K1x1, K1x2, K2x1, K2x2 oder GU enthalten muss eine zusätzliche Tabelle eingeschoben werden, die angibt, auf welches Bauteil sich die nachfolgenden Abmessungen beziehen. Beispiel für die Anbauteile: Winkellasche, Mitnehmerlasche, vulkanisiertes Elastomerprofil oder nichts, also keine zusätzliche Maßtabelle. Die Bezeichnung 08B-1-M1x1 steht zum Beispiel dafür, dass es sich im eine Simplex-Rollenkette nach DIN 8187 mit einer schmalen Mitnehmerlasche auf einer Seite der Kette handelt. 208A-1-K1x1 beschreibt eine Simplex-Rollenkette nach DIN 8188 mit breiten Winkellaschen auf einer Seite der Kette. Und so sieht es dann aus, wenn es mit PHP umgesetzt wird.


Als erstes definieren wir die Funktion

function strposa($haystack, $needles=array(), $offset=0)
{
$stack = array();
foreach($needles as $needle)
    {
    $res = strpos($haystack, $needle, $offset);
    if ($res !== false) $stack[$needle] = $res;
    }
if(empty($stack)) return false;
return min($stack);
}

Erläuterung

$strposa Name der Funktion
   
$haystack Unser Heuhaufen (PHP Standardvariable)
   
$needles Viele Nadeln (unserer Anbauteile) als array (Bereichsvariable)
   
$offset gibt den Startpunkt an, an welcher Stelle nach der Übereinstimmung im Array gesucht werden soll (bei uns von ganz vorne). Wird der gesuchte String gefunden, ermittelt diese Variable an welcher Stelle er gefunden wurde und speichert ihn. $offset kann also keinen negativen Wert erhalten. Der kleinstmögliche ist also 0 (NULL).
   
$foreach Damit überschreiben wir die PHP-Variablenfunktion $needles mit $needle
   
$res Das zwischengespeicherte Ergebnis aus der Funktion
   
If ($res !== false) Hier setzen wir eine Negation ein, welche sagt, wenn das Ergebnis nicht falsch bzw. oder nicht falsch oder wahr ist, soll es in die Variable $Stack abgelegt werden.
   
Ergebnis: Wenn $stack leer ist wird als return Code false ausgegeben anderenfalls soll $stack ausgegeben werden.

Verwenden der Funktion:

$string = $dsatz["kbz2"];
$array = array('-M','-K','-GU');
If (strposa($string, $array, 1))
{
echo "<tr>";
echo "<td id='tablel' colspan='3'>";
    if (strpos(%string, '-M'))
    {
    echo "Abmessungen Mitnehmerlasche";
    }
            elseif (strops($string, "-GU"))
            {
            echo "Abmessungen             Elastomerprofil";
            }
    else
    {
    echo "Abmessungen Winkellasche";
    }
echo "</td>";
echo "</tr>";
}
else
{
echo "";
}

usw….

Die Variable $string wird durch die Variable $dsatz[‘‘kzb2‘‘] definiert dessen Wert aus einer Datenbank herangezogen wird welcher in einer vorangegangen Abfrage ermittelt wurde.


Nachteil unserer Lösung

Diese Lösungsvariante ist etwas schwieriger umzusetzen, benötigt etwas länger Zeit und mehr Hirnschmalz in der Umsetzung, da hierbei die Gefahr von Flüchtigkeitsfehler wesentlich höher ist. Einen Scriptfehler zu entdecken ist daher etwas aufwendiger


Vorteil unserer Lösung

Statt für jede Rollenkettenserie ein extra Scriptfile zur Verfügung zu stellen können wir unser Array beliebig erweitern und müssen nur eine weitere ifelse Anweisung hinzufügen und somit alle im unseren Sortiment angebotenen Ketten mit nur einem Scriptfile abdecken. Das erspart enorm viel Zeit und verringert den Pflegeaufwand von unseren Scriptfiles.


Wie immer darf jeder Ahnunghaber, Lobsager, Guru etc. kommentieren, egal ob Lob oder Tadel, denn uns hält jetzt nichts mehr von FIFA auf der PS3 ab. Wäre es jetzt unfair wenn wir mit FC Barcelona gegen Bradford City spielen? Wir meinen: Nö!


Euer Entwicklteam
 
( 2 Votes ) 
{jcomments on}