import (
"context"
"fmt"
"io"
securitycenter "cloud.google.com/go/securitycenter/apiv1"
securitycenterpb "google.golang.org/genproto/googleapis/cloud/securitycenter/v1"
"google.golang.org/genproto/protobuf/field_mask"
)
// addSecurityMarks adds/updates a the security marks for the findingName and
// returns the updated marks. Specifically, it sets "key_a" an "key_b" to
// "value_a" and "value_b" respectively. findingName is the resource path for
// the finding to add marks to.
func addSecurityMarks(w io.Writer, findingName string) error {
// findingName := "organizations/11123213/sources/12342342/findings/fidningid"
// Instantiate a context and a security service client to make API calls.
ctx := context.Background()
client, err := securitycenter.NewClient(ctx)
if err != nil {
return fmt.Errorf("securitycenter.NewClient: %v", err)
}
defer client.Close() // Closing the client safely cleans up background resources.
req := &securitycenterpb.UpdateSecurityMarksRequest{
// If not set or empty, all marks would be cleared before
// adding the new marks below.
UpdateMask: &field_mask.FieldMask{
Paths: []string{"marks.key_a", "marks.key_b"},
},
SecurityMarks: &securitycenterpb.SecurityMarks{
Name: fmt.Sprintf("%s/securityMarks", findingName),
// Note keys correspond to the last part of each path.
Marks: map[string]string{"key_a": "value_a", "key_b": "value_b"},
},
}
updatedMarks, err := client.UpdateSecurityMarks(ctx, req)
if err != nil {
return fmt.Errorf("UpdateSecurityMarks: %v", err)
}
fmt.Fprintf(w, "Updated marks: %s\n", updatedMarks.Name)
for k, v := range updatedMarks.Marks {
fmt.Fprintf(w, "%s = %s\n", k, v)
}
return nil
}
// Imports the Google Cloud client library.
const {SecurityCenterClient} = require('@google-cloud/security-center');
// Creates a new client.
const client = new SecurityCenterClient();
async function addFindingSecurityMarks() {
// findingName is the full resource path for the finding to update.
/*
* TODO(developer): Uncomment the following lines
*/
// const findingName =
// "organizations/123123342/sources/1213/findings/findingid";
const [newMarks] = await client.updateSecurityMarks({
securityMarks: {
name: `${findingName}/securityMarks`,
marks: {key_a: 'value_a', key_b: 'value_b'},
},
// Only update the marks with these keys.
updateMask: {paths: ['marks.key_a', 'marks.key_b']},
});
console.log('New marks: %j', newMarks);
}
addFindingSecurityMarks();
from google.cloud import securitycenter
from google.protobuf import field_mask_pb2
client = securitycenter.SecurityCenterClient()
# finding_name is the resource path for a finding that exists in CSCC.
# Its format is
# "organizations/{org_id}/sources/{source_id}/findings/{finding_id}"
# e.g.:
# finding_name = "organizations/1112/sources/1234/findings/findingid"
finding_marks_name = "{}/securityMarks".format(finding_name)
# Notice the suffix after "marks." in the field mask matches the keys
# in marks.
field_mask = field_mask_pb2.FieldMask(
paths=["marks.finding_key_a", "marks.finding_key_b"]
)
marks = {"finding_key_a": "value_a", "finding_key_b": "value_b"}
updated_marks = client.update_security_marks(
request={
"security_marks": {"name": finding_marks_name, "marks": marks},
"update_mask": field_mask,
}
)