Auswirkungen auf die Sicherheit, wenn UFW default_forward_policy akzeptiert wird?

8

Das Docker-Handbuch ( http://docs.docker.com/installation/ubuntulinux/#docker-and-ufw ) besagt, dass es nicht erforderlich ist, UFWs DEFAULT_FORWARD_POLICY auf "ACCEPT" zu setzen, damit Docker-Container sich gegenseitig erreichen können.

  1. Was bedeutet dies für die Sicherheit auf einem Server mit öffentlich zugänglichen Netzwerkschnittstellen?

  2. Was ist zu tun, um einen solchen Docker-Host zu sichern?

Niko
quelle
1
Ja, ich weiß nicht, warum das so ist. Und das steht auch ohne Haftungsausschluss.
Jonathan
Es ist einige Zeit her, dass @Jadawin der Community eine scheinbar vollkommen gute Antwort angeboten hat. Können Sie es akzeptieren, indem Sie die grüne Markierung unter dem Punktzähler markieren, damit andere davon profitieren können? (Benutzer gehen bevorzugt zu akzeptierten Antworten.) Prost.
Cbhihe
1
Es beantwortet nicht die erste Frage, was sind die Auswirkungen von DEFAULT_FORWARD_POLICY
jakethedog

Antworten:

5

Sie scheinen diesen Teil des Problems zumindest in der neuesten Version 1.4.1 gelöst zu haben. Meine FORWARD-Richtlinie lautet, Pakete zu verwerfen, und die Kommunikation zwischen Containern funktioniert problemlos.

Dies sind die Standardregeln in der von Docker erstellten FORWARD-Kette:

$ iptables -vnL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in      out      source               destination         
 6902   96M ACCEPT     all  --  *       docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 6151  482K ACCEPT     all  --  docker0 !docker0 0.0.0.0/0            0.0.0.0/0           
    3   180 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Von unten nach oben:

  • Die dritte Regel ist Docker-> Docker-Kommunikation, die ohne Einschränkungen akzeptiert wird.
  • Die zweite Regel ist Docker-> überall (aber nicht Docker), was ebenfalls ohne Einschränkungen akzeptiert wird.
  • Die erste Regel ist überall-> Docker, nur "Antwort" -Pakete werden akzeptiert.

Keine Probleme hier. (Es sei denn, Sie möchten ausgehende Filter)

Sie können die FORWARD + INPUT-Richtlinie problemlos auf DROP / REJECT setzen.

Jetzt möchten Sie möglicherweise einen Dienst im Internet bereitstellen. ZB ein einfacher Webserver:

$ docker run -d -p 80:80 dockerfile/nginx

OK, gehen Sie jetzt zu yourserver.com. Sie sehen die Standard-Nginx-Seite. Warum? Docker hat einige spezielle Regeln in iptables für Sie hinzugefügt.

$ iptables -vn -t nat -L # NAT table, truncated for clarity
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  189 11900 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.15:80

$ iptables -vnL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.15          tcp dpt:80
 6903   96M ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 6159  483K ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    3   180 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Diese Regeln umgehen alle ufw-Regeln, wenn ein Container lauscht. ufw macht nichts in der nat-Tabelle und Docker legt seine Regeln an erster Stelle in der FORWARD-Kette fest. Es ist Ihnen also nicht möglich, eine IP-Adresse zu blockieren oder Ratenbegrenzungen jeglicher Art vorzunehmen.

Mögliche Lösungen:

  • Starten Sie Docker mit --iptables=falseund erledigen Sie alles manuell. Sorgfältige Lösung, da bei jedem Neustart eines Containers eine neue IP-Adresse abgerufen wird (dies ist derzeit geplant).
  • Binden Sie alle Ports auf localhost mit -p 127.0.0.1:30080:80und erstellen Sie Ihre eigenen iptables-Regeln, um dorthin zu gelangen.
  • Ufw irgendwie ändern?
  • Verwenden Sie kein Firewall-Framework. Ich mache das jetzt. Alle meine Regeln werden in einem separaten Skript als iptables-Befehle gespeichert. Dieses Skript wird nach jedem Neustart ausgeführt service docker start. Obwohl ein bisschen hacky es funktioniert ...
Jadawin
quelle