本文へジャンプします。

NIFTY Cloudの脆弱性診断をJenkinsで自動実行し、結果をSlackに通知してみた

インターネットサービスを提供しているサーバーに脆弱性があると、侵入や改ざん、情報漏えいといったセキュリティインシデントを引き起こす原因となってしまうのは皆さんもよくご存じかと思います。

次々に発見されるOSの脆弱性はもちろん、ミドルウェアのバージョン変更によっても脆弱性が生じることもあるため、このような被害を防ぐためには、定期的にサーバーの脆弱性診断を行うことが重要です。

ニフティクラウド脆弱性スキャンを使えば、ご利用中のサーバーの脆弱性を簡単に検知することができます。

今回は、Jenkinsを使って脆弱性診断を自動で実行し、結果をSlackに通知する仕組みを構築してみました。


vss_jenkins

設定

スキャンテンプレートの作成

ニフティクラウドのコンパネにログインし、メニューより「脆弱性スキャン」のページへ移動してスキャンテンプレートを作成します。

vss_menu

今回はニフティクラウドのeast-1リージョンに構築した「webserver」の脆弱性をスキャンしてみます。

vss_template

Jenkins

脆弱性診断を自動で実行するためにJenkinsを構築します。
Jenkinsを起動するために、ニフティクラウドにCentOS 7.1のサーバーを作成します。

vss_create_instance

Jenkinsのインストール

サーバー作成が完了したら、サーバーにログインして以下のようにJenkinsをインストールします。

[root@jenkins]

# yum -y install java-1.8.0-openjdk
# curl -L -o  /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
# rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
# yum -y install jenkins
# chkconfig jenkins on
# systemctl start jenkins

インストールが完了したら、ブラウザーから http://サーバーのIPアドレス:8080 にアクセスするとJenkinsのUI画面が表示されます。
表示される画面にしたがってJenkinsの初期設定を実施し、ユーザーを作成してログインします。
この時「install suggested plugins」を選択しておきます。

vss_install_jenkins

Slackの通知設定

脆弱性スキャンの結果をSlackに通知させるために設定を行います。
SlackのApps&integrationから、Jenkinsで検索して追加し通知したいチャネルを指定します。
生成されたTokenはJenkins側で設定する必要があるのでメモを取っておきます。

vss_jenkins_search

vss_slack_jenkins

JenkinsのUIにて、[Jenkinsの管理]→[プラグインの管理]から利用可能タブで「slack」と検索し「Slack Notification Plugin」をインストールします。

vss_jenkins_slack_plugin

インストールが完了したら、[Jenkinsの管理]→[システムの管理]から「Global Slack Notifier Settings」セクションにて先ほどSlackから追加したJenkinsのTokenを入力して保存します。

vss_jenkins_slack_settings

CLIツールのインストール

Jenkinsから脆弱性スキャンを実行するためにはNIFTY Cloud 脆弱性スキャンAPIをリクエストする必要があります。
APIをリクエストするために、go-ncvs-cliというコマンドラインツールを作ってみました。
個人で作ったもので、ニフティクラウドの公式ツールではありませんが、基本的なAPI操作は可能となっています。
サーバーにて、以下のようにインストールします。

[root@jenkins]

# curl -L -o /usr/local/bin/ncvs-cli https://github.com/harikiriboy/go-ncvs-cli/releases/download/v1.0.0/ncvs-cli
# chmod +x /usr/local/bin/ncvs-cli

インストールが完了したら、JenkinsのUIで[Jenkinsの管理]→[システムの管理]から「グローバル プロパティ」セクションにて環境変数を設定します。
コンパネから取得したアクセスキーをシークレットキーを[AWS_ACCESS_KEY_ID] [AWS_SECRET_ACCESS_KEY] に入力します。
CLIを実行するために/usr/local/binにもパスを通しておきます。

vss_niftycloud_key

vss_jenkins_key

ジョブの作成

準備が整ったので、脆弱性スキャンを実行するジョブを作成します。
[新規ジョブの作成]から任意のジョブ名を入力して[Pipeline]を選択します。

vss_jenkins_create_job

「ビルドのパラメーター化」にチェックを入れ、文字列パラメーター[scan_template_name]を追加します。
vss_jenkins_param

「Pipeline」欄に以下のようなスクリプトを入力し、保存します。

