The Secure60 Google Workspace Connector is a lightweight container that collects Google Workspace audit and authentication logs and sends them to Secure60 — either to your Secure60 Collector or directly to the Secure60 ingest endpoint. You deploy it in your own environment, and your Google credentials stay with you: the service-account key and configuration live in local files and are never stored by Secure60.
It polls the Google Admin SDK Reports API — the same approach used by the major SIEM platforms — collecting one feed per Workspace application so you get login, admin, Drive, OAuth-token, SAML, groups and more:
| Telemetry | Google source | Notes |
|---|---|---|
| User sign-ins (success / failure / challenge) | Reports API login |
Interactive and reauth logins |
| Admin console actions (user / group / role / setting changes) | Reports API admin |
User lifecycle, privilege and service changes |
| Drive activity (view, edit, download, sharing) | Reports API drive |
File access and permission changes |
| OAuth / third-party app grants | Reports API token |
Which apps users authorize, and the scopes granted |
| SAML app sign-ins | Reports API saml |
Federated logins to connected apps |
| Groups, mobile, context-aware access, rules, access transparency | Reports API | Additional security-relevant feeds |
The default set of Reports applications is the security-relevant core: login,
admin, drive, token, saml, groups, user_accounts, mobile,
context_aware_access, rules, access_transparency. You can change the list, and
any application your admin can’t read is skipped automatically.
OAuth / third-party-app visibility. The token feed shows every app a user
authorizes (for example Claude or Slack) as operation=oauth-authorize, with the
app in the auth_application field and the requested scopes in event_param_scope_*.
That lets you inventory connected apps and spot risky grants (drive, gmail.*)
versus identity-only ones (userinfo.email, openid).
The connector is deliberately minimal, on two separate surfaces:
https://www.googleapis.com/auth/admin.reports.audit.readonly grants read-only
access to audit activity reports only — login, admin, Drive, token and SAML audit
events. It cannot read email, cannot read Drive file contents, cannot
see user data, and cannot change anything. It is the narrowest audit scope
Google offers.A guided setup tool runs inside the connector image, so there is nothing to install locally — no Google Cloud SDK, no Python. From the folder where you’ll run the connector:
docker run --rm -it -v "$PWD:/work" -w /work \
secure60/s60-google-connector:latest python /app/setup.py
It walks you through the browser steps, then does the rest for you:
.env-google-connector (it asks whether to send to the Secure60
ingest endpoint or to your Secure60 Collector).Prefer to do every step by hand? Follow the Manual Google Setup guide — the same Cloud Console and Admin console click-through, no tools required.
The guided tool writes .env-google-connector for you. It contains your delegated
admin, the key path, and one Secure60 destination — for example:
# The Workspace super-admin the connector reads audit logs as
DELEGATED_ADMIN_EMAIL=admin@yourdomain.com
# Path to the service-account key inside the container (mounted by compose)
GOOGLE_CREDENTIALS_PATH=/secrets/sa.json
# Secure60 destination — choose ONE:
# Send to the Secure60 ingest endpoint:
PROJECT_ID=301
TOKEN=your-secure60-ingest-token
# …or send to your Secure60 Collector instead (TLS cert not verified):
# S60_COLLECTOR_BASE=https://your-collector:443
That is a complete configuration — everything else has a sensible default. The distinct filename lets several connectors share one deploy folder.
Save this compose.yaml next to your .env-google-connector and sa.json:
services:
s60-google-connector:
image: "secure60/s60-google-connector:latest"
container_name: "s60-google-connector"
pull_policy: always
env_file:
- .env-google-connector
volumes:
# The service-account key (read-only); path matches GOOGLE_CREDENTIALS_PATH.
- ./sa.json:/secrets/sa.json:ro
- s60-google-state:/state
restart: always
volumes:
s60-google-state:
Then start it:
docker compose up -d
docker compose logs -f
You should see lines like Reports login: 3 records ... and
Forwarded 3 events -> ingest (HTTP 200). Events appear in your Secure60 project
within a few minutes.
A working configuration is the delegated admin plus one destination (the mounted
sa.json supplies the credential). Everything below is optional and shown with its
default.
| Variable | Description | Default |
|---|---|---|
DELEGATED_ADMIN_EMAIL |
Workspace super-admin the connector reads audit logs as | required |
GOOGLE_CREDENTIALS_PATH |
Service-account key path inside the container | /secrets/sa.json |
PROJECT_ID |
Secure60 project ID (ingest mode) | — |
TOKEN |
Secure60 ingest token (ingest mode) | — |
S60_COLLECTOR_BASE |
Secure60 Collector URL, e.g. https://…:443 (collector mode; TLS not verified) |
— |
S60_INGEST_BASE |
Secure60 ingest base URL | https://ingest.secure60.io |
WORKSPACE_APPLICATIONS |
Reports applications to collect (comma-separated) | security core |
POLLING_INTERVAL_MINUTES |
How often to poll | 5 |
INITIAL_LOOKBACK_MINUTES |
History to fetch on first run (capped to the API’s 180-day window) | 1440 |
LOOKBACK_OVERLAP_MINUTES |
Trailing re-scan to catch late feeds (OAuth token lags ~2h) | 180 |
HEARTBEAT_INTERVAL_MINUTES |
How often to emit a health heartbeat | 15 |
LOG_LEVEL |
INFO or DEBUG |
INFO |
The destination mode is inferred automatically: set PROJECT_ID + TOKEN for
ingest, or S60_COLLECTOR_BASE for your collector.
Events are sent as flat JSON aligned with the Secure60 CIM. Every event carries
vendor=google, product=google workspace, app_name=gworkspace,
technology_group=cloud, plus normalized fields and the original Google fields
(prefixed event_).
Common fields:
operation — the normalized activity, e.g. user-login, oauth-authorize,
data-access, user-modify, user-password-modify, user-permission-modify,
group-modify, admin-service-modify.outcome — success or failure.type — the entity the event targets: user (login/admin/groups), file
(Drive), application (OAuth token), endpoint (mobile). This drives entity
correlation across systems.user_name — the acting user (email).ip_src_address — the source IP address (geo-enriched on arrival).auth_application — on the token feed, the third-party app a user authorized
(for example Claude), so you can inventory and govern OAuth grants.source_type — gworkspace; the specific feed is in
event_id_applicationname (login, token, drive, …).timestamp — the time the activity occurred at the source.event_* — the full Google record, flattened. Each activity parameter becomes
a discrete field you can match on directly, for example
event_param_login_type or event_param_scope_0.Because the data is normalized to CIM, you can correlate Google Workspace activity with other sources and write Rules against these fields immediately.
admin.reports.audit.readonly; don’t add broader scopes to the same client.sa.json.
Watch for revoked delegation or a deleted key — both stop collection.secure60/s60-google-connector:1.0) for
reproducible deployments, and upgrade deliberately.operation=oauth-authorize | group by auth_application to track third-party apps
and flag high-risk scopes or newly-seen apps.For help deploying the Secure60 Google Workspace Connector, contact the integrations team at integrations@secure60.io.