securitygoogle-cloud-functionsgoogle-cloud-source-repos

Google Cloud Functions - How to securely store service account private key when using Google Source Repository?


I use Google Source Repository to store my Google Cloud Functions. (Git repo hosted by Google, basically)

One of my function needs to access a private Google Sheet file, I therefore created a Service Account. (With way too many rights since it's so hard to understand what exact rights we should give to a service account, and so hard to update later on, but I digress)

Now, it's clearly not recommended to store the Service Account JSON file in the git repository itself for obvious reasons. Here is what it looks like (stripped from values)

{
  "type": "service_account",
  "project_id": "",
  "private_key_id": "",
  "private_key": "",
  "client_email": "",
  "client_id": "",
  "auth_uri": "",
  "token_uri": "",
  "auth_provider_x509_cert_url": "",
  "client_x509_cert_url": ""
}

I have been looking at environment variables to configure for a Functions or something alike but didn't find anything. Tracking the key (and therefore potentially duplicating that file on several repositories) really doesn't sound such a good idea. But I haven't found any "proper" way to do it yet. And due to the way Google Functions work, I can't think of anything else but env variables.


Solution

  • My solution when using cloud function with a service account is:

    1. Encrypt your service account credential json file using Cloud KMS/vault and upload it to Cloud Storage.
    2. Fetch service account credential json file from Cloud Storage and decrypt it using a Cloud KMS service account which has encrypt/decrypt permission.

    3. Parse service account credential json file at runtime and get private_key, client_email and projectId.

    4. Pass these three secret variables to the client library

    We store config variables as environment variables for cloud function, they are plain text, but it's ok. Because they are not secret things.

    We must not store secret things like plain text, e.g cloud function environment variables.