Attivare i token di sicurezza con OS Login

Questo documento descrive come utilizzare i token di sicurezza fisici registrati 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 i token di sicurezza, OS Login recupera il file della chiave SSH privata associato al token di sicurezza e configura automaticamente il file della chiave SSH. Se utilizzi strumenti di terze parti per la connessione, devi utilizzare l'API OS Login per recuperare le informazioni sulla chiave SSH e configurare autonomamente il file della chiave SSH.

Prima di iniziare

  • Aggiungi un token di sicurezza al tuo Account Google.
  • Configura OS Login.
  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale viene verificata l'identità per l'accesso ai servizi e alle API Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti in Compute Engine nel seguente modo.

    Seleziona la scheda relativa a come prevedi di utilizzare gli esempi in questa pagina:

    Console

    Quando utilizzi la console Google Cloud per accedere ai servizi e alle API di Google Cloud, non devi configurare l'autenticazione.

    gcloud

    1. Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

      gcloud init
    2. Imposta una regione e una zona predefinite.

    REST

    Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, devi utilizzare le credenziali che fornisci a gcloud CLI.

      Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

      gcloud init

Limitazioni

  • Le VM in cui sono abilitati token di sicurezza accettano solo connessioni da token SSH collegati ai token di sicurezza fisici registrati nel tuo Account Google.
  • Sia la VM a cui ti stai connettendo sia la workstation da cui ti connetti devono utilizzare una versione di OpenSSH 8.2 o successiva che supporti i tipi di token di sicurezza SSH. I seguenti sistemi operativi VM di Compute Engine supportano i token 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 i token 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.

Attivare i token di sicurezza con OS Login

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

Abilita i token di sicurezza per tutte le VM abilitate a OS Login in un progetto

Per abilitare i token di sicurezza in tutte le VM che utilizzano OS Login nel tuo progetto, utilizza la console Google Cloud o gcloud CLI.

Console

Per abilitare i token di sicurezza per tutte le VM abilitate a OS Login, utilizza la console Google 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 i token 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

Abilita i token di sicurezza su una singola VM abilitata per OS Login

Per abilitare i token di sicurezza su una VM che utilizza OS Login, utilizza la console Google Cloud o gcloud CLI.

Console

Per abilitare i token 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 abilitare i token 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 i token 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 usando 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 usando strumenti di terze parti, devi eseguire personalmente la configurazione.

Console

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

Per connetterti a una VM in cui sono abilitati i token di sicurezza:

  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 con gcloud CLI, quest'ultimo recupera le chiavi private associate ai tuoi token 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 in cui sono abilitati i token di sicurezza:

gcloud beta compute ssh VM_NAME

Strumenti di terze parti

Prima di connetterti a una VM in cui sono abilitati i token di sicurezza, 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 è permanente e si applica a tutte le VM che utilizzano token di sicurezza nel tuo progetto.

Da un terminale sulla workstation, segui questi passaggi:

  1. Installa la libreria client di Google per Python, se non l'hai già fatto, eseguendo questo 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, facoltativamente, 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.

Che cosa succede dopo?