Wie kann IP-Spoofing mit MAC und ebtables verhindert werden?

10

Ich versuche, IP-MAC- Pairing-Regeln in ebtables zu erstellen . Es gibt nur wenige Tutorials und verwandte Fragen [1], aber ich habe eine bestimmte Einstellung.

UMWELT: Ich habe viele physische Gastgeber . Jeder Host verfügt über wenige Ethernet-Karten, die verbunden und als Slave für die Bridge verwendet werden. Auf jedem Host befinden sich viele virtuelle Maschinen (kvm, qemu, libvirt). Jede virtuelle Maschine ist über einen neuen Port namens vnet [0-9] + mit einer Bridge ihres physischen Hosts verbunden. Es gibt kein NAT. Das Netzwerk funktioniert einwandfrei, alle physischen Hosts können gepingt werden, auch alle virtuellen Maschinen. Jede virtuelle Maschine hat ihre eigene IP-Adresse und MAC-Adresse.

PROBLEM: Innerhalb einer virtuellen Maschine kann die IP-Adresse in eine andere geändert werden.

GEFUNDENE LÖSUNG: Es gibt eine bekannte Lösung auf der ebtables-Site [2], aber diese Lösung ist anwendbar, wenn nur ein Host verwendet wird. Es erlaubt den gesamten Datenverkehr und wenn ein Paket von IP mit einem anderen MAC als zulässig vorhanden ist, wird das Paket verworfen. Wenn mehr als ein Host vorhanden ist, müssen alle vorhandenen IP-MAC-Paare auf allen Hosts registriert sein. Es ist eine umgekehrte Richtlinienlösung erforderlich.

CRAFTED SOLUTION: Ich habe versucht, ebtables invertiert zu verwenden. Hier ist ein Beispiel, was ich versucht habe.

BEISPIEL 1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

BEISPIEL 2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Der Kern meiner Anforderungen besteht darin, die Standardrichtlinie DROP zu verwenden und nur Datenverkehr von virtuellen Maschinen mit dem richtigen IP-MAC-Paar zuzulassen, das auf einem bestimmten Host bereitgestellt wird. Diese Lösungen funktionieren jedoch nicht.

FRAGE: Wie kann ich den Datenverkehr auf der Bridge nur für bestimmte IP-MAC-Paare laufender virtueller Maschinen zulassen und alle unbekannten IP-MAC-Paare löschen, die von den Ports vnet [0-9] + kommen?

Vielen Dank für alle Antworten.

Martin
quelle
2
Aber was ist, wenn jemand seinen Mac schmiedet?
Zoredache
1
Nun, das ist auch ein Problem. Das richtige IP-MAC-Paar zu erraten ist jedoch sehr schwierig und überschreitet rechtzeitig die Sicherheitsstufe meines Dienstes.
Martin

Antworten:

12

Ich habe es endlich geschafft, eine funktionierende Lösung zu finden.

  1. Die Lösung verwendet ebtables und IP-MAC-Paare.
  2. Die einzige benötigte Tabelle ist die Standardtabelle 'Filter'.
  3. Es ist nicht erforderlich, der INPUT-Kette Regeln oder Richtlinien hinzuzufügen, da die INPUT-Kette NICHT mit der Ausführung virtueller Maschinen zusammenhängt. Erläuterungen zur Bedeutung der Ketten INPUT, OUTPUT und FORWARD in der Filtertabelle finden Sie in der Manpage ebtables.
  4. Da ebtables auf Ethernet-Ebene funktioniert und die IP-MAC-Kopplung nur für IP-Pakete anwendbar ist, muss dies in den Regeln betont werden, um ARP-Frames und anderen wichtigen Datenverkehr nicht zu blockieren.

Am Anfang gibt es also überhaupt keine Regeln und alle Richtlinien sind auf AKZEPTIEREN eingestellt. Es gibt keine benutzerdefinierten Ketten. Die Filtertabelle sieht folgendermaßen aus:

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Eine neue Kette wird hinzugefügt. Diese Kette enthält alle zulässigen IP-MAC-Paare. Es heißt VMS.

# ebtables -N VMS

Nun zum wichtigen Teil. Wenden Sie für jeden Frame, der ein IP-Paket (oder seine Teile) enthält, das eine Brücke von Port vnet [0-9] + durchläuft, die Kettenrichtlinien und -regeln des Ketten-VMS an. Mit anderen Worten, wenden Sie für jedes IP-Paket, das von einer virtuellen Maschine kommt, die VMS-Kette an.

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

Die Standardrichtlinie von Chain VMS muss DROP sein. Auf diese Weise wird jedes von einer virtuellen Maschine kommende IP-Paket standardmäßig verworfen. Später werden zulässige Ausnahmen für IP-MAC-Paare hinzugefügt. Die Standardrichtlinie DROP führt dazu, dass der gesamte Datenverkehr von einer virtuellen Maschine mit unbekanntem IP-MAC-Paar auf einmal gelöscht wird, was IP-Spoofing unmöglich macht.

# ebtables -P VMS DROP

Der Tabellenfilter sieht jetzt so aus. So sieht es auch aus, wenn keine virtuellen Maschinen ausgeführt werden (zulässig).

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

Angenommen, es gibt zwei laufende Maschinen. Wenn wir versuchen, zu ihnen zu pingen, wird der Datenverkehr unterbrochen und das Ziel ist nicht erreichbar. Dies ist das gewünschte Ergebnis, da dieser Verkehr noch nicht erlaubt ist. Nur ein Befehl reicht aus, um jeden Datenverkehr einer virtuellen Maschine zuzulassen.

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

Jetzt fließt der Datenverkehr von zulässigen virtuellen Maschinen in Ordnung und IP-Spoofing wird verhindert.

Diese Lösung ist möglicherweise nicht perfekt und wenn Sie Kommentare oder Verbesserungen haben, werde ich diese gerne hören.

Martin
quelle