FortiGateの設計/設定ガイド

FortiGateの設計・設定方法を詳しく書いたサイトです。 FortiGateの基本機能であるFW(ファイアウォール)、IPsec、SSL‐VPN(リモートアクセス)だけでなく、次世代FWとしての機能、セキュリティ機能(アンチウイルス、Webフィルタリング、SPAM対策)、さらにはHA,可視化、レポート設定までも記載します。初期化方法やバージョンアップなどの管理面も書いています。標的型攻撃を守るためのゲートウェイとしても導入されることが多いので、セキュリティ機能に関しては充実した記載を心がけます。

IPS

 1.IPS機能

❶IPSとは
IPS(Intrusion Prevention System)は、「侵入(Intrusion)」を「防御(Prevention)」するシステム(System)です。
主目的は、外部から公開Webサーバなどへの攻撃を防ぐことです。

❷外部からの攻撃と内部からの攻撃
上記で述べましたように、IPSは、基本は外からの攻撃パケットを防御します。
も防ぐために、内側にもIPS機能を有効にする場合があります。
たとえば、マルウェアに感染したPCが、外部のサーバへコマンドを送信して通信をします。そのコマンドや通信を検知してブロックします。

❸アクション
攻撃通信に対して、Blockすることも、ログに吐き出すだけの設定も可能です。
 
❹FortiGateのIPSでできること
・危険度やカテゴリ単位に応じて、IPSの設定ができます。
・カスタムシグネチャとして、脅威に対して自らがシグネチャを作成して適用することができます。
・上記のIPSをポリシーとして、セグメント単位などのグループ単位で設定を適用できます。
・また、外部からの通信だけでなく、内部からの通信にIPS機能を持たせることができます。

❺ライセンス
IPSを利用するには、別途ライセンスが必要です。

❻その他(詳細情報)
・IPSのエンジンは独自★
・IPSのシグネチャ情報は、定期的に更新されます(更新周期は★)

2.IPSのアクション

選択できるアクションは、下記5つです。
リセットは管理しているサーバー向け以外は利用しないと思います。
IPS3

★詳しくは別途記載

3.IPSの設定

Security Profiles>Intrusion Protectionを開きます。
fortigate_ips











IPS設定はまず、重要度(攻撃の深刻度合)を設定することから始めます。
IPS1
 重要度の選択に応じて、対応するシグニチャも変更します。
Bashなど深刻なものへの対応のため、重要度の High、Criticalは適応した方が良いです。

シグニチャの詳細は以下で確認できます。
http://www.fortiguard.com/encyclopedia/

アクションは初期設定で 「シグニチャ デフォルト」 が選択されています。
これはシグニチャの内のデフォルト項目に表示される内容で処理されることを指します。
IPS2

誤検知を防ぐため新しいシグニチャは「モニター」アクションになっています。
これは誤検知を嫌うためで、自動でブロックに変化します。

必要に応じて個別にアクションを変更できます。
※カスタムで IPSを作成することも可能です。

選択できるアクションは、下記5つです。
リセットは管理しているサーバー向け以外は利用しないと思います。
IPS3

4.IPSの試験

簡単なテストとしては以下。

①Web.Server.Password.Files.Access
URLに続けて、etc/passwdを入れてhttp://www.example.com/etc/passwd とすると「Web.Server.Password.Files.Access」というシグネチャでブロックされる

②HTTP.URI.SQL.Injection
SQLインジェクションで、入力フォームに以下を入れると「HTTP.URI.SQL.Injection」というシグネチャでブロックされる。
「1' or '1' = '1';-- 」※最後は空白スペース

5.カスタムシグネチャの作成方法

以下に例が記載されています。
https://archives2011-2018.fortinet.co.jp/security_blog/141016-poodle-faq.html

HTTPの通信ヘッダを見ると、ブラウザの情報などがわかると思います。それをみて、IEからは通信させないとか、Windows7のOSからは通信させないなどのカスタムシグネチャが作成できるはずです。

