googleapis/google/cloud/privilegedaccessmanager/v1/privilegedaccessmanager.proto
2025-07-30 23:37:28 -07:00

1258 lines
47 KiB
Protocol Buffer

// 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.
syntax = "proto3";
package google.cloud.privilegedaccessmanager.v1;
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";
option csharp_namespace = "Google.Cloud.PrivilegedAccessManager.V1";
option go_package = "cloud.google.com/go/privilegedaccessmanager/apiv1/privilegedaccessmanagerpb;privilegedaccessmanagerpb";
option java_multiple_files = true;
option java_outer_classname = "PrivilegedAccessManagerProto";
option java_package = "com.google.cloud.privilegedaccessmanager.v1";
option php_namespace = "Google\\Cloud\\PrivilegedAccessManager\\V1";
option ruby_package = "Google::Cloud::PrivilegedAccessManager::V1";
option (google.api.resource_definition) = {
type: "privilegedaccessmanager.googleapis.com/OrganizationLocation"
pattern: "organizations/{organization}/locations/{location}"
};
option (google.api.resource_definition) = {
type: "privilegedaccessmanager.googleapis.com/FolderLocation"
pattern: "folders/{folder}/locations/{location}"
};
// This API allows customers to manage temporary, request based privileged
// access to their resources.
//
// It defines the following resource model:
//
// * A collection of `Entitlement` resources. An entitlement allows configuring
// (among other things):
//
// * Some kind of privileged access that users can request.
// * A set of users called _requesters_ who can request this access.
// * A maximum duration for which the access can be requested.
// * An optional approval workflow which must be satisfied before access is
// granted.
//
// * A collection of `Grant` resources. A grant is a request by a requester to
// get the privileged access specified in an entitlement for some duration.
//
// After the approval workflow as specified in the entitlement is satisfied,
// the specified access is given to the requester. The access is automatically
// taken back after the requested duration is over.
service PrivilegedAccessManager {
option (google.api.default_host) = "privilegedaccessmanager.googleapis.com";
option (google.api.oauth_scopes) =
"https://www.googleapis.com/auth/cloud-platform";
// `CheckOnboardingStatus` reports the onboarding status for a
// project/folder/organization. Any findings reported by this API need to be
// fixed before PAM can be used on the resource.
rpc CheckOnboardingStatus(CheckOnboardingStatusRequest)
returns (CheckOnboardingStatusResponse) {
option (google.api.http) = {
get: "/v1/{parent=projects/*/locations/*}:checkOnboardingStatus"
additional_bindings {
get: "/v1/{parent=organizations/*/locations/*}:checkOnboardingStatus"
}
additional_bindings {
get: "/v1/{parent=folders/*/locations/*}:checkOnboardingStatus"
}
};
}
// Lists entitlements in a given project/folder/organization and location.
rpc ListEntitlements(ListEntitlementsRequest)
returns (ListEntitlementsResponse) {
option (google.api.http) = {
get: "/v1/{parent=projects/*/locations/*}/entitlements"
additional_bindings {
get: "/v1/{parent=organizations/*/locations/*}/entitlements"
}
additional_bindings {
get: "/v1/{parent=folders/*/locations/*}/entitlements"
}
};
option (google.api.method_signature) = "parent";
}
// `SearchEntitlements` returns entitlements on which the caller has the
// specified access.
rpc SearchEntitlements(SearchEntitlementsRequest)
returns (SearchEntitlementsResponse) {
option (google.api.http) = {
get: "/v1/{parent=projects/*/locations/*}/entitlements:search"
additional_bindings {
get: "/v1/{parent=organizations/*/locations/*}/entitlements:search"
}
additional_bindings {
get: "/v1/{parent=folders/*/locations/*}/entitlements:search"
}
};
}
// Gets details of a single entitlement.
rpc GetEntitlement(GetEntitlementRequest) returns (Entitlement) {
option (google.api.http) = {
get: "/v1/{name=projects/*/locations/*/entitlements/*}"
additional_bindings {
get: "/v1/{name=organizations/*/locations/*/entitlements/*}"
}
additional_bindings {
get: "/v1/{name=folders/*/locations/*/entitlements/*}"
}
};
option (google.api.method_signature) = "name";
}
// Creates a new entitlement in a given project/folder/organization and
// location.
rpc CreateEntitlement(CreateEntitlementRequest)
returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{parent=projects/*/locations/*}/entitlements"
body: "entitlement"
additional_bindings {
post: "/v1/{parent=organizations/*/locations/*}/entitlements"
body: "entitlement"
}
additional_bindings {
post: "/v1/{parent=folders/*/locations/*}/entitlements"
body: "entitlement"
}
};
option (google.api.method_signature) = "parent,entitlement,entitlement_id";
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Deletes a single entitlement. This method can only be called when there
// are no in-progress (`ACTIVE`/`ACTIVATING`/`REVOKING`) grants under the
// entitlement.
rpc DeleteEntitlement(DeleteEntitlementRequest)
returns (google.longrunning.Operation) {
option (google.api.http) = {
delete: "/v1/{name=projects/*/locations/*/entitlements/*}"
additional_bindings {
delete: "/v1/{name=organizations/*/locations/*/entitlements/*}"
}
additional_bindings {
delete: "/v1/{name=folders/*/locations/*/entitlements/*}"
}
};
option (google.api.method_signature) = "name";
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Updates the entitlement specified in the request. Updated fields in the
// entitlement need to be specified in an update mask. The changes made to an
// entitlement are applicable only on future grants of the entitlement.
// However, if new approvers are added or existing approvers are removed from
// the approval workflow, the changes are effective on existing grants.
//
// The following fields are not supported for updates:
//
// * All immutable fields
// * Entitlement name
// * Resource name
// * Resource type
// * Adding an approval workflow in an entitlement which previously had no
// approval workflow.
// * Deleting the approval workflow from an entitlement.
// * Adding or deleting a step in the approval workflow (only one step is
// supported)
//
// Note that updates are allowed on the list of approvers in an approval
// workflow step.
rpc UpdateEntitlement(UpdateEntitlementRequest)
returns (google.longrunning.Operation) {
option (google.api.http) = {
patch: "/v1/{entitlement.name=projects/*/locations/*/entitlements/*}"
body: "entitlement"
additional_bindings {
patch: "/v1/{entitlement.name=organizations/*/locations/*/entitlements/*}"
body: "entitlement"
}
additional_bindings {
patch: "/v1/{entitlement.name=folders/*/locations/*/entitlements/*}"
body: "entitlement"
}
};
option (google.api.method_signature) = "entitlement,update_mask";
option (google.longrunning.operation_info) = {
response_type: "Entitlement"
metadata_type: "OperationMetadata"
};
}
// Lists grants for a given entitlement.
rpc ListGrants(ListGrantsRequest) returns (ListGrantsResponse) {
option (google.api.http) = {
get: "/v1/{parent=projects/*/locations/*/entitlements/*}/grants"
additional_bindings {
get: "/v1/{parent=organizations/*/locations/*/entitlements/*}/grants"
}
additional_bindings {
get: "/v1/{parent=folders/*/locations/*/entitlements/*}/grants"
}
};
option (google.api.method_signature) = "parent";
}
// `SearchGrants` returns grants that are related to the calling user in the
// specified way.
rpc SearchGrants(SearchGrantsRequest) returns (SearchGrantsResponse) {
option (google.api.http) = {
get: "/v1/{parent=projects/*/locations/*/entitlements/*}/grants:search"
additional_bindings {
get: "/v1/{parent=organizations/*/locations/*/entitlements/*}/grants:search"
}
additional_bindings {
get: "/v1/{parent=folders/*/locations/*/entitlements/*}/grants:search"
}
};
}
// Get details of a single grant.
rpc GetGrant(GetGrantRequest) returns (Grant) {
option (google.api.http) = {
get: "/v1/{name=projects/*/locations/*/entitlements/*/grants/*}"
additional_bindings {
get: "/v1/{name=organizations/*/locations/*/entitlements/*/grants/*}"
}
additional_bindings {
get: "/v1/{name=folders/*/locations/*/entitlements/*/grants/*}"
}
};
option (google.api.method_signature) = "name";
}
// Creates a new grant in a given project/folder/organization and
// location.
rpc CreateGrant(CreateGrantRequest) returns (Grant) {
option (google.api.http) = {
post: "/v1/{parent=projects/*/locations/*/entitlements/*}/grants"
body: "grant"
additional_bindings {
post: "/v1/{parent=organizations/*/locations/*/entitlements/*}/grants"
body: "grant"
}
additional_bindings {
post: "/v1/{parent=folders/*/locations/*/entitlements/*}/grants"
body: "grant"
}
};
option (google.api.method_signature) = "parent,grant";
}
// `ApproveGrant` is used to approve a grant. This method can only be called
// on a grant when it's in the `APPROVAL_AWAITED` state. This operation can't
// be undone.
rpc ApproveGrant(ApproveGrantRequest) returns (Grant) {
option (google.api.http) = {
post: "/v1/{name=projects/*/locations/*/entitlements/*/grants/*}:approve"
body: "*"
additional_bindings {
post: "/v1/{name=organizations/*/locations/*/entitlements/*/grants/*}:approve"
body: "*"
}
additional_bindings {
post: "/v1/{name=folders/*/locations/*/entitlements/*/grants/*}:approve"
body: "*"
}
};
}
// `DenyGrant` is used to deny a grant. This method can only be called on a
// grant when it's in the `APPROVAL_AWAITED` state. This operation can't be
// undone.
rpc DenyGrant(DenyGrantRequest) returns (Grant) {
option (google.api.http) = {
post: "/v1/{name=projects/*/locations/*/entitlements/*/grants/*}:deny"
body: "*"
additional_bindings {
post: "/v1/{name=organizations/*/locations/*/entitlements/*/grants/*}:deny"
body: "*"
}
additional_bindings {
post: "/v1/{name=folders/*/locations/*/entitlements/*/grants/*}:deny"
body: "*"
}
};
}
// `RevokeGrant` is used to immediately revoke access for a grant. This method
// can be called when the grant is in a non-terminal state.
rpc RevokeGrant(RevokeGrantRequest) returns (google.longrunning.Operation) {
option (google.api.http) = {
post: "/v1/{name=projects/*/locations/*/entitlements/*/grants/*}:revoke"
body: "*"
additional_bindings {
post: "/v1/{name=organizations/*/locations/*/entitlements/*/grants/*}:revoke"
body: "*"
}
additional_bindings {
post: "/v1/{name=folders/*/locations/*/entitlements/*/grants/*}:revoke"
body: "*"
}
};
option (google.longrunning.operation_info) = {
response_type: "Grant"
metadata_type: "OperationMetadata"
};
}
}
// Request message for `CheckOnboardingStatus` method.
message CheckOnboardingStatusRequest {
// Required. The resource for which the onboarding status should be checked.
// Should be in one of the following formats:
//
// * `projects/{project-number|project-id}/locations/{region}`
// * `folders/{folder-number}/locations/{region}`
// * `organizations/{organization-number}/locations/{region}`
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Entitlement"
}
];
}
// Response message for `CheckOnboardingStatus` method.
message CheckOnboardingStatusResponse {
// Finding represents an issue which prevents PAM from functioning properly
// for this resource.
message Finding {
// PAM's service account is being denied access by Cloud IAM.
// This can be fixed by granting a role that contains the missing
// permissions to the service account or exempting it from deny policies if
// they are blocking the access.
message IAMAccessDenied {
// List of permissions that are being denied.
repeated string missing_permissions = 1;
}
oneof finding_type {
// PAM's service account is being denied access by Cloud IAM.
IAMAccessDenied iam_access_denied = 1;
}
}
// The service account that PAM uses to act on this resource.
string service_account = 1;
// List of issues that are preventing PAM from functioning for this resource
// and need to be fixed to complete onboarding. Some issues might not be
// detected or reported.
repeated Finding findings = 2;
}
// An entitlement defines the eligibility of a set of users to obtain
// predefined access for some time possibly after going through an approval
// workflow.
message Entitlement {
option (google.api.resource) = {
type: "privilegedaccessmanager.googleapis.com/Entitlement"
pattern: "projects/{project}/locations/{location}/entitlements/{entitlement}"
pattern: "folders/{folder}/locations/{location}/entitlements/{entitlement}"
pattern: "organizations/{organization}/locations/{location}/entitlements/{entitlement}"
plural: "entitlements"
singular: "entitlement"
};
// Defines how a requester must provide a justification when requesting
// access.
message RequesterJustificationConfig {
// The justification is not mandatory but can be provided in any of the
// supported formats.
message NotMandatory {}
// The requester has to provide a justification in the form of a string.
message Unstructured {}
// This is a required field and the user must explicitly opt out if a
// justification from the requester isn't mandatory.
oneof justification_type {
// This option means the requester isn't required to provide a
// justification.
NotMandatory not_mandatory = 1;
// This option means the requester must provide a string as
// justification. If this is selected, the server allows the requester
// to provide a justification but doesn't validate it.
Unstructured unstructured = 2;
}
}
// `AdditionalNotificationTargets` includes email addresses to be notified.
message AdditionalNotificationTargets {
// Optional. Additional email addresses to be notified when a principal
// (requester) is granted access.
repeated string admin_email_recipients = 1
[(google.api.field_behavior) = OPTIONAL];
// Optional. Additional email address to be notified about an eligible
// entitlement.
repeated string requester_email_recipients = 2
[(google.api.field_behavior) = OPTIONAL];
}
// Different states an entitlement can be in.
enum State {
// Unspecified state. This value is never returned by the server.
STATE_UNSPECIFIED = 0;
// The entitlement is being created.
CREATING = 1;
// The entitlement is available for requesting access.
AVAILABLE = 2;
// The entitlement is being deleted.
DELETING = 3;
// The entitlement has been deleted.
DELETED = 4;
// The entitlement is being updated.
UPDATING = 5;
}
// Identifier. Name of the entitlement.
// Possible formats:
//
// * `organizations/{organization-number}/locations/{region}/entitlements/{entitlement-id}`
// * `folders/{folder-number}/locations/{region}/entitlements/{entitlement-id}`
// * `projects/{project-id|project-number}/locations/{region}/entitlements/{entitlement-id}`
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
// Output only. Create time stamp.
google.protobuf.Timestamp create_time = 2
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Update time stamp.
google.protobuf.Timestamp update_time = 3
[(google.api.field_behavior) = OUTPUT_ONLY];
// Optional. Who can create grants using this entitlement. This list should
// contain at most one entry.
repeated AccessControlEntry eligible_users = 5
[(google.api.field_behavior) = OPTIONAL];
// Optional. The approvals needed before access are granted to a requester. No
// approvals are needed if this field is null.
ApprovalWorkflow approval_workflow = 6
[(google.api.field_behavior) = OPTIONAL];
// The access granted to a requester on successful approval.
PrivilegedAccess privileged_access = 7;
// Required. The maximum amount of time that access is granted for a request.
// A requester can ask for a duration less than this, but never more.
google.protobuf.Duration max_request_duration = 8
[(google.api.field_behavior) = REQUIRED];
// Output only. Current state of this entitlement.
State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
// Required. The manner in which the requester should provide a justification
// for requesting access.
RequesterJustificationConfig requester_justification_config = 10
[(google.api.field_behavior) = REQUIRED];
// Optional. Additional email addresses to be notified based on actions taken.
AdditionalNotificationTargets additional_notification_targets = 11
[(google.api.field_behavior) = OPTIONAL];
// An `etag` is used for optimistic concurrency control as a way to prevent
// simultaneous updates to the same entitlement. An `etag` is returned in the
// response to `GetEntitlement` and the caller should put the `etag` in the
// request to `UpdateEntitlement` so that their change is applied on
// the same version. If this field is omitted or if there is a mismatch while
// updating an entitlement, then the server rejects the request.
string etag = 12;
}
// `AccessControlEntry` is used to control who can do some operation.
message AccessControlEntry {
// Optional. Users who are allowed for the operation. Each entry should be a
// valid v1 IAM principal identifier. The format for these is documented at:
// https://cloud.google.com/iam/docs/principal-identifiers#v1
repeated string principals = 1 [(google.api.field_behavior) = OPTIONAL];
}
// Different types of approval workflows that can be used to gate privileged
// access granting.
message ApprovalWorkflow {
oneof approval_workflow {
// An approval workflow where users designated as approvers review and act
// on the grants.
ManualApprovals manual_approvals = 1;
}
}
// A manual approval workflow where users who are designated as approvers
// need to call the `ApproveGrant`/`DenyGrant` APIs for a grant. The workflow
// can consist of multiple serial steps where each step defines who can act as
// approver in that step and how many of those users should approve before the
// workflow moves to the next step.
//
// This can be used to create approval workflows such as:
//
// * Require an approval from any user in a group G.
// * Require an approval from any k number of users from a Group G.
// * Require an approval from any user in a group G and then from a user U.
//
// A single user might be part of the `approvers` ACL for multiple steps in this
// workflow, but they can only approve once and that approval is only considered
// to satisfy the approval step at which it was granted.
message ManualApprovals {
// Step represents a logical step in a manual approval workflow.
message Step {
// Optional. The potential set of approvers in this step. This list must
// contain at most one entry.
repeated AccessControlEntry approvers = 1
[(google.api.field_behavior) = OPTIONAL];
// Required. How many users from the above list need to approve. If there
// aren't enough distinct users in the list, then the workflow indefinitely
// blocks. Should always be greater than 0. 1 is the only supported value.
int32 approvals_needed = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. Additional email addresses to be notified when a grant is
// pending approval.
repeated string approver_email_recipients = 3
[(google.api.field_behavior) = OPTIONAL];
}
// Optional. Do the approvers need to provide a justification for their
// actions?
bool require_approver_justification = 1
[(google.api.field_behavior) = OPTIONAL];
// Optional. List of approval steps in this workflow. These steps are followed
// in the specified order sequentially. Only 1 step is supported.
repeated Step steps = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Privileged access that this service can be used to gate.
message PrivilegedAccess {
// `GcpIamAccess` represents IAM based access control on a Google Cloud
// resource. Refer to https://cloud.google.com/iam/docs to understand more
// about IAM.
message GcpIamAccess {
// IAM role bindings that are created after a successful grant.
message RoleBinding {
// Required. IAM role to be granted.
// https://cloud.google.com/iam/docs/roles-overview.
string role = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. The expression field of the IAM condition to be associated
// with the role. If specified, a user with an active grant for this
// entitlement is able to access the resource only if this condition
// evaluates to true for their request.
//
// This field uses the same CEL format as IAM and supports all attributes
// that IAM supports, except tags.
// https://cloud.google.com/iam/docs/conditions-overview#attributes.
string condition_expression = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Required. The type of this resource.
string resource_type = 1 [(google.api.field_behavior) = REQUIRED];
// Required. Name of the resource.
string resource = 2 [(google.api.field_behavior) = REQUIRED];
// Required. Role bindings that are created on successful grant.
repeated RoleBinding role_bindings = 4
[(google.api.field_behavior) = REQUIRED];
}
oneof access_type {
// Access to a Google Cloud resource through IAM.
GcpIamAccess gcp_iam_access = 1;
}
}
// Message for requesting list of entitlements.
message ListEntitlementsRequest {
// Required. The parent which owns the entitlement resources.
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Entitlement"
}
];
// Optional. Requested page size. Server may return fewer items than
// requested. If unspecified, the server picks an appropriate default.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results the server should return.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. Filtering results.
string filter = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. Hint for how to order the results.
string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Message for response to listing entitlements.
message ListEntitlementsResponse {
// The list of entitlements.
repeated Entitlement entitlements = 1;
// A token identifying a page of results the server should return.
string next_page_token = 2;
// Locations that could not be reached.
repeated string unreachable = 3;
}
// Request message for `SearchEntitlements` method.
message SearchEntitlementsRequest {
// Different types of access a user can have on the entitlement resource.
enum CallerAccessType {
// Unspecified access type.
CALLER_ACCESS_TYPE_UNSPECIFIED = 0;
// The user has access to create grants using this entitlement.
GRANT_REQUESTER = 1;
// The user has access to approve/deny grants created under this
// entitlement.
GRANT_APPROVER = 2;
}
// Required. The parent which owns the entitlement resources.
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Entitlement"
}
];
// Required. Only entitlements where the calling user has this access are
// returned.
CallerAccessType caller_access_type = 2
[(google.api.field_behavior) = REQUIRED];
// Optional. Only entitlements matching this filter are returned in the
// response.
string filter = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. Requested page size. The server may return fewer items than
// requested. If unspecified, the server picks an appropriate default.
int32 page_size = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results the server should return.
string page_token = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for `SearchEntitlements` method.
message SearchEntitlementsResponse {
// The list of entitlements.
repeated Entitlement entitlements = 1;
// A token identifying a page of results the server should return.
string next_page_token = 2;
}
// Message for getting an entitlement.
message GetEntitlementRequest {
// Required. Name of the resource.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "privilegedaccessmanager.googleapis.com/Entitlement"
}
];
}
// Message for creating an entitlement.
message CreateEntitlementRequest {
// Required. Name of the parent resource for the entitlement.
// Possible formats:
//
// * `organizations/{organization-number}/locations/{region}`
// * `folders/{folder-number}/locations/{region}`
// * `projects/{project-id|project-number}/locations/{region}`
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Entitlement"
}
];
// Required. The ID to use for this entitlement. This becomes the last part of
// the resource name.
//
// This value should be 4-63 characters in length, and valid characters are
// "[a-z]", "[0-9]", and "-". The first character should be from [a-z].
//
// This value should be unique among all other entitlements under the
// specified `parent`.
string entitlement_id = 2 [(google.api.field_behavior) = REQUIRED];
// Required. The resource being created
Entitlement entitlement = 3 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique
// request ID so that if you must retry your request, the server knows to
// ignore the request if it has already been completed. The server guarantees
// this for at least 60 minutes after the first request.
//
// For example, consider a situation where you make an initial request and the
// request times out. If you make the request again with the same request
// ID, the server can check if original operation with the same request ID
// was received, and if so, ignores the second request and returns the
// previous operation's response. This prevents clients from accidentally
// creating duplicate entitlements.
//
// The request ID must be a valid UUID with the exception that zero UUID is
// not supported (00000000-0000-0000-0000-000000000000).
string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
}
// Message for deleting an entitlement.
message DeleteEntitlementRequest {
// Required. Name of the resource.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "privilegedaccessmanager.googleapis.com/Entitlement"
}
];
// Optional. An optional request ID to identify requests. Specify a unique
// request ID so that if you must retry your request, the server knows to
// ignore the request if it has already been completed. The server guarantees
// this for at least 60 minutes after the first request.
//
// For example, consider a situation where you make an initial request and the
// request times out. If you make the request again with the same request
// ID, the server can check if original operation with the same request ID
// was received, and if so, ignores the second request.
//
// The request ID must be a valid UUID with the exception that zero UUID is
// not supported (00000000-0000-0000-0000-000000000000).
string request_id = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. If set to true, any child grant under this entitlement is also
// deleted. (Otherwise, the request only works if the entitlement has no child
// grant.)
bool force = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Message for updating an entitlement.
message UpdateEntitlementRequest {
// Required. The entitlement resource that is updated.
Entitlement entitlement = 1 [(google.api.field_behavior) = REQUIRED];
// Required. The list of fields to update. A field is overwritten if, and only
// if, it is in the mask. Any immutable fields set in the mask are ignored by
// the server. Repeated fields and map fields are only allowed in the last
// position of a `paths` string and overwrite the existing values. Hence an
// update to a repeated field or a map should contain the entire list of
// values. The fields specified in the update_mask are relative to the
// resource and not to the request.
// (e.g. `MaxRequestDuration`; *not* `entitlement.MaxRequestDuration`)
// A value of '*' for this field refers to full replacement of the resource.
google.protobuf.FieldMask update_mask = 2
[(google.api.field_behavior) = REQUIRED];
}
// A grant represents a request from a user for obtaining the access specified
// in an entitlement they are eligible for.
message Grant {
option (google.api.resource) = {
type: "privilegedaccessmanager.googleapis.com/Grant"
pattern: "projects/{project}/locations/{location}/entitlements/{entitlement}/grants/{grant}"
pattern: "folders/{folder}/locations/{location}/entitlements/{entitlement}/grants/{grant}"
pattern: "organizations/{organization}/locations/{location}/entitlements/{entitlement}/grants/{grant}"
plural: "grants"
singular: "grant"
};
// Timeline of a grant describing what happened to it and when.
message Timeline {
// A single operation on the grant.
message Event {
// An event representing that a grant was requested.
message Requested {
// Output only. The time at which this grant expires unless the approval
// workflow completes. If omitted, then the request never expires.
google.protobuf.Timestamp expire_time = 1
[(google.api.field_behavior) = OUTPUT_ONLY];
}
// An event representing that the grant was approved.
message Approved {
// Output only. The reason provided by the approver for approving the
// grant.
string reason = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Username of the user who approved the grant.
string actor = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// An event representing that the grant was denied.
message Denied {
// Output only. The reason provided by the approver for denying the
// grant.
string reason = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Username of the user who denied the grant.
string actor = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// An event representing that the grant was revoked.
message Revoked {
// Output only. The reason provided by the user for revoking the grant.
string reason = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Username of the user who revoked the grant.
string actor = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// An event representing that the grant was withdrawn.
message Withdrawn {}
// An event representing that the grant has been scheduled to be
// activated later.
message Scheduled {
// Output only. The time at which the access is granted.
google.protobuf.Timestamp scheduled_activation_time = 1
[(google.api.field_behavior) = OUTPUT_ONLY];
}
// An event representing that the grant was successfully
// activated.
message Activated {}
// An event representing that the grant activation failed.
message ActivationFailed {
// Output only. The error that occurred while activating the grant.
google.rpc.Status error = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// An event representing that the grant was expired.
message Expired {}
// An event representing that the grant has ended.
message Ended {}
// An event representing that the policy bindings made by this grant were
// modified externally.
message ExternallyModified {}
oneof event {
// The grant was requested.
Requested requested = 2;
// The grant was approved.
Approved approved = 3;
// The grant was denied.
Denied denied = 4;
// The grant was revoked.
Revoked revoked = 5;
// The grant has been scheduled to give access.
Scheduled scheduled = 6;
// The grant was successfully activated to give access.
Activated activated = 7;
// There was a non-retriable error while trying to give access.
ActivationFailed activation_failed = 8;
// The approval workflow did not complete in the necessary duration,
// and so the grant is expired.
Expired expired = 10;
// Access given by the grant ended automatically as the approved
// duration was over.
Ended ended = 11;
// The policy bindings made by grant have been modified outside of PAM.
ExternallyModified externally_modified = 12;
// The grant was withdrawn.
Withdrawn withdrawn = 13;
}
// Output only. The time (as recorded at server) when this event occurred.
google.protobuf.Timestamp event_time = 1
[(google.api.field_behavior) = OUTPUT_ONLY];
}
// Output only. The events that have occurred on this grant. This list
// contains entries in the same order as they occurred. The first entry is
// always be of type `Requested` and there is always at least one entry in
// this array.
repeated Event events = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// Audit trail for the access provided by this grant.
message AuditTrail {
// Output only. The time at which access was given.
google.protobuf.Timestamp access_grant_time = 1
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. The time at which the system removed access. This could be
// because of an automatic expiry or because of a revocation.
//
// If unspecified, then access hasn't been removed yet.
google.protobuf.Timestamp access_remove_time = 2
[(google.api.field_behavior) = OUTPUT_ONLY];
}
// Different states a grant can be in.
enum State {
// Unspecified state. This value is never returned by the server.
STATE_UNSPECIFIED = 0;
// The entitlement had an approval workflow configured and this grant is
// waiting for the workflow to complete.
APPROVAL_AWAITED = 1;
// The approval workflow completed with a denied result. No access is
// granted for this grant. This is a terminal state.
DENIED = 3;
// The approval workflow completed successfully with an approved result or
// none was configured. Access is provided at an appropriate time.
SCHEDULED = 4;
// Access is being given.
ACTIVATING = 5;
// Access was successfully given and is currently active.
ACTIVE = 6;
// The system could not give access due to a non-retriable error. This is a
// terminal state.
ACTIVATION_FAILED = 7;
// Expired after waiting for the approval workflow to complete. This is a
// terminal state.
EXPIRED = 8;
// Access is being revoked.
REVOKING = 9;
// Access was revoked by a user. This is a terminal state.
REVOKED = 10;
// System took back access as the requested duration was over. This is a
// terminal state.
ENDED = 11;
// Access is being withdrawn.
WITHDRAWING = 12;
// Grant was withdrawn by the grant owner. This is a terminal state.
WITHDRAWN = 13;
}
// Identifier. Name of this grant.
// Possible formats:
//
// * `organizations/{organization-number}/locations/{region}/entitlements/{entitlement-id}/grants/{grant-id}`
// * `folders/{folder-number}/locations/{region}/entitlements/{entitlement-id}/grants/{grant-id}`
// * `projects/{project-id|project-number}/locations/{region}/entitlements/{entitlement-id}/grants/{grant-id}`
//
// The last segment of this name (`{grant-id}`) is autogenerated.
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
// Output only. Create time stamp.
google.protobuf.Timestamp create_time = 2
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Update time stamp.
google.protobuf.Timestamp update_time = 3
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Username of the user who created this grant.
string requester = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
// Required. The amount of time access is needed for. This value should be
// less than the `max_request_duration` value of the entitlement.
google.protobuf.Duration requested_duration = 5
[(google.api.field_behavior) = REQUIRED];
// Optional. Justification of why this access is needed.
Justification justification = 6 [(google.api.field_behavior) = OPTIONAL];
// Output only. Current state of this grant.
State state = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Timeline of this grant.
Timeline timeline = 8 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. The access that would be granted by this grant.
PrivilegedAccess privileged_access = 9
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Audit trail of access provided by this grant. If unspecified
// then access was never granted.
AuditTrail audit_trail = 10 [(google.api.field_behavior) = OUTPUT_ONLY];
// Optional. Additional email addresses to notify for all the actions
// performed on the grant.
repeated string additional_email_recipients = 11
[(google.api.field_behavior) = OPTIONAL];
// Output only. Flag set by the PAM system to indicate that policy bindings
// made by this grant have been modified from outside PAM.
//
// After it is set, this flag remains set forever irrespective of the grant
// state. A `true` value here indicates that PAM no longer has any certainty
// on the access a user has because of this grant.
bool externally_modified = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// Justification represents a justification for requesting access.
message Justification {
oneof justification {
// A free form textual justification. The system only ensures that this
// is not empty. No other kind of validation is performed on the string.
string unstructured_justification = 1;
}
}
// Message for requesting list of grants.
message ListGrantsRequest {
// Required. The parent resource which owns the grants.
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
// Optional. Requested page size. The server may return fewer items than
// requested. If unspecified, the server picks an appropriate default.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results the server should return.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. Filtering results.
string filter = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. Hint for how to order the results
string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Message for response to listing grants.
message ListGrantsResponse {
// The list of grants.
repeated Grant grants = 1;
// A token identifying a page of results the server should return.
string next_page_token = 2;
// Locations that could not be reached.
repeated string unreachable = 3;
}
// Request message for `SearchGrants` method.
message SearchGrantsRequest {
// Different types of relationships a user can have with a grant.
enum CallerRelationshipType {
// Unspecified caller relationship type.
CALLER_RELATIONSHIP_TYPE_UNSPECIFIED = 0;
// The user created this grant by calling `CreateGrant` earlier.
HAD_CREATED = 1;
// The user is an approver for the entitlement that this grant is parented
// under and can currently approve/deny it.
CAN_APPROVE = 2;
// The caller had successfully approved/denied this grant earlier.
HAD_APPROVED = 3;
}
// Required. The parent which owns the grant resources.
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
// Required. Only grants which the caller is related to by this relationship
// are returned in the response.
CallerRelationshipType caller_relationship = 2
[(google.api.field_behavior) = REQUIRED];
// Optional. Only grants matching this filter are returned in the response.
string filter = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. Requested page size. The server may return fewer items than
// requested. If unspecified, server picks an appropriate default.
int32 page_size = 4 [(google.api.field_behavior) = OPTIONAL];
// Optional. A token identifying a page of results the server should return.
string page_token = 5 [(google.api.field_behavior) = OPTIONAL];
}
// Response message for `SearchGrants` method.
message SearchGrantsResponse {
// The list of grants.
repeated Grant grants = 1;
// A token identifying a page of results the server should return.
string next_page_token = 2;
}
// Message for getting a grant.
message GetGrantRequest {
// Required. Name of the resource.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
}
// Request message for `ApproveGrant` method.
message ApproveGrantRequest {
// Required. Name of the grant resource which is being approved.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
// Optional. The reason for approving this grant. This is required if the
// `require_approver_justification` field of the `ManualApprovals` workflow
// used in this grant is true.
string reason = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for `DenyGrant` method.
message DenyGrantRequest {
// Required. Name of the grant resource which is being denied.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
// Optional. The reason for denying this grant. This is required if
// `require_approver_justification` field of the `ManualApprovals` workflow
// used in this grant is true.
string reason = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Request message for `RevokeGrant` method.
message RevokeGrantRequest {
// Required. Name of the grant resource which is being revoked.
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
// Optional. The reason for revoking this grant.
string reason = 2 [(google.api.field_behavior) = OPTIONAL];
}
// Message for creating a grant
message CreateGrantRequest {
// Required. Name of the parent entitlement for which this grant is being
// requested.
string parent = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
child_type: "privilegedaccessmanager.googleapis.com/Grant"
}
];
// Required. The resource being created.
Grant grant = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. An optional request ID to identify requests. Specify a unique
// request ID so that if you must retry your request, the server knows to
// ignore the request if it has already been completed. The server guarantees
// this for at least 60 minutes after the first request.
//
// For example, consider a situation where you make an initial request and the
// request times out. If you make the request again with the same request
// ID, the server can check if original operation with the same request ID
// was received, and if so, ignores the second request. This prevents
// clients from accidentally creating duplicate grants.
//
// The request ID must be a valid UUID with the exception that zero UUID is
// not supported (00000000-0000-0000-0000-000000000000).
string request_id = 3 [(google.api.field_behavior) = OPTIONAL];
}
// Represents the metadata of the long-running operation.
message OperationMetadata {
// Output only. The time the operation was created.
google.protobuf.Timestamp create_time = 1
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. The time the operation finished running.
google.protobuf.Timestamp end_time = 2
[(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Server-defined resource path for the target of the operation.
string target = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Name of the verb executed by the operation.
string verb = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Human-readable status of the operation, if any.
string status_message = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. Identifies whether the user has requested cancellation
// of the operation. Operations that have been cancelled successfully
// have [Operation.error][] value with a
// [google.rpc.Status.code][google.rpc.Status.code] of 1, corresponding to
// `Code.CANCELLED`.
bool requested_cancellation = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. API version used to start the operation.
string api_version = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}