脆弱性スキャナVuls(入門編)
3月 31日 @ 21:30 ~ 23:00 講師: usiusi360
資料
講演
自己紹介
- 仕事は Vuls, クラウドサービス版の開発/ビューア VulsRepo の開発
- もともとシステム運用をしていて監視・運用設計が得意
運用の方で、サーバの脆弱性対策ちゃんとやれていますか?
- Vulsユーザコミュニティだと、アップデートが必要だけどなかなかできていない、というのが共通認識
昨今の課題
- JVN, IPA etc の巡回
- 脆弱性報告件数は右肩上がり。一つ一つ見切れない。
- 脆弱性対策は時間との闘い
- 情報公開 → 攻撃者へのヒントも公開されている。公開されると攻撃が急増する。
- 発見・対処が遅れるとリスクが高まる
早期対応の重要性
- 2013年, Apache Struts 脆弱性を突かれてクレジットカードの情報漏れ
- その後セキュリティ対策実施
- 2017年, また Struts2 の脆弱性を突かれて不正アクセスされてた
- 実際セキュリティ製品(WAFとか)入れても脆弱性情報公開直後とかは防ぎきれない
でも毎日ウォッチし続けるのはツライ
- 過去情報も結構頻繁に更新されてる。
- スコアが上がったり
- 影響のある製品が追加されたり
- ニュースになるのは重要なものだけ。
- 隠れた影響度の高いものが結構ある
- ニュースだけ追っていても見落としがある
- アップデートに対して自分たちのシステムの構成と照らしあわせをするのはツライ
- チェック漏れがあると一大事
- システマティックな対応が必要
人力運用の限界
- 脆弱性スキャンツールを適材適所で使う
サーバに対する脆弱性対策
-
まず可視化が必要
- モニタリングして見えるようにしないといけない。見えないことはコントロールできない。
-
脆弱性の種類も多様化: 一つの対策では防げない
- NW多層防御
- 脆弱性診断
- 侵入の早期検知
-
Q. 脆弱性の自動化を考え始めたのは実際の運用現場で体験されたからですか?
- A. もともとの開発者が作ったきっかけ: 脆弱性情報が振ってくるのをさばききれない。一念発起して作り出した、というのがVulsになっている。
- SoftwareDesign2017/10月号の第2特集4章に記事があるのでそちらを
多層防御
- WAF, IPS, FW...
- 防御系/検知系
- 脆弱性診断として各層にいろいろなツールがある
- Vuls: ソフトウェアの脆弱性スキャナ
- VulsはWebアプリの侵入テストとか、セキュリティ設定を見たりするわけではない。ポートスキャンとかもしない。あくまで、サーバに入っているパッケージを見るツール。
Vuls
- VULnarability Scanner (脆弱性スキャナー)
- 某呪文? 元々そっちから取ったらしい
概要
- 各ディストリビュータが公開しているリリースノートみたいなものとかを取り込んでくる。あとchangelogとかも。
- 実際の機器にログインしてパッケージ構成情報(名前とバージョン)を取得して外部データとマッチング、人が理解しやすいカタチでレポートする、というのが主な機能。
- 2016/4月に github 公開。2016/10/01 にランキング1位を獲得(一瞬だったけど)
- 是非 Vuls/VulsRepo にスター付けてください!
- コミュニティ活動も活発にやっています: Vuls User Meetup
- 利用事例、vuls.io に掲載。LT等での発表もいろいろ。Vulsに関する勉強会・セミナー発表一覧
- SoftwareDesign2017/10月号でOSS版, 2018/1月号でクラウドサービスについて掲載
特徴
- OSS
- Agent Less
- 非破壊でスキャン: ペネトレーション系だとアプリに影響出たりすることもあるが、ssh して rpm とかを見ているだけなので安全。
- ディストリビューションパッケージだけじゃなくてCPE登録すれば個別にビルドしたものやNW機器も検知可能
- オンプレ・クラウドの両方に対応
- AWS Inspecter は EC2 のサーバのみ。
- いろいろな Linux Distroに対応
- FreeBSDにも対応
- Docker コンテナにも対応
- JVNデータ取ってくるので日本語レポート可能
スキャン結果通知
- Mail, Slack に標準で対応
- 日本語OK
- TUIツールあり
- コンソールで直接結果を見れる
- VulsRepo
- Vulsが出力するjsonを取り込んでpivot table 的に軸を変更したりできる。
- CSV → Excel 連携: エンドユーザ向けレポート提出とかにも利用可能
- CSV → ElasticSearch/Kibana 連携とかも可能
Vuls構成パターン
いくつかモードがある
- ローカルスキャン
- Vulsがインストールされたサーバ自身をスキャン
- リモートスキャン
- 外部サーバにログインしてOSコマンド発行してパッケージ情報を収集
Dockerコンテナスキャン
- コンテナには
docker exec
コマンドを介してチェック- コンテナ内に ssh daemon は不要
- OpenVAS は ssh しかない。
複数の Vuls サーバによる運用
- 実際の現場だとユーザごと・システムごととかにネットワークが分離されていることが多い
- システム内でスキャンした結果を1カ所に集約して VulsRepo 等で集計することもできる。
- NTTPCコミュニケーションズさんなどがやっている方法
- CIRT組織とか広く見るところだと、各部門からjsonファイルをもらって、組織ごとの対応状況をチェックするなど。
ハンズオン
環境
- AWS, 2インスタンス
- CentOS7.4(Vuls), Ubuntu16.04
- インストール時に github にアクセスできること
- スキャン中は各ディストリビューションのパッケージ情報が取れること
- マニュアルは vuls.io に。
Vuls構成
- Remote Scan Mode (Scan via SSH) · Vuls
- 最初にJVN等外部の情報を取ってくる(fetch)
- 二つのアプリ: go-cve-dictionary, goval-dictionary
- default では SQLite に格納
- Vuls 本体は各サーバにログインして yum, apt コマンド等を発行し、リポジトリのパッケージ情報を間接的に取ってくる
- 取ってきたデータと fetch したデータをマッチングして json データを出力する
CentOSへのインストール
- Install Manually on CentOS · Vuls
- sudo 権限はマニュアル見ながら判断を
go-cve-dictionary
- make: go dep (依存性管理), go install している
make install
すると関連ライブラリをダウンロード。 - alpineにも対応(つい最近)
- 進捗は出ないのでしばらく待つ
go-cve-dictionary -v
してバージョン表示されればOK (/bin)- golang の場合、バイナリ単体で動くので、中間ファイルとかソースとかは消してしまっても大丈夫。go dep でダウンロードしたものは vendor ディレクトリに入っているので、環境が汚れるというのはほとんどない。
- できたら脆弱性DBを取得 (今回は過去2年くらいあればいいので取得データの年は2017で)
- fetch してなくても検知自体はできる (OVALでバージョンチェックしてるのでCVE IDはわかる。それを元にNVD、JVNのデータでサマリーやスコア等の情報を補完している。)
- fetch 実行すると直下に sqlite3 ファイルができる (取得したデータをいれてるDBファイル)
goval-dictionary
- 手順は同様
- CentOSは OVAL 情報がないので、かわりに RedHat の情報を使っている。
- fetch すると改行コードがおかしくなるのでいったん shell 抜けて入り直す
- Ubuntu もスキャンするので Ubuntu のデータも取得, バージョンごとに分かれているので ubuntu 16 を指定:
goval-dictionary fetch-ubuntu 16
コメント
- 今日はソースからインストールする手順をやっているけど、docker で入れる手順もあります。
- githubにバージョン切ったものについてはビルド済みのデータもあるけどちょっと古い。
- 少し試すだけならこちらでも
Vuls
- Vuls 本体のビルド中にエラーメッセージっぽいのが出てくるけど気にしなくても大丈夫。いま master に入っているソースは、構文チェックが入っていて怒られてる。次のバージョンで治る予定。
vuls -v
してバージョン表示されれば完了- マニュアルではその後、アップデート時に周辺ライブラリを消すというのが書いてあるが今回は不要。
Local Scan
- Tutorial: Local Scan Mode · Vuls
- Config file をつくる
vuls configtest
: 必要なパッケージや権限等のチェックvuls scan
でスキャン実行- この時点では rpm 情報取ってきただけで脆弱性を見つけているわけではない
- report
- オプションいろいろあるけど必要なのは
vuls report --format-short-text
- 3種類ある
- 日本語で JVN 情報出した場合は
--lang-ja
つけると JVN があるものについては日本語で表示 vuls tui
: 4ペイン表示、TABでペイン移動、矢印キーで上下左右移動、Ctrl-c で抜ける
- オプションいろいろあるけど必要なのは
WebUI (VulsRepo) インストール
- Online Demo : VulsRepo で雰囲気はわかるはず
- CVE ID リスト
- "not fixed yet" はまだ修正版が出てない
Remote Scan
- 鍵認証のみ。パスフレーズは空で作る必要がある。
- パスワード認証は非対応
- もともとは対応していたけど、パスワード見えちゃうところがあるので廃止した
- 鍵登録したら一度ログインして known-hosts に登録してやる
まとめ
- 人手でやるのは無理だけど、Vuls で抜けもれなくチェックできます。
- スコアが出るので対処優先度が付けられる。PCIDSSとかでもスコアベースになるので、Vuls使うことで対応できる。
- マニュアルについては資料参照
- 宣伝
- FutureVuls というクラウドサービスをやっています。2018/1月から。OSS版Vulsはスキャンと可視化まで。FutureVulsは検知した後のインシデント管理、アップデートしたときの影響といった機能を盛り込んでいる
- FutureVuls - Vulsクラウドサービス [Vuls SaaS]
- 質問はVulsのコミュニティ Slack へ。
- CSV出力例とかは関連リンク集 Qiita へ。
- 去年・一昨年のアドベントカレンダーとかで、応用事例とかが追える。
- 勉強会・セミナー等の情報も全部書いてあるので。
参加者の声
(Discord 上の発言で、なにか取り上げたいものがありましたら記載お願いします)
- yum-utilsがないって怒られましたがyumで入れた後はOKになりました
- 環境によってはないかも。yum-utils いれてください。
Q & A
(Discord 上に質問が流れたらピックアップお願いします)
- Q.見つかった脆弱性は、どのように対処するのが妥当なんですか?
- A.システムによる。例えば、それほど重要なサーバじゃなくて yum update で全部更新できるならやってしまえばいい。ただ現実問題として、業務で使っていてパッケージアップデートしたら業務アプリが動かなくなるとかあったりする。なるべくアップデートしないという運用をしているところも多い。だからこそ Vuls とかで脆弱性有無を可視化してどこから対応するかを検討。指標の一つとしてスコア高いものから…とか。
- DMZにあるサーバと、DBみたいに奥にあるサーバでは対応も違う。複数台あるWebサーバだったら一部だけアップデートしてから、みたいな運用をしているところも多いのでは。DMZはスコア4以上、DB系はスコア7以上はあてるみたいなのとか。
- ワークアラウンドで逃げるというのも一つの選択肢。FutureVulsではそういう連携もできるようになってる。
- DeepSecurity との連携とかもできる。
- Struts とか古くてバージョン上げられないみたいなものに対して仮想パッチを当てるみたいな連携機能がある。
- ワークフロー
- Redmine ticket管理みたいなものはある。ステータス(調査中・アップデート中・対応済み)とか優先度・担当者割り当て、期限の管理なども出来る。
- 検知した後実機で パッケージをyum update かけて脆弱性がなくなったら自動的に対応状況を変えるとか、消し込みも可能
- ignore というステータスで、対応しないものをつけたりもできる。ignore になってもスコアが後から変動した場合にもう一度検知して表示させるみたいな機能は今計画中。
- OSSにない機能だと ロール/タグ
- 台数増えたときに集約的に見れるように。
- スコアの再計算: exploit code の有無とか環境値で再計算できる
- NW機器対応
- NVDサイト見るとCPEというのがある。どのプロダクトのどのバージョンに問題があるか。config file に書いてもらうと検知できる。
- FutureVulsでも実装 (Cisco の ver いくつとか)
- 他の脆弱性対策ツールに比較して、こちらの「推し」は? 非侵食性ですか? 実際動作してる状態のサーバに対して応答をみる動作をするとかそういうものもあったような気がします
- OpenVAS, OpenSCAP を使うと設定ファイルをみてくれたり。
- 実際にパッケージが入っていても起動してないものとかを加味した上で検知する仕組みを今実装中。
- パッケージをアップデータしたけどリスタートしてないとか、アップデートしたら再起動しなさいとかを出せる仕組みを実装中。
- Cisco提携
- Cisco OVAL 使って実機入って情報取るみたいなのやっていたり
- やってるけどあまり進んでいない感がある
- IIJの方がやってくれている