【问题标题】:GCP Data Loss Prevention API Authentication: Does it require the use of a service account?GCP Data Loss Prevention API 身份验证:是否需要使用服务帐户?
【发布时间】:2021-07-05 16:50:26
【问题描述】:

我正在尝试使用 API 自动执行 DLP 扫描。唯一阻碍我完成这个项目的是身份验证。尽管我自己的帐户拥有对所有项目的组织所有者访问权限,但在每个项目中创建和使用具有 BigQuery、存储和 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=######"

【问题讨论】:

    标签: api google-cloud-platform automation service-accounts google-cloud-dlp


    【解决方案1】:

    查看文档Authenticating to the Cloud DLP API:

    您必须对 Cloud DLP API 进行身份验证才能使用它。这 Cloud DLP API 可以处理 API 密钥和身份验证。主要的 这两种方法的区别在于:

    • API 密钥标识调用 API 的调用项目(应用或网站)。
    • 身份验证令牌用于识别正在使用该项目的用户。

    和

    使用服务帐号向 Cloud DLP API 进行身份验证:

    按照create a service account 的说明进行操作。选择 JSON 作为您的密钥类型,并授予用户 DLP 用户角色 (roles/dlp.user)。

    一般来说,您应该遵循以下步骤:

    1. enable billing
    2. enable DLP API
    3. create a service account,将角色授予服务帐户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
      
    4. 设置环境变量:

      export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_key.json_FILE]
      
    5. 运行您的脚本

    另外,看看Quickstart: Using the command-line tool部分Permissions:

    检查内容需要serviceusage.services.use 权限 对于在父项中指定的项目。 roles/editor, roles/owner 和 roles.dlp.user 角色包含所需的权限 或者您可以定义自己的自定义角色。

    如果您仍有问题,请尝试按照以下步骤进行故障排除:

    1. 使用命令gcloud auth list检查您的活动帐户
    2. 检查是否启用了 DLP API gcloud services list --enabled | grep DLP
    3. 使用命令gcloud auth activate-service-account 激活您的 DLP 服务帐户并再次运行您的脚本

    并使用命令和输出更新您的问题。另外,请说明您在脚本中使用 DLP 服务帐户的方式。

    【讨论】:

    • 我已经看过所有这些文档,也不清楚我的问题的答案。我仍然不确定我的问题的答案是“是的,我可以使用我自己的 api 帐户”还是“不,我必须改用服务帐户”。 gcloud auth login 然后 gcloud auth print-access-token 与 api 一起使用并不能解决这个问题,尽管我是所有者,但我仍然显示权限被拒绝。如果我可以使用自己的帐户,那为什么会被拒绝?
    • 1.正如您在 Authenticating to the Cloud DLP API cloud.google.com/dlp/docs/auth 文档中看到的那样,您可以使用 API 密钥或服务帐户。 2.尝试创建一个服务帐户并按照我的步骤操作。要找出问题的原因,一些额外的信息(如命令和输出)将非常有帮助。 3. 如果一般方法不适合您 - 请运行我提供的额外命令并使用输出更新您的问题。
    • gcloud 命令列表确实帮助我自动化了整个事情,我仍然无法让它使用我自己的帐户,但无论如何我们真的应该使用服务帐户。
    • 感谢您的确认!
    【解决方案2】:

    是的,您可以在 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 扩展)。反斜杠仅在以下情况下才保留其特殊含义 后跟以下字符之一:$、`、"、\ 或换行符。 在双引号内,后跟其中之一的反斜杠 字符被删除。反斜杠前面的字符不带 特殊含义保持不变。可以引用双引号 在双引号内加上反斜杠。如果启用, 除非 !出现在双 引号使用反斜杠进行转义。 ! 前面的反斜杠是 未删除。

    特殊参数 * 和 @ 在 double 中具有特殊含义 引号(请参阅 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"
    
    ..................
    

    【讨论】:

    • 嗯,这绝对是我所希望的答案。但是为什么这会说我没有权限呢?我拥有项目的所有权角色...
    • 我的示例中的 user@cloud.com 是项目的所有者,它可以工作,您是否启用了 API gcloud services list | grep dlp.googleapis.com
    • 如果未启用则gcloud services enable dlp.googleapis.com
    • 它在所有项目上都启用了,但仍然拒绝让我使用自己的帐户,它会让我使用服务帐户,而不是我自己的。它甚至可以让我创建服务帐户并分配 dlp.admin 或 bigquery.admin 角色,因为正如我所说,我是项目的所有者。没有意义。
    【解决方案3】:

    有一点需要注意,这与 DLP 略有不同。每个请求实际上涉及两个服务帐户。你用来调用API的那个,但服务本身使用dlp服务帐号转身调用其他服务从存储中读取。

    启用 dlp 后,您会看到此帐户自动创建。看起来像这样... service-[PROJECT_NUMBER]@dlp-api.iam.gserviceaccount.com 并在此处讨论https://cloud.google.com/dlp/docs/iam-permissions#service_account

    我见过的一个常见设置是安全团队将在单个项目中启用 DLP 以扫描他们的整个组织。他们将通过授予他们正在运行的项目中的 service-[PROJECT_NUMBER]@dlp-api.iam.gserviceaccount.com 访问组织中所有其他项目的权限来做到这一点。这将让它读取整个公司的 GCS/BQ。

    【讨论】:

      【解决方案4】:

      如果您发现这篇文章是因为您想通过 Java 客户端仅使用 API 密钥调用 DLP API,请参阅我如何使其工作的要点(在 Scala 中)。基本上必须自己传递标头并明确表示没有其他身份验证机制

      https://gist.github.com/kylejmcintyre/b7ff56cf08addb87ebcf53defa18461f

      在我的例子中,我将所有要检查的数据传递给 API,因此除了调用检查 API 之外,我不关心任何其他身份验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2021-10-18
        相关资源
        最近更新 更多