Habilitar llaves de seguridad con OS Login


En este documento se describe cómo usar las llaves de seguridad físicas registradas en tu cuenta de Google para conectarte a instancias de máquina virtual (VM) que usan Inicio de sesión del SO.

Las llaves de seguridad físicas se usan para generar archivos de claves SSH privadas para conectarse a las VMs. Cuando usas la herramienta Google Cloud SSH en el navegador de la consola o la CLI de Google Cloud para conectarte a las VMs con llaves de seguridad, Inicio de sesión del SO recupera el archivo de claves SSH privadas asociado a tu llave de seguridad y lo configura por ti. Cuando uses herramientas de terceros para conectarte, debes usar la API OS Login para obtener la información de la clave SSH y configurar el archivo de claves SSH tú mismo.

Antes de empezar

  • Añade una llave de seguridad a tu cuenta de Google.
  • Configurar OS Login.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

    REST

    Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.

      Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Limitaciones

  • Las VMs que tienen habilitadas las llaves de seguridad solo aceptan conexiones de llaves SSH que estén asociadas a las llaves de seguridad físicas registradas en tu cuenta de Google.
  • No puedes usar Cloud Shell para conectarte a VMs que tengan habilitadas las llaves de seguridad.
  • Tanto la máquina virtual a la que te conectas como la estación de trabajo desde la que te conectas deben usar una versión de OpenSSH 8.2 o posterior que admita tipos de SSH de clave de seguridad. Los siguientes sistemas operativos de máquinas virtuales de Compute Engine admiten llaves de seguridad:

    • Debian 11 (o versiones posteriores)
    • SUSE Linux Enterprise Server (SLES) 15 (o versiones posteriores)
    • Ubuntu 20.04 LTS (o versiones posteriores)
    • Container-Optimized OS 93 LTS (o una versión posterior)
    • Rocky Linux 9 (o versiones posteriores)

    Para comprobar si tu entorno admite llaves de seguridad, ejecuta el siguiente comando:

    ssh -Q key | grep ^sk-
    

    Si el comando no devuelve ningún resultado, significa que tu entorno no admite llaves de seguridad.

  • El cliente SSH de la estación de trabajo desde la que te conectas debe admitir llaves de seguridad e incluir las bibliotecas necesarias, como libfido2.

Habilitar llaves de seguridad con OS Login

Puedes habilitar el uso de llaves de seguridad en todas las VMs que usen OS Login en tu proyecto o en VMs concretas.

Habilitar las llaves de seguridad en todas las VMs de un proyecto que tengan habilitado OS Login

Para habilitar las llaves de seguridad en todas las VMs que usen OS Login en tu proyecto, utiliza laGoogle Cloud consola o la CLI de gcloud.

Consola

Para habilitar las llaves de seguridad en todas las VMs que tengan habilitado OS Login, usa laGoogle Cloud consola para definir enable-oslogin y enable-oslogin-sk en TRUE en los metadatos del proyecto:

  1. Ve a la página Metadatos.

    Ir a Metadatos

  2. Haz clic en Editar.

  3. Haz clic en Añadir elemento.

    1. En el campo Key (Clave), introduce enable-oslogin.
    2. En el campo Valor, introduce TRUE.
  4. Haz clic en Añadir elemento.

    1. En el campo Key (Clave), introduce enable-oslogin-sk.
    2. En el campo Valor, introduce TRUE.
  5. Haz clic en Guardar.

gcloud

Para habilitar las llaves de seguridad en todas las VMs con OS Login habilitado, usa el comando gcloud compute project-info add-metadata para definir enable-oslogin=TRUE y enable-oslogin-sk=TRUE en los metadatos del proyecto:

gcloud compute project-info add-metadata \
    --metadata enable-oslogin=TRUE,enable-oslogin-sk=TRUE

Habilitar llaves de seguridad en una sola máquina virtual con inicio de sesión del SO habilitado

Para habilitar las llaves de seguridad en una VM que use OS Login, utiliza laGoogle Cloud consola o la CLI de gcloud.

