Cisco-ASA Layer-7-Inspection/DNS-PTR-DLP

Aus Knowledgebase
Zur Navigation springen Zur Suche springen

Die Cisco ASA hat so einige Features, u. A. eine Layer-7-Inspection. Sie kann in Pakete eines Streams schauen und die Verbindung basierend auf den gefundenen Werten unterbrechen.

Im folgenden Beispiel werden relevante Konfigurationsfragmente aufgezeigt, welche verhindern, dass DNS-Anfragen von extern in den gemäß RFC1918 definierten Netzbereichen zum DNS gelangen (sollen).

Diese Konfiguration wurde auf einer ASA mit Firmware Version 9.2 getestet.

Festlegen der Layer-¾-Übereinstimmungen

class-map dns-traffic
 match port udp eq 53

Policies (also Regelwerke) arbeiten immer mit Class-Maps. Daher ist diese zusätzliche Verknotung leider notwendig.

Die DNS-Inspection-Engine kommt (noch?) nicht mit TCP-Verbindungen zurecht. Schiebt man TCP-DNS-Traffic zur Inspection-Engine, bleiben die Pakete darin hängen, bis die Firewall-Logik die eigentliche TCP-Verbindung mit einem SYN-Timeout unterbricht. Daher genügt die einfache Klassifizierung auf udp/53.

Das bedeutet aber auch, dass die beschriebene Konfiguration mit einem dig +tcp auf einfache Weise umgangen werden kann. Daher sind zusätzliche Sicherungsmaßnahmen auf dem DNS selbst unumgänglich. Alternativ kann auch firewallseitig nur UDP-Traffic zum DNS durchgelassen werden. Dies stellt im Allgemeinen kein Problem dar, solange nicht externe Slave-DNS per Zonentransfer vom zu schützenden DNS ihre Informationen aktuell halten. Durch die Verfügbarkeit von EDNS sollten auch beim Einsatz von DNSSEC keine funktionalen Einschränkungen auftreten. Getestet habe ich dies indes noch nicht.

Festlegen der Layer-7-Übereinstimmungen

Anhand von Regexen wird festgelegt, welche Anfragen eine Übereinstimmung erzielen sollen:

regex 10.in-addr.arpa "\.10\.[Ii][Nn]-[Aa][Dd][Dd][Rr]\.[Aa][Rr][Pp][Aa]"
regex 168.192.in-addr.arpa "\.168\.192\.[Ii][Nn]-[Aa][Dd][Dd][Rr]\.[Aa][Rr][Pp][Aa]"
regex 1x.172.in-addr.arpa "\.1[6-9]\.172\.[Ii][Nn]-[Aa][Dd][Dd][Rr]\.[Aa][Rr][Pp][Aa]"
regex 2x.172.in-addr.arpa "\.2[0-9]\.172\.[Ii][Nn]-[Aa][Dd][Dd][Rr]\.[Aa][Rr][Pp][Aa]"
regex 3x.172.in-addr.arpa "\.3[0-1]\.172\.[Ii][Nn]-[Aa][Dd][Dd][Rr]\.[Aa][Rr][Pp][Aa]"

Diese einzelnen Regexe werden in einer Klasse (als Oder-Verknüpfung, match-any) zusammengefasst

class-map type regex match-any dns_rfc1918
 description Match queries for internal addresses
 match regex 10.in-addr.arpa
 match regex 1x.172.in-addr.arpa
 match regex 2x.172.in-addr.arpa
 match regex 3x.172.in-addr.arpa
 match regex 168.192.in-addr.arpa

Nun wird die PMap erstellt, in welcher festgelegt wird, was bei einer Übereinstimmung getan werden soll. Im Beispiel sind auch ein paar nützliche und als aus Erfahrung gut funktionierende Einstellungen für zusätzliche Überwachungen parametriert.

policy-map type inspect dns dns_out_in_map
 parameters
  message-length maximum client auto
  message-length maximum server auto
  no nat-rewrite
  id-randomization
  id-mismatch count 300 duration 300 action log
 match domain-name regex class dns_rfc1918
  drop-connection log

Zusammenfügen zum Großen Ganzen

Nun können in einer generischen (non-Inspect) PMap die Klassen und die Inspection-Policies miteinander verknüpft werden:

policy-map outside-in_policy
 class dns-traffic
  inspect dns dns_out_in_map 

Damit Pakete wie gewünscht inspiziert werden, muss diese PMap an eine Netzwerkschnittstelle gebunden werden:

service-policy outside-in_policy interface outside fail-close

Natürlich können die beiden Regelwerke auch in der globalen PMap untergebracht werden. Dies habe ich hier absichtlich nicht getan, ich möchte innerhalb der internen Netzwerksegmente keine Einschränkungen der DNS-Auflösungen haben.

Log

Im Logging der ASA tauchen bei Fehlversuchen diese Meldungen auf:

%ASA-4-410003: DNS Classification: Dropped DNS request (id 42553) from outside:203.0.113.10/46054 to dmz:198.51.100.20/53; matched Class 43: match domain-name regex class dns_rfc1918
%ASA-4-507003: udp flow from outside:203.0.113.10/46054 to dmz:198.51.100.20/53 terminated by inspection engine, reason - inspector disconnected, dropped packet.

Fußnoten


Weblinks