Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(securitycenter): Add Resource SCC Management API Org security ce… #3960

Merged
merged 8 commits into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';

// Retrieve a specific security center service by its name.
function main(organizationId, service, location = 'global') {
// [START securitycenter_get_security_center_service]
// Imports the Google Cloud client library.
const {SecurityCenterManagementClient} =
require('@google-cloud/securitycentermanagement').v1;

// Create a Security Center Management client
const client = new SecurityCenterManagementClient();

/*
* Required. Resource name of security center service
* Its format is
* `organizations/[organizationId]/locations/[location]/securityCenterServices/[service]`
* `folders/[folderId]/locations/[location]/securityCenterServices/[service]`
* `projects/[projectId]/locations/[location]/securityCenterServices/[service]`
*/
// TODO(developer): Update the following references for your own environment before running the sample.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
// const service = 'SERVICE';
// Replace SERVICE with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The TODO comment should be more specific. Instead of just saying "Update the following references", it should specify what the references are and how they should be updated. For example, it could say "Update the organization ID, location, and service name to match your environment."

Suggested change
// TODO(developer): Update the following references for your own environment before running the sample.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
// const service = 'SERVICE';
// Replace SERVICE with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner
// TODO(developer): Update the organization ID, location, and service name to match your environment.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
// const service = 'SERVICE';
// Replace SERVICE with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed

const name = `organizations/${organizationId}/locations/${location}/securityCenterServices/${service}`;

// Build the request.
const getSecurityCenterServiceRequest = {
name: name,
};

async function getSecurityCenterService() {
// Call the API.
const [response] = await client.getSecurityCenterService(
getSecurityCenterServiceRequest
);
console.log('Retrieved SecurityCenterService:', response.name);
}

getSecurityCenterService();
// [END securitycenter_get_security_center_service]
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Per the Google JavaScript Style Guide, prefer using a function expression or an arrow function over a function declaration. This makes it easier to reason about the code, as function expressions are not hoisted. Also, consider using template literals for string concatenation, as it makes the code more readable.

const main = (organizationId, service, location = 'global') => {
  // [START securitycenter_get_security_center_service]
  // Imports the Google Cloud client library.
  const {SecurityCenterManagementClient} =
    require('@google-cloud/securitycentermanagement').v1;

  // Create a Security Center Management client
  const client = new SecurityCenterManagementClient();

  /*
   * Required. Resource name of security center service
   *     Its format is
   *    `organizations/[organizationId]/locations/[location]/securityCenterServices/[service]`
   *    `folders/[folderId]/locations/[location]/securityCenterServices/[service]`
   *    `projects/[projectId]/locations/[location]/securityCenterServices/[service]`
   */
  // TODO(developer): Update the following references for your own environment before running the sample.
  // const organizationId = 'YOUR_ORGANIZATION_ID';
  // const location = 'LOCATION_ID';
  // const service = 'SERVICE';
  // Replace SERVICE with one of the valid values:
  // container-threat-detection, event-threat-detection, security-health-analytics,
  // vm-threat-detection, web-security-scanner
  const name = `organizations/${organizationId}/locations/${location}/securityCenterServices/${service}`;

  // Build the request.
  const getSecurityCenterServiceRequest = {
    name,
  };

  const getSecurityCenterService = async () => {
    // Call the API.
    const [response] = await client.getSecurityCenterService(
      getSecurityCenterServiceRequest
    );
    console.log(`Retrieved SecurityCenterService: ${response.name}`);
  };

  getSecurityCenterService();
  // [END securitycenter_get_security_center_service]
};


main(...process.argv.slice(2));
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';

// List all security center services for the given parent.
function main(organizationId, location = 'global') {
// [START securitycenter_list_security_center_service]
// Imports the Google Cloud client library.
const {SecurityCenterManagementClient} =
require('@google-cloud/securitycentermanagement').v1;

// Create a Security Center Management client
const client = new SecurityCenterManagementClient();

/**
* Required. The name of the parent resource. Its
* format is "organizations/[organizationId]/locations/[location]",
* "folders/[folderId]/locations/[location]", or
* "projects/[projectId]/locations/[location]".
*/
//TODO(developer): Update the following references for your own environment before running the sample.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The TODO comment should be more specific. Instead of just saying "Update the following references", it should specify what the references are and how they should be updated. For example, it could say "Update the organization ID and location to match your environment."

Suggested change
//TODO(developer): Update the following references for your own environment before running the sample.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
//TODO(developer): Update the organization ID and location to match your environment.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed

const parent = `organizations/${organizationId}/locations/${location}`;

// Build the request.
const listSecurityCenterServicesRequest = {
parent: parent,
};

async function listSecurityCenterServices() {
// Call the API.
const [services] = await client.listSecurityCenterServices(
listSecurityCenterServicesRequest
);
for (const service of services) {
console.log('Security Center Service Name:', service.name);
}
}

listSecurityCenterServices();
// [END securitycenter_list_security_center_service]
}

main(...process.argv.slice(2));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Per the Google JavaScript Style Guide, prefer using a function expression or an arrow function over a function declaration. This makes it easier to reason about the code, as function expressions are not hoisted. Also, consider using template literals for string concatenation, as it makes the code more readable.

const main = (organizationId, location = 'global') => {
  // [START securitycenter_list_security_center_service]
  // Imports the Google Cloud client library.
  const {SecurityCenterManagementClient} =
    require('@google-cloud/securitycentermanagement').v1;

  // Create a Security Center Management client
  const client = new SecurityCenterManagementClient();

  /**
   *  Required. The name of the parent resource. Its
   *  format is "organizations/[organizationId]/locations/[location]",
   *  "folders/[folderId]/locations/[location]", or
   *  "projects/[projectId]/locations/[location]".
   */
  //TODO(developer): Update the following references for your own environment before running the sample.
  // const organizationId = 'YOUR_ORGANIZATION_ID';
  // const location = 'LOCATION_ID';
  const parent = `organizations/${organizationId}/locations/${location}`;

  // Build the request.
  const listSecurityCenterServicesRequest = {
    parent,
  };

  const listSecurityCenterServices = async () => {
    // Call the API.
    const [services] = await client.listSecurityCenterServices(
      listSecurityCenterServicesRequest
    );
    for (const service of services) {
      console.log(`Security Center Service Name: ${service.name}`);
    }
  };

  listSecurityCenterServices();
  // [END securitycenter_list_security_center_service]
};

Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';

// Updates a security center service configuration.
function main(organizationId, service, location = 'global') {
// [START securitycenter_update_security_center_service]
// Imports the Google Cloud client library.
const {SecurityCenterManagementClient} =
require('@google-cloud/securitycentermanagement').v1;

// Create a Security Center Management client
const client = new SecurityCenterManagementClient();

/*
* Required. Resource name of security center service
* Its format is
* `organizations/[organizationId]/locations/[location]/securityCenterServices/[service]`
* `folders/[folderId]/locations/[location]/securityCenterServices/[service]`
* `projects/[projectId]/locations/[location]/securityCenterServices/[service]`
*/
// TODO(developer): Update the following references for your own environment before running the sample.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
// const service = 'SERVICE';
// Replace SERVICE with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The TODO comment should be more specific. Instead of just saying "Update the following references", it should specify what the references are and how they should be updated. For example, it could say "Update the organization ID, location, and service name to match your environment."

Suggested change
// TODO(developer): Update the following references for your own environment before running the sample.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
// const service = 'SERVICE';
// Replace SERVICE with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner
// TODO(developer): Update the organization ID, location, and service name to match your environment.
// const organizationId = 'YOUR_ORGANIZATION_ID';
// const location = 'LOCATION_ID';
// const service = 'SERVICE';
// Replace SERVICE with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed

const name = `organizations/${organizationId}/locations/${location}/securityCenterServices/${service}`;

// Define the security center service configuration, update the
// IntendedEnablementState accordingly.
const securityCenterService = {
name: name,
intendedEnablementState: 'ENABLED',
};

// Set the field mask to specify which properties should be updated.
const fieldMask = {
paths: ['intended_enablement_state'],
};

// Build the request.
const updateSecurityCenterServiceRequest = {
securityCenterService: securityCenterService,
updateMask: fieldMask,
};

async function updateSecurityCenterService() {
// Call the API.
const [response] = await client.updateSecurityCenterService(
updateSecurityCenterServiceRequest
);
console.log(
`Updated SecurityCenterService: ${response.name} with new enablement state: ${response.intendedEnablementState}`
);
}

updateSecurityCenterService();
// [END securitycenter_update_security_center_service]
}

main(...process.argv.slice(2));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Per the Google JavaScript Style Guide, prefer using a function expression or an arrow function over a function declaration. This makes it easier to reason about the code, as function expressions are not hoisted. Also, consider using template literals for string concatenation, as it makes the code more readable.

const main = (organizationId, service, location = 'global') => {
  // [START securitycenter_update_security_center_service]
  // Imports the Google Cloud client library.
  const {SecurityCenterManagementClient} =
    require('@google-cloud/securitycentermanagement').v1;

  // Create a Security Center Management client
  const client = new SecurityCenterManagementClient();

  /*
   * Required. Resource name of security center service
   *     Its format is
   *    `organizations/[organizationId]/locations/[location]/securityCenterServices/[service]`
   *    `folders/[folderId]/locations/[location]/securityCenterServices/[service]`
   *    `projects/[projectId]/locations/[location]/securityCenterServices/[service]`
   */
  // TODO(developer): Update the following references for your own environment before running the sample.
  // const organizationId = 'YOUR_ORGANIZATION_ID';
  // const location = 'LOCATION_ID';
  // const service = 'SERVICE';
  // Replace SERVICE with one of the valid values:
  // container-threat-detection, event-threat-detection, security-health-analytics,
  // vm-threat-detection, web-security-scanner
  const name = `organizations/${organizationId}/locations/${location}/securityCenterServices/${service}`;

  // Define the security center service configuration, update the
  // IntendedEnablementState accordingly.
  const securityCenterService = {
    name,
    intendedEnablementState: 'ENABLED',
  };

  // Set the field mask to specify which properties should be updated.
  const fieldMask = {
    paths: ['intended_enablement_state'],
  };

  // Build the request.
  const updateSecurityCenterServiceRequest = {
    securityCenterService,
    updateMask,
  };

  const updateSecurityCenterService = async () => {
    // Call the API.
    const [response] = await client.updateSecurityCenterService(
      updateSecurityCenterServiceRequest
    );
    console.log(
      `Updated SecurityCenterService: ${response.name} with new enablement state: ${response.intendedEnablementState}`
    );
  };

  updateSecurityCenterService();
  // [END securitycenter_update_security_center_service]
};

3 changes: 2 additions & 1 deletion security-center/snippets/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
"license": "Apache-2.0",
"dependencies": {
"@google-cloud/pubsub": "^4.0.0",
"@google-cloud/security-center": "^8.7.0"
"@google-cloud/security-center": "^8.7.0",
"@google-cloud/securitycentermanagement": "^0.5.0"
},
"devDependencies": {
"c8": "^10.0.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

const {assert} = require('chai');
const {execSync} = require('child_process');
const exec = cmd => execSync(cmd, {encoding: 'utf8'});
const {describe, it} = require('mocha');

// TODO(developer): update for your own environment
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The TODO comment should be more specific. Instead of just saying "update for your own environment", it should specify what needs to be updated and how. For example, it could say "Update the organization ID, location, and service name to match your testing environment."

Suggested change
// TODO(developer): update for your own environment
// TODO(developer): Update the organization ID, location, and service name to match your testing environment

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed

const organizationId = '1081635000895';
const location = 'global';

Check failure on line 24 in security-center/snippets/system-test/management_api/securityCenterService.test.js

View workflow job for this annotation

GitHub Actions / Node.js lint

'location' is assigned a value but never used

Check failure on line 24 in security-center/snippets/system-test/management_api/securityCenterService.test.js

View workflow job for this annotation

GitHub Actions / Node.js lint

'location' is assigned a value but never used

Check failure on line 24 in security-center/snippets/system-test/management_api/securityCenterService.test.js

View workflow job for this annotation

GitHub Actions / lint

'location' is assigned a value but never used
// Replace service with one of the valid values:
// container-threat-detection, event-threat-detection, security-health-analytics,
// vm-threat-detection, web-security-scanner
const service = 'event_threat_detection';

describe('Security Center Service', async () => {
let data = {

Check failure on line 31 in security-center/snippets/system-test/management_api/securityCenterService.test.js

View workflow job for this annotation

GitHub Actions / lint

'data' is never reassigned. Use 'const' instead
orgId: organizationId,
service: service,
};

it('should get the security center service', done => {
const output = exec(
`node management_api/getSecurityCenterService.js ${data.orgId} ${data.service}`
);
assert(output.includes(data.orgId));
assert(output.includes(data.service));
assert.match(output, /Retrieved SecurityCenterService/);
assert.notMatch(output, /undefined/);
done();
});

it('should list the security center services', done => {
const output = exec(
`node management_api/listSecurityCenterServices.js ${data.orgId}`
);
assert(output.includes(data.orgId));
assert(output.includes(data.service.toUpperCase()));
assert.match(output, /Security Center Service Name/);
assert.notMatch(output, /undefined/);
done();
});

it('should update the security center service', done => {
const output = exec(
`node management_api/updateSecurityCenterService.js ${data.orgId} ${data.service}`
);
assert(output.includes(data.orgId));
assert(output.includes(data.service));
assert.match(output, /Updated SecurityCenterService/);
assert.notMatch(output, /undefined/);
done();
});
});
Loading