Consola

Para habilitar las llaves de seguridad en una sola VM, usa la consola para definir Google Cloud y enable-oslogin-sk como TRUE en los metadatos de la instancia:enable-oslogin

  1. Ve a la página Instancias de VM.

    Ir a instancias de VM

  2. Haga clic en el nombre de la VM en la que quiera habilitar las llaves de seguridad.

  3. Haz clic en Editar.

  4. En la sección Metadatos, haz clic en Añadir elemento.

    1. En el campo Key (Clave), introduce enable-oslogin.
    2. En el campo Valor, introduce TRUE.
  5. Haz clic en Añadir elemento.

    1. En el campo Key (Clave), introduce enable-oslogin-sk.
    2. En el campo Valor, introduce TRUE.
  6. Haz clic en Guardar.

gcloud

Para habilitar las llaves de seguridad en una sola VM, usa el comando gcloud compute instances add-metadata para definir enable-oslogin=TRUE y enable-oslogin-sk=TRUE en los metadatos de la instancia:

gcloud compute instances add-metadata VM_NAME \
    --metadata enable-oslogin=TRUE,enable-oslogin-sk=TRUE

Sustituye VM_NAME por el nombre de tu VM.

Conectarse a una VM con una llave de seguridad

Puedes conectarte a una VM que use llaves de seguridad mediante la Google Cloud consola, la interfaz de línea de comandos de gcloud o herramientas de terceros. Si te conectas a las VMs mediante la Google Cloud consola o la CLI de gcloud, Compute Engine configurará tu clave SSH. Si te conectas a las VMs mediante herramientas de terceros, debes realizar la configuración tú mismo.

Consola

Cuando te conectas a las VMs mediante la herramienta Google Cloud consola SSH en el navegador, esta recupera las claves privadas asociadas a tus llaves de seguridad.

Para conectarte a una VM que tenga habilitadas las llaves de seguridad, haz lo siguiente:

  1. En la consola de Google Cloud , ve a la página Instancias de VM.

  2. En la lista de VMs, haz clic en SSH en la fila de la VM a la que quieras conectarte.

  3. Cuando se te pida, toca tu llave de seguridad.

gcloud

Cuando te conectas a las VMs mediante la CLI de gcloud, esta recupera las claves privadas asociadas a tus claves de seguridad y configura los archivos de claves privadas. Esta configuración es persistente y se aplica a todas las VMs que usan llaves de seguridad.

Usa el comando gcloud beta compute ssh para conectarte a una VM que tenga habilitadas las llaves de seguridad:

gcloud beta compute ssh VM_NAME

Herramientas de terceros

Antes de conectarte a una VM que tenga habilitadas las llaves de seguridad, debes recuperar las claves privadas asociadas a tus llaves de seguridad y configurar los archivos de claves privadas. En este ejemplo se usa la biblioteca de cliente de Python para realizar la configuración.

Solo tienes que realizar esta configuración la primera vez que te conectes a una VM. La configuración es persistente y se aplica a todas las máquinas virtuales que usen llaves de seguridad en tu proyecto.

