Today I stumbled up a problem where sops refused to decode my file:
That is, sops complained that Google KMS service I use to encrypt/decrypt the keys behind the scenes is diabled in my proejct. Which didn't make sense - after all, I created KMS keys in that project so the service must be enabled.
I inspected the project id After checking environment variables, KMS key location in the encrypted file I had no other options but to try One easy fix is to run What is there was a way to simply tell sops (and others) to use project owning the resource (the KMS key in my case) as a billing project as well? Apparently there is a way:
Failed to get the data key required to decrypt the SOPS file.
Group 0: FAILED
projects/foo/locations/global/keyRings/foo-keyring/cryptoKeys/foo-global-key: FAILED
- | Error decrypting key: googleapi: Error 403: Cloud Key
| Management Service (KMS) API has not been used in project
| 123xxxxxx before or it is disabled. Enable it by visiting
| https://console.developers.google.com/apis/api/cloudkms.googleapis.com/overview?project=123xxxxxxx
| then retry. If you enabled this API recently, wait a few
| minutes for the action to propagate to our systems and
| retry.
| Details:
| [
| {
| "@type": "type.googleapis.com/google.rpc.Help",
| "links": [
| {
| "description": "Google developers console API
| activation",
| "url":
| "https://console.developers.google.com/apis/api/cloudkms.googleapis.com/overview?project=123xxxxxxx"
| }
| ]
| },
| {
| "@type": "type.googleapis.com/google.rpc.ErrorInfo",
| "domain": "googleapis.com",
| "metadata": {
| "consumer": "projects/123xxxxxxx",
| "service": "cloudkms.googleapis.com"
| },
| "reason": "SERVICE_DISABLED"
| }
| ]
| , accessNotConfigured
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.
123xxxxxxx
the error was referring to and was surprised to find out that it belongs to a project bar
and not the project foo
I was working on (and the one where KMS keys where stored at).
strace
on sops binary to find out was causes sops to go with project bar
instead of foo
. And bingo - it looked at ~/.config/gcloud/application_default_credentials.json
file which has quota_project_id
parameter pointing straight to bar
.
gcloud auth application-default set-quota-project foo
. It basically tells Google SDK to use foo
as a billing project when calling KMS service (KMS API distinguishes between calling project and resource-owning project as explained here. It works but it's a fragile solution - if you are working on several projects in parallel you need to remember to switch back and forth to the correct project since these particular applicatoin-default settings can not be controlled from environment variables.
And voilĂ - it works!
gcloud auth application-default login --disable-quota-project
...
Credentials saved to file: [~/.config/gcloud/application_default_credentials.json]
These credentials will be used by any library that requests Application Default Credentials (ADC).
WARNING:
Quota project is disabled. You might receive a "quota exceeded" or "API not enabled" error. Run $ gcloud auth application-default set-quota-project to add a quota project.
Friday, November 11, 2022
Pointing Mozilla SOPS into the right direction
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment