Zum Hauptinhalt springen

Anhang C. Authentifizierungsfragen

Dieser Anhang beschreibt einen optionalen Authentifizierungsmechanismus, der verwendet werden kann, um die Integrität von NTP-Nachrichten zu überprüfen und Schutz vor Nachrichtenänderungs- und Wiederholungsangriffen zu bieten. Der Mechanismus basiert auf der MD5-kryptographischen Hash-Funktion und verwendet einen gemeinsamen geheimen Schlüssel zwischen den Peers. Wenn die Authentifizierung aktiviert ist, wird ein Authentifikatorfeld mit einem Schlüsselbezeichner und Nachrichtendigest an die NTP-Nachricht angehängt.

Der Authentifizierungsmechanismus bietet die folgenden Sicherheitsdienste:

  1. Nachrichtenintegrität: Stellt sicher, dass die Nachricht während der Übertragung nicht geändert wurde.
  2. Quellenauthentifizierung: Überprüft, dass die Nachricht von einem legitimen Peer stammt, der den gemeinsamen geheimen Schlüssel besitzt.
  3. Schutz vor Wiederholung: Bei Kombination mit dem NTP-Zeitstempelmechanismus bietet Schutz vor Wiederholungsangriffen.

Der Authentifizierungsmechanismus ist optional und muss nicht in allen Fällen implementiert werden. Wenn jedoch Sicherheit ein Anliegen ist, insbesondere in Umgebungen, in denen nicht autorisierte Zeitserver möglicherweise falsche Zeitinformationen einspeisen könnten, bietet der Authentifizierungsmechanismus ein wirksames Schutzmittel.

C.1. NTP-Authentifizierungsmechanismus

Der NTP-Authentifizierungsmechanismus verwendet die MD5-kryptographische Hash-Funktion, um einen Nachrichtendigest über die NTP-Nachricht und einen gemeinsamen geheimen Schlüssel zu berechnen. Der Nachrichtendigest wird zusammen mit einem Schlüsselbezeichner, der angibt, welcher Schlüssel verwendet wurde, an die NTP-Nachricht im Authentifikatorfeld angehängt.

Das Authentifikatorfeld hat das folgende Format:

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Message Digest |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Schlüsselbezeichner: Dies ist eine 32-Bit-vorzeichenlose Ganzzahl, die den kryptographischen Schlüssel identifiziert, der zur Erzeugung des Nachrichtendigests verwendet wurde.

Nachrichtendigest: Dies ist ein 128-Bit-MD5-Hash, der über die NTP-Nachricht (bis zum, aber ohne das Authentifikatorfeld) und den gemeinsamen geheimen Schlüssel berechnet wird.

Die gemeinsamen geheimen Schlüssel werden manuell konfiguriert und in einer Schlüsseldatei gespeichert, auf die der NTP-Daemon zugreifen kann. Jeder Schlüssel hat einen eindeutigen Bezeichner und wird als 64-Bit-(8-Oktett-)Wert dargestellt. Das Format des Schlüssels ist mit dem DES-Verschlüsselungsalgorithmus kompatibel, obwohl DES im Authentifizierungsmechanismus nicht direkt verwendet wird.

C.2. NTP-Authentifizierungsverfahren

Die Authentifizierungsverfahren werden während der Sende- und Empfangsvorgänge aufgerufen. Wenn die Authentifizierung aktiviert ist, berechnet das Sendeverfahren den Nachrichtendigest und hängt den Authentifikator an die ausgehende Nachricht an. Das Empfangsverfahren überprüft den Authentifikator bei eingehenden Nachrichten und setzt entsprechend das Authentifizierungsbit.

C.2.1. Verschlüsselungsverfahren

Das Verschlüsselungsverfahren wird vom Sendeverfahren aufgerufen, wenn die Authentifizierung aktiviert ist. Es berechnet den MD5-Nachrichtendigest und hängt den Authentifikator an die NTP-Nachricht an.

begin encrypt procedure
if (peer.authenable = 0) exit; /* Authentifizierung deaktiviert */

/* Schlüsselbezeichner anhängen */
pkt.keyid <- peer.hostkeyid;

/* MD5-Digest über Nachricht und Schlüssel berechnen */
digest <- MD5(message || key[peer.hostkeyid]);

/* Digest an Nachricht anhängen */
pkt.check <- digest;

end encrypt procedure

Die MD5-Berechnung wird über die gesamte NTP-Nachricht (einschließlich NTP-Header und Zeitstempelfelder) gefolgt vom gemeinsamen geheimen Schlüssel durchgeführt. Der resultierende 128-Bit-Digest wird im Authentifikatorfeld an die Nachricht angehängt.

