RSSとSlackスタンプを使ってライトに脅威インテリジェンスの対応を始めました!

はじめに

はじめまして。コーポレートエンジニアリンググループ(以下、CE)の白取です。
ポメラニアンを飼っているCEだから@ce_pomeです。
Slackのアイコンにも愛犬が一緒に写っています。

初めてのテックブログで何を書こうか迷いましたが、CEの2本柱であるセキュリティと自動化の両方を紹介できる脅威インテリジェンスをテーマにしてみました。

脅威インテリジェンスとは

解釈の幅が広いと思いますが、始めたばかりの我々としてはまず以下のように設定してみました。

  • 脆弱性の情報を収集し、当社に関係のある脆弱性に対して適切に対応を行う
  • 対応を行ったうえで、インテリジェンスとして蓄積することで、インシデント発生時に備える

その体制を整える過程をご紹介できればと思っています。

情報源

SlackのRSS機能を使って、以下2つのRSSをメインで利用しています。

  • JPCERT/CC
  • Security NEXT

きっかけ

以前からSlackのRSSフィードに登録してほとんど垂れ流している状態でしたが、ISO/IEC 27001:2022に準拠するISMSで脅威インテリジェンスへの対応が求められるということで、方法を考え始めました。
最初から専用ソリューションを導入して完璧にすることは予算面・工数面どちらも難しかったため、まずは自社リソースでできることはなにか?を考え、SlackのRSS通知へのリアクションを起点とする自動化、その後の手動アクションを前提で動き出しました。

情報の収集方法

Google Apps Script(GAS)を利用して、Slackに投稿された自社に関係のあるRSS通知に対してリアクションをつけると別のチャンネルへ転送されるようなコードを書いています。
リアクションに応じて、メンションをつける先を変えたりもしています。
(重要度の高いものはCISOへメンションをつけるなど)
例えば、以下の画像のようにRSS通知に指定のリアクションをつけると、指定の対象者へメンションがつくような形になっています。

RSS通知
BOT通知

コードの一部抜粋ですが、スプレッドシートに設定した情報をもとに以下のようなコードでwebhook経由でメッセージ送信するようにしています。

スプレッドシートの設定

/**
 * SlackのAPI Methodsをスタンドアロンスクリプトでまとめて、ライブラリとしてインポートしている
 */
get_slack_post() {
  const now = new Date().getTime();
  // 何日前のSlackを取得するか指定(今回は3日前を指定)
  let diff_days_ago = now - (60 * 60 * 24 * 3 * 1000);
  diff_days_ago = this.slack.date_to_str(diff_days_ago);
  
  const channel_id = "C*********"; 
  let dict = this.slack.get_message(channel_id, diff_days_ago, true);

  for (const message of dict.messages) {
    let body = "";
    const timestamp = message.ts;
    const url = `${base_url}${channel_id}/p${timestamp.replace(".", "")}`;

    if (this.set_data.has(url)) {
      continue;
    }

    this.set_data.add(url);
    const reactions = this.get_reactions(channel_id, timestamp);
    if (reactions === undefined) {
      continue;
    }

    for (const reaction of reactions) {
      const reaction_name = reaction.name;
      let users = reaction.users;
      // 投稿時にメンションに変換されるように文字列形式を変更
      users = users.map(user => `<@${user}>`);
      users = users.join(" ");

      // スプレッドシートに記載しているリアクションに対応するメンションやテキストを取得する
      const add_text = this.branch_reaction(reaction_name);
      body += `${add_text}${users} さんがこの投稿に対して  :${reaction_name}:  をしました。\n`;
      // 過去取得した分をスプレッドシートに保管するため、URLとリアクションを配列に格納しておく。
      this.data.push([url, reaction_name]);
    }

    body += url;

    this.send_to_slack(body);
  }

  if (this.data.length > 0) {
    const last_row = this.sheet.getRange(this.sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow()+1;
    this.sheet.getRange(last_row, 1, this.data.length, this.data[0].length).setValues(this.data);
  }
}

脆弱性への対応

RSS通知にリアクションをつけて脆弱性情報を収集した後、自社で利用しているアプリケーションの場合には原則アップデートをアナウンス、自社プロダクトであるPark Directで利用しているサーバのOSやソフトウェアに関しては開発チームに共有するようにしています。
開発チームの方ではサービスで利用しているパッケージやコンテナイメージに対する脆弱性スキャンをかけていますが、現状全てをカバーできるわけではないので補完的に連携をしています。

脆弱性への対応要否を決める際は、CVSS(Common Vulnerability Scoring System)のリスクスコアを参考にしています。CVSSのスコアと対応工数をCISOを含めて比較し、リスクのほうが上回ると判断した場合は対応を促しています。
また、ブラウザの脆弱性やCVSS9.0を超える深刻な脆弱性の場合は、優先度を高めてアップデート対応をしてもらっています。

データの蓄積方法

リアクションをつけたデータは、Googleスプレッドシートにも連携されるようになっています。
過去どのような脆弱性の報告があって、何件対応したのかを画像のような形で蓄積しているので有効活用しています。

リスク分析

ニーリーでは定期的にセキュリティ分科会を開催しているため、そこで直近のマルウェアの動向や脆弱性の内容等、最新の傾向をCISOやセキュリティ担当メンバーへお伝えする機会があります。

今後やりたいこと

  • インテリジェンスの強化
    • 蓄積したデータの中で自社でも発生可能性が高いと判断したリスクに対して、起こらないようにする予防策や実際に起ってしまった場合の対処法を議論する
  • SOARの導入によるセキュリティ運用の自動化・効率化

この2点はやっていきたいと考えており、今後の課題でもあります。

おわりに

以上が当社でゼロから脅威インテリジェンスの体制を構築していった過程です。
これから脅威インテリジェンスを始めてみようと思っている方の参考になればと思い、書かせていただきました。