こんにちは。Tachanです。
みなさま!来年にOCIの構築実践ガイドが出ますね!
各サービスの内容だけでなく、設計や構築方法なども記載されているとのことです。
各通販サイトでは予約が始まっております。
Amazon:www.amazon.co.jp/dp/4297118092
楽天:https://books.rakuten.co.jp/rb/16518966/
また、オラクルの日本の開発者チームによるYouTubeも開設されています!
ここでは開発者向けコミュニティで開催されたセミナーを見ることができます。
動画を拝見させていただきましたが、どれも興味深い内容で、システム構築の勉強になります。
チャンネル:https://www.youtube.com/channel/UCDz9yA6Vp7OG0sPx3RhrtnA/about
さて、今回は自分への戒めの意味も込めて記事を作成しました。
ことの経緯
先日こんなことがありました。
オラクルクラウド上にubuntuのインスタンスを作成し、ソフトウェアをインストールしたところ………………
SSHは繋がるけどWebブラウザアクセスができない…!!!
OCI上のFWやネットワークで止められているのかと思いましたが、
設定に不備は見当たりませんでした。
ネットワーク・セキュリティ・グループ(NSG)で該当のポートを追加したものの、
アクセスはできませんでした…
原因
途方に暮れた私は、チームリーダーである山内さんに相談しました。
そこでわかったことは、iptablesがデフォルトで有効になっていたことでした。
オラクルクラウド上で通信制御の設定していても、
このiptablesで全部拒否されていたのです。
調べてみると、オラクルクラウドのubuntuは、UFWではなくiptablesでFW制御を行うようでした。
詳細はオラクルクラウドの公式ドキュメントに記載されています。
提供イメージ
https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/References/images.htm
既知の問題
https://docs.cloud.oracle.com/ja-jp/iaas/Content/knownissues.htm#ufw
対処
UbuntuインスタンスにSSH経由でiptablesコマンドを利用し、該当ポートを許可する設定を行いました。
iptablesの設定確認コマンド
$ sudo iptables -L
該当ポートの許可
$ sudo iptables -I INPUT 5 -p tcp --dport [ポート番号] -j ACCEPT
公式ドキュメントではルート権限で実行していましたが、
ルートの設定をしていなかったため一般ユーザー(ubuntu)を使い、
ドキュメントとは異なるコマンドを使用しました。
これで解決…と言いたいところですが、iptablesについて調べていたところ、
サーバを再起動するとiptablesの設定が初期値に戻ってしまうようです。
OCIが行うメンテナンスによっては、サーバーが再起動になる可能性があります。
それを防ぐために、iptablesの設定を永続化する必要がありました。
「sudo iptables save」で保存できるかなと思ったのですが、うまくいかないみたいですね。
私も実際に試しましたがうまくいきませんでした。
以下のコマンドを実行することで、iptablesの設定を永続化することが可能です。
sudo /etc/init.d/netfilter-persistent save
sudo /etc/init.d/netfilter-persistent reload
これで再度Webブラウザアクセスすると、ちゃんとつながりました!よかった!
iptablesについて調べたこと
上記の対処により、OCI上のマシンへの通信は問題なく行えるようになり解決したのですが、
iptables、OCIのiptablesルールについて調べたことを記載します。
iptablesとは
Linuxに実装されたパケットフィルタリングおよびネットワークアドレス変換 (NAT) 機能であるNetfilterの設定を操作するコマンドのことです。
このパケットフィルタリング機能を利用し、対象のコンピュートへの通信をフィルタリングし、ファイアウォール機能を実現しています。
OCI提供のUbuntu iptablesルールの確認
以下は「sudo iptables -L」コマンド実行時に表示される
OCIで提供されるUbuntu 18.04 LTSのデフォルトのiptablesのルールです。
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT udp -- anywhere anywhere udp spt:ntp
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
InstanceServices all -- anywhere link-local/16
Chain InstanceServices (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere 169.254.0.2 owner UID match root tcp dpt:iscsi-target /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */
※中略※
REJECT udp -- anywhere link-local/16 udp /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */ reject-with icmp-port-unreachable
チェインとは
INPUT、FORWARD、OUTPUT、InstanceServicesの4つのチェインがあります。
チェインとは、どのタイミングでパケットフィルタリングするか指定するためのものです。
用途に応じたルールの入れ物と考えられます。
- INPUT:外部から対象コンピュート宛のパケットを制御するルールを記載する
- FORWARD:別のホストへパケットを転送するルールを記載する
- OUTPUT:対象コンピュートから外部へのパケットを制御するルールを記載する(※InstanceServicesへのジャンプルールを編集しないこと)
- InstanceServices:インスタンスのブート・ボリュームとブロック・ボリュームのiSCSIネットワークのルール(※編集しないこと)
Chain ○○〇〇の後に記載されている(policy ACCEPT)の意味は、すべてのルールにマッチしなかった場合の動作です。
また、各チェイン内のルールは以下の内容で構成されています。
- ターゲット:ACCEPT/REJECT/DROPなどパケットがルール該当した場合の処理を指定
- プロトコル:TCP/UDP/ICMPなどのプロトコルを指定
- パケット送信元:パケットの送信元IPアドレスやネットワークを指定
- パケット宛先:パケットの宛先IPアドレスやネットワークを指定
- オプション:ポート番号やパケットに対する詳細条件を指定
INPUTチェインルール
次にOCIのコンピュートに指定されているINPUTチェインルールを1行ずつ見てみましょう。
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
1行目に記載されているこのルールは、RELATED、ESTABLISHEDが指定されていますので、 確立済みの通信(ESTABLISHED)と関連パケット(RELATED)は、全てのプロトコルで、全ての送信元から、全ての宛先に通信を許可するというものです。
ACCEPT icmp -- anywhere anywhere
2行目のルールはプロトコルICMPの場合、全ての送信元から全ての宛先への通信を許可するというものです。
ACCEPT all -- anywhere anywhere
3行目のルールは一見、全てのプロトコルは全ての送信元から全ての宛先へ通信を許可すると見えてしまいますが、 実は指定されている受信インタフェースがLoopbackインタフェースのみとなっています。
「sudo iptables -L -v」コマンド実行することで適用インタフェースの確認が可能です。
以下は、出力結果の抜粋ですが、inの項目がloとなっており、
対象のルールの受信インタフェースがLoopbackインタフェースのみ指定されていることが分かります。
$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
109 9900 ACCEPT all -- lo any anywhere anywhere
次は4行目のルールです。
ACCEPT udp -- anywhere anywhere udp spt:ntp
このルールは、プロトコルUDPで送信元ポートがNTPの場合、全ての送信元から全ての宛先に通信を許可するというものです。 UDPで行うNTP同期では、対象コンピュートから時刻同期を行った際にNTPサーバからの戻りのパケットを許可してあげるためのルールになります。
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5行目のルールは、プロトコルTCPで宛先ポートSSHの新規セッションについては、全ての送信元から全ての宛先に許可するものです。
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
最後の6行目のルールは、全てのプロトコルで全ての送信元から全ての宛先への通信は、host-prohibitedメッセージを返して接続を拒否するというものです。
OCIのFORWARDチェインルール
OCIデフォルトのFORWARDチェインのルールは単純です。
先ほどのINPUTチェイン6行目のルールと同じで全ての通信はhost-prohibitedメッセージを返してFORWARDを拒否するというものです。
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
OCIのOUTPUTチェインルール
最後のOUTPUTチェインのルールは、全ての送信元から169.254.0.0/16宛のパケットはInstanceServicesというチェインにジャンプして、InstanceServicesチェインでチェックされ評価するというものです。
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
InstanceServices all -- anywhere link-local/16
尚、InstanceServicesチェインにはインスタンスのブート・ボリュームとブロック・ボリュームで使用されるiSCSIネットワーク・エンドポイント(169.254.0.2:3260、169.254.2.0/24:3260)に対する送信接続の確立を許可するルールが含まれています。
Chain InstanceServices (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere 169.254.0.2 owner UID match root tcp dpt:iscsi-target /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */
※中略※
REJECT udp -- anywhere link-local/16 udp /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */ reject-with icmp-port-unreachable
OUTPUT/InstanceServicesチェインでは、Link-Local宛の通信のみ対象となっておりますが、「Chain OUTPUT (policy ACCEPT)」が指定されており、OUTPUT/InstanceServicesチェインのルールにマッチしない場合、全ての通信が許可されます。
これにより、OCI上のコンピュートは外部への通信については任意の通信が可能になっています。
まとめ
今回はOCIのUbuntuサーバを利用する際の注意点として、iptablesがデフォルト有効となっている点をご紹介しました。
また、OCIのコンピュートのiptablesについて調べたことをまとめてみました。
次回以降はiptablesの存在を忘れないようにするぞ、という強い気持ちを持って今回は終わります。
最後までお読みいただきありがとうございました。
今回の記事は以上になりますが、
弊社では、他にも検証記事やクラウド移行に関する記事を作成しています。
・OCIと社内ネットワークをVPN接続してみた
https://cloudsolution.terilogy.com/blog/oci-vpn-20201225
・OCI上でWindows DHCPサーバを動かしてみた
https://cloudsolution.terilogy.com/blog/oci-windows-dhcp-server
また、弊社では、Oracle Cloudの構築やOCVSを使ったVMWareの移行サービス、
他にも設定ミスや各種ガイドライン・コンプライアンスに違反がないか継続的にチェックするCSPMサービスの取り扱いもございますので、こちらからぜひ詳細をご覧ください。
Oracle Cloud:https://cloudsolution.terilogy.com/oci
OCVS:https://cloudsolution.terilogy.com/oci/ocvs
CSPMサービス:https://cloudsolution.terilogy.com/corestack/cspm
- カテゴリ:
- OCIでの設計上の注意