Habilita las llaves de seguridad con el Acceso al SO


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áquinas virtuales (VM) que usan Acceso al SO.

La llaves de seguridad física se usa para generar archivos de claves SSH privadas para conectarte a las VMs. Cuando usas la herramienta SSH en el navegador de la consola de Google Cloud o Google Cloud CLI para conectarte a las VMs mediante llaves de seguridad, el Acceso al SO recupera el archivo de claves SSH privadas asociado con tu llave de seguridad y configura el archivo de claves SSH por ti. Cuando usas herramientas de terceros para conectarte, debes usar la API de Acceso al SO a fin de recuperar la información de Llave SSH y configurar el archivo de clave SSH tú mismo.

Antes de comenzar

  • Agrega una llave de seguridad a la Cuenta de Google.
  • Configura el Acceso al SO.
  • Si aún no lo hiciste, configura la autenticación. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar un código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    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. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Limitaciones

  • Las VMs que tienen llaves de seguridad habilitadas solo aceptan conexiones de claves SSH conectadas 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.
  • La VM a la que te conectas y la estación de trabajo desde la que te conectas deben usar una versión de OpenSSH 8.2 o posterior que sea compatible con los tipos de llave de seguridad SSH. Los siguientes sistemas operativos de VM de Compute Engine son compatibles con las llaves de seguridad:

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

    Para verificar si tu entorno admite claves de seguridad, ejecuta el siguiente comando:

    ssh -Q key | grep ^sk-
    

    Si el comando no muestra ningún resultado, tu entorno no admite claves 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.

Habilita las llaves de seguridad con el Acceso al SO

Puedes habilitar el uso de llaves de seguridad para todas las VM que usan el Acceso al SO en tu proyecto o para VM individuales.

Habilita llaves de seguridad para todas las VM que tienen Acceso al SO habilitado en un proyecto

Para habilitar las llaves de seguridad en todas las VMs que usan el Acceso al SO en tu proyecto, usa la consola de Google Cloud o la CLI de gcloud.

Console

A fin de habilitar las llaves de seguridad para todas las VM que tienen habilitado el Acceso al SO, usa la consola de Google Cloud a fin de configurar enable-oslogin y enable-oslogin-sk como 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 Agregar elemento.

    1. En el campo Clave, ingresa enable-oslogin.
    2. En el campo Valor, ingresa TRUE.
  4. Haz clic en Agregar elemento.

    1. En el campo Clave, ingresa enable-oslogin-sk.
    2. En el campo Valor, ingresa TRUE.
  5. Haz clic en Guardar.

gcloud

A fin de habilitar las llaves de seguridad para todas las VM que tienen habilitado el Acceso al SO, usa el comando gcloud compute project-info add-metadata a fin de configurar 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

Habilita llaves de seguridad en una sola VM que tenga habilitado el Acceso al SO

Para habilitar las llaves de seguridad en una VM que usa el Acceso al SO, usa la consola de Google Cloud o la CLI de gcloud.

Console

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

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

    Ir a Instancias de VM

  2. Haz clic en el nombre de la VM para la que quieres habilitar las llaves de seguridad.

  3. Haz clic en Editar.

  4. En la sección Metadatos, haz clic en Agregar elemento.

    1. En el campo Clave, ingresa enable-oslogin.
    2. En el campo Valor, ingresa TRUE.
  5. Haz clic en Agregar elemento.

    1. En el campo Clave, ingresa enable-oslogin-sk.
    2. En el campo Valor, ingresa 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 a fin de configurar 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

Reemplaza VM_NAME por el nombre de tu VM.

Conéctate a una VM mediante una llave de seguridad

Puedes conectarte a una VM que use llaves de seguridad mediante la consola de Google Cloud, gcloud CLI o herramientas de terceros. Si te conectas a las VMs mediante la consola de Google Cloud o la CLI de gcloud, Compute Engine configura tu clave SSH por ti. Si te conectas a las VMs con herramientas de terceros, debes realizar la configuración tú mismo.

Console

Cuando te conectas a las VMs con la herramienta SSH en el navegador de la consola de Google Cloud, esta recupera las claves privadas asociadas con 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 deseas conectarte.

  3. Cuando se te solicite, toca la llave de seguridad.

gcloud

Cuando te conectas a las VMs mediante la CLI de gcloud, esta recupera las claves privadas asociadas con tus llaves 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 tiene habilitadas las llaves de seguridad, debes recuperar las claves privadas asociadas con tus llaves de seguridad y configurar los archivos de claves privadas. En este ejemplo, se usa la biblioteca cliente de Python para realizar la configuración.

Solo necesitas realizar esta configuración la primera vez que te conectas a una VM. La configuración es persistente y se aplica a todas las VM que usan llaves de seguridad en tu proyecto.

Desde una terminal en tu estación de trabajo, haz lo siguiente:

  1. Instala la biblioteca cliente de Google para Python si aún no lo has hecho, con el siguiente comando:

    pip3 install google-api-python-client
    
  2. Guarda la siguiente secuencia de comandos de Python de muestra, que recupera las claves privadas asociadas con 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, de manera opcional, conéctate a la VM.

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

    Reemplaza lo siguiente:

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

Próximos pasos