では、カスタムシグネチャを作ってみましょう。

(1)カスタムシグネチャの作成

「カスタムシグネチャ」のメニューから作成する。
たとえば、「seeeko.com」のサイトへの通信をブロックする。

以下、マニュアルではあるが、日本語化するといいだろう

https://help.fortinet.com/fos60hlp/60/Content/FortiOS/fortigate-security-profiles/IPS/Creating%20a%20custom%20signature%20to%20block%20access%20to%20example.com.htm?Highlight=F-SBID

ただし、「(」が全角だったり「--」が怪しいので、以下をどうぞ
※大文字小文字は区別する。

①カスタムシグネチャの作成
方法はいくつかあり、侵入防止のIPSシグネチャ表示から新規作成も可能。以下は、カスタムシグネチャのボタンから実施。
セキュリティプロファイル>カスタムシグネチャ
新規作成>IPSシグネチャ

シグネチャ名:Block.seeeko.com

F-SBID( --name "Block.seeeko.com"; --pattern "seeeko.com"; --service HTTP;-- no_case; --flow from_client; --context host; )

②defaultのシグネチャに適用する
セキュリティプロファイル>侵入防止>で、新規作成やら、既存のプロファイルを開くと、「IPSシグネチャ」が右に現れる。
または、セキュリティプロファイル>IPSシグネチャ>「新規作成」
default のポリシーに、「IPSシグネチャとフィルタ」>新規作成で、作成したカスタムシグネチャを追加する。このときシグネチャのタブに切り替える。また、作成したカスタムシグネチャを選択して、その上の「選択したものを追加」を押す。
さらに、アクションの欄で、「デフォルト」になっているところを右クリックで「ブロック」にする。

(2)特定のOSやブラウザの通信を止める。

たとえば、古いブラウザやOSはインターネットに接続すると攻撃を受けるリスクがある。
たとえば、以下のように、「Internet Explorer」に未修正の脆弱性、すでに悪用した攻撃を確認」という記事が出ることがある。未修整の脆弱性であるから、カスタムシグネチャというのが対策の一つになりえる。
https://internet.watch.impress.co.jp/docs/news/1230236.html

どうやって作るか。実際に通信させてみて、その通信の中にある固有の情報をつかもう。たとえば、パケットキャプチャでHTTPヘッダを見るとWindows10の場合、以下のように表示される。

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

※余談であるが、Mozillaとなっているが、実際に使ったブラウザはIEである。

ちなみに、Windows NTに続き表記は以下のようにOSのバージョンを表す。
Windows NT 10.0 →Windows10やWindows Server2016
Windows NT 6.3 →Windows8.1など
Windows NT 6.1 →Windows7など

情報は以下
https://ja.wikipedia.org/wiki/Windows_NT%E7%B3%BB

なので、サポートが終了したWindows7のPCからの通信を止める場合には、このキーワードを入れればよい。
→もちろん、誤検知もあるので、しばらくはモニターして、問題がなさそうであればBlockがいいだろう。

シグネチャ名:Block.Windows7

F-SBID( --name "Block.Windows7"; --pattern "Windows NT 6.1"; --service HTTP;-- no_case; --flow from_client; --context header; )

テストとしてはわかりにくいので、自分が使っているバージョンのChromeのみを拒否してみよう。IEは許可されるので違いを見てみる。
注意点はSSLのサイトはヘッダ部分が暗号化されているのでスルーされる点である。SSLフルインスペクションをすればいいのだが、テストとしてはわかりにくい。
暗号化されていないサイトでテストがいいだろう。
※最後の「--context」部分は、先ほどの「host」ではなく、「header」である。

F-SBID( --name "Chrome/79.0"; --service HTTP; --protocol tcp; --pattern "Chrome/79.0"; --no_case; --context header; )

※ --flow from_client は、サーバではなくクライアントに限定する場合に使う。