Аутентификация облачного хранилища данных Google c # SDK

#google-cloud-datastore

#google-cloud-хранилище данных

Вопрос:

Я пытаюсь аутентифицировать хранилище данных Google c # SDK в модуле k8, работающем в Google Cloud. Я не смог найти никакого способа ввести файл account.json в DatastoreDb или DatastoreClient, кроме использования переменной среды GOOGLE_APPLICATION_CREDENTIALS. Использование переменной среды GOOGLE_APPLICATION_CREDENTIALS проблематично, поскольку я не хочу оставлять файл учетной записи открытым.

Согласно документации в:https://googleapis.github.io/google-cloud-dotnet/docs/Google .Облако.Datastore.V1/index.html

При запуске на облачной платформе Google не требуется предпринимать никаких действий для аутентификации.

Но, похоже, это не работает.

Мы будем признательны за подсказку в правильном направлении (:

Ответ №1:

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

  1. Создайте учетную запись службы для нужного приложения.
  2. Сгенерируйте и закодируйте ключ учетной записи службы: просто сгенерируйте .json ключ для вновь созданной учетной записи службы на предыдущем шаге, а затем закодируйте его с помощью base64 -w 0 key-file-name . Это важно: K8S ожидает, что содержимое секрета будет закодировано в Base64.
  3. Создайте файл секретного манифеста K8s (см. Содержимое ниже), а затем примените его.

    apiVersion: v1
    kind: Secret
    metadata:
    name: your-service-sa-key-k8s-secret
    type: Opaque
    data:
    sa_json: previously_generated_base64_encoding

  4. Смонтируйте секрет.

        volumes:
     - name: service-account-credentials-volume
       secret:
         secretName: your-service-sa-key-k8s-secret
         items:
         - key: sa_json
           path: secrets/sa_credentials.json
      

Теперь все, что вам нужно сделать, это установить для GOOGLE_APPLICATION_CRENDENTIALS значение secrets/sa_credentials.json.

Надеюсь, это поможет. Извините за форматирование (в спешке).

Комментарии:

1. Это то, что я закончил делать, прежде чем задать вопрос. К сожалению, это не соответствует спецификации безопасности, в соответствии с которой я работаю, поскольку файл учетной записи в конечном итоге не зашифрован в файловой системе pod. (термин k8 «секрет» вводит в заблуждение) Я ценю совет @Andrey Balici

2. Возможно, это поможет: kubernetes.io/docs/tasks/administer-cluster/encrypt-data . На самом деле никогда этого не делал, но, возможно, это отправная точка для вас.

Ответ №2:

Вот как это можно сделать:

 учетные данные var = 
 Учетные данные Google.Из файла (@"/path/to/google.credentials.json").CreateScoped(DatastoreClient.Области по умолчанию);
 var channel = новый Grpc.Core.Канал (DatastoreClient.Конечная точка по умолчанию.toString(), учетные данные.ToChannelCredentials());

 Клиент хранилища данных = DatastoreClient.Создать (канал, настройки: 
 Настройки хранилища данных.getDefault());
 DatastoreDb db = DatastoreDb.Create(YOUR_PROJECT_ID, client: клиент);
 // Что делать с хранилищем данных...
 // Выключите канал, когда он больше не требуется.
 ожидание канала.ShutdownAsync();

Взято из:https://github.com/googleapis/google-cloud-dotnet/blob/master/apis/Google .Облако.Datastore.V1 / Google.Облако.Datastore.V1/DatastoreClient.cs