Usar secretos para almacenar datos sensibles

Puedes usar un Secret para almacenar información de configuración sensible, como contraseñas y claves de acceso, en tu clúster de GKE. En esta página, se describe cómo Config Connector usa los valores de Secret cuando configura tus recursos de Google Cloud .

Descripción general

En esta sección, se presenta una descripción general del uso de Secrets con Config Connector.

Seguridad y encriptación de Secrets en reposo

Debido a que los Secrets de Kubernetes contienen credenciales y cadenas de conexión sensibles, habilita la encriptación de Secrets en la capa de aplicación en tu clúster. GKE encripta los Secrets en reposo de forma predeterminada. La encriptación de Secrets en la capa de aplicación agrega otra capa de seguridad con la encriptación de sobre de Cloud Key Management Service.

Además, usa el control de acceso basado en roles (RBAC) para restringir el acceso de lectura a los Secrets solo a los administradores de clústeres autorizados. Aplica la misma restricción a los recursos de Config Connector que almacenan valores sensibles en sus campos status, como IAMServiceAccountKey.

Usa un secreto cuando creas un recurso

Puedes usar los datos dentro de un secreto cuando creas un recurso. En Pasa un secreto a un recurso, creas un secreto que contiene una contraseña y, luego, haces referencia al secreto para un usuario en una base de datos de Cloud SQL.

Actualización de secretos

Cuando aplicas una actualización a un Secret, Config Connector actualiza el recurso cuando concilia tu estado deseado. Por ejemplo, si actualizas el secreto al que se hace referencia como la contraseña de un SQLUser, Config Connector actualizará la contraseña del usuario.

Eliminar secretos

Si borras un secreto que está en uso por un recurso, Config Connector no quitará la referencia del recurso al secreto. Por ejemplo, si creas un SQLUser con una contraseña que hace referencia a un secreto y, luego, lo borras, la contraseña permanecerá en el SQLUser.

Soluciona problemas

Si creas un recurso que hace referencia a un Secret que no existe, Config Connector creará un evento DependencyNotFound o DependencyInvalid.

Secrets y espacios de nombres de Kubernetes

Debido a que Kubernetes no permite el acceso a Secrets en todos los espacios de nombres, si usas el mismo valor de Secret para recursos de diferentes espacios de nombres, debes aplicar Secrets en cada espacio de nombres.

Pasar un secreto a un recurso

En esta sección, crearás un servidor de Cloud SQL y establecerás la contraseña predeterminada del usuario con un secreto.

Antes de comenzar

Para completar estos pasos, necesitas lo siguiente:

  • Config Connector instalado en un clúster de Kubernetes
  • La API de Cloud SQL Admin habilitada en tu proyecto. Si deseas confirmar que la API está habilitada, ejecuta el siguiente comando de gcloud:

    gcloud services list --filter=sqladmin.googleapis.com
    

    Si el comando imprime Listed 0 items., debes habilitar la API. Puedes habilitar la API con Config Connector y la API de Resource Manager, o un comando de gcloud.

API de Service Usage

  1. Config Connector usa la API de Service Usage para habilitar las APIs de servicio. Para realizar estos pasos, debes habilitar la API de Service Usage. Puedes habilitar esta API con Google Cloud CLI:
    gcloud services enable serviceusage.googleapis.com
  2. Copia el siguiente YAML en un archivo llamado enable-sql.yaml

    apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
    kind: Service
    metadata:
      name: sqladmin.googleapis.com
    
  3. Aplica enable-sql.yaml a tu clúster con kubectl:

    kubectl apply -f enable-sql.yaml --namespace CC_NAMESPACE
    

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

gcloud

Para habilitar la API de SQL Admin con Google Cloud CLI, ejecuta el siguiente comando:

gcloud services enable sqladmin.googleapis.com

Crea un servidor de Cloud SQL

  1. Copia el YAML a continuación en un archivo llamado sql-server-example.yaml. Esto crea un servidor de Cloud SQL llamado sqlserver-1 y un usuario llamado sqluser-sample. La contraseña para sqluser-sample se establece mediante una referencia de recurso a un secreto llamado secret-1.

    apiVersion: sql.cnrm.cloud.google.com/v1beta1
    kind: SQLInstance
    metadata:
      labels:
        label-one: "sql-server-example"
      name: sqlserver-1
    spec:
      region: us-central1
      databaseVersion: MYSQL_5_7
      settings:
        tier: db-g1-small
    ---
    apiVersion: sql.cnrm.cloud.google.com/v1beta1
    kind: SQLUser
    metadata:
      name: sqluser-sample
    spec:
      instanceRef:
        name: sqlserver-1
      host: "%"
      password:
        valueFrom:
          secretKeyRef:
            name: secret-1  # Name of the Secret object to extract a value from
            key: password   # Key that identifies the value to be extracted
    
  2. Copia el YAML a continuación en un archivo llamado example-secret.yaml. Edita el valor de password antes de guardar. Esto declara secret-1, mencionado en la sección anterior.

    apiVersion: v1
    kind: Secret
    metadata:
      name:  secret-1
    stringData:
      password: PASSWORD
    
  3. Aplica las configuraciones a tu clúster.

    kubectl apply -n CC_NAMESPACE -f example-secret.yaml
    kubectl apply -n CC_NAMESPACE -f sql-server-example.yaml
    

    Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

    Config Connector crea la instancia de Cloud SQL y un usuario con la contraseña que especificaste. Esto podría llevar varios minutos.

  4. Espera varios minutos y confirma que la instancia está disponible:

    gcloud sql instances list --filter="name=sqlserver-1"

    La salida debe incluir un servidor con un STATUS de RUNNABLE.

  5. Confirma que puedes conectarte a la instancia de SQL:

    gcloud sql connect sqlserver-1 --user=sqluser-sample

    Se te solicita tu contraseña.

Limpia

Si no deseas conservar la instancia, elimina la instancia de Cloud SQL, el usuario y el secreto con kubectl.

    kubectl delete -n CC_NAMESPACE -f sql-server-example.yaml
    kubectl delete -n CC_NAMESPACE -f example-secret.yaml

Reemplaza CC_NAMESPACE con el espacio de nombres que administra Config Connector.

¿Qué sigue?