AUTOMATION NOTE — 051

Google Workspace MDM監査ログからデバイスコンプライアンスレポートを自動生成するGAS実装ガイド

Google Workspace MDM (Mobile Device Management) を導入している組織では、デバイスのセキュリティ状態やコンプライアンス状況を定期的に把握し、経営層や監査担当者へ報告する業務が発生します。本記事では、Google Workspace MDMの監査ログを活用し、Google Apps Script (GAS) を用いてデバイスコンプライアンスレポートを自動生成する具体的な手順を解説します。

この記事を読んだほうが良い人

  • Google Workspace MDMを導入済みで、デバイス管理を行っている情シス担当者
  • デバイスコンプライアンスの状況を定期的に報告する必要があるが、手動でのレポート作成に手間を感じている方
  • GDPRやSOC2などの規制対応において、デバイス管理の証跡整備を効率化したいと考えている方
  • Google Apps Script (GAS) を使って業務自動化に取り組みたい方

Google Workspace MDM監査ログ活用の現状と課題

Google Workspace MDMは、組織内のデバイスセキュリティを強化するための重要なツールです。しかし、「MDMを導入したものの、デバイスの状態を詳細に追跡したり、ログを定期的に確認したりする仕組みが整っていない」というケースは少なくありません。

MDM導入後の「ログ未活用」問題

MDMを導入し、デバイスポリシーを設定するだけでも一定のセキュリティ向上は期待できます。しかし、デバイスがそのポリシーに「本当に準拠しているか」「異常なアクティビティがないか」を継続的に監視しなければ、MDMの真価は発揮できません。多くの情シス担当者は、日々の業務に追われ、MDMが生成する膨大な監査ログを十分に活用できていない現状があります。

コンプライアンスレポート作成の手間

経営層や監査担当者からは、定期的に「現在、組織内のデバイスがどの程度セキュリティポリシーに準拠しているか」といったコンプライアンスレポートの提出を求められることがあります。これらをGoogle Workspaceの管理コンソールから手動で情報を集め、整形してレポートを作成するのは、多大な時間と労力を要する定型業務です。

コンプライアンス規制と監査ログの重要性

GDPR (General Data Protection Regulation) やSOC2 (Service Organization Control 2) などの規制や認証においては、企業が情報セキュリティに対して適切な管理体制を構築していることを証明する必要があります。デバイス管理の監査ログは、組織がセキュリティポリシーを適用し、デバイスのコンプライアンスを維持していることの重要な証拠となります。ログから定期的にレポートを生成し、これを証跡として提示することで、規制対応の信頼性を高めることが可能です。

Google Workspace MDM監査ログで何ができるか

Google Workspaceの管理コンソールでは、デバイスに関する様々なアクティビティログが記録されています。これらはAdmin SDK Reports APIを通じてプログラムから取得できます。

取得できる情報とその限界

Admin SDK Reports APIのapplicationName: 'mobile'を使用すると、主に以下のデバイス関連情報を監査ログから取得できます。

  • デバイスの登録/登録解除: 新しいデバイスがMDMに登録された、または登録が解除されたイベント。
  • デバイスの同期: デバイスがGoogle Workspaceと同期した日時。
  • デバイスポリシーの適用: ポリシーがデバイスに適用されたイベント。
  • デバイスのステータス変更: デバイスが非準拠になった、ブロックされた、ワイプされたなどのステータス変更。
  • デバイス情報: デバイスID、OSの種類とバージョン、モデル、ユーザー情報など。

これらの情報を使って、例えば「最終同期から30日以上経過しているデバイスのリスト」「特定のOSバージョンが適用されていないデバイスのリスト」といったコンプライアンス状況を把握できます。

一方で、Admin SDK Reports APIのモバイルログでは、以下のような詳細な操作ログは取得できません。 - デバイス上で起動された特定のアプリケーションの履歴 - ファイルシステムへのアクセス履歴 - Webサイトの閲覧履歴

これらの情報は、より詳細なMDMソリューションやEDR (Endpoint Detection and Response) 製品が必要となります。Google Workspace MDM監査ログは、あくまで「デバイスがGoogle Workspaceのポリシーに対してどう振る舞っているか」に焦点を当てた情報を提供すると理解することが重要です。

ログ保持期間とエディション要件

