Назад | Перейти на главную страницу

Последствия для безопасности настройки UFW default_forward_policy для принятия?

Руководство по докеру (http://docs.docker.com/installation/ubuntulinux/#docker-and-ufw) заявляет, что необходимо установить UFW DEFAULT_FORWARD_POLICY в "ACCEPT", чтобы контейнеры докеров могли связываться друг с другом.

  1. Каковы последствия для безопасности, если это сделать на сервере с общедоступными сетевыми интерфейсами?

  2. Что нужно сделать, чтобы обезопасить такой докер-хост?

Кажется, они решили эту часть проблемы, по крайней мере, в последней версии 1.4.1. Моя политика FORWARD - отбрасывать пакеты, и межконтейнерная связь работает без проблем.

Это стандартные правила в цепочке FORWARD, созданной докером:

$ 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           

Снизу вверх:

  • Третье правило - связь докер-> докер, которая допускается без ограничений.
  • Второе правило docker-> где угодно (но не докер), что тоже принимается без ограничений.
  • Первое правило - где угодно -> докер, принимаются только "ответные" пакеты.

Здесь нет проблем. (Если вам не нужны исходящие фильтры)

Вы можете с радостью установить для политики FORWARD + INPUT значение DROP / REJECT.

Теперь вы можете захотеть предоставить услугу в Интернете. Например. простой веб-сервер:

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

Хорошо, теперь перейдите на yourserver.com. Вы увидите страницу nginx по умолчанию. Зачем? Docker добавил для вас несколько специальных правил в iptables.

$ 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           

Эти правила обходят все правила ufw, если есть прослушивающий контейнер. ufw ничего не делает в таблице nat, а Docker устанавливает свои правила на первое место в цепочке FORWARD. Таким образом, вы не можете заблокировать IP-адрес или установить какое-либо ограничение скорости.

Возможные решения:

  • Запустите Docker с --iptables=false и делать все вручную. Кропотливое решение, потому что каждый раз, когда вы перезапускаете контейнер, он получает новый IP (на данный момент они планируют его изменить).
  • Свяжите все порты на localhost с помощью -p 127.0.0.1:30080:80 и создайте для этого свои собственные правила iptables.
  • Модифицировать ufw как-нибудь?
  • Не используйте какую-либо структуру межсетевого экрана. Я делаю это сейчас. Все мои правила сохранены в отдельном скрипте в виде команд iptables. Этот скрипт выполняется после перезагрузки и каждые service docker start. Хотя это немного взломано, это работает ...