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

В руководстве по докеру ( http://docs.docker.com/installation/ubuntulinux/) говорится, что необходимо установить для UFW DEFAULT_FORWARD_POLICY значение "ПРИНЯТЬ", чтобы контейнеры док-станции могли связываться друг с другом.

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

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

1 ответ

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

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

$ 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-> Docker Communication, которое принимается без ограничений.
  • Второе правило - docker->where(но не docker), что также принимается без ограничений.
  • Первое правило где угодно -> Docker, принимаются только "ответные" пакеты.

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

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

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

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

Хорошо, теперь перейдите на yourserver.com. Вы увидите страницу nginx по умолчанию. Зачем? Докер добавил некоторые специальные правила в 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-адрес (на данный момент они планируют это изменить).
  • Свяжите все порты на локальном хосте с -p 127.0.0.1:30080:80 и создайте свои собственные правила iptables, чтобы туда попасть.
  • Модифицировать ufw как-нибудь?
  • Не используйте брандмауэры. Я делаю это сейчас. Все мои правила сохраняются в отдельном скрипте как команды iptables. Этот скрипт выполняется после перезагрузки и каждый service docker start, Хотя это немного хакерски работает...
Другие вопросы по тегам