ランサーズ(Lancers)エンジニアブログ > SRE > ランサーズで脆弱性スキャナVulsを導入しました!!

ランサーズで脆弱性スキャナVulsを導入しました!!

adachin|2018年06月26日
SRE

5月にランサーズのSREチームに入社しました@adachin0817(あだちん)と申します。

さてさて皆さん以下のブログをお読みになられましたか?
https://engineer.blog.lancers.jp/2018/06/5267/
SREチームの発足

普段はインフラ改善、開発環境、新規インフラ構築、コードレビュー、分析基盤の運用などを行っています。そこで、今回SREチームが4人になったことで、セキュリティ強化のため、Linuxの脆弱性対応は活動していこうと決めました。

皆さま日々Linuxの脆弱性対応をしていますでしょうか?..

・脆弱性を追いたいけどNVDやJVNを追うのは…(ツライ)
・Twitterやメールなどでアナウンスされてバタバタしちゃう…(脂汗)
・そういえば管理しているサーバの脆弱性ってどのくらいあるんだろう…(白目)

・そもそも脆弱性アップデートとかしていない…(ギグっ)
・とりあえず置いとこう…(諦め)

なんて経験ある方は多いと思います。SREは日本語で「サイト信頼性エンジニア」と言われますが、もちろんセキュリティの担保も該当します。そこでVulsは脆弱性の検知や管理の手段として、今熱いOSSとなっています。

今回はランサーズでのVuls運用と今後の展望についてブログします!

脆弱性スキャナVulsとは/インストール方法

簡単にまとめますと、

・Linuxサーバに存在する脆弱性をスキャン
Ubuntu, Debian, CentOS, Amazon Linux, RHELに対応、dockerも

・OSパッケージ管理対象外のミドルウェアをスキャン
プログラミング言語のライブラリやフレームワーク、ミドルウェアの脆弱性スキャン
CPEに登録されているソフトウェアが対象

・エージェントレスアーキテクチャ
スキャン対象サーバにSSH接続可能なマシン1台にセットアップするだけで動作

・設定ファイルのテンプレート自動生成
CIDRを指定してサーバを自動検出、設定ファイルのテンプレートを生成

・EmailやSlackなど通知可能(日本語でのレポートも可能)

・付属するTerminal-Based User Interfaceビューアでは、Vim風キーバインドでスキャン結果を参照可能

・開発者はフューチャーアーキテクトの神戸氏

VulsはGolangでできています。基本Linuxの脆弱性をスキャンしますのでアプリケーションレベルでの脆弱性スキャンはできません。スキャン方法はSSHで接続するのでPull型となります。つまり、vulsユーザを作りansibleで公開鍵を配布するのがベストかと思います。

https://blog.adachin.me/archives/5540
【脆弱性スキャナ】Vulsをインストールしてみた!

インストール方法は非常に簡単でございます。
上記の私のブログを参考にしてもらえば幸いでございます!!

Lancers x Vuls

■環境

・Amazon Linux
・vuls v0.4.2 92f36ca

・vulsrepo
・go1.10.2 linux/amd64

本番環境と検証環境はAWSアカウントが別なので、各踏み台サーバにインストールして管理することにしました。

スキャン対象ホストですがホストもLB配下に置いてないからスキャンしないではなく、可動しているサーバ全てにスキャンするようにして、いつでも最新のKernelなどバージョンに保つようにしています。なぜ全て?と思われますが、実際弊社でどのくらいのサーバが運用されているのか、こんなサーバあったっけ?何動いてるっけ?などがないように、サーバ自体の管理も行えるからです。

また、コミュニケーションツールとしてChatWorkが主流となっています。
実は私が入社前に開発して下記のようにいい感じに通知しています。(脆弱性がない場合は再起動必要か,ホスト名,OS名と表示しています)もちろんSlackにも通知させていますが、今後Slackに完全移行することになりました!!(トホホ..)

Vuls 定期実行

$ sudo crontab -l
#run vuls-auto.sh
00 09 * * 3 sudo -u vuls bash -l /home/vuls/vuls/vuls-auto.sh /tmp/vuls.log 2&>1

毎週水曜日の午前9時にvuls-auto.shというシェルスクリプトを叩いています。
毎日スキャンしてもいいのですが、1週間に1回ということで、日々アップデートされるKernelなどは量がかなり多いため、1ヶ月に1回というペースでサーバ再起動をしています。

今までscan,reportをわざわざcrontabに直接書いていましたが、管理し難いことがあったので、
スクリプトにすることで「nvd,jvn,ovalらがupdate、scan、report」らが一つになりました。
下記のgistで管理しているのでぜひ使ってみてください!

・vuls-auto.sh

https://gist.github.com/RVIRUS0817/5228ead105329438f8f643d6b1849bd0

・vuls reportでオプションはどんな感じ?

$ vuls report -format-short-text -format-json -to-slack -to-s3 -to-chatwork -cvss-over=7 -lang=ja -ignore-unfixed

・-to-s3
resultsの結果をS3に同期させるようにしています。
・ -cvss-over

CVSSスコアが7以上で通知させるようにしています。(鬼のようにくるので汗)
・ -ignore-unfixed
弊社は主にAmazon Linuxを使っていますが、一部Ubuntuもあります。Amazon Linuxは主に該当しませんが、下記のようにまだ脆弱性未対応なものは-ignore-unfixedを付け足すことで通知させないようにしています。

VulsRepo

VulsRepoというVulsでスキャンしたデータを可視化するOSSがあるのですが、もちろん弊社でも利用して、社内のみにアクセスできるようにしています。
実際に脆弱性のレベルやJVNなどのリンクに飛べたりなど詳細が細かく可視化されます。これにより、開発者やSREチームでも「この脆弱性は対応したほうがイイね!」など議論ができるので、今後の未知なる脆弱性にも対応しやすくなると思います。

今後Vuls運用でやっていきたいこと/まとめ

resultsで出力されるJSONファイルをBigQueryに同期して、Redashで今月どのくらいこのホストには脆弱性が出てるなど、簡単に可視化されたらSREチームでも共有できますし、さらに脆弱性対応も捗りそうです!

まだ運用して1ヶ月ですが、チーム内でアップデートすることでサービス影響ないのか!?などと議論していますが、ランサーズでも脆弱性対応をし続けることで、サービスの安全性を高められることは間違いないと思います。ユーザ様も安心/安全にサービスを使ってほしいのが我々弊社エンジニアの願いです。

Vulsは早いスピードで新機能がリリースされていっています。私も今後OSS活動として企業さんが導入されるよう広報していきますので、まだ導入していない方はぜひともおすすめします!!
今年のVuls祭りでは私もお手伝いなどやらせて頂くことになりましたので、その時はぜひお話しましょう!!

お昼はボードゲームを主にやっているので、
オフィス近い方はぜひ!!!