En un terminal de tu estación de trabajo, haz lo siguiente:

  1. Si aún no lo has hecho, instala la biblioteca de cliente de Google para Python ejecutando el siguiente comando:

    pip3 install google-api-python-client
    
  2. Guarda la siguiente secuencia de comandos de Python de ejemplo, que obtiene las claves privadas asociadas a tus llaves de seguridad, configura los archivos de claves privadas y se conecta a la VM.

    import argparse
    import os
    import subprocess
    from typing import Optional
    
    import googleapiclient.discovery
    
    
    def write_ssh_key_files(security_keys: list[dict], directory: str) -> list[str]:
        """
        Store the SSH key files.
    
        Saves the SSH keys into files inside specified directory. Using the naming
        template of `google_sk_{i}`.
    
        Args:
            security_keys: list of dictionaries representing security keys retrieved
                from the OSLogin API.
            directory: path to directory in which the security keys will be stored.
    
        Returns:
            List of paths to the saved keys.
        """
        key_files = []
        for index, key in enumerate(security_keys):
            key_file = os.path.join(directory, f"google_sk_{index}")
            with open(key_file, "w") as f:
                f.write(key.get("privateKey"))
                os.chmod(key_file, 0o600)
                key_files.append(key_file)
        return key_files
    
    
    def ssh_command(key_files: list[str], username: str, ip_address: str) -> list[str]:
        """
        Construct the SSH command for a given IP address and key files.
    
        Args:
            key_files: SSH keys to be used for authentication.
            username: username used to authenticate.
            ip_address: the IP address or hostname of the remote system.
    
        Returns:
            SSH command as a list of strings.
        """
        command = ["ssh"]
        for key_file in key_files:
            command.extend(["-i", key_file])
        command.append(f"{username}@{ip_address}")
        return command
    
    
    def main(
        user_key: str, ip_address: str, dryrun: bool, directory: Optional[str] = None
    ) -> None:
        """
        Configure SSH key files and print SSH command.
    
        Args:
            user_key: name of the user you want to authenticate as. Usually an email address.
            ip_address: the IP address of the machine you want to connect to.
            dryrun: bool flag to do dry run, without connecting to the remote machine.
            directory: the directory to store SSH private keys.
        """
        directory = directory or os.path.join(os.path.expanduser("~"), ".ssh")
    
        # Create the OS Login API object.
        oslogin = googleapiclient.discovery.build("oslogin", "v1beta")
    
        # Retrieve security keys and OS Login username from a user's Google account.
        profile = (
            oslogin.users()
            .getLoginProfile(name=f"users/{user_key}", view="SECURITY_KEY")
            .execute()
        )
    
        if "posixAccounts" not in profile:
            print("You don't have a POSIX account configured.")
            print("Please make sure that you have enabled OS Login for your VM.")
            return
    
        username = profile.get("posixAccounts")[0].get("username")
    
        # Write the SSH private key files.
        security_keys = profile.get("securityKeys")
    
        if security_keys is None:
            print(
                "The account you are using to authenticate does not have any security keys assigned to it."
            )
            print(
                "Please check your Application Default Credentials "
                "(https://cloud.google.com/docs/authentication/application-default-credentials)."
            )
            print(
                "More info about using security keys: https://cloud.google.com/compute/docs/oslogin/security-keys"
            )
            return
    
        key_files = write_ssh_key_files(security_keys, directory)
    
        # Compose the SSH command.
        command = ssh_command(key_files, username, ip_address)
    
        if dryrun:
            # Print the SSH command.
            print(" ".join(command))
        else:
            # Connect to the IP address over SSH.
            subprocess.call(command)
    
    
    if __name__ == "__main__":
        parser = argparse.ArgumentParser(
            description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
        )
        parser.add_argument("--user_key", help="Your primary email address.")
        parser.add_argument(
            "--ip_address", help="The external IP address of the VM you want to connect to."
        )
        parser.add_argument("--directory", help="The directory to store SSH private keys.")
        parser.add_argument(
            "--dryrun",
            dest="dryrun",
            default=False,
            action="store_true",
            help="Turn off dryrun mode to execute the SSH command",
        )
        args = parser.parse_args()
    
        main(args.user_key, args.ip_address, args.dryrun, args.directory)
  3. Ejecuta la secuencia de comandos para configurar tus claves y, opcionalmente, conectarte a la VM.

    python3 SCRIPT_NAME.py --user_key=USER_KEY --ip_address=IP_ADDRESS [--dryrun]
    

    Haz los cambios siguientes:

    • SCRIPT_NAME: el nombre de tu secuencia de comandos de configuración.
    • USER_KEY: tu dirección de correo principal.
    • IP_ADDRESS: la dirección IP externa de la VM a la que te conectas.
    • [--dryrun]: (Opcional) añade la marca --dryrun para imprimir el comando de conexión sin conectarte a la VM. Si no especificas esta marca, la secuencia de comandos ejecuta el comando de conexión.

Siguientes pasos