Skip to main content

Google Security Command Center

Google's Security Command Center service provides visibility and insights into your Google Cloud environment. You can bring bucket, compute instance, firewall, and security data from Google Cloud into Brinqa to construct a unified view of your attack surface and enhance your ability to mitigate potential risks.

This document details the information you must provide for the connector to authenticate with Google Cloud and how to obtain that information from Google Cloud. See create a data integration for step-by-step instructions on setting up the integration.

Required connection settings

When setting up a data integration, select Security Command Center from the Connector drop-down. If you cannot find the connector in the drop-down, make sure that you have installed it first. You must provide the following information to authenticate Google Cloud with Brinqa:

  • Scope: The relative name of the root asset in your Google Cloud environment. Only the following formats are supported:

    • An organization number, e.g.: "organizations/123".

    • A project ID, e.g.: "projects/my-project-id".

    • A project number, e.g.: "projects/12345".

      note

      Providing an organization number enables collecting assets from all associated projects, including any new projects added after you have set up the integration. But the credentials you provide must have organization level permissions. Follow the rest of this document for instructions.

  • Credentials: The full content of the JSON file that contains your service account key.

Enable the Cloud Asset API

The Security Command Center connector requires that you enable the Cloud Asset API on the specified scope.

Create a custom role for Brinqa

Google Cloud uses service accounts to authenticate and authorize API calls, but you can only create service accounts within a project. For the Security Command Center connector to collect assets from multiple projects, you must grant the service account organization level permissions through a custom Identity and Access Management (IAM) role.

To create a custom role with organization level permissions, follow these steps:

  1. Log in to the Google Cloud Console.

  2. Select the organization where you want the connector to collect assets.

  3. In the Navigation menu, select IAM & Admin > Roles.

  4. Click Create Role.

  5. Enter a name and description for your role.

  6. Click Add Permissions and add the following read-only permissions required by the connector:

    • cloudasset.viewer

    • securitycenter.findingsViewer

  7. Click Create.

Create a service account and grant organization level permissions

Since the service account must have organization level permissions for the Security Command Center connector to collect assets from all the projects within the organization, Brinqa recommends that you create a service account specifically for the connector.

To create a service account and grant the appropriate permissions, follow these steps:

  1. Log in to the Google Cloud Console.

  2. Select the project where you want to create the service account.

  3. In the Navigation menu, select IAM & Admin > Service Accounts.

  4. Click Create Service Account.

  5. Enter a name and description for the service account.

  6. Skip the optional steps and click Done.

  7. View the service account details and save the email address for later use.

  8. Select the organization where you have created the custom role.

  9. In the Navigation menu, select IAM & Admin.

  10. Click Grant Access.

  11. Click New principals and paste in the email taken from the service account details page.

  12. Click Select a role and select the custom role created previously.

    gcp grant access

  13. Click Save.

Obtain your service account key

If you have completed the previous steps successfully, your service account should have the minimum permissions that the Security Command Center connector needs to collect assets from all the projects within your organization.

To obtain the service account key, follow these steps:

  1. Log in to the Google Cloud Console.

  2. Select your project where the service account resides.

  3. In the Navigation menu, select IAM & Admin > Service Accounts.

  4. Select the service account and click the Keys tab.

  5. Click Add Key > Create new key.

  6. Keep JSON as key type and click Create.

    The generated private key file is saved to your computer automatically.

Additional settings

The Security Command Center connector contains an additional option for specific configuration:

  • Page size: The maximum number of records to get per API request. The default setting is 1000. It is not recommended to go over 1000.

Types of data to retrieve

The Security Command Center connector can retrieve the following types of data from Google Cloud:

Table 1: Data retrieved from Google Cloud