Google Workspaceの監査ログの保持期間は、利用しているエディションによって異なります。

  • Business Standard/Plus: 一般的に6ヶ月
  • Enterprise Standard/Plus: 1年間、またはそれ以上(設定による)

Admin SDK Reports APIへのアクセス自体は、ほとんどの有償Google Workspaceエディションで利用できます。ただし、監査ログのBigQueryエクスポートなど、一部の高度な機能はEnterpriseエディション以上で利用可能です。また、長期的なコンプライアンス対応を考えると、Enterpriseエディションでのより長いログ保持期間は大きなメリットとなります。Admin SDK Reports APIは、Google CloudプロジェクトでAdmin SDK APIを有効化し、適切な認証情報を設定する必要があります。

GASでMDM監査ログからコンプライアンスレポートを自動生成する

ここからは、実際にGoogle Apps Script (GAS) を使ってMDM監査ログを取得し、Google Spreadsheetにコンプライアンスレポートを自動生成する手順を解説します。

全体フローの概要

自動生成のフローは以下のステップで構成されます。

  1. Admin SDK Reports APIでログ取得: GASからAPIを呼び出し、指定期間のデバイスアクティビティログを取得します。
  2. GASでデータ整形・集計: 取得したJSON形式のログデータから必要な情報を抽出し、レポートに適した形に整形します。
  3. Google Spreadsheetに結果出力: 整形したデータをGoogle Spreadsheetに書き込み、レポートとして可視化します。
  4. 定期実行設定: GASのトリガー機能を利用して、この処理を月次や週次で自動的に実行するよう設定します。

前提準備:Admin SDKの有効化とGASプロジェクト設定

GASからAdmin SDKを利用するには、以下の準備が必要です。

  1. Google Cloudプロジェクトの作成とAdmin SDK APIの有効化:

    • Google Cloud Consoleにアクセスし、新しいプロジェクトを作成します。
    • 作成したプロジェクトで「APIとサービス」から「Admin SDK API」を検索し、有効化します。
    • 注意: このAPI有効化は、GASのサービスとは別に、Google Cloudプロジェクト側で行う必要があります。
  2. GASプロジェクトの作成とAdmin SDK サービスの有効化:

    • Google SpreadsheetまたはGoogle Driveから新しいGASプロジェクトを作成します。
    • GASエディタで「サービス」アイコン(左側のサイドバー)をクリックし、「サービスを追加」を選択します。
    • 「Admin SDK」を検索し、追加します。識別子(AdminReportsAdminDirectoryがデフォルト)を確認して「追加」をクリックします。

実装:デバイスアクティビティログの取得

AdminReports.Activities.list()メソッドを使用して、MDM監査ログを取得します。applicationName'mobile'を指定することが重要です。

/**
 * 指定期間のGoogle Workspace MDM監査ログを取得し、整形して返します。
 * @param {Date} startDate 取得開始日
 * @param {Date} endDate 取得終了日
 * @returns {Array<Object>} 整形されたデバイスアクティビティの配列
 */
function getMdmAuditLogs(startDate, endDate) {
  const allDeviceActivities = [];
  let pageToken = null;

  do {
    const response = AdminReports.Activities.list('all', {
      applicationName: 'mobile',
      maxResults: 1000, // 1ページあたりの最大取得件数
      startTime: startDate.toISOString(),
      endTime: endDate.toISOString(),
      pageToken: pageToken
    });

    if (response.items) {
      response.items.forEach(activity => {
        // デバイス関連のイベントのみを抽出
        if (activity.events) {
          activity.events.forEach(event => {
            // 特に重要なのは、デバイスのステータス変更やポリシー準拠に関するイベント
            // 必要に応じてイベント名でフィルタリングする
            const commonParameters = {
              time: new Date(activity.id.time).toLocaleString(),
              email: activity.actor.email,
              eventName: event.name,
              // イベントの詳細情報からデバイスIDやOSなどを抽出
              deviceId: event.parameters.find(p => p.name === 'device_id')?.value,
              deviceType: event.parameters.find(p => p.name === 'device_type')?.value,
              osVersion: event.parameters.find(p => p.name === 'os_version')?.value,
              deviceModel: event.parameters.find(p => p.name === 'device_model')?.value,
              // 'compliance_state'という直接的なパラメータはAdmin SDK Reports APIのmobileイベントには存在しません。
              // 準拠状態を判断するには、eventName(例: 'device_compromised')や他のデバイス情報から間接的に判断する必要があります。
              // その他のパラメータも必要に応じて追加
            };
            allDeviceActivities.push(commonParameters);
          });
        }
      });
    }
    pageToken = response.nextPageToken;
  } while (pageToken);

  return allDeviceActivities;
}

