こんにちは。@Owl2ndと申します。
この世界の片隅に生息しているSEおじさんです。
昨今の在宅勤務で少し可処分時間が増えたので、巷のエンジニアのすなるアドベントカレンダーなどしてみんとて、今年仕事で触る機会のあったさくらのクラウド、XG Firewallについて書いてみました。
本記事は「さくらインターネット Advent Calendar 2020」に参加させていただいております。
https://qiita.com/advent-calendar/2020/sakura
自分にプレッシャーをかけようと飛び込みで登録してみましたが、他記事のクオリティが高いので、目論見通りプレッシャーやばいですね……。
登場人物
2号さん:非開発部署育ちなので職位はそこそこだがスキルは勉強中の人。
フロム脳くん:開発部署でバリバリ構築をこなすマン。マゾいゲームが好き。
序章
2号「よう、フロムくん、稲作やってる?」
フ脳「……今はデモンズやってますよ(2号さん、何か質問あるときの顔だ)」
2号「実はさくらのクラウドでSophos XG Firewall使ってWAF構築する案件振られたんやけど、フロムくんXGの構築得意やったよね」
フ脳「得意って程でもないですが……どこか引っかかってるんですか?」
2号「インスタンスが、起動せんねん」
フ脳「最初からってことですね……」
Sophos XG Firewallを起動する in さくらのクラウド
フ脳「基本的には初期導入手順書通りに進める感じなんですけどね……」
□ドキュメント for Sophos XG Firewall in さくらのクラウド
https://manual.sakura.ad.jp/cloud/marketplace/sophosxgfirewall.html
フ脳「インスタンスが起動しないってことはおそらくNICの数が足りないんじゃないですか」
2号「ファ!? NICって1個じゃあかんの?」
フ脳「Sophos XGはNIC 2個ないと起動しないんですよ」
2号「でもさくらのクラウドってインスタンス作成したら即座にNIC 1個で自動起動するやん?」
フ脳「だからインスタンス作成時にサーバ追加画面でシンプルモードのチェックを外して」
フ脳「ページ下部の"作成後すぐに起動"のチェックを外してからデプロイするんです」
2号「ふぁー、シンプルモードのチェック初めて外したわ」
フ脳「で、インスタンスが作成されたらNICを1つ追加してから、インスタンスを起動」
2号「おっ、起動してきた!」
2号「簡単やなぁ……わいの今日一日返してほしいわ!」
フ脳「最初からちゃんとドキュメント読めばいいんですよ……」
2号「ア、ハイ」
ライセンスをアクティベートする
2号「ほな、ここからはドキュメントを読みながら進めるで!」
フ脳「(このまま付き合う感じの空気になってるな……)」
2号「インスタンスは起動したから、まずはNICに割り振られたIPアドレスを確認して」
2号「コンソールからXG Firewallにログインして、インターフェイスにIPを設定する、と」
SF01V_SO01_SFOS 17.5.10 MR-10# ip addr add [IFアドレス]/255.255.255.0 dev Port1
SF01V_SO01_SFOS 17.5.10 MR-10# route add default gw [GWアドレス]
フ脳「これでグローバルIP経由でXG Firewallの管理画面に接続できるようになりました」
2号「"https://[IFアドレス]:4444"にブラウザアクセス」
2号「からの、オレオレ証明書エラー飛ばしてログイン……シリアル番号の登録?」
フ脳「XG Firewallではライセンスはシリアル番号に紐づくんです」
フ脳「ライセンス購入申請した時にシリアル番号届きませんでしたか」
2号「え、ライセンス購入申請なんてしてへんで」
フ脳「あ、そうなんですか……じゃあ今からマーケットプレイスで申請しましょうか」
□マーケットプレイス in さくらのクラウド
https://secure.sakura.ad.jp/cloud/iaas/#!/pref/marketplace-add/
2号「いや、そういえばライセンス購入の決裁も通してないわ」
2号「しかも納期はわりとギリギリ」
フ脳「(なんで開き直ってるんだ)……じゃあ今回は試用ライセンスで進めましょう」
フ脳「"シリアル番号がない (試用を開始)"にチェックを入れて進んでください」
2号「え、ドキュメントには書いてないやり方やけど、そんなんしてええんか?」
フ脳「メーカーのライセンス規約的には問題なさそうですよ」
フ脳「ただし、さくらインターネットのサポートは受けられないのでそのつもりで」
2号「了解!(困ったらフロムくんに聞けばええしな)」
2号「フロムくん! え、英語のページやぞ!」
フ脳「翻訳ツールも発達した現代でなにを恐れてるんですか……」
フ脳「試用ライセンスの発行にはSophos IDが必要になるので"Create Sophos ID"を選択してください」
2号「メールアドレス使うんやな……どんなアドレスでもええの?」
フ脳「受信可能なアドレスならなんでもいいですよ。ただし、ここで登録したアドレスは再利用できないからそのつもりで」
2号「ふむふむ、適当にgmailでも使って、受信した検証コード入力して……登録完了や」
フ脳「それじゃさっきの英語の画面まで戻って今度は"Sign In"に進んでください」
フ脳「あとは必要情報入力してライセンスの同意など進めていって、登録完了画面までたどり着いたら完了です」
2号「有効期限は1ヶ月か。まぁ、構築の納期は1週間やし、検証用には十分やな!」
フ脳「!?」
最低限の基本設定
フ脳「納期の話は聞かなかったことにします」
フ脳「まずXG Firewallの管理画面にログインしたらすぐにやることが3つ」
- IPアドレスの設定
- パスワードの変更
- ローカルサービスACLの設定
2号「あれ、IPアドレスはコンソールから設定したやん」
フ脳「ベースのLinuxの設定はあれでいいんですけど、SFOSの設定はGUIから投入しておく必要があるんですよ」
IPアドレスの設定
フ脳「[設定]⇒[ネットワーク]からPort1の[Edit Interface]を選択して」
2号「DHCPをスタティックに変更してコンソールと同様の設定を投入っと」
パスワードの変更
フ脳「パスワードは[システム]⇒[管理]⇒[デバイスのアクセス]から設定できます」
2号「簡単なパスワードやと弾かれるな……検証用やからさらっと行きたいんやけど」
フ脳「一応その辺は[システム]⇒[管理]⇒[管理の設定]からルール変更できます」
ローカルサービスACLの設定
フ脳「ローカルサービスACLの設定は[システム]⇒[管理]⇒[デバイスのアクセス]で設定します」
2号「パスワードと同じとこやな」
フ脳「ここではXG Firewallでアクセスを許可しないサービスを遮断します」
フ脳「検証用ですので、まずは[ローカルサービスACLの例外ルール]で検証環境のグローバルIPからの接続を許可する設定を入れておきましょう」
フ脳「次にローカルサービスACLで使わないサービスのチェックを全部外します」
フ脳「ちなみに、例外ルールを入れる前にチェックを外すと管理画面のログインも切断されてしまうので気を付けてください」
WAF構築の流れ
2号「これでひとまず検証環境の準備完了か」
2号「次はWAFの構築やな」
フ脳「XG Firewallでは、WAFはファイアウォールの業務アプリケーションルールとして設定します」
フ脳「[ファイアウォール]⇒[ファイアウォールルールの追加]⇒[業務アプリケーションのルール]で」
フ脳「アプリケーションテンプレートから"Web Server Protection[WAF]"を選択します」
フ脳「とりあえず動きを見るために"http://example.com"のスキャン設定を入れてみましょうか」
2号「example.comって資料の例示とかでよく使う奴やな」
2号「実サイトがあるの知らんかったけど、勝手にスキャン設定入れたりして大丈夫なんか?」
フ脳「大丈夫です」
フ脳「"僕らが建てたXG Firewallに対して、example.comのホスト名でリクエストが来たときにスキャンする"って設定なので」
フ脳「管理者側がDNS設定を触らない限りは実サーバのサービスには影響しないんですよ」
2号「なるほどな~(わかったふり)」
フ脳「……まぁ、実際に動きをみていけばわかると思います」
フ脳「[ホスト型サーバー]の項目でリクエストの受付に関する項目を設定します」
フ脳「今回、XG Firewallが持っているグローバルアドレスは一つだけなので、リクエストの受付はPort1で行います」
フ脳「リクエスト受付用に、管理用IPアドレスとは別のアドレスを使いたい場合は」
フ脳「さくらのクラウドでルータ機能付きのスイッチを構築して、XG Firewallに接続してください」
2号「実際の構築ではそうした方がよさそうやな」
2号「あと、本番はHTTPSサイトのスキャン設定を入れなあかんのやけど」
フ脳「HTTPSサイトをスキャンする場合は、サイト証明書とサーバ秘密鍵を入手する必要があるので」
フ脳「今回のテストではHTTPのスキャン設定を行います」
フ脳「まぁ、メニューの[証明書]から証明書をアップロードして」
フ脳「スキャン設定画面で選択するだけなので、それほど作業の過程に違いはないですよ」
フ脳「[保護されたサーバー]の項目では転送先のオリジンサーバーを設定します」
フ脳「続いて[詳細設定]内の[保護対策]からWAFポリシーを新規作成します」
フ脳「保護ポリシーは一部の例外を除いてすべて有効にしてから動作チェックをして」
フ脳「偽陽性誤検知が発生するポリシーを除外するようなチューニング方法がいいと思います」
フ脳「リクエストに含まれるホストヘッダはそのままオリジンサーバに引き渡したいので」
フ脳「[ホストヘッダをパス]にチェックを入れておきます」
WAF動作確認
フ脳「今回、よそ様のWebサイトを勝手にスキャン対象にしたので」
フ脳「DNSでトラフィックをWAFに向けることができないので、hostsファイルを使います」
フ脳「管理者権限で起動したエディタで」
フ脳「"C:\Windows\System32\drivers\etc\hosts"を開いて」
フ脳「こんな感じで名前解決の情報を記入します」
2号「hosts設定後にサイトにアクセスしても、特に変化ないね」
フ脳「XG Firewallのログから確認してみましょうか」
フ脳「ログビューアを起動して[Web Server Protection]のログを参照します」
2号「お、ちゃんと転送してるやん!」
修羅場は続く
2号「さーて、ここから検証スタートや……フロムくん、晩飯なに食べたい?」
フ脳「さらっと残業付き合わせようとしないでください」
フ脳「帰ってデモンズやらなきゃ……!」
2号「ままま待った! 死にゲーやりたいなら現実でやればええやん!?」
フ脳「わからないところあったら明日聞きますから」
フ脳「それではお先で~す!」
2号「……」
BUSINESS HOURS ARE OVER
However, the Task traps you.
You stay in the company as Slave, forever.
2号「心が折れそうだ……」
次回、WAF構築編に続く……?