C.2.2. Entschlüsselungsverfahren

Das Entschlüsselungsverfahren wird vom Empfangsverfahren aufgerufen, um den Authentifikator bei eingehenden Nachrichten zu überprüfen. Es berechnet den Nachrichtendigest mit dem angegebenen Schlüssel neu und vergleicht ihn mit dem Digest in der empfangenen Nachricht.

begin decrypt procedure
if (peer.authenable = 0) begin /* Authentifizierung deaktiviert */
peer.authentic <- 1;
exit;
endif

/* Prüfen, ob Schlüsselbezeichner gültig ist */
if (pkt.keyid not in sys.keys) begin
peer.authentic <- 0;
exit;
endif

/* Empfangenen Digest extrahieren */
received_digest <- pkt.check;

/* Erwarteten Digest berechnen */
expected_digest <- MD5(message || key[pkt.keyid]);

/* Digests vergleichen */
if (received_digest = expected_digest)
peer.authentic <- 1;
else
peer.authentic <- 0;

end decrypt procedure

Wenn die Authentifizierung erfolgreich ist (Digests stimmen überein), wird das Authentifizierungsbit (peer.authentic) auf 1 gesetzt, was anzeigt, dass die Nachricht von einem legitimen Peer stammt. Wenn die Authentifizierung fehlschlägt, wird das Bit auf 0 gesetzt, und abhängig von der Konfiguration kann die Nachricht abgelehnt werden.

C.2.3. Kontrollnachrichtenverfahren

Wenn die in Anhang B beschriebenen NTP-Kontrollnachrichten mit Authentifizierung implementiert werden, wird derselbe Authentifizierungsmechanismus verwendet. Die Verschlüsselungs- und Entschlüsselungsverfahren werden auf die gleiche Weise angewendet wie bei regulären NTP-Nachrichten.

Für Kontrollnachrichten ist die Authentifizierung besonders wichtig, da diese Nachrichten zum Lesen und Ändern interner Variablen der NTP-Implementierung verwendet werden können. Ohne Authentifizierung könnte ein Angreifer möglicherweise die Zeitsynchronisation stören oder sensible Informationen extrahieren.

Implementierungsüberlegungen

Bei der Implementierung des Authentifizierungsmechanismus sollten folgende Überlegungen berücksichtigt werden:

  1. Schlüsselverwaltung: Die gemeinsamen geheimen Schlüssel müssen manuell auf allen Peers konfiguriert werden, die die Authentifizierung verwenden. Schlüssel sollten regelmäßig geändert werden, um die Sicherheit zu erhalten.

  2. Leistungsauswirkung: Die Berechnung des MD5-Digests fügt jeder Nachricht Verarbeitungsaufwand hinzu. Auf Systemen mit begrenzten CPU-Ressourcen kann dies die Zeitgenauigkeit beeinträchtigen. Implementierungen sollten in Betracht ziehen, Digest-Berechnungen zwischenzuspeichern oder bei Verfügbarkeit Hardware-Beschleunigung zu verwenden.

  3. Zeitstempelpräzision: Die Verschlüsselungsoperation sollte so nah wie möglich an der tatsächlichen Nachrichtenübertragung durchgeführt werden, um die Auswirkungen auf die Zeitstempelgenauigkeit zu minimieren. Einige Implementierungen berechnen den Digest-Versatz vorab, um die Verschlüsselungsverzögerung zu kompensieren.

  4. Schlüsselbezeichnerraum: Der 32-Bit-Schlüsselbezeichnerraum ermöglicht eine große Anzahl von Schlüsseln, erleichtert die Schlüsselrotation und unterstützt mehrere Authentifizierungsdomänen.

  5. Rückwärtskompatibilität: Nachrichten mit und ohne Authentifizierung können koexistieren. Peers, die keine Authentifizierung unterstützen, ignorieren einfach das Authentifikatorfeld.

  6. Sicherheitsbeschränkungen: Der Authentifizierungsmechanismus schützt vor Nachrichtenänderungs- und Wiederholungsangriffen, bietet jedoch keine Verschlüsselung des Nachrichteninhalts. Die Zeitinformationen selbst werden im Klartext übertragen.

Der hier beschriebene Authentifizierungsmechanismus bietet ein praktisches Gleichgewicht zwischen Sicherheit und Leistung für die meisten NTP-Bereitstellungen. Für Umgebungen, die stärkere Sicherheitsgarantien erfordern, können zusätzliche Maßnahmen wie IPsec oder andere Transport-Layer-Sicherheitsmechanismen angemessen sein.