はじめての「ヤマハ vRX さくらのクラウド版」(8)新しいセキュリティーポリシーの検討

この連載では、ヤマハ 仮想ルーター vRXをさくらのクラウドで検証する環境を構築いたします。「ヤマハ vRX さくらのクラウド版」がどのように動作するのかや検証費用について説明していきます。皆さんも検証環境を作って、いろいろ試してみてください。
パケットの通過/破棄を制御するため、第6回「IPv4パケットフィルターの挙動」、第7回「NATディスクリプターの挙動」を観察してきました。その結果を踏まえて、従来テンプレートとしてよく使われてきたセキュリティーフィルターの定義を見直してみましょう。それぞれにメリットとデメリットがありますので、環境に合わせて見直します。
目次
セキュリティーポリシーの検討
外部ホストからのICMP/TCP/UDPパケットをどのように処理をしたいかという視点でいくつかの方法を組めるようになっています。それらの方法をご紹介いたします。
- (おさらい)新しい基本的なセキュリティーフィルター
- 第6回、第7回などで紹介してきたインターネット接続設定で適用されるセキュリティーフィルターです。
- ICMP/TCP/UDPはIPマスカレードで処理します。
- ping(echo request)に対してIPマスカレードがecho replyを返してしまうため、ポートスキャンの対象にされやすいです。(追加検討する2案はpingに返事をしないように設定しています)
- セッション管理テーブル(NAT)の使用量を最小化できます。
- 外部ホストからのスキャンのログは、ICMPについては記録できません。TCP/UDPはNATで記録できます。
- 外部ホストからのパケットを破棄する方法1
- ICMP/TCP/UDPのパケットはIPマスカレードを通過させ、静的パケットフィルターで破棄します。
- セッション管理テーブル(NAT)の使用量が増大します。
- 外部ホストからのスキャンをvRXのパケットフィルターに集約することで、ログの破棄方法を統一できます。
- 外部ホストからのパケットを破棄する方法2
- TCP/UDPのパケットをIPマスカレードで破棄します。
- ICMPのパケットはIPマスカレードを通過させ、静的パケットフィルターで破棄します。
- セッション管理テーブル(NAT)の使用量を節約できます。(TCPとUDPの分を減らせます)
- 外部ホストからのスキャンのログは、TCPとUDPはNATで、ICMPはパケットフィルターで分散記録されます。
(おさらい)新しい基本的なセキュリティーフィルター
第7回の記事では、よくあるインターネット接続の設定例を必要最小限に簡略化したものにpingの動的フィルターを追加しました。セキュリティーポリシーを検討するにあたり、パケットフィルターとNATディスクリプターの使い方や考え方を再整理します。
外部→内部のセキュリティポリシー(守りを構築する)
- NATテーブルで管理されていない通信は、NATディスクリプター(IPマスカレード)ですべて破棄します。この動作は、nat descriptor masquerade incoming コマンドの初期値がrejectになっていることによるものです。(初期値がrejectなので設定には表示されていません)
- IPv4フィルターも動的フィルターで管理されていないパケットは破棄する設定になっていますが、それ以前にNATディスクリプターで破棄されるので、内部NWやvRXホスト機能まで到達しません。
外部→内部のセキュリティポリシーを表にまとめると以下のようになります。
パケット種別 | 条件 | 動作 | 実現方法 |
---|---|---|---|
ICMP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
ping(echo reply) | 通過(戻りも通過) | IPマスカレードと動的フィルター | |
ping(echo request) | echo replyを返す | IPマスカレードでreply | |
TCP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
ポート番号0~1023 宛 | 破棄してRSTを返す | IPマスカレードでreject | |
ポート番号1024~65535 宛 | 破棄して何も返さない | IPマスカレードでreject | |
UDP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
その他 | 破棄して何も返さない | IPマスカレードでreject |
内部→外部のセキュリティポリシー
- DNS、ping、TCP、UDPのパケットは動的フィルターで管理して通します。
- 戻りパケット(外部→内部)は、NATテーブルや動的フィルターのセッションテーブルで管理して通過させます。
こちらもセキュリティポリシーを表にしたものを以下に示します。
パケット種別 | 条件 | 動作 | 実現方法 |
---|---|---|---|
ICMP | ping(echo request) | 通過(戻りも通過) | IPマスカレードと動的フィルター(ping) |
その他 | 通過 | IPマスカレードと静的フィルター(pass) | |
TCP | すべて | 通過(戻りも通過) | IPマスカレードと動的フィルター(tcp) |
UDP | DNS問い合わせ | 通過(戻りも通過) | IPマスカレードと動的フィルター(domain) |
その他 | 通過(戻りも通過) | IPマスカレードと動的フィルター(udp) |
設定例
これらのセキュリティポリシーをvRXの設定コマンドとして表現したものを以下に示します。
... <<<IPマスカレードを設定する>>>
[NATディスクリプタの定義]
# nat descriptor log on {NATのアドレス割当をログに記録する}
# nat descriptor type 1 masquerade {変換タイプをIPマスカレードに設定する}
# nat descriptor address outer 1 primary {LAN1アドレスをNATの外側IPアドレスに設定する}
[NATディスクリプターのLAN1インターフェースへの適用]
# ip lan1 nat descriptor 1 {LAN1インターフェースへNATディスクリプタを適用}
... <<<セキュリティーフィルターを設定する>>>
# syslog notice on
[静的フィルターの定義]
# ip filter 298 reject-log * * * * * {INは、破棄してログを記録する}
# ip filter 299 pass-log * * * * * {OUTは、通してログを記録する}
[動的フィルターの定義]
# ip filter dynamic 280 * * domain
# ip filter dynamic 281 * * ping {内→外のpingを通す}
# ip filter dynamic 298 * * tcp
# ip filter dynamic 299 * * udp
[接続先フィルターの入力(IN)と出力(OUT)の適用]
# ip lan1 secure filter in 298
# ip lan1 secure filter out 299 dynamic 280 281 298 299
外部ホストからのパケットを破棄する方法1
期待していないスキャンをきちんと記録して分析しやすくするため、セキュリティーフィルターでパケットの破棄を実施するようにしてみます。
前節で紹介した基本的なセキュリティーフィルターでは、nat descriptor masquerade incoming コマンドの値をrejectに設定することでパケットの返信や破棄を行っていました。これをforwardに変更してパケットをvRXに転送します。vRXに転送することでvRX内部のIPv4パケットフィルターで処理されるようになるので、ICMP echo requestも破棄されるようになります。これによりpingによるスキャンに反応しなくなります。nmapによるスキャンではdownと判定されます。
外部→内部のセキュリティポリシー
- NATテーブルで管理されていない通信は、vRX内部のIPv4パケットフィルターに転送します。TCPとUDPは nat descriptor masquerade incoming コマンドの設定、ICMPは nat descriptor masquerade static コマンドの設定により実現します。
- IPv4パケットフィルターは、動的フィルターでセッション管理していないパケットをすべて破棄します。期待していないスキャンはここで破棄されます。
- NATを通過させるため、NAT管理テーブルの使用量が増大する点に注意が必要です。
これらのセキュリティポリシーを表にしたものを以下に示します。
パケット種別 | 条件 | 動作 | 実現方法 |
---|---|---|---|
ICMP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
ping(echo reply) | 通過(戻りも通過) | IPマスカレードと動的フィルター | |
ping(echo request) | 破棄 | 静的IPマスカレードでICMP通過 動的フィルターでreject | |
その他 | 破棄 | 静的IPマスカレードでICMP通過 動的フィルターでreject | |
TCP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
その他 | 破棄 | IPマスカレードでforward 静的フィルターでreject | |
UDP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
その他 | 破棄 | IPマスカレードでforward 静的フィルターでreject |
内部→外部のセキュリティポリシー
内部→外部のポリシーは、「(おさらい)新しい基本的なセキュリティーフィルター」の「内部→外部のセキュリティポリシー」で説明したポリシーと同様です。
- DNS、ping、TCP、UDPのパケットは動的フィルターで管理して通します。
- 戻りパケット(外部→内部)は、NATテーブルや動的フィルターのセッションテーブルで管理して通過させます。
内部→外部 | 条件 | 動作 | 実現方法 |
---|---|---|---|
ICMP | ping(echo request) | 通過(戻りも通過) | IPマスカレードと動的フィルター(ping) |
その他 | 通過 | IPマスカレードと静的フィルター(pass) | |
TCP | すべて | 通過(戻りも通過) | IPマスカレードと動的フィルター(tcp) |
UDP | DNS問い合わせ | 通過(戻りも通過) | IPマスカレードと動的フィルター(domain) |
その他 | 通過(戻りも通過) | IPマスカレードと動的フィルター(udp) |
設定例
設定内容は「基本的なセキュリティーフィルター」とは少し異なります。
... <<<IPマスカレードを設定する>>>
[NATディスクリプタの定義]
# nat descriptor log on {NATのアドレス割当をログに記録する}
# nat descriptor type 1 masquerade {変換タイプをIPマスカレードに設定する}
# nat descriptor address outer 1 primary {LAN1アドレスをNATの外側IPアドレスに設定する}
# nat descriptor masquerade incoming 1 forward ≪サーバに割り当てられたグローバルアドレス≫
# nat descriptor masquerade static 1 1 ≪サーバに割り当てられたグローバルアドレス≫ icmp
[NATディスクリプターのLAN1インターフェースへの適用]
# ip lan1 nat descriptor 1 {LAN1インターフェースへNATディスクリプタを適用}
... <<<セキュリティーフィルターを設定する>>>
# syslog notice on
[静的フィルターの定義]
# ip filter 298 reject-log * * * * * {INは、破棄してログを記録する}
# ip filter 299 pass-log * * * * * {OUTは、通してログを記録する}
[動的フィルターの定義]
# ip filter dynamic 280 * * domain
# ip filter dynamic 281 * * ping {内→外のpingを通す}
# ip filter dynamic 298 * * tcp
# ip filter dynamic 299 * * udp
[接続先フィルターの入力(IN)と出力(OUT)の適用]
# ip lan1 secure filter in 298
# ip lan1 secure filter out 299 dynamic 280 281 298 299
実際に設定を行っている画面を以下に示します。
pingを実行する(1) 内部→外部
内部からのpingを行っている画面を以下に示します。第7回の記事や「基本的なセキュリティーフィルター」と同じ動作をしています。
pingを実行する(2) 外部→内部
実行結果の画面を以下に示します。外部ホストからpingを4回実施しましたが応答(echo reply)が届いていないことがわかります。
show logの結果を下図に提示します。IPアドレスをマスクしているところはそれぞれ以下の通りです。
- 水色で部分マスクしている箇所は、vRXに付与されたIPアドレスです(末尾の".19"のみ表示しています)。
- 濃い青でマスクしている箇所は、vRXに対してICMPパケットを送信している外部のホストです。
- 赤でマスクしている箇所は、TCPで接続を試みている外部のホストです。
ログはいくつかのパターンに分類できます。パターンごとに解説します。
[NAT(1): LAN1] Bound ICMP ~
これはICMPのパケットを受信して、1つのNATテーブルが作成されたことを示します。
LAN1 Rejected IN(298) filter: ICMP ~ : echo request
same message repeated 1 times
これはICMPのecho requestを静的パケットフィルターの298番に従って破棄したことを示します。"same message repeated 1 times"は、同じログが連続して出力されたときに記録されるものです。ここでは"1 times"なので1回ですが、例えば50回連続すると"50 times"になります。
[NAT(1): LAN1] Bound TCP ~
これは外部からのTCP接続に対してIPマスカレードにてNATテーブルに登録後、vRXに転送しています。
LAN1 Rejected IN(298) filter: TCP ~
これは外部ホストからのスキャンを静的パケットフィルターの298番に従って破棄したことを示すログです。
これらのログを通して見ると、外部ホストからのスキャンはIPマスカレードを通過して、静的パケットフィルターで記録しながら破棄されていることがわかります。
nmapによるスキャン
続いてnmapによるスキャンを試してみましたが、pingに対する応答がなかったので、vRXがdownしていると判定してスキャンを中止していました。
このときのvRXのログをshow logで確認したものを下図に示します。nmapはTCP443番ポート(HTTPS)のスキャンとICMP echo requestの送信を2度繰り返していますが、vRXはどれにも返事をしなかったことがわかります。
nmapの実行結果の画面を以下に示します。Ping Scanによりdownと判定し、その後のスキャンを中止していることがわかります。
nmapの実行結果を表にまとめたものです。
調査内容 | 結果 |
---|---|
ping | down |
SYN Stealth Scan (1000 Ports) | filtered:ー port ignored states:ー ports no-responce:ー ports |
OS推定 | - |
Traceroute | ー hops |
調査所要時間 | 4.25 秒 |
実用上の設定
外部ホストから送られてきた不要なパケットをパケットフィルターでまとめて破棄することができました。その破棄するパケットのログはパケットフィルターにまとめられるため、NATディスクリプターのログは出力されません。停止してよいでしょう。
... <<<NATディスクリプターのログ出力を止める>>>
# no nat descriptor log
外部ホストからのパケットを破棄する方法2
外部ホストからのパケットをvRX内部のフィルターで破棄する方法をもう1つご紹介します。前節の「外部ホストからのパケットを破棄する方法1」ではICMPもTCPもUDPもvRX内部のIPv4フィルターで破棄していました。これに対してここで紹介する方法では、効率よく破棄を実行するため、ICMPはIPv4フィルターで破棄し、TCPとUDPはNATディスクリプターで破棄します。
※NATディスクリプターでICMPを破棄する機能はありません。
破棄するプロトコル | 方法1における実現方法 | 方法2における実現方法 |
---|---|---|
ICMP | IPv4フィルター | IPv4フィルター |
TCP | IPv4フィルター | NATディスクリプター |
UDP | IPv4フィルター | NATディスクリプター |
外部→内部のセキュリティポリシー
- NATテーブルで管理されていない通信は、vRX内部のIPv4パケットフィルターに転送します。TCPとUDPは nat descriptor masquerade incoming コマンドの設定値をdiscardに変更することで破棄し、ICMPは nat descriptor masquerade static コマンドで通過させて、IPv4フィルターで処理させます。
- IPv4パケットフィルターは、動的フィルターでセッション管理していないパケットをすべて破棄します。期待していないスキャンはここで破棄されます。
- NATを通過させるため、NAT管理テーブルの使用量が増大する点に注意が必要です。
これらのセキュリティポリシーを表にしたものを以下に示します。前節で紹介した方法と比較すると、TCPおよびUDPの「その他」の条件下でパケットを破棄する方法が異なります。方法1ではIPマスカレードでforwardしてから静的フィルターでrejectしていましたが、方法2はIPマスカレードでdiscard(破棄)しています。
IPマスカレード設定 | 方法1における設定 | 方法2における設定 |
---|---|---|
descriptor masquerade incoming コマンド | forward (TCPとUDPを通す) | discard (TCPとUDPを破棄) |
descriptor masquerade static コマンド | ICMPを通す | ICMPを通す |
外部→内部 | 条件 | 動作 | 実現方法 |
---|---|---|---|
ICMP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
ping(echo reply) | 通過(戻りも通過) | IPマスカレードと動的フィルター | |
ping(echo request) | 破棄 | 静的IPマスカレードでICMP通過 動的フィルターでreject | |
その他 | 破棄 | 静的IPマスカレードでICMP通過 動的フィルターでreject | |
TCP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
その他 | 破棄 | IPマスカレードでdiscard | |
UDP | セッション管理中 | 通過(戻りも通過) | IPマスカレードと動的フィルター |
その他 | 破棄 | IPマスカレードでdiscard |
内部→外部のセキュリティポリシー
内部→外部のポリシーは、「(おさらい)新しい基本的なセキュリティーフィルター」の「内部→外部のセキュリティポリシー」と同様です。
- DNS、ping、TCP、UDPのパケットは動的フィルターで管理して通します。
- 戻りパケット(外部→内部)は、NATテーブルや動的フィルターのセッションテーブルで管理して通過させます。
内部→外部 | 条件 | 動作 | 実現方法 |
---|---|---|---|
ICMP | ping(echo request) | 通過(戻りも通過) | IPマスカレードと動的フィルター(ping) |
その他 | 通過 | IPマスカレードと静的フィルター(pass) | |
TCP | すべて | 通過(戻りも通過) | IPマスカレードと動的フィルター(tcp) |
UDP | DNS問い合わせ | 通過(戻りも通過) | IPマスカレードと動的フィルター(domain) |
その他 | 通過(戻りも通過) | IPマスカレードと動的フィルター(udp) |
設定例
こちらも設定例は他の方法と少し異なります。
... <<<IPマスカレードを設定する>>>
[NATディスクリプタの定義]
# nat descriptor log on {NATのアドレス割当をログに記録する}
# nat descriptor type 1 masquerade {変換タイプをIPマスカレードに設定する}
# nat descriptor address outer 1 primary {LAN1アドレスをNATの外側IPアドレスに設定する}
# nat descriptor masquerade incoming 1 discard
# nat descriptor masquerade static 1 1 ≪サーバに割り当てられたグローバルアドレス≫ icmp
[NATディスクリプターのLAN1インターフェースへの適用]
# ip lan1 nat descriptor 1 {LAN1インターフェースへNATディスクリプタを適用}
... <<<セキュリティーフィルターを設定する>>>
# syslog notice on
[静的フィルターの定義]
# ip filter 298 reject-log * * * * * {INは、破棄してログを記録する}
# ip filter 299 pass-log * * * * * {OUTは、通してログを記録する}
[動的フィルターの定義]
# ip filter dynamic 280 * * domain
# ip filter dynamic 281 * * ping {内→外のpingを通す}
# ip filter dynamic 298 * * tcp
# ip filter dynamic 299 * * udp
[接続先フィルターの入力(IN)と出力(OUT)の適用]
# ip lan1 secure filter in 298
# ip lan1 secure filter out 299 dynamic 280 281 298 299
セキュリティーポリシーのまとめ
検討したポリシーとその選び方を紹介しつつ、環境に合わせてカスタマイズするポイントを紹介いたします。
セキュリティーポリシーの選び方
いくつかの選び方を例示します。要件に合わせて、実現するセキュリティーポリシーを選択してください。
- 外部ホストからのping/TCP/UDPは破棄したい。TCPに対してRSTも返さないようにしたい
- NATテーブルのリソース消費を最小にしたい
- 外部ホストからのスキャンのログをvRX内部のパケットフィルターで統一したい
本連載で選択するセキュリティーポリシー
本連載では、外部ホストからのスキャンのログをvRX内部のパケットフィルターで統一するために「外部ホストからのパケットを破棄する方法1」を選択していきます。
また、次回の記事ではvRXへのSSHリモートアクセス環境を準備して、このセキュリティーフィルターに静的IPマスカレードや静的フィルタリングを追加設定して、インターネットからアクセスできるようにしていきます。
カスタマイズのポイント
vRXのパケットフィルター設定をカスタマイズする際にポイントになりそうな点をいくつか紹介します。
1) NATディスクリプターのログ出力を抑止
「外部ホストからのパケットを破棄する方法1」の「実用上の設定」でも説明しましたが、破棄するパケットのログはパケットフィルターにまとめられるので、NATディスクリプターのログは出力されません。停止してよいでしょう。
... <<<NATディスクリプターのログ出力を止める>>>
# no nat descriptor log
2) 静的フィルターや動的フィルターのログ出力を抑止
静的フィルターや動的フィルターの記録が不要なら、ログ出力を停止することができます。以下の表に示すような設定を行ってください。
静的フィルターでログを記録する | 静的フィルターでログを記録しない |
---|---|
pass-log | pass pass-nolog |
reject-log reject | reject-nolog |
動的フィルターでログを記録する | 動的フィルターでログを記録しない |
---|---|
未設定 (初期値) syslog=on | syslog=off |
3) 動的フィルターの対応アプリケーション
動的フィルターは対応アプリケーションが多数用意されています。利用環境に合わせてこれらの定義を追加登録します。以下は ip filter dynamic コマンドから対応プロトコルを抜粋したものです。
- Rev.6.02.03(May 2001)以降などの「ファイアウォール機能」
- tcp/udp/ftp/tftp/domain/www/smtp/pop3/telnet/netmeeting
- Rev.10.01以降
- echo/discard/daytime/chargen/ftp/ssh/telnet/smtp/time/whois/dns/domain/tftp/gopher/finger/http/www/pop3/sunrpc/ident/nntp/ntp/ms-rpc/netbios_ns/netbios_dgm/netbios_ssn/imap/snmp/snmptrap/bgp/imap3/ldap/https/ms-ds/ike/rlogin/rwho/rsh/syslog/printer/rip/ripng/ms-sql/radius/l2tp/pptp/nfs/msblast/ipsec-nat-t/sip/ping/ping6/tcp/udp
- Rev.10.01.47以降、および、Rev.11.01以降
- submission
コマンドや資料 | 概要 |
---|---|
ip filter dynamic コマンド | 動的フィルターの定義 |
技術資料:ファイアウォール機能 | 「4.1 動的フィルターの定義」を参照 |
Rev.6.02.03 リリースノート | ファイアウォール機能の初実装 |
Rev.14.00.32 リリースノート | 仕様変更 [10] |
4) 管理テーブルのタイマー調整
「外部ホストからのパケットを破棄する方法1」や「外部ホストからのパケットを破棄する方法2」は、外部ホストからのスキャンでNATテーブル(セッション管理情報)を大量に消費してしまいます。NATテーブルのタイマーを短縮すると、不要になったセッション情報を早期に解放できます。設定方法は以下のコマンドを参照してください。
コマンド | 概要 |
---|---|
nat descriptor timer | NATテーブルのセッションを消去するタイマー設定 |
(参考) ip filter dynamic のtimeoutオプション | 動的フィルターのセッションを消去するタイマー設定 |
5) 通常のパケットフィルターでは検出や破棄が困難なパケットフィルター機能を明示的に有効にする
ip filter source-routeコマンドやip filter directed-broadcastコマンドは、通常のパケットフィルターでは破棄できないようなパケットを破棄する機能です。初期値は"on"です。"on"と明示的に設定するとconfigとして表示されます。
... <<<特殊なパケットフィルター機能を有効にしていることを明示する>>>
# ip filter source-route on {Source-route付きIPパケットのフィルタリング}
# ip filter directed-broadcast on {directed-broadcastのフィルタリング}
コマンド | 概要 |
---|---|
ip filter source-route | Source-routeオプション付きパケットを破棄します |
ip filter directed-broadcast | ディレクテッドブロードキャストアドレス宛のパケットを破棄します |
関連リンク
vRXで利用できるコマンド操作に関連する公式情報です。
検証経費
今回検証したサーバとvRXに関する費用は次の通りです。
項目 | 経費 |
---|---|
vRXを動作させる仮想マシン | 起動からシャットダウンまでの稼働時間に応じた課金が発生します |
vRXのアーカイブ | 今回の動作確認だけなら費用は発生しません |
vRXのライセンス | 今回の動作確認だけなら費用は発生しません |
連載トップへのリンク
連載回数番号 | リンク |
---|---|
第1回 | はじめる前に |
第2回 | インストールとシャットダウン |
第3回 | 初期設定 |
第4回 | 入出力を観測 |
第5回 | インストール状態確認 |
第6回 | セキュリティーフィルター適用 |
第7回 | NAT(IPマスカレード、NAPT)の適用 |
※画面キャプチャーなどは、2025年3月時点のものです。