Как настроить клиентскую библиотеку Google Cloud Platform для предотвращения потери данных для работы Python за SSL-прокси? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь использовать клиентскую библиотеку Google DOS для облачной платформы, работающую за прокси-сервером 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

Она запускается без проблем, когда U не находится за SSL-прокси.Когда я работаю за прокси-сервером, я устанавливаю 3 переменные ENV:

REQUESTS_CA_BUNDLE
HTTP_PROXY
HTTPS_PROXY

При такой настройке другие библиотеки Python клиента GCP прекрасно работают за SSL-прокси, например, для хранилища или больших запросов).

Для Python-библиотеки DLP-клиента я получаю:

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 ...

Я не нашел в документации, объясняющей, работает ли библиотека с прокси-сервером как одна клиентская библиотека GCP и как ее настроить.это работает с SSL-прокси.Библиотека находится в бета-версии, поэтому, возможно, она еще не реализована.

Похоже, она связана с сертификатом CA и рукопожатием.Нет проблем с тем же CA для BigQuery и Storage Client python lib.Есть идеи?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Ваш прокси выполняет TLS Interception.Это приводит к тому, что библиотеки Google не доверяют SSL-сертификату, который ваш прокси-сервер предоставляет при доступе к конечным точкам Google API.Это проблема посредника.

Решение состоит в том, чтобы обойти прокси для API Google.В вашей подсети VPC, где работает ваше приложение, включите частный доступ к Google.Для этого необходимо, чтобы правило маршрутизации VPC по умолчанию все еще существовало (или пересоздало его).

Частный доступ к Google

[ПРАВИТЬ после комментариев ниже]

Я добавляю этот комментарий, чтобы напугать пчелиный воск из-под управления.

Перехват TLS настолько опасен, что ни одна разумная компания не осуществит его, если прочтет следующее.

Сценарийв этом примере.Я айтишник, отвечающий за корпоративный прокси.В компании реализован TLS Interception, и я контролирую прокси.У меня нет доступа к ресурсам Google Cloud для моей компании.Я очень умен и хорошо понимаю Google Cloud IAM и OAuth.Я собираюсь взломать мою компанию, потому что, возможно, я не получил повышение (придумать собственную причину).

Я жду, пока один из менеджеров, у которого есть разрешения на уровне организации или владельца / редактора, пройдет аутентификацию в Google.Облако.Мой прокси-сервер регистрирует HTTPS-заголовки, тело и ответ для всего, что идет к https://www.googleapis.com/oauth2/v4/token, и еще несколько URL.

Возможно, прокси хранит журналы в Google Cloud Bucket или в томе SAN без активной авторизации.Может быть, я всего лишь инженер-программист, который находит файлы журнала прокси-сервера, которые лежат или легко доступны.

Корпоративный администратор входит в свою учетную запись Google.Я получаю возвращенный токен доступа OAuth.Теперь я могу выдавать себя за администратора организации в течение следующих 3600 секунд.Кроме того, я получаю маркер обновления OAuth.Теперь я могу воссоздать токены доступа OAuth по своему желанию в любое время, пока не будет отменен токен обновления, который для большинства компаний никогда не отменяется.

Для сомневающихся изучите мой проект Golang, в котором показано, как сохранить токены доступа OAuth иОбновить токены в файл для любой учетной записи Google, используемой для аутентификации.Я могу взять этот файл домой и получить авторизацию без какой-либо аутентификации.Этот код воссоздает токен доступа по истечении срока его действия, предоставляя мне почти вечный доступ к любой учетной записи, для которой эти учетные данные авторизованы.Ваши внутренние ИТ-ресурсы никогда не узнают, что я делаю это за пределами вашей корпоративной сети.

Примечание. В журнале аудита Stackdriver Audit может регистрироваться IP-адрес, однако идентификационные данные будут теми учетными данными, которые я украл.Чтобы скрыть свой IP-адрес, я бы пошел в Starbucks или публичную библиотеку в нескольких часах езды от моего дома / работы и оттуда делал свои дела.Теперь выясните, где и кто для этого хакера.Это приведет к изжоге у судебного эксперта.

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

Примечание. Эта проблема не связана с Google OAuth или Google Cloud.Это пример проблемы безопасности, развернутой компанией (перехват TLS).Этот стиль техники будет работать почти для всех известных мне систем аутентификации, которые не используют MFA.

[END EDIT]

0 голосов
/ 29 сентября 2019

Сводка:

  1. Клиентская библиотека предотвращения потери данных для python использует gRCP.google-cloud-dlp использует gRPC, а google-cloud-bigquery и google-cloud-storage используют библиотеку запросов для JSON-over-HTTPS.Поскольку это gRPC, необходимо настроить другую переменную env:

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

    Более подробную информацию и ссылки можно найти здесь ссылка

  2. Это не решает проблемувсе проблемы, потому что он продолжает отказывать после квитирования (прокси TLS), как описано здесь ссылка .Как хорошо объяснил @Джон Хэнли, мы должны вместо этого включить Частный доступ к Google, который является рекомендуемым и безопасным способом.Это еще не сделано в сетевой зоне. Я использую API, поэтому прокси-команда добавила обход SSL, и теперь она работает.Я жду, чтобы в частном доступе к Google Access была чистая и безопасная настройка для использования API GCP.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...