[GAS]SentinelOne APIを利用して検出されたCVE情報から「ID、説明(英語、日本語訳)」をまとめた一覧シートを作成

2023.03.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • SentinelOneでの脆弱性管理の際に、SentinelOne APIを利用すると容易に情報を取得することができます。
  • そこでGASとSentinelOne APIを利用して、検出されたCVE情報を「ID,説明(英語),説明(日本語訳)」でまとめた一覧としてシートに書き出す方法を記録いたします。

結果

  • 今回の手順で以下のような「CVE一覧シート」を作成します。

  • 項目は以下の通りです。
    • CVE ID
    • 説明(英語)
    • 説明(日本語訳)
      • ※翻訳にGASで利用できるLanguageAppを利用しています。

環境

  • mac OS Ventura 13.2
  • Google Apps Script

注意

  • ※こちらの機能はEA(Early Access)版、いわゆるBeta版扱いであり取得情報が不安定な部分も見受けられるため、ご利用の際は十分にご検討ください。
    • 例 : 「最新バージョンを脆弱性バージョンと誤検知」や「取得バージョンの誤り」等。

手順

EA(EarlyAccessProgram)の有効化

  • 現時点でEA(EarlyAccessProgram)、いわゆるBeta版扱いであるため利用するには事前に有効化する必要があります。
  • まず、SentinelOneの管理画面にアクセスしてサイドメニューの「Settings」をクリックして「Early Access Program」欄へ移動します。
  • そして「Join the SentinelOne Early Access Program」をONにして有効化してください。

APIトークンの生成

  • SentinelOneから情報を取得するために必要なトークンを生成します。
  • まず、SentinelOneの管理画面にアクセスして右上から「My User」をクリックしてください。

  • 次にポップアップされた画面の「Options」から「generate API token」もしくは「Regenerate API token」をクリックしてください。

  • クリック後、APIトークンが表示されるのでメモしておいてください。

スプレッドシート作成

  • 新規でスプレッドシートを作成してください。
  • その後、シート内の「拡張機能」タブから「Apps Script」でスクリプトエディタを開いてください。

プロパティ設定

  • GASのスクリプトエディタを開いたら、スクリプトプロパティに以下の内容を設定してください。
プロパティ
SENTINEL_BASE SentinelOne API URL
例: https://xxxxxx.sentinelone.net/web/api/v2.1

xxxxxxの部分は契約しているSentinelOneアカウントです。
SENTINEL_TOKEN 上記手順で取得したAPIトークン
SHEET_ID 上記で作成したスプレッドシートID

コード記述

  • プロパティ設定後、以下の内容をスクリプトエディタの任意のgsファイルに記述してください。
const properties = PropertiesService.getScriptProperties().getProperties();

function main(){
  // シート情報
  const cveSheetId = properties.SHEET_ID;
  const cveSheet = SpreadsheetApp.openById(cveSheetId).getSheets()[0];
  const headers = [['ID', '説明(英語)', '説明(日本語訳)']];
  const columns = headers[0].length
  const lastRow = cveSheet.getLastRow()

  // 初期化
  if(lastRow !== 0){
    cveSheet.getRange(1, 1, lastRow, columns).clearContent();
  }

  // CVE一覧取得
  const cves = getCves();
  // CVE ID一覧
  const cveIds = cves.map(cve => cve.cveId);
  // CVE 説明(英語)一覧
  const cveDescriptions = cves.map(cve => cve.description);
  // CVE 説明(日本語訳)一覧
  const cveTranslatedDescriptions = LanguageApp.translate(cveDescriptions.join('\n'), 'en', 'ja').split('\n');
  // 書き込み配列
  const insertCves = cveIds.map((cveId, index) => {
    return [
      cveId,
      cveDescriptions[index],
      cveTranslatedDescriptions[index]
    ]
  })

  // 書き込み
  const insertValues = [...headers, ...insertCves];
  cveSheet.getRange(1, 1, insertValues.length, columns).setValues(insertValues);

  console.log(`書き込み数 : ${insertCves.length}`)
}

// CVE一覧取得
function getCves(){
  const baseAPi = properties.SENTINEL_BASE
  const token = properties.SENTINEL_TOKEN
  const result = [];
  let cursor = '';
  do {
    const res = UrlFetchApp.fetch(`${baseAPi}/installed-applications/cves?limit=500&cursor=${cursor}`, {
      method: 'get',
      headers: {
        'Authorization': `ApiToken ${token}`,
      },
    })
    const json = JSON.parse(res.getContentText());
    json.data.forEach(cve => {
      result.push(cve)
    })
    cursor = json.pagination.nextCursor ?? '';
  }while(cursor)
  return result
}

実行

  • コード記述後、main関数を実行してログと作成されたスプレッドシートが以下のようになることを確認します。

  • 以上です。

まとめ

  • 今後もSentinelOne APIのさまざまなサービスを適宜利用していき、日々の業務改善に努めてまいります。

参考

  • 公式ドキュメント_全体 : https://xxxxxx.sentinelone.net/api-doc/
  • 公式ドキュメント_CVE取得API : https://xxxxxx.sentinelone.net/api-doc/api-details?category=application-risk&api=get-cves

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。