
如何用 Privileged Access Manager 创建 entitlement 并申请临时特权访问【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills当需要给某些人临时开通 Google Cloud 特权例如临时执行compute.instances.start这类操作时直接追加永久 IAM 角色绑定会带来长期权限残留。Google Cloud 的 Privileged Access ManagerPAM用按需、限时、可审计的访问提升来替代这种做法管理员先创建entitlement定义访问范围、可申请人和审批人申请人再基于 entitlement 提交grant请求审批通过后角色在请求时长内生效到期自动收回。本文基于 iam-helper-for-privileged-access-management skill 中的文档走通「管理员创建 entitlement → 申请人发起临时访问请求 → 查看状态确认生效」这条路径全程使用gcloudCLI。准备条件两类角色的权限要求这条路径涉及两个角色权限要求不同。创建 entitlement 的管理员需要roles/privilegedaccessmanager.admin创建、更新、删除 entitlement 配置目标层级范围上的 IAM 管理权限因为创建 entitlement 会在该范围上授权未来的角色评估与绑定组织范围roles/iam.securityAdminFolder 范围roles/resourcemanager.folderAdmin项目范围roles/resourcemanager.projectIamAdminroles/privilegedaccessmanager.viewer用于跨范围列出和查看 entitlement。申请临时访问的申请人不需要显式 IAM 角色——只需要被加入目标 entitlement 的eligibleUsers列表。申请人可以直接用gcloud pam entitlements search --caller-access-typegrant-requester发现自己有资格申请的 entitlement无需roles/privilegedaccessmanager.viewer但如果要用list/describe跨范围搜索全部 entitlement或检查角色定义gcloud iam roles describe则需要roles/privilegedaccessmanager.viewer和roles/iam.roleViewer。另外注意一条贯穿所有命令的规则scope 标志--projectPROJECT_ID、--folderFOLDER_ID、--organizationORGANIZATION_ID必须与 entitlement 实际定义所在的范围一致。创建 entitlement先确认目标 ID 不存在entitlement ID 约定为小写加连字符、由角色名派生例如roles/compute.admin对应compute-admin。创建前先检查ENTITLEMENT_ID下文以compute-admin为例是否已存在gcloud pam entitlements describe compute-admin \ --locationglobal \ --projectPROJECT_ID如果返回已存在的 entitlement停止创建流程改为查看详情或更新它只有返回 NOT_FOUND 才继续。编写 entitlement.yaml以 skill 内置的模板 entitlement_template.yaml 为基础生成配置文件模板原文如下privilegedAccess: gcpIamAccess: resourceType: cloudresourcemanager.googleapis.com/Project resource: //cloudresourcemanager.googleapis.com/projects/PROJECT_ID # Examples for other resources: # resourceType: cloudresourcemanager.googleapis.com/Folder # resource: //cloudresourcemanager.googleapis.com/folders/FOLDER_ID # resourceType: cloudresourcemanager.googleapis.com/Organization # resource: //cloudresourcemanager.googleapis.com/organizations/ORG_ID roleBindings: - role: ROLE_NAME # conditionExpression: request.time timestamp(2027-01-01T00:00:00Z) maxRequestDuration: 14400s requesterJustificationConfig: unstructured: {} eligibleUsers: - principals: - user:userexample.com # Optional: Manual Approval Workflow Configuration # approvalWorkflow: # manualApprovals: # requireApproverJustification: true # steps: # - approvalsNeeded: 1 # approverEmailRecipients: # - approverexample.com # approvers: # - principals: # - user:approverexample.com需要替换和决策的位置PROJECT_ID/ROLE_NAME/userexample.com替换为实际的目标项目 ID、要授予的 IAM 角色、申请人的真实邮箱eligibleUsers下可以有多个 principal。resourceType与resource模板默认是 Project 资源注释里给出了 Folder 和 Organization 的写法按目标资源类型替换。roleBindings可以指定多个 IAM 角色每个绑定还可附带可选的 IAMconditionExpression。遗留基础角色roles/viewer、roles/editor、roles/owner不被支持必须改用 v2 基础角色roles/basic.viewer、roles/basic.editor、roles/basic.owner或使用其他有效的前置定义/自定义/v2 基础角色。maxRequestDuration申请人单次可申请的最长时长必须写成秒数字符串。未指定时默认14400s4 小时也可按需配置如3600s1 小时、28800s8 小时。requesterJustificationConfig: {unstructured: {}}保留不要删。approvalWorkflow可选如果策略要求人工审批取消注释并填入审批人。审批人可以是user:db-leadmy-company.com这样的用户或group:sre-leadsmy-company.com这样的组requireApproverJustification: true表示要求审批人填写理由。配置了该块的 entitlementgrant 请求会进入APPROVAL_AWAITED状态等待审批人处理见后文可选分支。执行创建gcloud pam entitlements create compute-admin \ --locationglobal \ --entitlement-fileentitlement.yaml \ --projectPROJECT_ID如果 entitlement 定义在 Folder 或组织上把--projectPROJECT_ID换成--folderFOLDER_ID或--organizationORGANIZATION_ID。验证创建结果用只读命令确认 entitlement 已可查询gcloud pam entitlements list \ --locationglobal \ --projectPROJECT_ID gcloud pam entitlements describe compute-admin \ --locationglobal \ --projectPROJECT_IDlist能看到该范围内的全部 entitlementdescribe返回目标 entitlement 的配置详情。申请人发起临时访问请求Grant申请人侧的操作顺序是准备输入 → 沿资源层级搜索可用 entitlement → 提交 grant → 根据状态判断结果。第一步收集并校验四个输入Principal 邮箱申请访问的身份例如user:userexample.com权限名需要的 IAM 权限例如compute.instances.start请求时长未指定时默认3600s60 分钟目标资源接受短名如my-project内部格式化为完整 URI如//cloudresourcemanager.googleapis.com/projects/my-project。第二步沿层级搜索有资格的 entitlement这里有一个容易踩的坑单条gcloud pam entitlements search只查询指定的精确范围不会自动遍历父 Folder 和组织。而授予某个项目访问权的 entitlement 完全可能定义在祖先 Folder 或组织层级上所以要用 skill 自带的层级搜索脚本 search_eligible_entitlements.shbash skills/cloud/iam-helper-for-privileged-access-management/scripts/search_eligible_entitlements.sh --projectPROJECT_ID也可以传--folderFOLDER_ID或--organizationORGANIZATION_ID。脚本只执行gcloud pam entitlements search等只读查询从指定范围逐级向上搜索祖先 Folder 和组织。如果没有本地脚本文档给出的等价直接命令是projectPROJECT_ID echo Searching Project Scope gcloud pam entitlements search --caller-access-typegrant-requester \ --locationglobal --project$project --formatjson echo Searching Ancestor Folders Organization while read -r id type; do if [[ $type folder ]]; then gcloud pam entitlements search --caller-access-typegrant-requester \ --locationglobal --folder$id --formatjson elif [[ $type organization ]]; then gcloud pam entitlements search --caller-access-typegrant-requester \ --locationglobal --organization$id --formatjson fi done (gcloud projects get-ancestors $project --formatvalue(id,type) 2/dev/null || true)project变量替换为目标项目 ID。拿到结果后从各 entitlement 的roleBindings中确认哪一个授予了所需的权限或角色找到匹配记下ENTITLEMENT_ID以及它被发现的范围层级。如果多个层级都有合格 entitlement优先选范围最窄的Project 优于 FolderFolder 优于 Organization。没有匹配终止流程说明当前请求不存在可用的 entitlement——需要先请管理员创建。第三步提交 grant 请求# Example using an organization-level entitlement for a project resource: gcloud pam grants create \ --entitlementENTITLEMENT_ID \ --locationglobal \ --requested-durationDURATION \ --justificationAutomated temporary access request \ --organizationORGANIZATION_ID \ --requested-resourcesprojects/PROJECT_ID各参数说明--entitlementENTITLEMENT_ID第二步找到的 entitlement--requested-duration必须精确对应用户要的时长例如要求 2 小时就传--requested-duration7200s未指定时传默认3600sscope 标志--project/--folder/--organization必须与 entitlement 定义所在范围一致上例文档用的是「组织级 entitlement 访问某个项目资源」的场景--requested-resources实际需要访问的目标资源格式为projects/PROJECT_ID、folders/FOLDER_ID或organizations/ORGANIZATION_ID。第四步按状态判断结果请求返回的 grant 状态决定下一步APPROVAL_AWAITED请求已提交记下GRANT_ID访问在审批通过后才激活。到此为止等待审批人处理见下文可选分支SCHEDULED或ACTIVATINGgrant 已批准但开通仍在进行。等约 30 秒后重试检查状态 2–3 次ACTIVE访问已激活确认后即可开始操作。注意任务完成后不要主动撤销 grant让它到期自动结束即可。文档也说明了边界存在ACTIVE或SCHEDULEDgrant 时对应的 entitlement 无法删除因此临时访问的生命周期以自动过期收尾。可选分支审批人处理待批准请求只有当 entitlement 配置了approvalWorkflow时才会走到这一步。审批人同样不需要显式 IAM 角色只需被加入该 entitlementapprovalWorkflow的approvers列表。审批人可以直接搜索自己有权审批的 pending grantgcloud pam grants search \ --caller-relationshipcan-approve \ --locationglobal \ --projectPROJECT_ID或按目标层级传--folderFOLDER_ID、--organizationORGANIZATION_ID。如果已知 entitlement ID也可以直接列出它的全部 grantgcloud pam grants list \ --entitlementENTITLEMENT_ID \ --locationglobal \ --projectPROJECT_ID批准一个 grant 前先用gcloud pam grants describe或search确认 grant 存在及其状态并准备一句审批理由然后执行gcloud pam grants approve GRANT_ID \ --entitlementENTITLEMENT_ID \ --locationglobal \ --projectPROJECT_ID \ --reasonUSER_PROVIDED_REASON拒绝请求时把approve换成deny同样需要--reason。审批完成后申请人侧的 grant 状态会按前面第四步的逻辑变为ACTIVE可能先经过SCHEDULED/ACTIVATING。相关文档SKILL.mdPAM entitlement CRUD、审批流与安全确认策略的完整说明含 entitlement 更新export导出当前配置、勿改etag后update和删除先检查并撤销 open grant流程requester.md申请人工作流原文approver.md审批人工作流原文list_entitlements_hierarchy.sh管理员沿整个资源层级列出已定义 entitlement 的脚本。【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考