Connector ObjectRequiredMaps to Data Model
AlertYesAlert
Alert DefinitionYesAlert Definition
BucketYesCloud Resource
Compute InstanceYesHost
FirewallYesCloud Resource
GKE ClusterYesCloud Resource
ProjectYesCloud Resource
Service AccountYesCloud Resource
ViolationYesViolation
Violation DefinitionYesViolation Definition
VulnerabilityYesVulnerability
Vulnerability DefinitionYesVulnerability Definition
info

For detailed steps on how to view the data retrieved from Google Cloud in the Brinqa Platform, see How to view your data.

Attribute mappings

Expand the sections below to view the mappings between the source and the Brinqa data model attributes.

Alert

Table 2: Alert attribute mappings

Source Field NameMaps to Attribute
categorytype
createTimesourceCreatedDate
eventTimeLocal variable
getResourceNametargets, Local variable
nameuid
SourceProperties.ActivationTriggerLocal variable
SourceProperties.ProjectIdprojects
SourceProperties.ResourcePathpath
Statestatus, sourceStatus, statusCategory
Alert Definition

Table 3: Alert Definition attribute mappings

Source Field NameMaps to Attribute
categoryuid, name
findingClassLocal variable
severityseverity, sourceSeverity, severityScore
SourceProperties.ExceptionInstructionsLocal variable
SourceProperties.Explanationdescription
SourceProperties.Recommendationrecommendation
SourceProperties.ScannerNameLocal variable
Bucket

Table 4: Bucket attribute mappings

Source Field NameMaps to Attribute
ACLLocal variable
ancestorsLocal variable
BILLINGLocal variable
DEFAULT_OBJECT_ACLLocal variable
ENCRYPTIONLocal variable
ETAGtags, Local variable
iamConfiguration.bucketPolicyOnlyLocal variable
iamConfiguration.publicAccessPreventionLocal variable
iamConfiguration.uniformBucketLevelAccessLocal variable
KINDcategories
LABELStags, Local variable
LAST_MODIFIEDsourceLastModified
LIFESTYLELocal variable
LOCATIONlocation
LOCATION_TYPELocal variable
LOGGINGLocal variable
NAMEname
OWNERLocal variable
RETENTION_POLICYLocal variable
STORAGE_CLASSLocal variable
SYS_IDuid
timeCreatedfirstSeen
VERSIONINGLocal variable
versioncurrentVersion
WEBSITEreferences, name
ZONE_AFFINITYLocal variable
Compute Instance

Table 5: Compute Instance attribute mappings

Source Field NameMaps to Attribute
ancestorsLocal variable
assetTypecategories
AUTO_RESTARTLocal variable
CAN_IP_FORWARDLocal variable
confidentialInstanceConfigLocal variable
consumeReservationTypeLocal variable
CPU_PLATFORMLocal variable
creationTimestampfirstSeen
DELETE_PROTECTIONLocal variable
deletionProtectionLocal variable
DESCRIPTIONdescription
disksLocal variable
enableDisplayLocal variable
enableIntegrityMonitoringLocal variable
enableSecureBootLocal variable
enableVtpmLocal variable
INSTANCE_IDinstanceId
lastStartTimestampLocal variable
lastStopTimestampLocal variable
MACHINE_TYPELocal variable
NAMEname
NAT_IPLocal variable
networkInterfaces.fingerprintLocal variable
networkInterfaces.stackTypeLocal variable
NETWORKLocal variable
NETWORK_IPipAddresses, publicIpAddresses, privateIpAddresses
NETWORK_TAGStags, Local variable
NETWORK_TIERLocal variable
onHostMaintenanceLocal variable
PREEMPTIBLELocal variable
provisioningModelLocal variable
selfLinkurl
serviceAccounts.emailLocal variable
startRestrictedLocal variable
STATUSstatus, sourceStatus
SUBNETLocal variable
SYS_IDuid
versioncurrentVersion
ZONELocal variable
Firewall

Table 6: Firewall attribute mappings