// 実行例(過去1週間のログを取得)
function testGetLogs() {
  const endDate = new Date();
  const startDate = new Date();
  startDate.setDate(endDate.getDate() - 7); // 7日前

  const logs = getMdmAuditLogs(startDate, endDate);
  Logger.log(logs.length + '件のMDMログを取得しました。');
  // 取得したログの最初の数件を確認
  logs.slice(0, 5).forEach(log => Logger.log(JSON.stringify(log)));
}

上記のコードでは、AdminReports.Activities.listを使って指定期間のモバイル関連ログを取得しています。'all'はドメイン内の全ユーザーを対象とすることを意味します。maxResultsで1ページあたりの取得件数を指定し、pageTokenを使って全てのログを網羅的に取得するようにしています。取得したログはJSON形式なので、activity.eventsから必要な情報を抽出・整形します。

実装:Spreadsheetへの集計とレポート生成

取得したログデータをGoogle Spreadsheetに書き込み、レポートとして可視化します。

/**
 * 取得したMDM監査ログをGoogle Spreadsheetに書き込みます。
 * @param {Array<Object>} logs 整形されたデバイスアクティビティの配列
 * @param {string} spreadsheetId 書き込み先のSpreadsheet ID
 * @param {string} sheetName 書き込み先のシート名
 */
function writeLogsToSpreadsheet(logs, spreadsheetId, sheetName) {
  const ss = SpreadsheetApp.openById(spreadsheetId);
  const sheet = ss.getSheetByName(sheetName);

  if (!sheet) {
    Logger.log('シート ' + sheetName + ' が見つかりません。');
    return;
  }

  // ヘッダー行を定義
  const headers = [
    '時刻', 'メールアドレス', 'イベント名', 'デバイスID', 'デバイスタイプ',
    'OSバージョン', 'デバイスモデル'
  ];

  // 既存のデータをクリアし、ヘッダーを書き込む
  sheet.clearContents();
  sheet.getRange(1, 1, 1, headers.length).setValues([headers]).setFontWeight('bold');

  // データ行を準備
  const data = logs.map(log => [
    log.time,
    log.email,
    log.eventName,
    log.deviceId,
    log.deviceType,
    log.osVersion,
    log.deviceModel
  ]);

  // データを行に書き込む
  if (data.length > 0) {
    sheet.getRange(2, 1, data.length, headers.length).setValues(data);
  }

  // スプレッドシートの書式設定(例:列幅の自動調整)
  sheet.autoResizeColumns(1, headers.length);
  Logger.log(data.length + '件のMDMログをSpreadsheetに書き込みました。');
}

// メインの処理を実行する関数
function generateMdmComplianceReport() {
  const spreadsheetId = 'YOUR_SPREADSHEET_ID_HERE'; // ★ご自身のSpreadsheet IDに置き換える
  const sheetName = 'MDMコンプライアンスレポート';

  // 取得期間を設定(例: 前月1日から末日まで)
  const today = new Date();
  const firstDayOfLastMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1);
  const lastDayOfLastMonth = new Date(today.getFullYear(), today.getMonth(), 0, 23, 59, 59); // 前月末日の23:59:59

  Logger.log(`ログ取得期間: ${firstDayOfLastMonth.toLocaleString()} - ${lastDayOfLastMonth.toLocaleString()}`);

  const logs = getMdmAuditLogs(firstDayOfLastMonth, lastDayOfLastMonth);
  writeLogsToSpreadsheet(logs, spreadsheetId, sheetName);
}

このコードでは、generateMdmComplianceReport関数がメインの処理を担います。getMdmAuditLogsで取得したデータをwriteLogsToSpreadsheet関数で指定のGoogle Spreadsheetに書き込みます。YOUR_SPREADSHEET_ID_HEREの部分は、実際に使用するGoogle SpreadsheetのIDに置き換えてください。

実装:定期実行の設定