vss_jenkins_script

    import groovy.json.JsonSlurperClassic

    node('master') {
        currentBuild.result = "SUCCESS"

        try {

            def scan_history_uuid

            stage('execute-scan') {
                def json = sh returnStdout: true, script: "ncvs-cli execute-scan -scan-template-name ${scan_template_name}"
                def resp = jsonParse(json)

                scan_history_uuid = resp.ScanHistory.ScanHistoryUUID
            }

            stage('describe-scan-histories') {
                waitUntil {
                    sleep 60
                    def json = sh returnStdout: true, script: "ncvs-cli describe-scan-histories -scan-template-name ${scan_template_name}"
                    def resp = jsonParse(json)
                    def scan_history = findScanHistory(resp.ScanHistories, scan_history_uuid)

                    echo "Status is ${scan_history.Status}"

                    if (scan_history.Status == "running") {
                        return false
                    }
                    if (scan_history.Status == "waiting") {
                        return false
                    }
                    if (scan_history.Status == "completed") {
                        return true
                    }
                    throw new RuntimeException("Status is ${scan_history.Status}.")
                }
            }

            stage('describe-scan-results') {
                def json = sh returnStdout: true, script: "ncvs-cli describe-scan-results -scan-history-uuid ${scan_history_uuid}"
                def resp = jsonParse(json)

                for (def scan_result: resp.ScanResults) {
                    def color
                    switch (scan_result.Severity) {
                        case 0:
                            color = "#357abd"
                            break
                        case 1:
                            color = "#4cae4c"
                            break
                        case 2:
                            color = "#bcd323"
                            break
                        case 3:
                            color = "#ee9336"
                            break
                        case 4:
                            color = "#ff0000"
                            break
                        default:
                            break
                    }
                    slackSend color: color, message: "NIFTY Cloud Vulnerability Scan Result\n  - ${scan_result.Rule.RuleName}\n  - see more information https://console.cloud.nifty.com/web/#vss/scan-history/${scan_history_uuid}"
                }
            }

        } catch (err) {
            currentBuild.result = "FAILURE"
            throw err
        }
    }

    @NonCPS
    def jsonParse(def json) {
        return new groovy.json.JsonSlurperClassic().parseText(json)
    }

    @NonCPS
    def findScanHistory(list, uuid) {
        return list.find {
            it.ScanHistoryUUID == uuid
        }
    }

実行

以上でジョブの設定は完了です。
試しにパラメーター付きビルドからジョブを実行してみます。
[scan_template_name]には実行したいスキャンテンプレート名を入力します。

vss_jenkins_exec

ジョブを実行すると、実際にスキャンが開始されます。
スキャンが完了し、結果がSlackに通知されていれば成功です。

vss_scan_result

あとは、このジョブを「定期的に実行」にしておけば継続的な脆弱性スキャンが自動で実行できますし、アプリケーションのデプロイジョブの後に実行するように設定しておくことで、環境更新後の脆弱性有無のチェックも自動で行えます。
Jenkinsで実行するScriptをカスタマイズして条件文を入れれば、CVSSスコア○○以上の場合のみ通知といったことも可能です。

まとめ

ニフティクラウド脆弱性スキャンを使えば、脆弱性スキャンを自動で簡単に実施することができました。
ニフティクラウドタイマーとも連携しているので、単純に脆弱性スキャンをスケジュール実行したい場合はタイマーを使うのもおすすめです。この場合は、自分でJenkinsサーバーを構築する必要もありません。

vss_timer

とても便利なので皆様も是非使ってみてください。

ニフティクラウド 導入相談窓口
ニフティクラウド 無料セミナー

閉じる

閉じる

クラウドブログ編集部

クラウドブログ編集部

ニフティクラウド ユーザーブログ編集部のアカウントです。 編集部からのお知らせや、レギュラーライター以外のゲストによる寄稿記事を掲載していきます。

浜中 慶

浜中 慶

1980年、神奈川県生まれ。2003年ニフティ入社。 ポータルサイト開発を中心に、音楽配信サービス、CGMサービスなど様々なプロジェクトに企画/デザイン/システム担当として参加。現在は@niftyのポータルサービス向けコンテンツ管理システムの企画/開発/運用を担当。

吉田 雄哉

吉田 雄哉

