我正在尝试使用API自动进行DLP扫描。唯一阻碍我完成这个项目的是身份验证。似乎在每个项目中创建和使用具有BigQuery、Storage和DLP管理权限的服务帐户是避免权限被拒绝错误的唯一方法,尽管我自己的帐户拥有对所有项目的组织所有者访问权限。这是IAM问题还是DLP API和令牌使用的某些要求?为什么我的代币不起作用?我们有很多项目,将来可能会有更多的项目,我们希望避免在每个项目中创建一个服务帐户的繁琐和乏味问题,尤其是为了保持脚本的工作,必须一次又一次地创建服务帐户。自动化应该是少工作而不是多工作。
我在下面的一个项目中使用我自己的帐户令牌时出现的错误是DLP API肯定已启用。
"error": {
"code": 403,
"message": "Cloud Data Loss Prevention (DLP) API has not been used in project ###### before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dlp.googleapis.com/overview?project=###### then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
"status": "PERMISSION_DENIED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [
{
"description": "Google developers console API activation",
"url": "https://console.developers.google.com/apis/api/dlp.googleapis.com/overview?project=######"
查看文档验证到云DLP API:
您必须通过云DLP API的身份验证才能使用它。这个云DLP API可以处理API密钥和身份验证。主要这两种方法的区别在于:
- API键标识调用项目-正在调用API的应用程序或站点
- Auth令牌标识正在使用项目的用户(即个人)
和
使用服务帐户验证云DLP API:
按照说明创建服务帐户。选择JSON作为密钥类型,并授予用户DLP用户角色(
roles/dlp.user
)。
通常,您应该遵循以下步骤:
- 启用计费
- 启用DLP API
-
创建一个服务帐户,将角色授予服务帐户
roles/dlp.user
并下载key.json
文件:$ gcloud iam service-accounts create test-dlp --description "test-cloud" --display-name "test-dlp" $ gcloud projects add-iam-policy-binding class-run --member serviceAccount:test-dlp@class-run.iam.gserviceaccount.com --role roles/dlp.user $ gcloud iam service-accounts keys create key.json --iam-account test-dlp@class-run.iam.gserviceaccount.com
-
设置env变量:
export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_key.json_FILE]
-
运行您的脚本
此外,请查看Quickstart:使用命令行工具部分Permissions:
检查内容需要
serviceusage.services.use
权限用于在父级中指定的项目。CCD_ 6,roles/owner
和roles.dlp.user
角色包含所需的权限或者您可以定义自己的自定义角色。
如果您仍然有问题,请尝试按照以下步骤对bu进行故障排除:
- 使用命令
gcloud auth list
检查您的活动帐户 - 检查DLP API是否已启用
gcloud services list --enabled | grep DLP
- 使用命令
gcloud auth activate-service-account
激活DLP服务帐户,然后再次运行脚本
并使用命令和输出更新您的问题。此外,请澄清您在脚本中使用DLP服务帐户的方式。
是的,您可以将自己的用户帐户(所有者)与api一起使用。
1. gcloud auth login
2. gcloud auth list
#ACTIVE ACCOUNT with owner role
* user@cloud.com .
3. gcloud auth print-access-token
#xxxxxxxxxxxxxx
4. curl -s -H 'Content-Type: application/json' -H 'Authorization: Bearer xxxxxxxxxxx' 'https://dlp.googleapis.com/v2/infoTypes'
#OR
5. ACCESS_TOKEN="$(gcloud auth application-default print-access-token)"
curl -s -H 'Content-Type: application/json' -H "Authorization: Bearer $ACCESS_TOKEN" 'https://dlp.googleapis.com/v2/infoTypes'
#you need Double Quotes and not Single Quotes for -H flag
3.1.2.2单一报价
将字符用单引号(')括起来可保留文字值引号中每个字符的。可能不会出现单引号在单引号之间,即使前面有反斜杠。
3.1.2.3双重报价
将字符用双引号(")括起来可保留文字值引号中所有字符的,$除外,
, , and, when history expansion is enabled, !. The characters $ and
在双引号中保留其特殊含义(参见Shell扩展)。只有当后跟以下字符之一:$、`、"、\或换行符。在双引号内,后面跟着以下内容之一的反斜杠字符被删除。在不带特殊含义未作修改。可以引用双引号在双引号内,在其前面加一个反斜杠。如果启用,将执行历史扩展,除非!以双引号出现引号使用反斜杠进行转义。!前面的反斜杠!是未移除。当使用双精度时,特殊参数*和@具有特殊含义引号(请参见外壳参数展开)。
输出:
{
"infoTypes": [
{
"name": "AMERICAN_BANKERS_CUSIP_ID",
"displayName": "American Bankers CUSIP identifier",
"supportedBy": [
"INSPECT"
],
"description": "An American Bankers' Committee on Uniform Security Identification Procedures (CUSIP) number is a 9-character alphanumeric code that identifies a North American financial security."
},
{
"name": "AUSTRALIA_DRIVERS_LICENSE_NUMBER",
"displayName": "Australia driver's license number",
"supportedBy": [
"INSPECT"
],
"description": "An Australian driver's license number."
},
{
"name": "AUSTRALIA_MEDICARE_NUMBER",
"displayName": "Australia medicare number",
"supportedBy": [
"INSPECT"
..................
需要注意的一点是DLP有点不同。实际上,每个请求中都涉及两个服务帐户。用于调用API的服务,但服务本身使用dlp服务帐户来转向并调用其他服务以从存储中读取。
当你启用dlp时,你会看到这个帐户是自动创建的。看起来是这样的。。。服务-[PROJECT_NUMBER]@dlp-api.iam.gserviceaccount.com,此处讨论https://cloud.google.com/dlp/docs/iam-permissions#service_account
我看到的一个常见设置是,安全团队将在单个项目中启用DLP来扫描他们的整个组织。他们将通过授予他们正在运行的项目中的服务[PROJECT_NUMBER]@dlp-api.iam.gserviceaccount.com访问组织中所有其他项目的权限来实现这一点。这将使其在整个公司读取GCS/BQ。
如果您找到这篇文章是因为您只想使用API密钥通过Java客户端调用DLP API,请参阅我如何使其工作(在Scala中)的要点。基本上,我必须在自己身上传递头部,并明确表示没有其他身份验证机制存在
https://gist.github.com/kylejmcintyre/b7ff56cf08addb87ebcf53defa18461f
在我的情况下,我将所有要检查的数据传递到API中,因此除了调用inspect API之外,我不关心任何其他身份验证。