AWS環境のPaloaltoを本格導入した&ハマッたこと
現職で、AWS環境にPaloaltoVMを構築し、オンプレミスのPaloaltoからのリプレイスを図ったのですがその時ハマったことを自分用のメモとして記載します。
本エントリに書いてあることが意外とドキュメントとして探しづらいので情報をまとめました。この情報が誰かの役にたてばこれ幸いです。
前提
このエントリは下記の方向けに記載しています。
そもそもなぜ移行を検討したか
主にBCP目的です。
データセンターではなく、社内環境にPaloaltoを用意してあり、各支社からは本社のPaloaltoを経由して各種通信をするスター型のネットワークトポロジになっていました。
要は 本社のPaloaltoが停止すると全社のネットワークが止まる という。。
例えば、本社が大規模災害になったとすると 支社含めて会社業務がほぼ止まる という全く笑えない事態となってました。
(実際に本社の法令停電で支社がネットワーク接続できなくなる、という事態もおきてました)
どういう形で移行したの?
AWS側にPaloaltoVMを構築し、社内環境からはAWS側に構築したPaloaltoとIPSec接続しました。
そして、社内からのInternet接続は全てAWS環境のPaloaltoを通過するような構成にしました。
図にすると↓みたいな感じ。
[オンプレ]社内PC→[オンプレ]IPSecルータ→[AWS]Paloalto→[AWS]Internet Gateway
AWS環境じゃなくて、データセンターに置けば良くない?
データセンターに置くことも考えましたが、データセンターに置くことによるメリットがコストメリットくらいしか無く、 「Paloalto物理マシンのメンテ」 など余計な運用コストが発生することを懸念し、クラウドに移行しました。
※予算がシビアな会社はデータセンターにPaloaltoを置いて、そことIPSEC接続するのも悪い選択肢ではないとは思います。現社の場合は「運用コスト>費用」だったので。
そもそもPalo Alto VM必要?AWS側の機能だけで良くない?
と、最初考えたのですが、AWS側ですべて完結しようとすると、「セキュリティグループの管理が大変」だったり、「トラフィックログを見るのが大変」だなと考えたのでPalo Alto VMを導入することを決めました。
- セキュリティグループの管理
- トラフィックログの管理
ハマったこと
ここからが本題。ハマったこと一覧です。
InterfaceのIPアドレスはDHCPではなく、スタティックで構築すべし
当初はclassmethodさんの下記記事を参考にPaloaltoVMへのIPアドレスアサインを「DHCPクライアント」として登録して、AWS側のDHCPサーバ側からIPを取得させていました。
ところが、しばらくすると通信が不通になりPaloaltoVM自体を再起動しないと、再度通信ができなくなる自体に。 (恐らく、DHCPリース期限が切れたタイミングでこういった事象になるのですが真の原因は不明です。 )
そこでIPアドレスをDHCPではなくスタティックで設定しました。そうすることで通信が切れることはなくなりました。
ちなみに、どういったIPアドレスを設定すればいいか(≒AWS側からアサインされたIPアドレスをどうやって確認すればいいか)はPaloalto管理コンソールから対象のインタフェースを選択し、「DHCPクライアントランタイム情報の表示」 を選択すれば確認できます。
Gatewayアドレス・NextHopアドレスはグローバルIPではなく、ローカルIPアドレスで指定すべし
GatewayアドレスやNextHopアドレスをElastic IP(AWSで用意したグローバルIPのこと)で設定しがちなのですが、これはNGです。
設定するIPアドレスは AWS側の「プライベートIPアドレス」 を設定します。
(グローバルIPのアタッチはAWS側で勝手に実施します。Paloalto側ではできません。)
オンプレミスで構築をしてきた人だとグローバルIPを設定しがちなんですよね。。(私もそうでした)
インスタンスタイプによるInterface数の制限に注意
PaloaltoVMを構築する際にEC2インスタンスのインスタンスタイプが一番最低限のものにする場合、現時点(2019年5月時点)では「m4.xlarge」を選択することになります。 mx4.largeではENI(インタフェース)を4つまでしか作成できず、かつ、PaloaltoVM側でマネージメントインタフェースとして1つENIを使用するので、 実質、インタフェースは3つまでしか作成できません というわけで、3つ以上のインタフェースを作成したい人はインスタンスタイプをm4.xlarge以上のものにする必要があります。
詳細は下記URLの「各インスタンスタイプのネットワークインターフェイスあたりの IP アドレス数」-「ネットワークインターフェイスの最大数」でご確認ください。
※単純に「グローバルIPを複数使いたい」という場合は上記ENIの最大数の制限を回避する方法があります。詳細は後述の「1つのインタフェースにグローバルIPを複数割り当てする方法」を参考にしてください。
1つのインタフェースにグローバルIPを複数割り当てする方法
ちょっとややこしいですが、、下記手順で構築すれば可能です。
- EC2管理コンソールから「IPアドレスの管理」を選択。「新しいIPの割り当て」で新たなプライベートIPを割り当て。
- EC2管理コンソールから新たに割り当てたプライベートIPにEIPを割り当て。
- PaloaltoVMの管理コンソールにて「Policies」タブ-「NAT」にて新たに割り当てたEIPを適用したいNATルールを作成。
※ENIの割り当てもインスタンスタイプによって上限はあります。m4.xlargeでも上限15個なので、まあ使い切ることは無いかもですが。 こちらも詳細は(https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html の「インターフェイスあたりの IPv4 アドレス」を参考にしてください。)
swapインタフェース
PaloaltoVMを冗長化する場合の選択肢の一つとして、「AWS側のNLBにぶら下げる」という方法があります。
が、しかし。
PaloaltoVMのデフォルトでは「プライマリのインタフェースがマネジメントインタフェース」となります。
マネジメントインタフェースのままでは、ALBにぶら下げることができないので、下記方法でeth0とeth1を交換(swap)するようにPaloaltoVMを起動するようにすればNLBにぶら下げることができるようになります。
なので、私はインスタンス作成時に下記のように構築し、インスタンス作成後にswapして構築しました。
- eth0
- Internet Gatewayと通信できるENI(PaloaltoでいうUntrust側インタフェース)
- eth1
- マネジメントインタフェースのENI
冗長化の組み方
Palo Alto VMの冗長化構成として私が調べた限りでは一般的には下記の2つのいずれかの方法を取るようです。
- 同一AZ内に配置し、HA構成を組む。 ※オンプレミスでHA構成を構成するときと同じやり方。
- NLBにPalo Alto VMをぶら下げる
ただし、現職では上記いずれの方式も採用しませんでした。
理由は下記。
- 「同一AZでHA」
- 「NLB」
では、冗長化についてはどのようにしたかというと、「Lambdaによる監視・冗長化」で対応することにしました。(まだ実装はできてませんが。。)
具体的にはLambdaにて下記方法で冗長性を確保することにしました。
- LambdaにてプライマリVMのダウンを検知。
- LambdaにてセカンダリVMの起動。
- LambdaにてRoute53上のDNSエントリ(例えば、Global Protectなど)をプライマリVMからセカンダリVMのものに書き換え。
上記のような構成にすることで、2号機側は普段はインスタンス停止している状態となるのでインスタンス費用が節約可能にもなってます。
ご参考までに: knowledgebase.paloaltonetworks.com
VM構築時に参考にしたサイト
■リファレンスアーキテクチャ。先ずはこれを熟読しました。 www.paloaltonetworks.jp
■実際の構築HowTo docs.paloaltonetworks.com
実際使ってみてどう?
多少の通信遅延を覚悟していましたが、結構快適です。 WANインタフェースが1GBpsの回線ですが60Mbpsとかでます。 (全社展開はまだできておらず、一部環境での展開しかできておりませんので引き続き要検証)
現社の場合、Paloalto移行に伴い、AD環境や認証環境も全てAWS側に移行したので、仮に本社が壊滅しても事業継続が可能になりましたとさ。