グリーン免許エンジニアのNotepad

エンジニアの免許を取得したてのほやほやエンジニアが作るNotepadです。Notepad(メモ帳)以上のことは書けません。

Dockerを動かすとufwで設定したはずのルールを回避して外部にサービスを公開してしまう事象

始めに

ConoHa VPSをレンタルして、WireGuardを構築し、自分だけがアクセス可能なWebアプリ構築まで後一歩のところでハマったことをこちらに記載します。 なお、今回の「自分だけがアクセス可能なWebアプリ」はすでにDockerを使って作成済みであり、VPSでもDockerにて動かす想定です。 ちなみに、内容としてはこちらの続きのような認識ですので、詳しく設定内容知りたい方はご覧ください。

起こった事象

VPSにてVPNサーバを構築の上、必要なポート(今回だとssh,VPNのポート)のみ許可する設定をufwにて設定した後、 docker-composeにてDockerサービスを起動すると、、、 なんと、ufwで許可していない(厳密にはローカルIPからのみ許可している)Webサービスに外部からアクセスができてしまいました。 ※python http serverにて起動したwebは公開されないのに、Dockerで起動した80ポートは公開されるような状態

Dockerを使用した場合のufwの問題

調査したところ、Dockerを使用してサービスを公開する場合、Dockerはufwの設定を回避し、サービスを外部に公開してしまうようです。 また、Dockerが変更したiptablesの設定は、ufw側から閲覧できず、公開されているのに気づきにくい状態です。

after.rulesを使用したufwのルール設定

after.rulesは、ufwコマンドで追加したルールの後で実行されるルールを設定するためのファイルです。以下の手順に従って、ufwのルールを設定することで外部に公開されることのないDockerサービスを起動できます。

  1. after.rulesファイルを開きます。
sudo vim /etc/ufw/after.rules
  1. ファイルの最後に、以下のルールを追加します。
# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER
  1. after.rulesを保存し、ufwを再起動します。
sudo ufw disable
sudo ufw enable

これで、Dockerを使用してサービスを起動しても、ufwの設定を回避することがなくなります。after.rulesを使用してufwのルールを設定することで、サーバーへのアクセスを制限することができます。

さいごに

Dockerを使用して外部にサービスを公開する場合、ufwの設定を回避してしまう問題があります。 今回は、気づいたのでよかったものの、この事象を知らずにDockerにてサービスを公開すると、セキュリティ上問題があります。 何かしら構築したあとは、意図した挙動になっているかどうか確認することが大事ということを再確認できた事象でした。 今回は、after.rulesを使用してufwのルールを設定することで、この問題を解決しましたが、そのほかにも「DOCKER_OPTSにiptables=false」を追加するや、「—expose」オプションを利用するなど解決策はあるようなので、個人のネットワークにあった解決法を実施いただければと思います。

参考

GitHub - chaifeng/ufw-docker: To fix the Docker and UFW security flaw without disabling iptables ufwでブロックしているはずのDocker環境のポートに外部からアクセスできてしまう

© 2018-2023 tt. All Rights Reserved.