Source Field NameMaps to Attribute
allowed.portsLocal variable
allowed.IPProtocolprotocol
ancestorsLocal variable
assetTypecategories
creationTimestampfirstSeen
DESCRIPTIONdescription
DISABLEDLocal variable
DIRECTIONLocal variable
LAST_MODIFIEDsourceLastModified
LOG_CONFIGLocal variable
NAMEname
NETWORKLocal variable
PRIORITYLocal variable
selfLinkurl
SOURCE_RANGESLocal variable
SYS_IDuid
targetTagstags
versioncurrentVersion
GKE Cluster

Table 7:GKE Cluster attribute mappings

Source Field NameMaps to Attribute
ancestorsLocal variable
assetTypecategories
clusterIpv4CidrLocal variable
createTimefirstSeen
currentMasterVersionLocal variable
currentNodeCountLocal variable
currentNodeVersionLocal variable
descriptiondescription
enableKubernetesAlphaLocal variable
enableTpuLocal variable
endpointLocal variable
etagtags
expireTimeLocal variable
id / nameuid
initialClusterVersionLocal variable
initialNodeCountLocal variable
instanceGroupUrlsLocal variable
labelFingerprintLocal variable
locationLocal variable
loggingServiceLocal variable
monitoringServiceLocal variable
namename
networkLocal variable
nodeIpv4CidrSizeLocal variable
satisfiesPziLocal variable
satisfiesPzsLocal variable
selflinkurl
servicesIpv4CidrLocal variable
statussourceStatus, status
statusMessageLocal variable
subnetworkLocal variable
update_timesourceLastModified
versionLocal variable
zoneLocal variable
Project

Table 8: Project attribute mappings

Source Field NameMaps to Attribute
ancestorsLocal variable
assetTypecategories
createTimefirstSeen
data.nameLocal variable
labelstags
lifecycleStatestatus
parent.idLocal variable
parent.typeLocal variable
projectIdLocal variable
projectNumberuid, name
updateTimesourceLastModified
versioncurrentVersion
Service Account

Table 9: Service Account attribute mappings

Source Field NameMaps to Attribute
ancestorsLocal variable
asset_typecategories
clientIDLocal variable
descriptiondescription
disabledLocal variable
displayNameLocal variable
emailLocal variable
etagtags, Local variable
id / nameuid
namename
projectIdLocal variable
uniqueIdLocal variable
update_timesourceLastModified
versioncurrentVersion
Violation

Table 10: Violation attribute mappings

Source Field NameMaps to Attribute
ACTIVATION_TRIGGERLocal variable
AFFECTED_ASSETtargets, Local variable
CATEGORYtype
CREATED_ATsourceCreatedDate
EVENT_TIMELocal variable
PROJECTprojects
RESOURCE_PATHpath
STATEstatus, sourceStatus, statusCategory
SYS_IDuid
Violation Definition

Table 11: Violation Definition attribute mappings

Source Field NameMaps to Attribute
CATEGORYuid
DESCRIPTIONdescription
EXCEPTION_INSTRUCTIONSLocal variable
REMEDIATIONrecommendation
SCANNER_NAMELocal variable
SEVERITYseverity, sourceSeverity, severityScore
TITLEname
Vulnerability

Table 12: Vulnerability attribute mappings

Source Field NameMaps to Attribute
Statestatus, sourceStatus, statusCategory
SourceProperties.ActivationTriggerLocal variable
SourceProperties.ProjectIdprojects
SourceProperties.ResourcePathpath
createTimesourceCreatedDate
cve.idcveIds, cveRecords, type, uid, name
eventTimeLocal variable
getResourceNametargets, Local variable
nameuid
Vulnerability Definition

Table 13: Vulnerability Definition attribute mappings

