# 安全にオシロスコープで艦これをする :::info この記事は[群馬大学電子計算機研究会 IGGG Advent Calendar 2017](https://adventar.org/calendars/2300) 1日目の記事です ::: [TOC] ## 前置き [元祖](https://twitter.com/kuriuzu/status/611428367515037696)です.そして最近オシロスコープで再度艦これをやってみようという話です. しかし,このような古いオシロスコープなどに搭載されているソフトウェアの多くはサポートが終了しています.セキュリティ上の懸念を解消するにはどうすればよいでしょうか? :::warning 互いのホストにおいて各ベンダーから提供されるセキュリティに関連するアップデートを実施してください. また,今回は一定の対策が上流で実施されているネットワークにおける構築例を紹介します. ::: ## 水際での対策を考える インターネットに接続され,かつIoT機器やゲストへの提供を目的としたネットワークを構築する際には各ホスト側での対策を重点的に行うことは非常に困難となります.そこで,各ホストではなく,水際となるゲートウェイなどを利用してセキュリティ対策を実施することは可能であるかを考察します. ### ネットワークを分離する VLANなどを活用し,重要なホストが動作しているネットワークとは切り離すことが重要です. 図のように分離し,また以下で述べる処置を行います. ![セグメント分割の例](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/6bb5ca68d423417557d1b41b56a589d8d7d2b34d/nw-crop.png) ### ファイアウォールを導入する パケットフィルタリングによるファイアウォールを利用することで,特定のホストやポートに関する通信のみを許可することができます.これを利用することで,特定のサービスへの攻撃を防いだり,攻撃可能性を減少させることが可能となります. また,プロキシなどを利用することで,各アプリケーションでの通信において不審なものを検知させることも,ファイアウォールと言えます.[^firewall] [^firewall]: [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB#.E3.82.A2.E3.83.97.E3.83.AA.E3.82.B1.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.B2.E3.83.BC.E3.83.88.E3.82.A6.E3.82.A7.E3.82.A4.E5.9E.8B)より ### NAT(NAPT)配下に置く NATを利用することによって,グローバルIPアドレスとプライベートIPアドレス[^1]が変換されます.また,NAPTにおいてはポート番号についても変換されます.外部のネットワークからは内部のホストを特定して通信することは困難になります. つまり,特定のグローバルIPアドレスとポート番号に対して攻撃を仕掛けるような,いわゆる「ネットワークケーブルを挿しただけで感染する」タイプのマルウェア[^2]に対する対策には十分有効になります. 一方で,WANへの通信においては貫通してしまいます.よって,一旦WANへの通信が行われるものや,C&Cサーバや攻撃者が用意したホストに通信するようなマルウェアに対しては全く効果がありません. よって,十分な対策にはなり得ませんが,単純なマルウェアやネットワークの隠蔽に対しては今でも有効といえます[^3]. [^1]: 外部のネットワーク側に通じている(WAN)IPアドレスをグローバルIPアドレス,内部のネットワーク側に通じている(LAN)IPアドレスをプライベートIPアドレスと表現します. [^2]: 一方で,[WannaCryのようなLAN上のホストに対して直接攻撃するマルウェア](http://blog.trendmicro.co.jp/archives/14906)に対しては今回の対策は無意味と言えます. [^3]: 一方で,[情報処理推進機構やRFC](https://www.ipa.go.jp/security/fy22/reports/tech1-tg/a_06.html)ではNAT/NAPTは十分な対策ではないと言及しています. ### UTMを導入する ファイアウォールのレベルでは,ある特定のサービスへの通信の制限や,ある特定のアプリケーションに対するスキャンしかできませんでした.一方で,UTMとよばれる総合脅威管理とよばれるアプライアンスをを導入することで,その下にぶらさがるホストのあらゆる通信への脅威の検知が可能になります. - [Endian Firewall Community Edition](http://www.plum-systems.co.jp/endian-community/overview.html) - [Sophos UTM Home Edition](https://www.sophos.com/ja-jp/products/free-tools/sophos-utm-home-edition.aspx) - [Untangle](https://www.untangle.com/) これらは,各種のセキュリティ対策ソリューションを統合したものになっており,従来のファイアウォールやIDS/IPS,HTTPプロキシなどを含みます.UTMは,これらを組み合わせて1台にまとめて導入を容易にしたものと言い換えることもできます. ## 実践: UTMの導入 / Untangle ![Untangle](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/e42410536de4541acc0b166013c97c808150436e/s1.png) [Untangle](https://www.untangle.com/)は,LinuxをベースしたUTMです. 一部の機能は有料のサブスクリプションとなっていますが,基本の機能は無償で利用することができます. ### 無償で利用できる機能 - Firewall - Intrution Prevention - Phish Blocker - Virus Blocker Lite - Ad Blocker - Application Control Lite - Spam Blocker - Spam Blocker Lite - Web Monitor - Captive Portal - OpenVPN - Tunnel VPN - Reports ### Virus Blocker Lite: ClamAVによるスキャナ ClamAVによるWebスキャナであるVirus Blocker Liteを導入しましたが,初期状態では全く動作しませんでした. 以下のようにすることで,動作を確認しました.[^3] [^3]: https://forums.untangle.com/virus-blocker-lite/36710-virusblocker-lite-not-working-new-installs-after-fix-smtp-not-working.html ```shell $ cd /var/lib $ mv clamav clamav.old # Virus Blocker Liteを再インストールします $ mkdir /var/lib/clamav $ chmod 777 /var/lib/clamav $ freshclam ``` ![CalmAVによる検知の様子](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/e42410536de4541acc0b166013c97c808150436e/detect.png) Virus Blocker Liteによってマルウェアがブロックされるとこのようなページに遷移します. HTTP通信におけるマルウェアに対する対策としては有効と言えます. ### Intrution Prevention: 侵入検知 Snortを利用することができます.シグネチャを独自に追加することも可能です. シグネチャがすでに公開されているトロイの木馬や攻撃についてはこれを利用することで迅速に対応ができます. 設定画面より,シグネチャの追加や削除が行えます. 一括選択のような機能はないので,JSONをエクスポートしてから手元で編集して書き戻すのが良いと思います. ## 実践: ログの可視化 / Graylog によるログ収集基盤 ![Graylog ダッシュボードの様子](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/graylog.png) Untangleのダッシュボード機能やログ可視化機能であるReportsはとても見やすく使いやすいですが,今回は統合なログ管理基盤として[Graylog](https://www.graylog.org/)を導入してみます. ### Graylogの導入 公式に配布されている仮想アプライアンスを利用して導入しましたが,Dockerizeされているものも存在します. OVAを導入後,ログの収集が上手くいかない場合はシェルログイン後`sudo graylog-ctl reconfigure`を打ち込むと正常にログ収集が可能になります. ### GraylogでUntangleのsyslogを収集する はじめに,Graylogでsyslogを収集できるようにします. Graylogにログインした後,System -> Inputs -> Select Input -> Syslog TCP / UDP (どちらでもよい)で追加をしましょう. また,Global inputsに向けておきます. その後Untangleへログインして,syslogを有効にしてサーバをGraylogに向ければ完了です. ### Untangleのsyslogを見やすい形に整形する Untangleから出力されるsyslogのmessageはこのような形式になっています: ``` INFO uvm[0]: {"timeStamp":"2017-12-01 07:13:19.987","s2pByte... (JSON) ..."} ``` ここで,Extractorを作成して,Graylog(Elasticsearch)が読めるように各keyをしっかりと格納させてあげます. Extractorの方式には正規表現を使う方法やGrokを使う方法があります.また,JSON形式であればそのままExtractorにかけられます. JSONをそのまま受け取った場合,そのままExtractorにかければよいですが,今回は頭にJSONではないものが付いているので外してあげる必要があります. はじめに,Graylogを開いてInputs -> (syslog) -> Manage Extractorsをクリックします. Load Messageをクリックしたのち,messageの横にあるSelect Extractor Typeをクリックします. ![messageの横にあるSelect Extractor Typeをクリック](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s2.png) ここで,Replace with Regular Expression(正規表現)を選択します. 以下のように設定することで,単純に置換しているだけですがJSONデータを取り出すことができます. ![Extractor Configuration](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s3.png) 次に,そのJSONデータを使ってキーを取り出してあげます. 同じようにLoad Messageをクリックして,`raw_json`(今回の場合)の横にあるSelect Extractor Typeをクリックし,JSONをクリックします. ウィザードに従い,そのまま作成すると,互いのキーと値がきちんと入っていることが確認できます. ### Streamの設定 Streamには流れてきたログを振り分ける機能があります.ここに,振り分け条件としてSnortのログおよびClamAVの設定を施してフィルタしてみましょう. Stream -> Create Streamで新規Streamを作成できます. 作成すると,以下のように表示されます. ![Stream](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s4.png) 後は条件に従うようにフィルタすれば良いです.例えば,Snortであれば`blocked`が`1`のとき,ClamAVであれば,`virusname`が含んでいるときということになります. ![Snortの例](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s5.png) ![ClamAVの例](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s6.png) ### Slackへ流す Graylogには[Slackプラグイン](https://github.com/graylog-labs/graylog-plugin-slack)が存在し,Incoming Webhookによる投稿が可能です. GraylogのOutputと呼ばれる部分,もしくはAlarmの機能で利用可能となっています. Alarmに設定する場合,メッセージを自由に変更できるので,このようにアラートを流すことができます. ![Snortの例](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s7.png) ``` ########## IPS detected and blocked suspicious packet. ########## ${if backlog}Last messages accounting for this alert: ${foreach backlog message}Message: ${message.fields.msg} Category: ${message.fields.category} Dst: ${message.fields.ipDestination} Src: ${message.fields.ipSource} ${end}${else}<No backlog> ${end} ``` ![ClamAVの例](https://gist.github.com/atpons/c551fbd9130fb8435d00b4781f7b2076/raw/8b6b63f201c4259b4a5519a4ab2a591bf60f199f/s8.png) ``` ########## ClamAV detected and blocked suspicious packet. ########## Please look at dashboard for detail. ${if backlog}Last messages accounting for this alert: ${foreach backlog message}Virus: ${message.fields.virusname} ${end}${else}<No backlog> ${end} ``` 今回は,OSSのUTMとログ管理ソフトウェアを使って不審な通信を検出し水際で防ぐ方法について書きました. Untangleについては上流にファイアウォールがない場合にはフィルタルールを設定した上でファイアウォールを設定しても良いかもしれません. Graylogについてはログ管理ソフトウェアとして様々な活用方法が期待されます.また,Slackなどの連携や,Extractorについても多く公開されている[^ext]印象があります. [^ext]: https://marketplace.graylog.org/addons?tag=Extractor ゲートウェイを置くことで,ホストに対する攻撃の一部は防ぐことができます.しかし,不審な通信をいち早く見つける力や日々からのアップデートなども重要です. 対策を過信しすぎず,自身のネットワークは自身で守っていくことが重要です.