代码之家  ›  专栏  ›  技术社区  ›  Dr. Fabien Tarrade

如何配置Google云平台数据丢失预防客户端库,以便python在SSL代理后工作?

  •  0
  • Dr. Fabien Tarrade  · 技术社区  · 7 年前

    我正在尝试让Google Cloud Platform Data Loss Prevention(DLP)python客户端库在SSL代理之后工作: https://cloud.google.com/dlp/docs/libraries#client-libraries-usage-python

    我正在使用文档中的代码片段:

    # Import the client library
    import google.cloud.dlp
    import os
    import subprocess
    import json
    import requests
    import getpass
    import urllib.parse
    
    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    
    # Instantiate a client.
    dlp_client = google.cloud.dlp.DlpServiceClient()
    
    # The string to inspect
    content = 'Robert Frost'
    
    # Construct the item to inspect.
    item = {'value': content}
    
    # The info types to search for in the content. Required.
    info_types = [{'name': 'FIRST_NAME'}, {'name': 'LAST_NAME'}]
    
    # The minimum likelihood to constitute a match. Optional.
    min_likelihood = 'LIKELIHOOD_UNSPECIFIED'
    
    # The maximum number of findings to report (0 = server maximum). Optional.
    max_findings = 0
    
    # Whether to include the matching string in the results. Optional.
    include_quote = True
    
    # Construct the configuration dictionary. Keys which are None may
    # optionally be omitted entirely.
    inspect_config = {
        'info_types': info_types,
        'min_likelihood': min_likelihood,
        'include_quote': include_quote,
        'limits': {'max_findings_per_request': max_findings},
    }
    
    # Convert the project id into a full resource id.
    parent = dlp_client.project_path('my-project-id')
    
    # Call the API.
    response = dlp_client.inspect_content(parent, inspect_config, item)
    
    # Print out the results.
    if response.result.findings:
        for finding in response.result.findings:
            try:
                print('Quote: {}'.format(finding.quote))
            except AttributeError:
                pass
            print('Info type: {}'.format(finding.info_type.name))
            # Convert likelihood value to string respresentation.
            likelihood = (google.cloud.dlp.types.Finding.DESCRIPTOR
                          .fields_by_name['likelihood']
                          .enum_type.values_by_number[finding.likelihood]
                          .name)
            print('Likelihood: {}'.format(likelihood))
    else:
        print('No findings.')
    

    我还设置了以下ENV变量:

    GOOGLE_APPLICATION_CREDENTIALS
    

    当你不在SSL代理后面时,它可以正常运行。当我在代理后面工作时,我会设置3个环境变量:

    REQUESTS_CA_BUNDLE
    HTTP_PROXY
    HTTPS_PROXY
    

    在这种设置下,其他GCP客户端python库在SSL代理(例如存储或bigquery)后可以正常工作。

    对于DLP客户端python库,我得到:

    E0920 12:21:49.931000000 24852 src/core/tsi/ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed.
    DEBUG:google.api_core.retry:Retrying due to 503 Connect Failed, sleeping 0.0s ...
    E0920 12:21:50.927000000 24852 src/core/tsi/ssl_transport_security.cc:1229] Handshake failed with fatal error SSL_ERROR_SSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed.
    DEBUG:google.api_core.retry:Retrying due to 503 Connect Failed, sleeping 0.0s ...
    

    我在文档中没有找到解释lib是否作为一个GCP客户端lib与proxy一起工作,以及如何将其配置为与SSL proxy一起工作的说明。lib处于测试阶段,因此可能尚未实现。

    这似乎与CA证书和握手有关。对于BigQuery和存储客户端python库,相同的CA没有问题。知道吗?

    0 回复  |  直到 7 年前
        1
  •  1
  •   John Hanley    7 年前

    你的代理正在执行 TLS Interception 。这会导致谷歌库不信任您的代理在访问谷歌API端点时提供的SSL证书。这是一个中间人的问题。

    解决方案是绕过谷歌API的代理。在应用程序运行的VPC子网中,启用私有Google访问。这要求默认的VPC路由规则仍然存在(或重新创建)。

    Private Google Access

    [在下面的评论后编辑]

    我加上这句话是为了吓跑管理层。

    TLS拦截非常危险,如果他们阅读以下内容,任何合理的公司都不会实施它。

    本例中的场景。我是负责公司代理的IT人员。该公司已实施TLS拦截,我控制代理。我无法访问公司的谷歌云资源。我非常聪明,我非常了解谷歌云IAM和OAuth。我要黑我的公司,因为我可能没有得到加薪(编造你自己的理由)。

    我等待一位拥有组织或项目所有者/编辑级别权限的经理通过谷歌云的身份验证。我的代理记录了HTTPS的头、正文和响应,所有内容都将被删除 https://www.googleapis.com/oauth2/v4/token 还有一些网址。

    可能代理将日志存储在Google Cloud Bucket或SAN卷上,而没有实现可靠的授权。也许我只是一个软件工程师,发现代理日志文件随处可见或很容易访问。

    公司管理员登录他的谷歌账户。我捕获返回的OAuth访问令牌。我现在可以在接下来的3600秒内模拟组织管理员。此外,我还捕获了OAuth刷新令牌。现在,我可以随时根据自己的意愿重新创建OAuth访问令牌,直到刷新令牌被撤销,而对于大多数公司来说,他们永远不会这样做。

    对于怀疑者,请学习我的Golang项目,该项目展示了如何保存OAuth访问令牌,并将令牌刷新到用于验证的任何Google帐户的文件中。我可以把这个文件带回家,无需任何身份验证即可获得授权。此代码将在访问令牌过期时重新创建,使我几乎永远可以访问这些凭据授权的任何帐户。你的内部IT资源永远不会知道我在你的公司网络之外做这件事。

    注意:Stackdriver审计日志可以捕获IP地址,但是,身份将是我窃取的凭据。为了隐藏我的IP地址,我会去星巴克或公共图书馆,从我家/工作地点开车几个小时,然后在那里做我的事情。现在找出这个黑客的位置和身份。这会让法医专家感到心痛。

    https://github.com/jhanley-com/google-cloud-shell-cli-go

    注意:这个问题与Google OAuth或Google Cloud无关。这是该公司部署的安全问题(TLS拦截)的一个例子。这种技术将适用于我所知的几乎所有不使用MFA的身份验证系统。

    [结束编辑]

        2
  •  0
  •   Dr. Fabien Tarrade    6 年前

    总结:

    1. python数据丢失预防客户端库使用gRCP。 google cloud dlp使用gRPC,而google cloud bigquery和 谷歌云存储依赖于请求库 HTTPS上的JSON。因为它是gRPC,所以需要使用其他环境变量 设置:

      GRPC_DEFAULT_SSL_ROOTS_FILE_PATH=path_file.pem  
      # for debugging
      RPC_TRACE=transport_security,tsi  
      GRPC_VERBOSITY=DEBUG
      

      更多细节和链接可以在这里找到 link

    2. 这并不能解决所有的问题,因为它会在之后继续失败 这里描述的握手(TLS代理) link 也 由@John Hanley解释,我们应该启用私有谷歌访问 相反,这是推荐的安全方式。这还没有开始 在网络区域中放置我正在使用的API,以便代理团队 添加了一个SSL旁路,现在可以工作了。我正在等待私人谷歌访问enbale,以有一个干净和安全的设置来使用GCP API。