Source Field NameMaps to Attribute
categorycategories
cve.cvssv3.attack_vectorcvssV3Av
cve.cvssv3.base_scorecvssV3BaseScore
cve.cvssv3.confidentiality_impactcvssV3Ci
cve.cvssv3.integrity_impactcvssV3Ii
cve.idcveIds, cveRecords, type, uid, name
cve.references.urireferences
cve.upstream_fix_availablefixable
descriptionrecommendation
findingClassLocal variable
severityseverity, sourceSeverity, severityScore
SourceProperties.Descriptiondescription
note

Local variable indicates that the field is processed within a specific context, such as a particular workflow or calculation. Unlike other attributes, local variables aren't mapped to the unified data models. They only exist on the source data model.

Operation options

The Security Command Center connector supports the following operation options. See connector operation options for information about how to apply them.

Table 14: Security Command Center connector operation options

Connector ObjectOptionAll Possible valuesDescriptionExample
Alert,
Alert Definition, Violation,
Violation Definition,
Vulnerability,
Vulnerability Definition
findingClassFINDING_CLASS_UNSPECIFIED, MISCONFIGURATION, OBSERVATION, SCC_ERROR, THREAT, VULNERABILITYA comma-separated list of finding classes or categories. Retrieve findings based on the specified class, as determined by Google.Key: findingClass Value: SCC_ERROR,THREAT. This key and value combination only retrieves findings that are classified as SCC errors or threats.
severityUnspecified, Low, Medium, High, CriticalA comma-separated list of finding severities. Retrieve findings based on the specified severity, as determined by Google.Key: severity Value: High,Critical. This key and value combination only retrieves high and critical findings.
stateACTIVE, INACTIVERetrieve findings based on the specified state, as determined by Google.Key: state Value: ACTIVE. This key and value combination only retrieves active findings.
note

The option keys and values are case-sensitive as they are shown in this documentation.

APIs

The Security Command Center connector uses the Cloud Asset Inventory client libraries and Security Command Center API to interact with Google Security Command Center. Specifically, it uses the following client libraries:

