パケットキャプチャの勘どころ ssmjp 201501
TRANSCRIPT
パケットキャプチャの勘どころ@UNKN0WNBIT 2015/1/22 SSMJP 2015/01
ABOUT ME
• 名前:小林 稔
• Twitter:@unkn0wnbit
• 所属:Internet Initiative Japan Inc.
• 調査したりレポート書いたり。
• Internet Infrastructure Review (IIR)
• http://www.iij.ad.jp/company/development/report/iir/
AGENDA
1. パケットキャプチャの目的
2. パケットキャプチャの仕方
3. パケットキャプチャの問題
4. 問題の対策
5. 安全にパケットキャプチャする
6. まとめ
1.パケットキャプチャの目的
1.パケットキャプチャの目的
•大まかに分類すると…
1. デバッグ
2. トラブルシューティング
3. コンプライアンス対応
4. セキュリティ対策(IPSなど)
5. Forensics / インシデント対応
6. 気になるあの娘のユーザIDとパスワードが知りたい!
2.パケットキャプチャの仕方
•突然ですが、ここでパケットキャプチャの仕方をおさらいしましょう。
•とても簡単です!
パケットキャプチャ ステップ1
• 空いているポートにおもむろにLANケーブルをつなぐ!
パケットキャプチャ ステップ2
• 間髪入れずにtcpdumpを実行!
パケットキャプチャ ステップ3
• やったぜ!
ね、簡単でしょう?
でも、ちょっと待って!
• ケーブル挿すだけじゃ、ネットワーク上のすべてのパケットをキャプチャできません。
• ケーブルを接続する方法もいろいろあるんです。
1. Vampire tap(10BASE-5)
2. リピータハブ
3. L2スイッチングハブ
4. ネットワークタップ
5. アグリゲーションタップ/リジェネレーションタップ
6. L1スイッチ
7. Linux / BSD
VAMPIRE TAP
• 10BASE-5の同軸ケーブルのアレ
• バス型トポロジなので挿すだけで全部キャプチャできる
参照:http://flylib.com/books/en/1.408.1.35/1/http://en.wikipedia.org/wiki/Vampire_tap
リピータハブ
•バカハブと呼ばれる不幸なデバイス
•ケーブルを挿すだけなので省略
L2スイッチングハブ
• MACアドレスを基にポートをスイッチングするので、ケーブルを挿しただけだと、自分宛のパケットしかキャプチャできない。
• すべてのパケットをキャプチャするには、以下のいずれかの手段が必要。
• ミラーポート(SPANポート)を設定する。
• ARP Poisoningして、すべてのパケットをキャプチャデバイスを経由させる。
ネットワークタップ
• 遅延なし、(機器内の)パケットドロップなし。
• 使いにくい点としては、2つのポートでキャプチャをしなければならないところ。
• Linuxでキャプチャするなら、bondingが必要かな。
参照:http://www.comworth.co.jp/products/network-taps
アグリゲーションタップ/リジェネレーションタップ
• 基本的に、ネットワークタップと同じ機能を持っている。
• 内部にバッファを持ち、送受信混ぜたパケットを単一のポートに送出できる。
• モニターポートは1つ以上設定できる。
• 製品によっては、1:1、1:N、N:1、Any:Anyなどの設定が可能。
参照:http://www.bitrieve.co.jp/products/lan_tap/100
L1スイッチ
• L1以上の各種条件で設定ができるスイッチ
参照:http://www.bitrieve.co.jp/products/hard/?page=info-gigamon
LINUX / BSD
• Linux
• bridgeを作って、iptablesでミラーリング。
• ミラーポートとキャプチャポートには、IPアドレスとルーティングが必要。
• # brctl addbr br0
• # brctl addif br0 eth0
• # brctl addif br0 eth1
• # ifconfig eth2 192.168.10.1/24 →eth2がミラーポート
• # route add -net 192.168.19.0 netmask 255.255.255.0 dev eth2
• # iptables -t mangle -A PREROUTING -i br0 -j TEE --gateway 192.168.10.2 →gatewayにキャプチャポートのIPアドレス
• BSD
• bridgeを作って、spanポートを追加。
• # ifconfig bridge0 create
• # brconfig bridge0 add rl0 add rl1 up
• # brconfig bridge0 addspan vr0
参照:http://okacl.hatenablog.com/entry/2013/06/11/034906http://nsmwiki.org/OpenBSD_Network_Tap
3.パケットキャプチャの問題
パケットキャプチャをする時の一番大きな問題
• それは…
• 様々な要因でパケットドロップが発生する。
pi@raspberrypi ~ $ sudo tcpdump -i br0 -w /pcap/test.pcap -c 3000tcpdump: listening on br0, link-type EN10MB (Ethernet), capture size 65535 bytes3000 packets captured3189 packets received by filter186 packets dropped by kernel
パケットドロップが発生する箇所と原因
• 箇所1
• パケットキャプチャデバイス
• 原因1
• NIC、CPU、メモリ、ストレージ、OSの何れかのキャパシティが足りていない。
• アプライアンスの性能が低い。
パケットドロップが発生する箇所と原因
• 箇所2
• ミラーポートを設定したスイッチ
• 原因2
• ミラー元ポートの送受信合計トラフィック量 < ミラー先ポートリンクアップ速度になっている。
• 全部のパケットをキャプチャさせようとして、ミラー元ポート数:ミラー先ポート数が、N:1になりやすい。
• スイッチのバッファが足りなくなる。
• スイッチが捌ける以上のパケット数(pps)を処理している。
パケットドロップによって発生する問題
• パケットドロップが発生する
↓
• セッション再構築ができない
↓
• 正しくデバッグできなくなる
• トラブルシューティングに必要な情報を取りこぼす
• コンプライアンス対応で必要な情報が確認できない
• セキュリティ対策製品(IPSなど)の性能が落ちる
• Forensics / インシデント対応で必要な情報が確認できない
4.問題の対策1. PAUSEフレーム 2. キャプチャデバイス 3.パケットミラーリング設計
1. PAUSEフレーム
• フロー制御を行うEthernet Frame
• IEEE 802.3xで規定されている。
• NICのバッファがあふれそうになると、相手にPAUSEフレームを送信して、指定した時間だけフレーム送信を待つように依頼する。
• 半二重通信の場合は規格化されていないが、「バックプレッシャ(Back Pressure)輻輳制御」が広く利用されている。
• CSMA/CDの応用
• サンプルフレーム
• http://wiki.wireshark.org/SampleCaptures
• http://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=Ethernet_Pause_Frame.cap
1. PAUSEフレーム
参照:http://wiki.networksecuritytoolkit.org/nstwiki/index.php/LAN_Ethernet_Maximum_Rates,_Generation,_Capturing_%26_Monitoring#Ethernet_Flow_Control_Pause_Frame_.28IEEE_802.3x.29
1. PAUSEフレーム
• PAUSEフレームを受信したポートは、そのポートの送信フレームを指定された時間が経過するまでバッファにためる。
• バッファのしきい値を超えると、フレームを受信しているポートからPAUSEフレームを送信する(PAUSEフレームはサーバからクライアントに直接伝達しない)。
参照:http://humairahmed.com/blog/?p=5316
1. PAUSEフレームの注意点
• ネットワーク全体のパフォーマンスを下げてしまうので、デフォルトで無効になっているネットワーク機器もある。
• 主にCiscoなどインテリジェンスな製品
• PAUSEフレームの受信は有効でも送信は無効だったり
• 製品やモジュールによっては完全に無効化
• 個人向けの安いL2スイッチは大体有効っぽい
• WindowsはNICのプロパティで設定
• Linuxはethtoolで設定
• 物理ポート単位の制御ではなく、アプリケーション単位のフロー制御として、PFC(Priority-based Flow Control : IEEE 802.1Qbb)、ETC(Enhanced Transmission Selection : IEEE 802.1Qaz)が標準化されている。
1. PAUSEフレームの注意点
• そもそも、キャプチャポートでは有効化しておくメリットがないので、無効化しておく方が良いかも。
• ネットワーク全体のパフォーマンスを下げてしまう可能性
• ミラーポートを持つデバイス側で無効化されている可能性
• フレームの送出を待っている間にバースト通信によって、バッファが上書きされる可能性
2. キャプチャデバイスの見直し
• アプライアンスを使用している場合
• 基本的に機種のアップグレードしかない。
• PCでキャプチャしている場合
• とにかく速いNIC
• とにかく速いCPU
• 積めるだけのMemory
• I/Oが高速なStorage
• 一次保存はRAMディスクがベスト。
• 最新のOS(Firmware)
• Linux : TPACKET v3をサポートしているkernelとアプリケーション(libpcap, netsniff-ngなど)
• FreeBSD : netmapが取り込まれている 参照:http://www.tcpdump.org/http://netsniff-ng.org/http://yuuki.hatenablog.com/entry/2013/08/03/162715
3. パケットミラーリング設計の見直し
• ミラーポートを高速なインターフェースにする
• 1Gbpsの複数のポートをミラーリングするなら、10Gbpsのミラーポートが必要となる。
• 理論的には、1つの1Gbpsをミラーリングする場合も2Gbpsのミラーポートが必要になる。
• おおよその送受信トラフィックは非対称なので、実際にはそこまで必要でないが、NetFlow/IPFIXなどでなるべく正確な通信量を把握すべき。
• SNMPはリクエストした瞬間の値しか取得できないので、バースト的なトラフィックはわからない。
• MRTGで生成されるグラフは平均値。
5.安全にパケットキャプチャする
パケットキャプチャ時のセキュリティ
• パケットキャプチャをするときの実行権限どうしてます?
• 大体の人が管理者権限でキャプチャしてますよね?
• 管理者権限で実行するのは最小限にするのが大原則
• パケットキャプチャツールの脆弱性が攻撃されたら、システム乗っ取られるかも。
• でも、パケットキャプチャツール動かすのに管理者権限って必須でしょ?
管理者権限が必須だって?
ヘ(^o^)ヘ いいぜ|∧
/ /(^o^)/ てめえが何でも
/( ) rootが必要だって思い込んでるってなら(^o^) 三 / / >
\ (\\ 三(/o^) < \ 三( // く まずはそのふざけた
幻想をぶち殺す
本当に管理者権限いらないの?
• とまでは言いませんが、ツールやOSによって対応範囲が異なります。
•管理者権限が必要な処理範囲を最小化することは可能です。
* ** + うそです
n ∧_∧ n+ (ヨ(* ´∀`)E)
Y Y *
どの処理が危ないのか
• パケットキャプチャの処理を大きく分けると
1. パケットをキャプチャ
2. パケットを解析
3. ファイルに書き込み
• 管理者権限が必要なのは「パケットキャプチャ」
• Promiscuousモードにしたりするので、一般ユーザでは無理。
• 一番バギーな処理は「パケット解析」
• Wiresharkのchangelogを読むと、毎回大量のdissectorの修正が入っている。
• 機能追加・改善も多いから、余計にバギーな状況に。
• この2つの処理の権限をどうにかしたい。
解決方法:PRIVILEGE SEPARATION / DROP PRIVILEGE
• 特権分離とは
• rootの特権が必要な操作を行うプロセスと非特権(一般ユーザ権限)で操作を行うプロセスを分離する考え方。
• 非特権プロセスの脆弱性が攻撃されても、特権昇格につながらない。
• OpenSSHで10年くらい前から実装されてるアレ。
• Wiresharkに実装されている。
• 権限降格とは
• 特権が必要な処理を終えたあとに、非特権に降格する考え方。
• tcpdumpに実装されている。
WIRESHARKのPRIVILEGE SEPARATION
• 説明の前に、Wiresharkのプロセス構成を見てみましょう。
Wireshark
dumpcap
①パケットキャプチャ開始の操作をすると起動
②パケットをキャプチャ
③パケットデータを渡す
④パケットを解析ユーザインターフェースと
パケット解析
ひたすら、パケットをキャプチャして受け渡す
※イメージです
WIRESHARKのPRIVILEGE SEPARATION
• Windowsの場合、dumpcapの代わりにWinPcapがサービスとして動作しているので、普通に使っても特権分離できている。
• Linuxの場合、Linux Capabilitiesという機能を使って、dumpcapコマンドに一般ユーザでもネットワークカードを操作できる権限を付与する。
• 実行できるユーザを限定するために、wiresharkグループユーザのみがdumpcapコマンドを実行できるようにする。
• BSD(include MacOS X)の場合は、キャプチャするユーザが「/dev/bpf*」デバイスの読み取り権限があればよい。
• 詳細な設定手順は、以下を参照。
• http://wiki.wireshark.org/CaptureSetup/CapturePrivileges
DEBIAN GNU/LINUXは簡単
• 以下の操作で完了
1. # apt-get install wireshark
2. # dpkg-reconfigure wireshark-common
• 設定ダイアログで「YES」を選択
• dumpcapコマンドにLinux Capabilitiesの設定など
• wiresharkグループの追加
3. wiresharkグループにWiresharkを使うユーザを追加
TCPDUMPのDROP PRIVILEGE
• キャプチャデバイスまたはキャプチャファイルを読み込んだ後に、一般ユーザに権限降格する。
• tcpdump実行時に「-Z(大文字)」オプションで一般ユーザを指定する。
• 指定する一般ユーザはログイン可能である必要は無い。
• コンパイル時にデフォルトでこのオプションが有効になるように指定することが可能。
• システムによっては、デフォルトでpcapユーザやtcpdumpユーザが指定されている模様。
ところで、なんでみんな管理者権限で実行するの?
• 多くの記事で「rootで実行する」と解説されているのが原因…かな?
• 実行権限について、触れられているのを見たことがない。
6.まとめ
それで結局どうするのがよいのか
• ミラーリング
• ミラーリングデバイスはタップ系デバイスがお勧めだが高いので、何だかんだスイッチングハブでミラーリングすることが多い。
• ただし、安易にスイッチングハブで大量のポートのミラーリングをしない。
• スイッチングハブのミラーポートは一段高速なネットワークインターフェースにするのが望ましい。
• ミラー元ポートの送受信合計トラフィック量 < ミラーポートのリンクアップ速度
• トラフィック量(bps)、パケット量(pps)の見積もりはなるべく正確に行う。
• バースト的なトラフィックはミラーリングされる前にパケットドロップする可能性があるので、そこは異常値としてあきらめる。
• クライアント-サーバ間の通信が不完全であれば再送されるので、それがミラーリングされればOKと考える。
それで結局どうするのがよいのか
• キャプチャ
• FWやIPSなど、トラフィックをセッションとして解析するデバイスの場合、トラフィック量だけで機器を選定するとパフォーマンスが足りなくなることがある(セッションテーブルの不足など)。
• TPACKET v3やnetmapはかなり高速なので、パケットキャプチャだけであればオープンソースソフトウェアで十分かも。
• 10Gbpsを処理できるという話も。
• Wireshark/tcpdumpのPrivilege Separation機能を使う。
• 用法・容量を守って、安全で楽しいパケットキャプチャライフを送りましょう!
Q & A
• ご清聴ありがとうございました。
• 質問等あればお願いします。