株式会社co-meetingの創業メンバー。「取締役&External- facing Technologist」と名乗り新しいIT技術を広く伝える活動とWebアプリケーション開発を行う毎日。パッケージベンダーでのSaaS立上げ・製造業の情報システム部門で企画やPM・受託開発と従事してきたため、ベンダーサイドとユーザサイド の両方の視点を持ち合わせる。

石田 健亮

石田 健亮

株式会社ドリーム・アーツで小売事業者向けSaaS「Shopらん」を企画、開発。メインの仕事はプログラマーだがサーバー管理や営業もこなすユーティリティプレイヤー。最近好きな事はパフォーマンスチューニング。特に並列化プログラミングがマイブーム。キライなことはデータセンターでの作業。騒音と乾燥が弱点。ニフティクラウドでデータセンターに行く必要が無くなったことが本当の利点だ と思っている。

五月女 雄一

五月女 雄一

ニフティでは「インフラを守る簡単な様で奥が深いお仕事」をしています。 夢はインフラの気持ちが読めるエンジニアになること。

わたなべ かずひろ

わたなべ かずひろ

専門学校卒業後、ソフトウェア開発会社で電力系統制御システムの開発に従事。その後、CD-ROM等マルチメディア系PCソフトの開発を経て、1998年フリーランスに。 2000年8月に株式会社イーツーの設立に参画。携帯を含む様々なWeb系のシステム開発に携わる。現在はiPhone/Androidアプリなどの開発も手がけている。

市角

市角

ニフティクラウドのコントロールパネル設計・開発をメインに、たまにインフラの運用やお手伝いもやっていたりします。コントロールパネルや新機能の活用方法、アイデアなどを中心に書いていく予定です。

仲山 昌宏

仲山 昌宏

歌って踊れるインフラエンジニア兼、PHPもRubyもJavaも書くPerl使い。 物理サーバの運用に飽きて、フルラックに格安サーバ詰めて自宅プライベートクラウドを構築中。 今年は個人的には分散処理を攻めていきます。

猪飼 賢広

猪飼 賢広

1984年、愛知県名古屋市生まれ。大学は福島県にある某大学。2008年ニフティに入社。 開発系部署に配属後、主に各種テーマサイト開発のシステム面調整、開発進行管理役などとして参加。 現在もPC・ガラケーサイトの開発まわりを担当。インフラまわりを触る案件にも携わっており、日々修行中。 好きな芸人はなかやまきんに君とレイザーラモンRG。

久江 裕之

久江 裕之

ニフティクラウドのインフラ運用、OS提供の仕事をしています。 新しいOSやイメージが出る時にこのブログでご紹介いたします。入社5年目。一流のインフラエンジニアを目指して日々勉強中。

竹内 豪

竹内 豪

ニフティクラウド エンジニア

山口

山口

ニフティクラウドの基盤設計、新サービス/アライアンス/インフラ企画、その他雑用全般を担当しています。 クラウドに欲しい機能や、こんなふうに使ってほしいという想いが共有できれば良いですね。

芳中 隆幸

芳中 隆幸

ニフティクラウドの開発、運用を担当しています。

酒井 浩平

酒井 浩平

ニフティクラウドの中にいます。 ネットワークまわりの運用・開発や自動化などに取り組んでいます。 すべてのエンジニアを幸せにすることを目指しています。

higebu

higebu

ニフティクラウド IaaSのエンジニアです。 ネットワーク、DRサービス with VMware vCloud® Air™ Technology辺りの担当をしています。

武田

武田

ニフティクラウドの開発・運用を担当しています。 各種機能の内容についてなどで執筆させていただく予定です。

福澤真

福澤真

ニフティクラウドのコンパネ開発、運用をしています。

森藤 大地

森藤 大地

データに関する仕事が好きです。

宮原徹

宮原徹

日本仮想化技術株式会社 代表取締役社長兼CEO。仮想化技術に関するコンサルタントとして長年活動しており、特にベンチマークテストによる性能評価を得意としている。

荒谷翔

荒谷翔

株式会社はてなでMackerelのセールスデベロッパーとして勤務しています

東條 望

東條 望

2014年にニフティへ中途入社。 入社後から現在まで、ニフティクラウドのサービス企画・開発を担当しています。 各サービスの紹介を執筆させていただく予定です。

世良迪夫

世良迪夫

ニフティクラウドのRDBなどを担当しています