Alert
SecurityCenterClient client = SecurityCenterClient.create();
ListFindingsRequest.Builder request =
ListFindingsRequest.newBuilder().setParent(sourceName.toString()).setFilter(filter);
// Call the API.
ListFindingsPagedResponse response = client.listFindings(request.build());
Alert Definition
SecurityCenterClient client = SecurityCenterClient.create();
ListFindingsRequest.Builder request =
ListFindingsRequest.newBuilder().setParent(sourceName.toString()).setFilter(filter);
// Call the API.
ListFindingsPagedResponse response = client.listFindings(request.build());
Bucket
AssetServiceClient client = createAssetServiceClient();
ListAssetsRequest.Builder bld = ListAssetsRequest.newBuilder()
.setParent(scope)
.setPageSize(pageSize)
.setContentType(ContentType.RESOURCE)
.addAssetTypes(assetType);
// Add asset type "storage.googleapis.com/Bucket" to filter
// Call listAssets API with assetType filter
ListAssetsPagedResponse response = client.listAssets(bld.build());
Compute Instance
AssetServiceClient client = createAssetServiceClient();
ListAssetsRequest.Builder bld = ListAssetsRequest.newBuilder()
.setParent(scope)
.setPageSize(pageSize)
.setContentType(ContentType.RESOURCE)
.addAssetTypes(assetType);
// Add asset type "compute.googleapis.com/Instance" to filter
// Call listAssets API with assetType filter
ListAssetsPagedResponse response = client.listAssets(bld.build());
Firewall
AssetServiceClient client = createAssetServiceClient();
ListAssetsRequest.Builder bld = ListAssetsRequest.newBuilder()
.setParent(scope)
.setPageSize(pageSize)
.setContentType(ContentType.RESOURCE)
.addAssetTypes(assetType);
// Add asset type "compute.googleapis.com/Firewall" to filter
// Call listAssets API with assetType filter
ListAssetsPagedResponse response = client.listAssets(bld.build());
GKE Cluster
AssetServiceClient client = createAssetServiceClient();
ListAssetsRequest.Builder bld = ListAssetsRequest.newBuilder()
.setParent(scope)
.setPageSize(pageSize)
.setContentType(ContentType.RESOURCE)
.addAssetTypes(assetType);
// add asset type "container.googleapis.com/Cluster" to filter
// Call listAssets API with assetType filter
ListAssetsPagedResponse response = client.listAssets(bld.build());
Project
AssetServiceClient client = createAssetServiceClient();
ListAssetsRequest.Builder bld = ListAssetsRequest.newBuilder()
.setParent(scope)
.setPageSize(pageSize)
.setContentType(ContentType.RESOURCE)
.addAssetTypes(assetType);
// add asset type "cloudresourcemanager.googleapis.com/Project" to filter
// Call listAssets API with assetType filter
ListAssetsPagedResponse response = client.listAssets(bld.build());
Service Account
AssetServiceClient client = createAssetServiceClient();
ListAssetsRequest.Builder bld = ListAssetsRequest.newBuilder()
.setParent(scope)
.setPageSize(pageSize)
.setContentType(ContentType.RESOURCE)
.addAssetTypes(assetType);
// add asset type "iam.googleapis.com/ServiceAccount" to filter
// Call listAssets API with assetType filter
ListAssetsPagedResponse response = client.listAssets(bld.build());
Violation
SecurityCenterClient client = SecurityCenterClient.create();
ListFindingsRequest.Builder request =
ListFindingsRequest.newBuilder().setParent(sourceName.toString()).setFilter(filter);
// Call the listFindings API.
ListFindingsPagedResponse response = client.listFindings(request.build());
Violation Definition
SecurityCenterClient client = SecurityCenterClient.create();
GroupFindingsRequest.Builder bld =
GroupFindingsRequest.newBuilder().setParent(sourceName.toString()).setGroupBy("category").setPageSize(1000);
// Call the GroupFinding API.
GroupFindingsPagedResponse response = client.groupFindings(bld.build());
// Categories are listed from GroupFindingsPagedResponse.
// Then set category as filter on listFindings API
ListFindingsPagedResponse response = client.listFindings(request.build());
Vulnerability
SecurityCenterClient client = SecurityCenterClient.create();
ListFindingsRequest.Builder request =
ListFindingsRequest.newBuilder().setParent(sourceName.toString()).setFilter(filter);
// Call the API.
ListFindingsPagedResponse response = client.listFindings(request.build());
Vulnerability Definition
SecurityCenterClient client = SecurityCenterClient.create();
ListFindingsRequest.Builder request =
ListFindingsRequest.newBuilder().setParent(sourceName.toString()).setFilter(filter);
// Call the API.
ListFindingsPagedResponse response = client.listFindings(request.build());

Changelog

The Security Command Center connector has undergone the following changes:

Table 15: Security Command Center connector changelog

VersionDescription
3.2.1- The connector now retrieves the following objects from Google: Alert, Alert Definition, GKE Cluster, Project, Service Account, Vulnerability, and Vulnerability Definition.

- Renamed the Finding and Finding Definition objects to Violation and Violation Definition to more accurately reflect the type of misconfiguration and policy violations being ingested.

- Findings classified as vulnerabilities now consolidate to the Vulnerability and Vulnerability Definition data models and all other categories consolidate to Violation and Violation Definition.

- Added the FINDING_CLASS attribute to Violation and Violation Definition objects.

- Added a new operation option for filtering by finding class: findingClass.

- Updated the logic to use a more precise UID generation method to prevent duplicates.

- Fixed attribute mappings for severity fields, including Severity, Severity Score, and Source Severity.

- Added the TAGS attribute to Bucket and Compute Instance objects by combining data from the tags and labels fields.
3.2.0Code clean up and general maintenance.
3.1.3No change.
3.1.2No change.
3.1.1Added the CVE_IDS and CVE_RECORDS attributes to the Finding object to retrieve CVE information.
3.1.0Initial Integration+ release.