Последствия для безопасности установки UFW default_forward_policy для принятия?
В руководстве по докеру ( http://docs.docker.com/installation/ubuntulinux/) говорится, что необходимо установить для UFW DEFAULT_FORWARD_POLICY значение "ПРИНЯТЬ", чтобы контейнеры док-станции могли связываться друг с другом.
Как это влияет на безопасность на сервере с общедоступными сетевыми интерфейсами?
Что нужно сделать, чтобы обезопасить такой докер хост?
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
, Хотя это немного хакерски работает...