Cisco-ASA Layer-7-Inspection/DNS-PTR-DLP
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