GASのトリガー機能を使えば、generateMdmComplianceReport関数を自動で定期実行できます。

  1. GASエディタの左側サイドバーにある「トリガー」アイコン(時計のマーク)をクリックします。
  2. 右下の「トリガーを追加」ボタンをクリックします。
  3. 以下の設定を行います。
    • 実行する関数を選択: generateMdmComplianceReport
    • イベントのソースを選択: 時間主導型
    • 時間ベースのトリガーのタイプを選択: 月ベースのタイマー(例: 毎月1日の午前1時〜2時に実行)
    • 時間帯を選択: レポートが必要な頻度に合わせて調整します。

これにより、指定した間隔で自動的にMDM監査ログが取得され、Spreadsheetにコンプライアンスレポートが更新されます。

BigQuery連携:より高度な分析を求める場合

Google Workspace Enterprise Plusエディションを利用している場合、Admin SDK Reports APIのログを直接BigQueryにエクスポートする機能が提供されています。

Enterprise Plusエディションのメリット

Enterprise Plusエディションでは、Google Workspaceの監査ログ(Admin、Audit、Drive、Login、Mobileなどのログ)をBigQueryに自動的にストリーミングできます。これにより、以下のメリットが得られます。

  • 長期保存: BigQueryはペタバイト級のデータも扱えるため、長期的なログ保存と分析が容易になります。
  • 高度な分析: SQLクエリを使って、複雑な条件での集計や傾向分析が可能です。GASで実装するよりも、より柔軟でパワフルなデータ分析環境を構築できます。
  • ダッシュボード連携: BigQueryのデータをLooker Studio (旧 Google Data Studio) などと連携させ、リアルタイムに近いダッシュボードを作成できます。

BigQueryへのエクスポート設定は、Google Workspace管理コンソールの「レポート」>「監査と調査」>「BigQuery エクスポート」から行います。この方法を利用すれば、GASでのログ取得・整形処理は不要となり、BigQueryの持つ高い分析能力を最大限に活用できます。

運用の注意点とヒント

自動化されたレポートシステムを運用する上で、いくつかの注意点とヒントがあります。

APIレート制限への配慮

Admin SDK Reports APIには、1日あたりのAPIリクエスト数に制限があります。大規模な組織で大量のログを取得する場合、この制限に抵触する可能性があります。GASのスクリプトでは、Utilities.sleep()を使ってAPI呼び出しの間に短い待機時間を設ける、または取得期間を細かく分割して複数回に分けて実行するなどの対策を検討します。

レポートのカスタマイズと継続的な改善

今回紹介したレポートは基本的なものですが、組織のニーズに合わせてカスタマイズすることが可能です。 - 追加情報の統合: 例えば、Active Directoryや人事システムから取得した従業員情報をSpreadsheetに結合し、ユーザー部門ごとのコンプライアンス状況を分析するなど、より多角的なレポートを作成できます。 - 条件付き書式: Spreadsheetの条件付き書式を使って、非準拠デバイスの行を強調表示するなど、視覚的に分かりやすいレポートに改善できます。 - メール通知: 特定の条件(例: 非準拠デバイスが5台以上になった場合)を満たした場合に、GASから自動で情シス担当者へメール通知する機能を追加することも有効です。

レポートは一度作って終わりではなく、コンプライアンス要件の変化や組織のセキュリティ目標に合わせて、継続的に改善していく意識が重要です。

まとめ

Google Workspace MDMの監査ログは、デバイスコンプライアンスの現状を把握し、GDPRやSOC2といった規制対応の証跡として活用できる貴重な情報源です。本記事では、Google Apps Script (GAS) とAdmin SDK Reports APIを組み合わせることで、この監査ログからデバイスコンプライアンスレポートを自動生成する具体的な方法を解説しました。

この自動化により、情シス担当者は手動でのレポート作成業務から解放され、より戦略的なセキュリティ施策の検討や、異常検知への対応に時間を割けるようになります。MDMを導入しているものの、ログの活用やレポート作成に課題を感じている方は、ぜひ本記事の手順を参考に、自動レポートシステムの構築に挑戦してみてください。

コーポレートITのご相談はお気軽に

この記事で書いたような業務改善・自動化の設計から実装まで、DRASENASではコーポレートITの現場に寄り添った支援を行っています。 「まず相談だけ」でも大歓迎です。DRASENAS 公式サイトからお気軽にどうぞ。

CONTACT

御社の IT 部門、ここにあります。

「ITのことはあまりわからない」── そのような状態からで、まったく問題ございません。まずはお気軽にご相談ください。

一社ずつ、一から。