# Google Workspace Logs

## Overview

Panther can fetch [Google Workspace](https://workspace.google.com/) (known formerly as G Suite) log events by querying the [Google Workspace Reports API](https://developers.google.com/admin-sdk/reports/v1/get-start/getting-started). Panther will query the Reports API for new events every 60 seconds.

<details>

<summary>Google Workspace applications Panther pulls logs for</summary>

Panther pulls Google Workspace logs for the following applications:

* Access Transparency
* Admin
* Calendar
* Chat
* Chrome
* Classroom
* Context-Aware Access
* Data Studio (Looker Studio)
* Drive
* GCP
* Gemini for Workspace
* Gmail
* Groups
* Groups Enterprise
* Keep
* Login
* Meet
* Mobile
* Rules
* SAML
* Token
* User Accounts
* Vault

</details>

## How to onboard Google Workspace logs to Panther

In order for Panther to access the Google Workspace Reports API, you need to create and configure a Google Cloud app, and provide its credentials to Panther.

### Prerequisites

To complete the steps below, your Google user must:

* Be authorized to read your organization's activity records
  * If your user does not have this privilege, follow [these Google Workspace instructions](https://support.google.com/a/answer/2406043) to create a new role with Reports access and assign the role to your user.
* (If you plan to enable pulling [Google Workspace user profiles](https://docs.panther.com/enrichment/google-workspace)) have read user privileges

### Step 1: Create a new Google Workspace source in Panther

1. In the left sidebar menu of the Panther Console, click **Configure** > **Log** **Sources**.
2. Click **Create New.**
3. Search for “Google Workspace,” then click its tile.
4. On the slide-out panel, click **Start Setup**.
5. On the **Configuration** page, configure the following field:
   * **Name**: Enter a descriptive name for the source e.g., `My Google Workspace logs`.
6. Click **Setup.**

### Step 2: Create and configure a Google Cloud app

Before setting up a Google Cloud app, you'll need to choose an authentication method. You can use a [Service Account](https://cloud.google.com/iam/docs/service-account-overview), [Workload Identity Federation](https://docs.cloud.google.com/iam/docs/workload-identity-federation), or [OAuth](https://developers.google.com/identity/protocols/oauth2) —see the top-level tabs below.

{% tabs %}
{% tab title="Service account" %}

1. Create a new app in Google Cloud:
   1. Log in to your [Google Cloud console](https://console.developers.google.com/project).
   2. Click **+ Create project.**\
      ![In Google Cloud console, the "+Create Project" button appears at the top of the page under the search bar. In this image, there is a teal circle around it.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-c43fb53088f6c69eaeb43ab5f82a55412b9c0c6e%2FScreenshot%202023-04-05%20at%202.50.53%20PM.png?alt=media)
   3. Enter a descriptive **Project name** (e.g. `Panther Integration`) and choose a **Location**.
   4. Click **Create**.
      * It will take a few seconds to create the project. Once created, you will see a notification on the page.
   5. On the left sidebar menu, click the three lines icon, then **Cloud Overview** > **Dashboard**.
   6. If the project you just created is not already selected in the dropdown at the top of the page, open the dropdown and select it.\
      ![At the top of the Google Cloud dashboard, there is a dropdown. "Panther integration test" has been selected, and the select box is circled.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-8c0192e4432c6082484eff972a2c724ced5bec94%2FScreenshot%202023-04-05%20at%202.59.39%20PM.png?alt=media)
2. Enable the Admin SDK API:
   1. In the search bar, enter"Admin SDK API," and select **Admin SDK API**.
   2. On the **Admin SDK API** page, click **Enable.**\
      ![In the Google Cloud console, an Admin SDK API page is shown. An Enable button is circled.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-1a3d03a30efc5e03d47b2e8b00bcc3b3cdbe4d00%2FScreenshot%202023-04-05%20at%203.48.52%20PM.png?alt=media)
      * You will be redirected to a new screen.
3. [Create a new Google Cloud service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts).
4. [Generate a JSON key file](https://cloud.google.com/iam/docs/creating-managing-service-account-keys) for the service account:

   1. In the **IAM & Admin** section, click **Service Accounts**.
   2. On the row of the service account you just created, click **Actions**, then **Manage keys**.

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FkEfZK1xrEkYnuckIw3Lo%2FScreenshot%202026-01-08%20at%2017.22.04.png?alt=media&#x26;token=fde3fcc5-49ce-4095-b8ad-116f87a956e4" alt="" width="563"><figcaption></figcaption></figure>
   3. Click **Add Key** > **Create new key**.

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FSHI7n45AVqrT0TvJpJkC%2FScreenshot%202026-01-08%20at%2017.26.37.png?alt=media&#x26;token=ce43b103-3dd2-451e-9134-eda801feb162" alt="" width="563"><figcaption></figcaption></figure>
   4. Under **Key type**, select **JSON**, then click **Create**.&#x20;
      * A JSON file will be downloaded.

   <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Keep this file in a safe place—it contains the credentials for this service account.</p></div>
5. Enable Domain-wide delegation:
   1. On the row of the service account you just created, click **Actions**, then **Manage details**.

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2F91Ubj8mbgiXRtJYbbgoJ%2FScreenshot%202026-01-12%20at%2013.20.13.png?alt=media&#x26;token=9f9ae7c5-a393-4025-83db-a9ac47fd8f6f" alt="" width="563"><figcaption></figcaption></figure>
   2. Click **Advanced settings**, then copy the **Client ID**.<br>

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FpRxq10wVMZGIoRwysNSs%2Fimage.png?alt=media&#x26;token=d5026e4c-f8d0-4820-82bd-d4546f283018" alt="" width="563"><figcaption></figcaption></figure>
   3. Click **View Google Workspace Admin Console**.
   4. Sign in with an Administrator account.
   5. Click **Security** → **Access and data control** → **API controls**.
   6. Click **Manage Domain-wide delegations**.
   7. Click **Add new**.\
      ![](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2F0iobNGp1aRMdvXsQz459%2Fimage.png?alt=media\&token=83e3cf5a-32a1-4e01-8d5b-b776a3c5e3fd)
   8. Fill in the fields:
      1. **Client ID**: enter the Client ID you copied above.
      2. **OAuth scopes** (comma-separated, no spaces): enter `https://www.googleapis.com/auth/admin.reports.audit.readonly`
         * (Optional) If user profiles are desired, also enter (separated by a comma) `https://www.googleapis.com/auth/admin.directory.user.readonly`
   9. Click **Authorize**.
6. Choose the **Google Admin user** to impersonate when retrieving data. You have two options :
   * Use a SuperAdmin account: This is simpler to set up but grants broader permissions than strictly necessary.
   * Follow the principle of least privilege (recommended): Create and use a dedicated Google Workspace user with only the required permissions
     1. [Create a custom admin role in Google Workspace with minimal permissions](https://support.google.com/a/answer/9807615?hl=en).
     2. Grant the minimum required permissions to the role:
        1. Required: Reports → Audit/Usage read access

           <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FmCYWAsfyJCe2pjB8B3Q7%2FScreenshot%202026-02-09%20at%2014.59.27.png?alt=media&#x26;token=0e7b8d43-5c2a-4242-93be-c40b7c041191" alt="" width="188"><figcaption></figcaption></figure></div>
        2. Optional: Directory → Users read access (if using user profiles)

           <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fjhsx1wTL7sq5ydcbMlXk%2FScreenshot%202026-02-09%20at%2014.59.40.png?alt=media&#x26;token=e2761642-4344-4dac-8cb4-acb12d597bc8" alt="" width="188"><figcaption></figcaption></figure></div>
        3. Optional: Vault → Google Vault Access All Logs

           <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FQ1miXFTpQGOYItBYmTcC%2FScreenshot%202026-02-09%20at%2014.59.48.png?alt=media&#x26;token=389adb0e-f670-48c4-9a40-3aff7c04b92f" alt="" width="188"><figcaption></figcaption></figure></div>
     3. Assign this custom role to a dedicated Google Workspace user.
7. Finish the source setup in Panther:
   1. Under **Provide pulling configuration & JSON Keyfile,** upload your JSON key file.\
      ![](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FqZWHBbMYSm37NrI8UhOm%2Fimage.png?alt=media\&token=12395709-2dcf-4fc8-8b3d-fec36bbe303d)
   2. In the **Admin User Email** field, enter the email address of the **Google Admin user** that the service account will impersonate (chosen in previous step).

      <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FU84CRIokhqLQQmCDnPzQ%2FScreenshot%202026-02-02%20at%2016.48.21.png?alt=media&#x26;token=8035819b-be78-4904-8729-34a3ad22a5e3" alt="" width="375"><figcaption></figcaption></figure></div>
   3. On the **Enrichment** page, if you would like to enable [Google Workspace User Profiles](https://docs.panther.com/enrichment/google-workspace), to the right of **User Profiles**, click the toggle `ON`.
      * Note the [prerequisites for enabling Google Workspace profiles](https://docs.panther.com/enrichment/google-workspace#prerequisites-for-google-workspace-user-profiles).
      * If you toggled **User Profiles** `ON`, also set a **Refresh period (min)**. This represents the cadence at which Panther will update profile data with what is stored in Google Workspace.\
        ![](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fnf7ZW3JOwKJMymgkqmX1%2Fimage.png?alt=media\&token=6fd5601f-a262-43ec-ab9e-f1f285fd675c)
   4. Click **Setup**. You will be directed to a success screen:

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-e55cedf82c6a6adc66ec5c14ebdcb164c3b1dcca%2FScreenshot%202023-08-03%20at%204.33.30%20PM.png?alt=media" alt="The success screen reads, &#x22;Everything looks good! Panther will now automatically pull &#x26; process logs from your account&#x22;" width="281"><figcaption></figcaption></figure>

      * You can optionally enable one or more [Detection Packs](https://docs.panther.com/detections/panther-managed/packs).
      * If you have not done so already, click **Attach or Infer Schemas** to attach one or more schemas to the source.
      * The **Trigger an alert when no events are processed** setting defaults to **YES**. We recommend leaving this enabled, as you will be alerted if data stops flowing from the log source after a certain period of time. The timeframe is configurable, with a default of 24 hours.
        {% endtab %}

{% tab title="Workload Identity Federation" %}

1. Create a new app in Google Cloud:
   1. Log in to your [Google Cloud console](https://console.developers.google.com/project).
   2. Click **+ Create project.**\
      ![In Google Cloud console, the "+Create Project" button appears at the top of the page under the search bar. In this image, there is a teal circle around it.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-c43fb53088f6c69eaeb43ab5f82a55412b9c0c6e%2FScreenshot%202023-04-05%20at%202.50.53%20PM.png?alt=media)
   3. Enter a descriptive **Project name** (e.g. `Panther Integration`) and choose a **Location**.
   4. Click **Create**.
      * It will take a few seconds to create the project. Once created, you will see a notification on the page.
   5. On the left sidebar menu, click the three lines icon, then **Cloud Overview** > **Dashboard**.
   6. If the project you just created is not already selected in the dropdown at the top of the page, open the dropdown and select it.\
      ![At the top of the Google Cloud dashboard, there is a dropdown. "Panther integration test" has been selected, and the select box is circled.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-8c0192e4432c6082484eff972a2c724ced5bec94%2FScreenshot%202023-04-05%20at%202.59.39%20PM.png?alt=media)
2. Enable the Admin SDK API:
   1. In the search bar, enter "Admin SDK API," and select **Admin SDK API**.
   2. On the **Admin SDK API** page, click **Enable.**\
      ![In the Google Cloud console, an Admin SDK API page is shown. An Enable button is circled.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-1a3d03a30efc5e03d47b2e8b00bcc3b3cdbe4d00%2FScreenshot%202023-04-05%20at%203.48.52%20PM.png?alt=media)
      * You will be redirected to a new screen.
3. [Create a new Google Cloud service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts).
   1. On the row of the service account you just created, note down the **Email**. You will need this in the next steps.
4. Configure Workload Identity Federation with AWS by following the [Configure Workload Identity Federation with AWS or Azure](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds) documentation.
   1. As you are [defining an attribute mapping(s) and condition](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#mappings-and-conditions), take note of the following examples:

      * Example [attribute mappings](https://cloud.google.com/iam/docs/workload-identity-federation#mapping):

        <table><thead><tr><th width="195.8271484375">Google</th><th width="523.1220703125">AWS</th></tr></thead><tbody><tr><td><code>google.subject</code></td><td><code>assertion.arn.extract('arn:aws:sts::{account_id}:')+":"+assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')</code></td></tr><tr><td><code>attribute.account</code></td><td><code>assertion.account</code></td></tr></tbody></table>
      * Example [attribute condition](https://cloud.google.com/iam/docs/workload-identity-federation#conditions):\
        `attribute.account=="<PANTHER_AWS_ACCOUNT_ID>"`

      <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p>The value of the <code>google.subject</code> attribute <a href="https://cloud.google.com/iam/docs/workload-identity-federation#mapping">cannot exceed 127 characters</a>. You may use <a href="https://cloud.google.com/iam/docs/workload-identity-federation#mapping">Common Expression Language (CEL) expressions</a> to transform or combine attributes from the token issued by AWS. The expression suggested in the table above takes this limit into account, and is an attempt at transforming the ARN into a value that uniquely identifies Panther entities. For more information on the AWS attributes, see "Example 2 - Called by user created with AssumeRole" on <a href="https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html">this AWS documentation page</a>.</p></div>
   2. When you are [adding a provider to your identity pool](https://cloud.google.com/iam/docs/workload-identity-federation-with-other-clouds#aws), select **AWS**.
   3. Go to  **IAM & Admin** → **Workload Identity Federation.**
      1. Click the display name of the Workload Identity Pool you just created.
      2. Note down the **IAM principal** shown on this page. You'll need it in the next steps.
5. Grant IAM Permissions

   1. Go to **IAM & Admin** → **Service Accounts**
   2. On the row of the service account you just created, click on the **Email**
   3. Go to “**Principals with access**” tab
   4. Click “**Grant access**”

      <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FfXhgQ4UnKRiukmK40oGC%2FScreenshot%202026-01-23%20at%2011.18.09.png?alt=media&#x26;token=0c856430-d077-4f03-9692-261fc6e1a110" alt="" width="563"><figcaption></figcaption></figure></div>
   5. In “New principals” field, you must add **two entries**.
      1. First principal: the Workload Identity principal
         1. The IAM principal you copied earlier will look similar to this:

            <pre class="language-bash" data-overflow="wrap"><code class="lang-bash">principal://iam.googleapis.com/projects/&#x3C;PROJECT_NUMBER>/locations/global/workloadIdentityPools/&#x3C;POOL_ID>/subject/SUBJECT_ATTRIBUTE_VALUE
            </code></pre>
         2. **Modify** this value by:
            * Replacing `principal://` with `principalSet://`
            * Removing everything starting from /subject/
            * Replacing it with /\*
         3. After the change, **it should look like this:**

            <pre class="language-bash" data-overflow="wrap"><code class="lang-bash">principalSet://iam.googleapis.com/projects/&#x3C;PROJECT_NUMBER>/locations/global/workloadIdentityPools/&#x3C;POOL_ID>/*
            </code></pre>
         4. Paste this modified value into the **New principals** field.
      2. Second principal: the service account email
         1. Paste the **service account email** address you noted in an earlier step.
            1. Example format:

               <pre class="language-bash" data-overflow="wrap"><code class="lang-bash">my-service-account@my-project.iam.gserviceaccount.com
               </code></pre>
      3. Ensure **both entries** are present.
   6. In the "Assign roles" field, select `Service Account Token Creator` role

   <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FoTl4MvBke2cf4PbZdA0z%2FScreenshot%202026-03-24%20at%2012.08.24.png?alt=media&#x26;token=e0aab669-0e65-48e7-aa90-e66893883245" alt="" width="563"><figcaption></figcaption></figure>

   1. Click on “**Save**”
6. [Download the credentials configuration file](https://docs.cloud.google.com/iam/docs/workload-download-cred-and-grant-access#download-configuration), which will be used in Panther to authenticate to the Google Workspace logs API.
7. Enable Domain-wide delegation:
   1. Go to **IAM & Admin** → **Service Accounts**
   2. On the row of the service account you just created, click **Actions**, then **Manage details**.

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2F91Ubj8mbgiXRtJYbbgoJ%2FScreenshot%202026-01-12%20at%2013.20.13.png?alt=media&#x26;token=9f9ae7c5-a393-4025-83db-a9ac47fd8f6f" alt="" width="563"><figcaption></figcaption></figure>
   3. Click **Advanced settings**, then copy the **Client ID**.<br>

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FpRxq10wVMZGIoRwysNSs%2Fimage.png?alt=media&#x26;token=d5026e4c-f8d0-4820-82bd-d4546f283018" alt="" width="563"><figcaption></figcaption></figure>
   4. Click **View Google Workspace Admin Console**.
   5. Sign in with an Administrator account.
   6. Click **Security** → **Access and data control** → **API controls**.
   7. Click **Manage Domain-wide delegations**.
   8. Click **Add new**.\
      ![](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2F0iobNGp1aRMdvXsQz459%2Fimage.png?alt=media\&token=83e3cf5a-32a1-4e01-8d5b-b776a3c5e3fd)
   9. Fill in the fields:
      1. **Client ID**: enter the Client ID you copied above.
      2. **OAuth scopes** (comma-separated, no spaces): enter `https://www.googleapis.com/auth/admin.reports.audit.readonly`
         * (Optional) If user profiles are desired, also enter (separated by a comma) `https://www.googleapis.com/auth/admin.directory.user.readonly`
   10. Click **Authorize**.
8. Select the Google admin user account that the service account will impersonate when retrieving data. See [Why is an admin user email required for impersonation?](https://help.panther.com/articles/6633569239-why-does-setting-up-google-workspace-with-workload-identity-federation-in-panther-require-an-admin-user-email-for-impersonation?lang=en) for more information.\
   You have two options:
   * Use a SuperAdmin account: This is simpler to set up but grants broader permissions than strictly necessary.
   * Follow the principle of least privilege (recommended): Create and use a dedicated Google Workspace user with only the required permissions.
     1. [Create a custom admin role in Google Workspace with minimal permissions](https://support.google.com/a/answer/9807615?hl=en).
     2. Grant the minimum required permissions to the role:
        1. Required: Reports → Audit/Usage read access

           <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FmCYWAsfyJCe2pjB8B3Q7%2FScreenshot%202026-02-09%20at%2014.59.27.png?alt=media&#x26;token=0e7b8d43-5c2a-4242-93be-c40b7c041191" alt="" width="188"><figcaption></figcaption></figure></div>
        2. Optional: Directory → Users read access (if using user profiles)

           <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fjhsx1wTL7sq5ydcbMlXk%2FScreenshot%202026-02-09%20at%2014.59.40.png?alt=media&#x26;token=e2761642-4344-4dac-8cb4-acb12d597bc8" alt="" width="188"><figcaption></figcaption></figure></div>
        3. Optional: Vault → Google Vault Access All Logs

           <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FQ1miXFTpQGOYItBYmTcC%2FScreenshot%202026-02-09%20at%2014.59.48.png?alt=media&#x26;token=389adb0e-f670-48c4-9a40-3aff7c04b92f" alt="" width="188"><figcaption></figcaption></figure></div>
     3. Assign this custom role to a dedicated Google Workspace user.
9. Finish the source setup in Panther:
   1. Under **Provide pulling configuration & Credential Configuration File,** upload your credential configuration file.

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FNVlONIhLgGW7xY5yArhC%2FScreenshot%202026-02-02%20at%2016.45.05.png?alt=media&#x26;token=209a96c6-c9f8-4f03-8ff8-4b1bf4de2ed4" alt=""><figcaption></figcaption></figure>
   2. In the **Admin User Email** field, enter the email address of the **Google Admin user** that the service account will impersonate (chosen in previous step).

      <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FT6FwFAOq7Mpr9M1iUlov%2FScreenshot%202026-02-02%20at%2016.45.58.png?alt=media&#x26;token=5d835434-07e9-446c-840e-5e869980c580" alt="" width="375"><figcaption></figcaption></figure></div>
   3. On the **Enrichment** page, if you would like to enable [Google Workspace User Profiles](https://docs.panther.com/enrichment/google-workspace), to the right of **User Profiles**, click the toggle `ON`.
      * Note the [prerequisites for enabling Google Workspace profiles](https://docs.panther.com/enrichment/google-workspace#prerequisites-for-google-workspace-user-profiles).
        * If you toggled **User Profiles** `ON`, also set a **Refresh period (min)**. This represents the cadence at which Panther will update profile data with what is stored in Google Workspace.\
          ![](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fnf7ZW3JOwKJMymgkqmX1%2Fimage.png?alt=media\&token=6fd5601f-a262-43ec-ab9e-f1f285fd675c)
   4. Click **Setup**. You will be directed to a success screen:

      <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-e55cedf82c6a6adc66ec5c14ebdcb164c3b1dcca%2FScreenshot%202023-08-03%20at%204.33.30%20PM.png?alt=media" alt="The success screen reads, &#x22;Everything looks good! Panther will now automatically pull &#x26; process logs from your account&#x22;" width="281"><figcaption></figcaption></figure>

      * You can optionally enable one or more [Detection Packs](https://docs.panther.com/detections/panther-managed/packs).
      * If you have not done so already, click **Attach or Infer Schemas** to attach one or more schemas to the source.
      * The **Trigger an alert when no events are processed** setting defaults to **YES**. We recommend leaving this enabled, as you will be alerted if data stops flowing from the log source after a certain period of time. The timeframe is configurable, with a default of 24 hours.
        {% endtab %}

{% tab title="OAuth" %}

1. On the **Credentials** page, copy the redirect URL and store it in a secure location. You will need this in the next steps.&#x20;

   <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FMbOnAqJt8HpUIMYz7WuQ%2FScreenshot%202026-02-02%20at%2016.50.55.png?alt=media&#x26;token=4a99b948-42a0-4a3c-bd2a-4754bbc7c646" alt="" width="375"><figcaption></figcaption></figure></div>
2. Create a new app in Google Cloud:
   1. Log in to your [Google Cloud console](https://console.developers.google.com/project).
   2. Click **+ Create project.**\
      ![In Google Cloud console, the "+Create Project" button appears at the top of the page under the search bar. In this image, there is a teal circle around it.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-c43fb53088f6c69eaeb43ab5f82a55412b9c0c6e%2FScreenshot%202023-04-05%20at%202.50.53%20PM.png?alt=media)
   3. Enter a descriptive **Project name** (e.g. `Panther Integration`) and choose a **Location**.
   4. Click **Create**.
      * It will take a few seconds to create the project. Once created, you will see a notification on the page.
   5. On the left sidebar menu, click the three lines icon, then **Cloud Overview** > **Dashboard**.
   6. If the project you just created is not already selected in the dropdown at the top of the page, open the dropdown and select it.\
      ![At the top of the Google Cloud dashboard, there is a dropdown. "Panther integration test" has been selected, and the select box is circled.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-8c0192e4432c6082484eff972a2c724ced5bec94%2FScreenshot%202023-04-05%20at%202.59.39%20PM.png?alt=media)
   7. In the top search bar, search for "OAuth consent screen," then select the matching result.\
      ![The search bar at the top of Google Cloud Console has the search term "oauth consent screen" typed in it. the first result, "OAuth consent screen," is circled](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-501ba2e3b4a36148483200083c4a07f52030a980%2FScreenshot%202023-04-05%20at%203.01.36%20PM.png?alt=media)
   8. On the **OAuth consent screen** page, click **Get Started**.
3. Configure your new Google Cloud app and enable Admin SDK API:
   1. On the **OAuth consent screen** > **Branding** page, fill in the following information:
      * **App name**: Enter your project name or project ID.
      * **User support email**: Select your email address.
      * **Audience:** Select `Internal`.
      * **Developer contact information**: Enter your email address.
      * Leave the other fields blank.
   2. Click **Save and continue**.
   3. On the **Data access** > **Scopes** page, click **Add or remove scopes**.
   4. In the **Manually add scopes** section, enter `https://www.googleapis.com/auth/admin.reports.audit.readonly`
      * (Optional) if user profiles are desired, also enter \
        `https://www.googleapis.com/auth/admin.directory.user.readonly`
   5. Click **Add to table** and **Update**.\
      ![In the Manually add scopes section of the Google Cloud page, a URL has been entered. There is an arrow pointing from the Add to table button to the Update button.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-0a0d67c8d083b30fcf4b2d19d561b565aed03ada%2FScreenshot%202023-04-05%20at%203.38.15%20PM.png?alt=media)
   6. Click **Save.**
   7. In the search bar, search for "Admin SDK API," and select **Admin SDK API**.
   8. On the **Admin SDK API** page, click **Enable.**\
      ![In the Google Cloud console, an Admin SDK API page is shown. An Enable button is circled.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-1a3d03a30efc5e03d47b2e8b00bcc3b3cdbe4d00%2FScreenshot%202023-04-05%20at%203.48.52%20PM.png?alt=media)
      * You will be redirected to a new screen.
4. Create OAuth credentials for your new Google Cloud app:
   1. In the lefthand navigation menu, click **Credentials.**
   2. At the top of the page, click **+Create Credentials**.
   3. Click **OAuth client ID.**\
      ![In Google Cloud console, the Credentials link in the left sidebar is highlighted. There is an arrow pointing from it to the "+ Create Credentials" link. There is an arrow pointing from "+ Create Credentials" to one of the dropdown options, "OAuth Client ID"](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-5631229c63ee45d456e44e07aaa6197a0b05b11b%2FScreenshot%202023-04-05%20at%203.55.26%20PM.png?alt=media)
      * You will be redirected to a different page.
   4. On the **Create OAuth client ID** page, in the **Application type** field, select **Web application** and type in a friendly **Name**, e.g., `Panther`.
   5. Scroll down to the **Authorized redirect URIs** section, and click **+ Add URI**.
   6. In the **URIs 1** field, paste the redirect URL you copied above, in Step 2.1. This is found in the Panther Console on the log source's **Set Credentials** page.\
      ![There is an "Authorized Redirect URIs" header. There is a field labeled "URIs 1". At the bottom, there is a blue "Create" button.](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-9804aeb66a2eace80ac0c055c07ae73bf6d630ff%2FScreenshot%202023-04-05%20at%204.06.12%20PM.png?alt=media)
   7. Click **Create**.
   8. A pop up modal will display a **Client ID** and **Client Secret**. Using a secure method, make note of the ClientID and Client Secret. You will need to provide them in the Panther Console to pull your reports.
5. Finish Google Workspace source setup in Panther:

   1. Open the browser window or tab where you began the [log source setup in the Panther Console earlier in this documentation](#step-1-create-a-new-google-workspace-source-in-panther).
   2. On the **Credentials** page, enter the **Client ID** and **Client Secret** provided in your Google Cloud console.

      <div align="left"><figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FAWdubJY1wvUWs8FJrOhl%2FScreenshot%202026-02-02%20at%2016.50.55.png?alt=media&#x26;token=a85c8e74-b732-4519-833e-4182c9f89b94" alt="" width="375"><figcaption></figcaption></figure></div>

      * If you did not save these values during the previous steps, you can find them in the Google Cloud console under **APIs & Services** > **Credentials** > **OAuth 2.0 Client IDs**.
   3. Click **Continue**.
   4. On the **Enrichment** page, if you would like to enable [Google Workspace User Profiles](https://docs.panther.com/enrichment/google-workspace), to the right of **User Profiles**, click the toggle `ON`.
      * Note the [prerequisites for enabling Google Workspace profiles](https://docs.panther.com/enrichment/google-workspace#prerequisites-for-google-workspace-user-profiles).
      * If you toggled **User Profiles** `ON`, also set a **Refresh period (min)**. This represents the cadence at which Panther will update profile data with what is stored in Google Workspace.\
        ![](https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2FFWBHXfuLcozI88Wakvih%2Fimage.png?alt=media\&token=30aa6322-2eeb-46d1-974d-1998380410f1)
   5. Click **Setup**.
   6. On the **Verification** page, click **Grant Access**.

      * This will prompt you to authorize the Google Workspace App you created earlier to pull Google Workspace logs from your account.
      * Click **Allow**.

      <div align="center" data-full-width="false"><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-e02149be8a526e6ff8e1c725336c90552aa2b453%2FScreenshot%202023-04-05%20at%204.16.56%20PM.png?alt=media" alt="A Google prompt is titled &#x22;Panther integration app wants to access your Google Account.&#x22; Below, it says, &#x22;This will allow Panther integration app to: View audit reports for your G Suite domain.&#x22; Below, there are Allow and Cancel buttons." width="188"></div>
   7. You will be directed back to the Panther Console, where you will see a success screen:

   <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-e55cedf82c6a6adc66ec5c14ebdcb164c3b1dcca%2FScreenshot%202023-08-03%20at%204.33.30%20PM.png?alt=media" alt="The success screen reads, &#x22;Everything looks good! Panther will now automatically pull &#x26; process logs from your account&#x22;" width="281"><figcaption></figcaption></figure>

   * You can optionally enable one or more [Detection Packs](https://docs.panther.com/detections/panther-managed/packs).
   * The **Trigger an alert when no events are processed** setting defaults to **YES**. We recommend leaving this enabled, as you will be alerted if data stops flowing from the log source after a certain period of time. The timeframe is configurable, with a default of 24 hours.

     <figure><img src="https://4011785613-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LgdiSWdyJcXPahGi9Rs-2910905616%2Fuploads%2Fgit-blob-c48119abd559990173004bde99ff4907fdd2ded2%2FScreenshot%202023-08-03%20at%204.26.54%20PM.png?alt=media" alt="The &#x22;Trigger an alert when no events are processed&#x22; toggle is set to YES. The &#x22;How long should Panther wait before it sends you an alert that no events have been processed&#x22; setting is set to 1 Day" width="320"><figcaption></figcaption></figure>

{% endtab %}
{% endtabs %}

## Panther-managed detections

See [Panther-managed](https://docs.panther.com/detections/panther-managed) rules for Google Workspace in the [panther-analysis GitHub repository](https://github.com/panther-labs/panther-analysis/tree/master/rules) (in directories prefixed with `gsuite_`).

## Supported log types

Panther pulls data from Google's [Reports Activities API](https://developers.google.com/admin-sdk/reports/reference/rest/v1/activities) which includes admin activity, login activity, token activity, Google Drive activity, and more.

This data gets stored as both [`GSuite.ActivityEvent`](#gsuite.activityevent) and [`GSuite.Reports`](#gsuite.reports) log types—while these two schemas contain the same data, it's recommended to use `Gsuite.ActivityEvent` because it flattens the events, making the fields easier to reference in queries and detections.

While both schemas capture the same data, they store it differently in the data lake. For example, `GSuite.Reports` may have a slightly smaller number of logs in the data lake because multiple events are wrapped in one payload. In `GSuite.ActivityEvent`, however, each event becomes a single event in Panther. More information about this behavior can be found in the Knowledge Base article: [What is the difference between the Panther log types GSuite.Reports and GSuite.ActivityEvent?](https://help.panther.com/articles/4763221133-what-is-the-difference-between-the-panther-log-types-gsuite-reports-and-gsuite-activityevent)

{% hint style="info" %}
While Google Workspace logs are stored in both the `GSuite.ActivityEvent` and `GSuite.Reports` tables in your data lake, the data is only counted once against your ingestion quota.
{% endhint %}

### GSuite.ActivityEvent

Contains the activity events for a specific account and application, such as the Admin console application or the Google Drive application.

Reference: [Google Workspace Documentation on Reports API Activities List.](https://developers.google.com/admin-sdk/reports/v1/reference/activities/list#response)

```yaml
fields:
    - name: id
      required: true
      description: Unique identifier for each activity record.
      type: object
      fields:
        - name: applicationName
          description: Application name to which the event belongs.
          type: string
        - name: customerId
          description: The unique identifier for a Google Workspace account.
          type: string
        - name: time
          description: Time of occurrence of the activity.
          type: timestamp
          timeFormat: rfc3339
          isEventTime: true
        - name: uniqueQualifier
          description: Unique qualifier if multiple events have the same time.
          type: string
    - name: actor
      description: User doing the action.
      type: object
      fields:
        - name: email
          description: The primary email address of the actor. May be absent if there is no email address associated with the actor.
          type: string
          indicators:
            - email
        - name: profileId
          description: The unique Google Workspace profile ID of the actor. May be absent if the actor is not a Google Workspace user.
          type: string
        - name: callerType
          description: The type of actor.
          type: string
        - name: key
          description: Only present when callerType is KEY. Can be the consumer_key of the requestor for OAuth 2LO API requests or an identifier for robot accounts.
          type: string
    - name: kind
      required: true
      description: The type of API resource. For an activity report, the value is reports#activities.
      type: string
    - name: ownerDomain
      description: This is the domain that is affected by the report's event. For example domain of Admin console or the Drive application's document owner.
      type: string
      indicators:
        - domain
    - name: ipAddress
      description: IP address of the user doing the action. This is the Internet Protocol (IP) address of the user when logging into Google Workspace which may or may not reflect the user's physical location. For example, the IP address can be the user's proxy server's address or a virtual private network (VPN) address. The API supports IPv4 and IPv6.
      type: string
      indicators:
        - ip
    - name: type
      description: Type of event. The Google Workspace service or feature that an administrator changes is identified in the type property which identifies an event using the eventName property. For a full list of the API's type categories, see the list of event names for various applications above in applicationName.
      type: string
    - name: name
      description: Name of the event. This is the specific name of the activity reported by the API. And each eventName is related to a specific Google Workspace service or feature which the API organizes into types of events.
      type: string
    - name: parameters
      description: Parameter value pairs for various applications. For more information about eventName parameters, see the list of event names for various applications above in applicationName.
      type: json
```

### GSuite.Reports

{% hint style="warning" %}
We recommend using [`GSuite.ActivityEvent`](#gsuite.activityevent) instead of `GSuite.Reports`. While both schemas contain the same data, the structure of `GSuite.ActivityEvent` is flatter, and therefore easier to reference in queries and detections.
{% endhint %}

Contains the activity events for a specific account and application, such as the Admin console application or the Google Drive application.

Reference: [Google Workspace Documentation on Reports API Activities List.](https://developers.google.com/admin-sdk/reports/v1/reference/activities/list#response)

<pre class="language-yaml"><code class="lang-yaml">schema: GSuite.Reports
description: 
<strong>referenceURL: https://developers.google.com/admin-sdk/reports/v1/reference/activities/list#response
</strong>fields:
    - name: id
      required: true
      description: Unique identifier for each activity record.
      type: object
      fields:
        - name: applicationName
          description: Application name to which the event belongs.
          type: string
        - name: customerId
          description: The unique identifier for a Google Workspace account.
          type: string
        - name: time
          description: Time of occurrence of the activity.
          type: timestamp
          timeFormat: rfc3339
          isEventTime: true
        - name: uniqueQualifier
          description: Unique qualifier if multiple events have the same time.
          type: string
    - name: actor
      description: User doing the action.
      type: object
      fields:
        - name: email
          description: The primary email address of the actor. May be absent if there is no email address associated with the actor.
          type: string
          indicators:
            - email
        - name: profileId
          description: The unique Google Workspace profile ID of the actor. May be absent if the actor is not a Google Workspace user.
          type: string
        - name: callerType
          description: The type of actor.
          type: string
        - name: key
          description: Only present when callerType is KEY. Can be the consumer_key of the requestor for OAuth 2LO API requests or an identifier for robot accounts.
          type: string
    - name: kind
      required: true
      description: The type of API resource. For an activity report, the value is reports#activities.
      type: string
    - name: ownerDomain
      description: This is the domain that is affected by the report's event. For example domain of Admin console or the Drive application's document owner.
      type: string
      indicators:
        - domain
    - name: ipAddress
      description: IP address of the user doing the action. This is the Internet Protocol (IP) address of the user when logging into Google Workspace which may or may not reflect the user's physical location. For example, the IP address can be the user's proxy server's address or a virtual private network (VPN) address. The API supports IPv4 and IPv6.
      type: string
      indicators:
        - ip
    - name: events
      description: Activity events in the report.
      type: array
      element:
        type: object
        fields:
            - name: type
              description: Type of event. The Google Workspace service or feature that an administrator changes is identified in the type property which identifies an event using the eventName property. For a full list of the API's type categories, see the list of event names for various applications above in applicationName.
              type: string
            - name: name
              description: Name of the event. This is the specific name of the activity reported by the API. And each eventName is related to a specific Google Workspace service or feature which the API organizes into types of events.
              type: string
            - name: parameters
              description: Parameter value pairs for various applications. For more information about eventName parameters, see the list of event names for various applications above in applicationName.
              type: array
              element:
                type: object
                fields:
                    - name: name
                      description: The name of the parameter.
                      type: string
                    - name: value
                      description: String value of the parameter.
                      type: string
                    - name: intValue
                      description: Integer value of the parameter.
                      type: bigint
                    - name: boolValue
                      description: Boolean value of the parameter.
                      type: boolean
                    - name: multiValue
                      description: String values of the parameter.
                      type: array
                      element:
                        type: string
                    - name: multiIntValue
                      description: Integer values of the parameter.
                      type: array
                      element:
                        type: bigint
                    - name: messageValue
                      description: 'Nested parameter value pairs associated with this parameter. Complex value type for a parameter are returned as a list of parameter values. For example, the address parameter may have a value as [{parameter: [{name: city, value: abc}]}]'
                      type: json
                    - name: multiMessageValue
                      description: List of messageValue objects.
                      type: array
                      element:
                        type: json
</code></pre>
