Sops не может расшифровать файл gcp kms в Circleci, несмотря на то, что GOOGLE_APPLICATION_CREDENTIALS успешно настроен для учетной записи службы json - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь настроить задание на моем локальном окружности (используя docker executor, изображение: google/cloud-sdk:latest), и для этого задания требуется расшифровка зашифрованного файла sops gcp kms. Я настроил учетную запись службы Google для службы расшифровки gcp kms (я могу запустить сценарий, который будет запускаться через задание circleci, успешно локально, расшифровав файл sops через учетную запись службы, поэтому я знаю, что настройка учетной записи службы действительна) , Вот как я выполняю свою работу.

1 - я base64 кодирую учетную запись службы Google json файл: base64 path/to/service_aacount_file.json

2 - я запускаю работу circleci, устанавливая переменную среды GCLOUD_SERVICE_KEY на circleci, с закодированным в base64 содержимым из предыдущего шага: circleci local execute --env GCLOUD_SERVICE_KEY='<Base64EncodedServiceAccountJsonFileContent>' --job '<MyJob>'

3- Вот моя конфигурация circleci:

- run:
          name: <MyJob>
          command: |
            apt-get install -y docker
            apt-get install -y sudo
            cd $(pwd)/path/to/jobcode
            echo $GCLOUD_SERVICE_KEY | base64 -d > ${HOME}/<MyGoogleServiceAccountJsonFile.json>
            export GOOGLE_APPLICATION_CREDENTIALS="${HOME}/<MyGoogleServiceAccountJsonFile.json>" 
            gcloud auth activate-service-account --key-file ${HOME}/<MyGoogleServiceAccountJsonFile.json>
            echo $GOOGLE_APPLICATION_CREDENTIALS
            ls -halt $GOOGLE_APPLICATION_CREDENTIALS
            cat $GOOGLE_APPLICATION_CREDENTIALS
            sudo ./<RunJob.sh>

4 - Я получаю следующую ошибку при выполнении задания:

Failed to get the data key required to decrypt the SOPS file.

Group 0: FAILED
  projects/<MyProject>/locations/<MyLocation>/keyRings/<MySopsKeyring>/cryptoKeys/<MyKey>: FAILED
    - | Cannot create GCP KMS service: google: could not find
      | default credentials. See
      | https://developers.google.com/accounts/docs/application-default-credentials
      | for more information.

Recovery failed because no master key was able to decrypt the file. In
order for SOPS to recover the file, at least one key has to be successful,
but none were.

5- Далее из вывода консоли:

a- Я вижу, что учетная запись службы была успешно активирована: Activated service account credentials for: [<MyServiceAccount>@<MyProject>.iam.gserviceaccount.com]

b- GOOGLE_APPLICATION_CREDENTIALS Переменная окружения установлена ​​для учетной записи службы json: /path/to/service_account.json

c - вышеуказанный файл был правильно декодирован в base64 и содержит действительные json:

{
    "client_x509_cert_url": "<MyUrl>",
    "auth_uri": "<MyAuthUri>",
    "private_key": "<MyPrivateKey>",
    "client_email": "<ClientEmail>",
    "private_key_id": "<PrivateKeyId>",
    "client_id": "<ClientId>",
    "token_uri": "<TokenUri>",
    "project_id": "<ProjectId>",
    "type": "<ServiceAccount>",
    "auth_provider_x509_cert_url": "<AuthProviderCertUrl>"
}

6- Некоторые другие вещи, которые я пробовал:

a- Попытка установки имени проекта Google в переменных среды, но все еще та же ошибка.

b- Попытка установки GOOGLE_APPLICATION_CREDENTIALS для содержимого файла вместо путь к файлу, но aga с тем же результатом.

c - Попытка установки GOOGLE_APPLICATION_CREDENTIALS путем предоставления пути к файлу без кавычек или одинарных кавычек, но все равно без разницы.

d - Попытка установки $ BASH_ENV с помощью echo 'export GOOGLE_APPLICATION_CREDENTIALS=path/to/service_account.json' >> $BASH_ENV, но та же ошибка

Пожалуйста, помогите.

1 Ответ

1 голос
/ 10 февраля 2020

Пять опций, которые могут работать:

  1. Попробуйте выполнить следующую команду: gcloud auth application-default login
  2. Попробуйте эту команду, чтобы задать переменную env: echo 'export GOOGLE_APPLICATION_CREDENTIALS=/tmp/service-account.json' >> $BASH_ENV
  3. Другое дело, что я вижу, что runjob. sh работает под root. Возможно, учетные данные gcp не отображаются под sudo по умолчанию. Либо запустите скрипт без sudo, либо выполните предыдущие команды с sudo.
  4. В качестве крайней меры (эти варианты работали для меня, в вашем сценарии могут отличаться): { echo 1; echo 1; echo n; } | gcloud init
  5. gcloud components update Это иногда работает, когда SDK устарел.
  6. config set project [PROJECT_NAME]

Вы также можете проверить активные учетные записи с: gcloud auth list

...