-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Changes from 1 commit
4e7c5e5
005a03c
48facd7
6c70aa0
a968e7b
8514646
5335532
7aff180
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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 | ||
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] | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 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'; | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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)); | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 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 | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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)); | ||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 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]
}; |
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 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
|
||||||
// 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 = { | ||||||
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(); | ||||||
}); | ||||||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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."
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Addressed