Как пользователи могут доказать, что конкретная учетная запись имеет доступ к BigQuery? (Шифрование AEAD и авторизованные просмотры) - PullRequest
1 голос
/ 14 мая 2019

Я провожу мероприятие, на котором нескольким людям нужен доступ к BigQuery, и я хочу, чтобы они пришли мне подтверждение того, что у них есть доступ:

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

Как пользователь может доказать, что его учетная запись электронной почты имеет доступ к BigQuery?

Мне интересно, могли бы мы создать решение с авторизованными представлениями и функциями шифрования.

1 Ответ

3 голосов
/ 14 мая 2019

Мы собираемся использовать авторизованные представления и новую функцию шифрования AEAD s.

Сначала давайте создадим ключ, который только я могу видеть в одном из моих личных наборов данных:

CREATE TABLE `secrets.keys`
AS 
SELECT KEYS.NEW_KEYSET('AEAD_AES_GCM_256') key, CURRENT_TIMESTAMP() ts, 'for_a_view' label

Теперь я могу создать представление в общедоступном наборе данных, которое использует SESSION_USER() и AEAD.ENCRYPT():

SELECT SESSION_USER() user, ts, key_ts, key_label
  , AEAD.ENCRYPT(key, FORMAT('%s|%t', SESSION_USER(), ts), '') enc_user_ts
  , AEAD.ENCRYPT(key, SESSION_USER(), '') enc_user
  , AEAD.ENCRYPT(key, CAST(ts AS STRING), '') enc_ts

FROM (SELECT CURRENT_TIMESTAMP() ts)
, (SELECT ts key_ts, key, label key_label FROM `fh-bigquery.secrets.keys`  WHERE label='for_a_view')

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

enter image description here

Теперь любой может выполнить следующий запрос:

SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`

Что возвращает:

AQElE+8cn+uHouGhZO7895UNjVs3/k05ZJLkEceQ8kszHJjQkbvuB6Vx/miDi3DhFTty7ZifXps1VKWC5OtTrQOkCQqoFFQu+VkDfz9F65R5f3PGPA==

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

Расшифровка с моим секретным ключом:

SELECT AEAD.DECRYPT_STRING(key, FROM_BASE64('AQElE+8cn+uHouGhZO7895UNjVs3/k05ZJLkEceQ8kszHJjQkbvuB6Vx/miDi3DhFTty7ZifXps1VKWC5OtTrQOkCQqoFFQu+VkDfz9F65R5f3PGPA=='), '')
FROM (SELECT key FROM `fh-bigquery.secrets.keys` WHERE label='for_a_view' LIMIT 1)

, который возвращает:

⬛⬛⬛⬛⬛⬛⬛⬛e@gmail.com|2019-05-14 03:51:15.047791+00   

Обратите внимание, что это именно та учетная запись и метка времени, которые они использовали для выполнения своего запроса!

И вот как - если мне когда-нибудь понадобятся доказательства того, что учетная запись, которую вы мне сообщаете, используете BigQuery, является независимойВ этой учетной записи я попрошу вас выполнить следующий запрос и поделиться со мной его результатом:

SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
...