1.18 Ensure Secrets are Not Stored in Cloud Functions Environment Variables by Using Secret Manager

Information

Google Cloud Functions allow you to host serverless code that is executed when an event is triggered, without the requiring the management a host operating system. These functions can also store environment variables to be used by the code that may contain authentication or other information that needs to remain confidential.

Rationale:

It is recommended to use the Secret Manager, because environment variables are stored unencrypted, and accessible for all users who have access to the code.

Impact:

There should be no impact on the Cloud Function. There are minor costs after 10,000 requests a month to the Secret Manager API as well for a high use of other functions. Modifying the Cloud Function to use the Secret Manager may prevent it running to completion.

NOTE: Nessus has not performed this check. Please review the benchmark to ensure target compliance.

Solution

Enable Secret Manager API for your Project
From Google Cloud Console

Within the project you wish to enable, select the Navigation hamburger menu in the top left. Hover over 'APIs & Services' to under the heading 'Serverless', then select 'Enabled APIs & Services' in the menu that opens up.

Click the button '+ Enable APIS and Services'

In the Search bar, search for 'Secret Manager API' and select it.

Click the blue box that says 'Enable'.

From Google Cloud CLI

Within the project you wish to enable the API in, run the following command.

gcloud services enable Secret Manager API

Reviewing Environment Variables That Should Be Migrated to Secret Manager
From Google Cloud Console

Log in to the Google Cloud Web Portal (https://console.cloud.google.com/)

Go to Cloud Functions

Click on a function name from the list

Click on Edit and review the Runtime environment for variables that should be secrets. Leave this list open for the next step.

From Google Cloud CLI

To view a list of your cloud functions run

gcloud functions list

For each cloud function run the following command.

gcloud functions describe <function_name>

Review the settings of the buildEnvironmentVariables and environmentVariables. Keep this information for the next step.

Migrating Environment Variables to Secrets within the Secret Manager
From Google Cloud Console

Go to the Secret Manager page in the Cloud Console.

On the Secret Manager page, click Create Secret.

On the Create secret page, under Name, enter the name of the Environment Variable you are replacing. This will then be the Secret Variable you will reference in your code.

You will also need to add a version. This is the actual value of the variable that will be referenced from the code. To add a secret version when creating the initial secret, in the Secret value field, enter the value from the Environment Variable you are replacing.

Leave the Regions section unchanged.

Click the Create secret button.

Repeat for all Environment Variables

From Google Cloud CLI

Run the following command with the Environment Variable name you are replacing in the <secret-id>. It is most secure to point this command to a file with the Environment Variable value located in it, as if you entered it via command line it would show up in your shell's command history.

gcloud secrets create <secret-id> --data-file="/path/to/file.txt"

Granting your Runtime's Service Account Access to Secrets
From Google Cloud Console

Within the project containing your runtime login with account that has the 'roles/secretmanager.secretAccessor' permission.

Select the Navigation hamburger menu in the top left. Hover over 'Security' to under the then select 'Secret Manager' in the menu that opens up.

Click the name of a secret listed in this screen.

If it is not already open, click Show Info Panel in this screen to open the panel.
5.In the info panel, click Add principal.
6.In the New principals field, enter the service account your function uses for its identity. (If you need help locating or updating your runtime's service account, please see the 'docs/securing/function-identity#runtime_service_account' reference.)

In the Select a role dropdown, choose Secret Manager and then Secret Manager Secret Accessor.

From Google Cloud CLI
As of the time of writing, using Google CLI to list Runtime variables is only in beta. Because this is likely to change we are not including it here.

Modifying the Code to use the Secrets in Secret Manager
From Google Cloud Console
This depends heavily on which language your runtime is in. For the sake of the brevity of this recommendation, please see the '/docs/creating-and-accessing-secrets#access' reference for language specific instructions.

From Google Cloud CLI
This depends heavily on which language your runtime is in. For the sake of the brevity of this recommendation, please see the' /docs/creating-and-accessing-secrets#access' reference for language specific instructions.

Deleting the Insecure Environment Variables - Be certain to do this step last. Removing variables from code actively referencing them will prevent it from completing successfully.

From Google Cloud Console

Select the Navigation hamburger menu in the top left. Hover over 'Security' then select 'Secret Manager' in the menu that opens up.

Click the name of a function. Click Edit.

Click Runtime, build and connections settings to expand the advanced configuration options.

Click 'Security'. Hover over the secret you want to remove, then click 'Delete'.

Click Next. Click Deploy. The latest version of the runtime will now reference the secrets in Secret Manager.

From Google Cloud CLI

gcloud functions deploy <Function name>--remove-env-vars <env vars>

If you need to find the env vars to remove, they are from the step where 'gcloud functions describe <function_name>' was run.

Default Value:

By default Secret Manager is not enabled.

See Also

https://workbench.cisecurity.org/benchmarks/9562

Item Details

Category: IDENTIFICATION AND AUTHENTICATION, SYSTEM AND COMMUNICATIONS PROTECTION

References: 800-53|IA-5(1), 800-53|SC-28, 800-53|SC-28(1), CSCv7|14.8, CSCv7|16.4

Plugin: GCP

Control ID: 75ec528da117d5250ec7a532c6b2e1d435c6f3d3caf30b2fd9afcc49a31d24d5