Как надежно работает шифрование / дешифрование CloudKMS при вызове из системы, не принадлежащей Google?
Мне нужно знать, что plaintext
/ ciphertext
отправка в Google CloudKMS и открытый / закрытый ключ, используемый для аутентификации, безопасны при передаче, но я не знаю, как это доказать.
В соответствии с документами KMS я создал учетную запись службы, загрузил файл ключей JSON и подключил его через переменную среды GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
,
Я использую гем google-api-client (в версии 0.10.3
, выпущен 13 месяцев, потому что я не могу установить mime-types >= 3.0
при использовании padrino-mailer: смотрите этот коммит), проверили Google::Apis::CloudkmsV1::CloudKMSService
методы encrypt_crypto_key
а также decrypt_crypto_key
И они работают хорошо.
Я попытался прочитать исходные коды гемов google-api-client, googleauth и signet. Все, в чем я уверен, это:
- Файл ключа JSON загружен и
private_key
значение используется, чтобы сделатьOpenSSL::PKey::RSA.new
Вот Signet::OAuth2::Client
дается ключ RSA какsigning_key
в этом файле
Я считаю, что безопасность доказана, если файл ключа JSON используется для шифрования строки, отправленной через encrypt_crypto_key
на вызывающем сервере, а также расшифровать строку, полученную decrypt_crypto_key
и сервер CloudKMS на другом конце ведет себя аналогичным образом. Это то, что я предполагаю, что библиотека делает - сквозное шифрование - но я должен увидеть это, чтобы поверить в это. Я попытался просмотреть трафик в Wireshark, но не смог понять его смысл (возможно, этот факт доказывает это? Я не знаю)
Может ли кто-нибудь помочь мне доказать или опровергнуть этот метод вызова CloudKMS для шифрования / дешифрования пользовательских данных - использование гема google-api-client с файлом ключа JSON, загруженным в соответствии с документами, - безопасно?
Связанный: для тех из вас, кто интересуется, API CloudKMS находится на пути к включению в новую драгоценность google-cloud.
1 ответ
Связь между вашим клиентом и Google защищена через TLS. В Wireshark вы можете видеть, что связь осуществляется через порт 443, и что соединение TLS согласовано.
Ваши запросы аутентифицируются с использованием OAuth. В этом случае (используя учетную запись службы из-за пределов GCP) это выполняется с использованием потока, документированного в разделе Использование OAuth 2.0 для серверных приложений:
- Вы несете ответственность за предоставление приложению вне GCP закрытого ключа, выданного учетной записи службы, которую вы хотите подтвердить;
- затем он использует этот закрытый ключ для подписи JWT и отправки его на OAuth-сервер Google;
- Google отвечает маркером доступа OAuth, который является учетными данными на предъявителя, которые идентифицируют соответствующую учетную запись службы;
- Затем вы предоставляете этот токен доступа с вашими запросами в KMS, чтобы идентифицировать объект, который отправляет запросы в качестве учетной записи службы и использует свои полномочия;
- Затем KMS и GCP используют эту идентификацию для оценки контроля доступа IAM, чтобы определить, разрешены ли определенные операции.
Это защищенное сквозное соединение (соединение TLS является сквозной защитой, поскольку стороны связи - ваша служба и Google - являются конечными точками TLS). Поскольку ваш вопрос выглядит так: "Являются ли эти запросы безопасными при передаче и как я могу это показать", я думаю, что достаточно показать, что происходит согласование соединения TLS, Wireshark должна показать вам это. (Ваша библиотека подключений также должна выполнить подходящую оценку PKI представленного сертификата; проверка того, что это происходит правильно, немного сложнее, но разумно доверять тому, что происходит правильно, если вы исследуете инструменты, которые используете и их утверждения о проверке сертификата).
С наилучшими пожеланиями и спасибо за использование GCP и Cloud KMS. Дайте нам знать, если у вас есть дополнительные вопросы.