Abilita le chiavi di sicurezza con OS Login


Questo documento descrive come utilizzare le chiavi di sicurezza fisiche registrate nel tuo Account Google per connetterti alle istanze di macchine virtuali (VM) che utilizzano OS Login.

I token di sicurezza fisici vengono utilizzati per generare file di chiavi SSH private per la connessione alle VM. Quando utilizzi lo strumento SSH nel browser della console Google Cloud o Google Cloud CLI per connetterti alle VM utilizzando le chiavi di sicurezza, OS Login recupera il file della chiave SSH privata associato alla tua chiave di sicurezza e lo configura per te. Quando utilizzi strumenti di terze parti per connetterti, devi utilizzare l'API OS Login per recuperare le informazioni sulla chiave SSH e configurare autonomamente il file della chiave SSH.

Prima di iniziare

Limitazioni

  • Le VM con i token di sicurezza attivati accettano solo connessioni da chiavi SSH associate ai token di sicurezza fisici registrati nel tuo Account Google.
  • Non puoi utilizzare Cloud Shell per connetterti alle VM con i token di sicurezza attivati.
  • Sia la VM a cui ti connetti sia la workstation da cui ti connetti devono utilizzare una versione di OpenSSH 8.2 o successive che supporti i tipi SSH con chiave di sicurezza. I seguenti sistemi operativi per VM di Compute Engine supportano le chiavi di sicurezza:

    • Debian 11 (o versioni successive)
    • SUSE Linux Enterprise Server (SLES) 15 o versioni successive
    • Ubuntu 20.04 LTS (o versioni successive)
    • Container-Optimized OS 93 LTS (o versioni successive)
    • Rocky Linux 9 (o versioni successive)

    Per verificare se il tuo ambiente supporta le chiavi di sicurezza, esegui questo comando:

    ssh -Q key | grep ^sk-
    

    Se il comando non restituisce alcun output, il tuo ambiente non supporta i token di sicurezza.

  • Il client SSH sulla workstation da cui ti connetti deve supportare le chiavi di sicurezza e includere le librerie richieste, ad esempio libfido2.

Abilita le chiavi di sicurezza con OS Login

Puoi attivare l'utilizzo dei token di sicurezza per tutte le VM che utilizzano OS Login nel tuo progetto o per singole VM.

Abilita le chiavi di sicurezza per tutte le VM con OS Login abilitato in un progetto

Per abilitare le chiavi di sicurezza su tutte le VM che utilizzano OS Login nel tuo progetto, utilizza la consoleGoogle Cloud o gcloud CLI.

Console

Per abilitare le chiavi di sicurezza per tutte le VM abilitate per OS Login, utilizza la consoleGoogle Cloud per impostare enable-oslogin e enable-oslogin-sk su TRUE nei metadati del progetto:

  1. Vai alla pagina Metadati.

    Vai a Metadati

  2. Fai clic su Modifica.

  3. Fai clic su Aggiungi elemento.

    1. Nel campo Chiave, inserisci enable-oslogin.
    2. Nel campo Valore, inserisci TRUE.
  4. Fai clic su Aggiungi elemento.

    1. Nel campo Chiave, inserisci enable-oslogin-sk.
    2. Nel campo Valore, inserisci TRUE.
  5. Fai clic su Salva.

gcloud

Per abilitare le chiavi di sicurezza per tutte le VM abilitate a OS Login, utilizza il comando gcloud compute project-info add-metadata per impostare enable-oslogin=TRUE e enable-oslogin-sk=TRUE nei metadati del progetto:

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

Attiva le chiavi di sicurezza su una singola VM abilitata a OS Login

Per abilitare le chiavi di sicurezza su una VM che utilizza OS Login, utilizza la consoleGoogle Cloud o gcloud CLI.

Console

Per abilitare le chiavi di sicurezza su una singola VM, utilizza la console Google Cloud per impostare enable-oslogin e enable-oslogin-sk su TRUE nei metadati dell'istanza:

  1. Vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Fai clic sul nome della VM per cui vuoi attivare le chiavi di sicurezza.

  3. Fai clic su Modifica.

  4. Nella sezione Metadati, fai clic su Aggiungi elemento.

    1. Nel campo Chiave, inserisci enable-oslogin.
    2. Nel campo Valore, inserisci TRUE.
  5. Fai clic su Aggiungi elemento.

    1. Nel campo Chiave, inserisci enable-oslogin-sk.
    2. Nel campo Valore, inserisci TRUE.
  6. Fai clic su Salva.

gcloud

Per abilitare le chiavi di sicurezza su una singola VM, utilizza il comando gcloud compute instances add-metadata per impostare enable-oslogin=TRUE e enable-oslogin-sk=TRUE nei metadati dell'istanza:

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

Sostituisci VM_NAME con il nome della tua VM.

Connettiti a una VM utilizzando un token di sicurezza

Puoi connetterti a una VM che utilizza token di sicurezza utilizzando la console Google Cloud , gcloud CLI o strumenti di terze parti. Se ti connetti alle VM utilizzando la console Google Cloud o gcloud CLI, Compute Engine configura la chiave SSH per te. Se ti connetti alle VM utilizzando strumenti di terze parti, devi eseguire la configurazione autonomamente.

Console

Quando ti connetti alle VM utilizzando lo strumento SSH nel browser della console Google Cloud , SSH nel browser recupera le chiavi private associate alle tue chiavi di sicurezza.

Per connetterti a una VM con i token di sicurezza abilitati:

  1. Nella console Google Cloud , vai alla pagina Istanze VM.

  2. Nell'elenco delle VM, fai clic su SSH nella riga della VM a cui vuoi connetterti.

  3. Quando richiesto, tocca il token di sicurezza.

gcloud

Quando ti connetti alle VM utilizzando gcloud CLI, gcloud CLI recupera le chiavi private associate alle tue chiavi di sicurezza e configura i file delle chiavi private. Questa configurazione è persistente e si applica a tutte le VM che utilizzano token di sicurezza.

Utilizza il comando gcloud beta compute ssh per connetterti a una VM con token di sicurezza abilitati:

gcloud beta compute ssh VM_NAME

Strumenti di terze parti

Prima di connetterti a una VM con i token di sicurezza attivati, devi recuperare le chiavi private associate ai tuoi token di sicurezza e configurare i file delle chiavi private. Questo esempio utilizza la libreria client Python per eseguire la configurazione.

Devi eseguire questa configurazione solo la prima volta che ti connetti a una VM. La configurazione è persistente e si applica a tutte le VM che utilizzano token di sicurezza nel tuo progetto.

Da un terminale sulla workstation:

  1. Se non l'hai ancora fatto, installa la libreria client di Google per Python eseguendo il seguente comando:

    pip3 install google-api-python-client
    
  2. Salva il seguente script Python di esempio, che recupera le chiavi private associate ai tuoi token di sicurezza, configura i file delle chiavi private e si connette alla 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. Esegui lo script per configurare le chiavi e, se vuoi, connettiti alla VM.

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

    Sostituisci quanto segue:

    • SCRIPT_NAME: il nome dello script di configurazione.
    • USER_KEY: il tuo indirizzo email principale.
    • IP_ADDRESS: l'indirizzo IP esterno della VM a cui ti stai connettendo.
    • [--dryrun]: (facoltativo) aggiungi il flag --dryrun per stampare il comando di connessione senza connetterti alla VM. Se non specifichi questo flag, lo script esegue il comando di connessione.

Passaggi successivi