Habilite las claves de seguridad con el inicio de sesión del sistema operativo


Este documento describe cómo utilizar las claves de seguridad físicas registradas en su cuenta de Google para conectarse a instancias de máquinas virtuales (VM) que utilizan el inicio de sesión del sistema operativo.

Las claves de seguridad físicas se utilizan para generar archivos de claves SSH privadas para conectarse a máquinas virtuales. Cuando utiliza la herramienta SSH en el navegador de la consola de Google Cloud o la CLI de Google Cloud para conectarse a máquinas virtuales mediante claves de seguridad, OS Login recupera el archivo de clave SSH privado asociado con su clave de seguridad y configura el archivo de clave SSH por usted. Cuando utiliza herramientas de terceros para conectarse, debe utilizar la API de inicio de sesión del sistema operativo para recuperar la información de la clave SSH y configurar el archivo de clave SSH usted mismo.

Antes de comenzar

Limitaciones

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

    • Debian 11 (o posterior)
    • SUSE Linux Enterprise Server (SLES) 15 (o posterior)
    • Ubuntu 20.04 LTS (o posterior)
    • OS 93 LTS optimizado para contenedores (o posterior)
    • Rocky Linux 9 (o posterior)

    Para comprobar si su entorno admite claves de seguridad, ejecute el siguiente comando:

    ssh -Q key | grep ^sk-
    

    Si el comando no devuelve ningún resultado, su entorno no admite claves de seguridad.

  • El cliente SSH en la estación de trabajo desde la que se conecta debe admitir claves de seguridad e incluir las bibliotecas necesarias, como libfido2 .

Habilite las claves de seguridad con el inicio de sesión del sistema operativo

Puede habilitar el uso de claves de seguridad para todas las máquinas virtuales que utilicen el inicio de sesión del sistema operativo en su proyecto, o para máquinas virtuales individuales.

Habilite las claves de seguridad para todas las máquinas virtuales habilitadas para iniciar sesión en el sistema operativo en un proyecto

Para habilitar las claves de seguridad en todas las máquinas virtuales que usan el inicio de sesión del sistema operativo en tu proyecto, usa la consola de Google Cloud o la CLI de gcloud.

Consola

Para habilitar las claves de seguridad para todas las máquinas virtuales habilitadas para iniciar sesión en el sistema operativo, use la consola de Google Cloud para configurar enable-oslogin y enable-oslogin-sk en TRUE en los metadatos del proyecto:

  1. Vaya a la página de Metadatos .

    Ir a Metadatos

  2. Haga clic en Editar .

  3. Haga clic en Agregar elemento .

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

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

nube de gcloud

Para habilitar las claves de seguridad para todas las máquinas virtuales habilitadas para iniciar sesión en el sistema operativo, use el comando gcloud compute project-info add-metadata para 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

Habilite las claves de seguridad en una única máquina virtual habilitada para iniciar sesión en el sistema operativo

Para habilitar las claves de seguridad en una máquina virtual que usa el inicio de sesión en el sistema operativo, use la consola de Google Cloud o la CLI de gcloud.

Consola

Para habilitar las claves de seguridad en una única máquina virtual, use la consola de Google Cloud para configurar enable-oslogin y enable-oslogin-sk en TRUE en los metadatos de la instancia:

  1. Vaya a la página de instancias de VM .

    Ir a instancias de VM

  2. Haga clic en el nombre de la VM para la que desea habilitar las claves de seguridad.

  3. Haga clic en Editar .

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

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

    1. En el campo Clave , ingrese enable-oslogin-sk .
    2. En el campo Valor , ingrese TRUE .
  6. Haga clic en Guardar .

nube de gcloud

Para habilitar las claves de seguridad en una sola VM, usa el comando gcloud compute instances add-metadata para 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

Reemplace VM_NAME con el nombre de su VM.

Conéctese a una VM usando una clave de seguridad

Puedes conectarte a una VM que use claves de seguridad mediante la consola de Google Cloud, la CLI de gcloud o herramientas de terceros. Si te conectas a máquinas virtuales mediante la consola de Google Cloud o la CLI de gcloud, Compute Engine configura tu clave SSH por ti. Si se conecta a máquinas virtuales mediante herramientas de terceros, debe realizar la configuración usted mismo.

Consola

Cuando te conectas a máquinas virtuales mediante la herramienta SSH-in-browser de la consola de Google Cloud, SSH-in-browser recupera las claves privadas asociadas con tus claves de seguridad.

Para conectarse a una máquina virtual que tenga claves de seguridad habilitadas, haga lo siguiente:

  1. En la consola de Google Cloud, vaya a la página de instancias de VM .

  2. En la lista de máquinas virtuales, haga clic en SSH en la fila de la máquina virtual a la que desea conectarse.

  3. Cuando se le solicite, toque su clave de seguridad.

nube de gcloud

Cuando te conectas a máquinas virtuales mediante la CLI de gcloud, la CLI de gcloud recupera las claves privadas asociadas con tus claves de seguridad y configura los archivos de claves privadas. Esta configuración es persistente y se aplica a todas las máquinas virtuales que utilizan claves de seguridad.

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

gcloud beta compute ssh VM_NAME

Herramientas de terceros

Antes de conectarse a una máquina virtual que tenga claves de seguridad habilitadas, debe recuperar las claves privadas asociadas con sus claves de seguridad y configurar los archivos de claves privadas. Este ejemplo utiliza la biblioteca cliente de Python para realizar la configuración.

Solo necesita realizar esta configuración la primera vez que se conecta a una VM. La configuración es persistente y se aplica a todas las máquinas virtuales que usan claves de seguridad en su proyecto.

Desde una terminal en su estación de trabajo, haga lo siguiente:

  1. Instale la biblioteca cliente de Google para Python, si aún no lo ha hecho, ejecutando el siguiente comando:

    pip3 install google-api-python-client
    
  2. Guarde el siguiente script de Python de muestra, que recupera las claves privadas asociadas con sus claves 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. Ejecute el script para configurar sus claves y, opcionalmente, conectarse a la VM.

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

    Reemplace lo siguiente:

    • SCRIPT_NAME : el nombre de su script 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 estás conectando.
    • [--dryrun] : (Opcional) agregue el indicador --dryrun para imprimir el comando de conexión sin conectarse a la VM. Si no especifica este indicador, el script ejecuta el comando de conexión.

¿Qué sigue?