Attivare le chiavi di sicurezza con OS Login


Questo documento descrive come utilizzare i token di sicurezza fisici registrati nel tuo Account Google per connettersi 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, Accesso sistema operativo recupera il file della chiave SSH privata associato al token di sicurezza e lo configura per te. Quando utilizzi strumenti di terze parti per devi utilizzare l'API OS Login per recuperare le informazioni sulla chiave SSH e configurare il file della chiave SSH personalmente.

Prima di iniziare

  • Aggiungi un token di sicurezza al tuo Account Google.
  • Configura il sistema operativo Accesso.
  • Se non l'hai già fatto, configura l'autenticazione. L'autenticazione è la procedura mediante la quale la tua identità viene verificata per l'accesso alle API e ai servizi Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti su Compute Engine come segue.

    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

      Per utilizzare gli esempi dell'API REST in questa pagina in un ambiente di sviluppo locale, utilizza le credenziali fornite a gcloud CLI.

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

        gcloud init

      Per ulteriori informazioni, vedi Esegui l'autenticazione per l'utilizzo di REST nella documentazione sull'autenticazione di Google Cloud.

Limitazioni

  • Le VM con token di sicurezza abilitati accettano solo connessioni da I token SSH collegati ai token di sicurezza fisici registrati nel tuo Account Google
  • Non puoi utilizzare Cloud Shell per connetterti alle VM che dispongono di token di sicurezza in un bucket in cui è abilitato il controllo delle versioni.
  • Sia la VM a cui ti stai connettendo sia la workstation da cui ti stai connettendo deve utilizzare una versione di OpenSSH 8.2 o successiva che supporti la chiave di sicurezza SSH di testo. I seguenti sistemi operativi delle VM 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 il seguente comando:

    ssh -Q key | grep ^sk-
    

    Se il comando non restituisce alcun output, il tuo ambiente non supporta le chiavi di sicurezza.

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

Abilita i token 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 i token di sicurezza per tutte le VM con OS Login abilitato in un progetto

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

Console

Per attivare le chiavi di sicurezza per tutte le VM con OS Login abilitato, 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 Key (Chiave), inserisci enable-oslogin.
    2. Nel campo Valore, inserisci TRUE.
  4. Fai clic su Aggiungi elemento.

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

gcloud

Per attivare i token di sicurezza per tutte le VM abilitate per OS Login, utilizza Comando gcloud compute project-info add-metadata per impostare enable-oslogin=TRUE e enable-oslogin-sk=TRUE nel progetto metadati:

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 attivare i token di sicurezza su una VM che utilizza OS Login, utilizza la console Google Cloud o l'interfaccia a riga di comando gcloud.

Console

Per attivare i token di sicurezza su una singola VM, utilizza la console Google Cloud imposta 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 Key (Chiave), inserisci enable-oslogin.
    2. Nel campo Valore, inserisci TRUE.
  5. Fai clic su Aggiungi elemento.

    1. Nel campo Key (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 Comando gcloud compute instances add-metadata per impostare enable-oslogin=TRUE e enable-oslogin-sk=TRUE nell'istanza metadati:

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

Sostituisci VM_NAME con il nome della VM.

Connettiti a una VM usando un token di sicurezza

Puoi connetterti a una VM che utilizza chiavi di sicurezza utilizzando la console Google Cloud, l'interfaccia a riga di comando gcloud o strumenti di terze parti. Se ti connetti alle VM utilizzando la console Google Cloud o l'interfaccia a riga di comando gcloud, Compute Engine configura la chiave SSH per te. Se ti connetti alle VM usando strumenti di terze parti, devi eseguire la configurazione personalmente.

Console

Quando ti connetti alle VM utilizzando la console Google Cloud Strumento SSH nel browser, recupera SSH nel browser le chiavi private associate ai token di sicurezza.

Per connetterti a una VM in cui sono abilitati i token di sicurezza, segui questi passaggi:

  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 token di sicurezza e configura i file delle chiavi private. Questa configurazione è permanente 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, deve recuperare le chiavi private associate ai tuoi token di sicurezza e 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 colleghi a una VM. La configurazione è permanente e si applica a tutte le VM che utilizzano token di sicurezza nel progetto.

Da un terminale sulla tua workstation, svolgi i seguenti passaggi:

  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 alle tue chiavi 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 connetti.
    • [--dryrun]: (Facoltativo) aggiungi il flag --dryrun per stampare il comando di connessione senza connetterti alla VM. In caso contrario se specifichi questo flag, lo script esegue il comando di connessione.

Passaggi successivi