Ative as chaves de segurança com o Início de sessão do SO


Este documento descreve como usar as chaves de segurança físicas registadas na sua Conta Google para se ligar a instâncias de máquinas virtuais (VM) que usam o Início de sessão no SO.

As chaves de segurança físicas são usadas para gerar ficheiros de chaves SSH privadas para estabelecer ligação a VMs. Quando usa a ferramenta Google Cloud SSH na consola no navegador ou a CLI Google Cloud para estabelecer ligação a VMs através de chaves de segurança, o Início de sessão do SO obtém o ficheiro de chave SSH privada associado à sua chave de segurança e configura o ficheiro de chave SSH por si. Quando usa ferramentas de terceiros para se ligar, tem de usar a API OS Login para obter as informações da chave SSH e configurar o ficheiro de chave SSH.

Antes de começar

  • Adicione uma chave de segurança à sua Conta Google.
  • Configure o Início de sessão do SO.
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    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. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    Para mais informações, consulte o artigo Autenticar para usar REST na Google Cloud documentação de autenticação.

Limitações

  • As VMs que têm chaves de segurança ativadas só aceitam ligações de chaves SSH anexadas às chaves de segurança físicas registadas na sua Conta Google.
  • Não pode usar o Cloud Shell para estabelecer ligação a VMs com chaves de segurança ativadas.
  • Tanto a VM à qual está a estabelecer ligação como a estação de trabalho a partir da qual está a estabelecer ligação têm de usar uma versão do OpenSSH 8.2 ou posterior que suporte tipos de SSH de chave de segurança. Os seguintes sistemas operativos de VMs do Compute Engine suportam chaves de segurança:

    • Debian 11 (ou posterior)
    • SUSE Linux Enterprise Server (SLES) 15 (ou posterior)
    • Ubuntu 20.04 LTS (ou posterior)
    • SO otimizado para contentores 93 LTS (ou posterior)
    • Rocky Linux 9 (ou posterior)

    Para verificar se o seu ambiente suporta chaves de segurança, execute o seguinte comando:

    ssh -Q key | grep ^sk-
    

    Se o comando não devolver qualquer resultado, o seu ambiente não suporta chaves de segurança.

  • O cliente SSH na estação de trabalho a partir da qual está a estabelecer ligação tem de suportar chaves de segurança e incluir as bibliotecas necessárias, como libfido2.

Ative as chaves de segurança com o Início de sessão do SO

Pode ativar a utilização de chaves de segurança para todas as VMs que utilizam o Início de sessão no SO no seu projeto ou para VMs individuais.

Ative as chaves de segurança para todas as VMs com o Início de sessão do SO ativado num projeto

Para ativar as chaves de segurança em todas as VMs que usam o Início de sessão do SO no seu projeto, use a consolaGoogle Cloud ou a CLI gcloud.

Consola

Para ativar as chaves de segurança para todas as VMs com início de sessão no SO ativado, use a consola para definir enable-oslogin e enable-oslogin-sk como TRUE nos metadados do projeto:Google Cloud

  1. Aceda à página Metadados.

    Aceda aos metadados

  2. Clique em Edit.

  3. Clique em Adicionar item.

    1. No campo Chave, introduza enable-oslogin.
    2. No campo Valor, introduza TRUE.
  4. Clique em Adicionar item.

    1. No campo Chave, introduza enable-oslogin-sk.
    2. No campo Valor, introduza TRUE.
  5. Clique em Guardar.

gcloud

Para ativar as chaves de segurança para todas as VMs com o Início de sessão do SO ativado, use o comando gcloud compute project-info add-metadata para definir enable-oslogin=TRUE e enable-oslogin-sk=TRUE nos metadados do projeto:

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

Ative as chaves de segurança numa única VM com o Início de sessão do SO ativado

Para ativar as chaves de segurança numa VM que usa o Início de sessão do SO, use a Google Cloud consola ou a CLI gcloud.

Consola

Para ativar as chaves de segurança numa única VM, use a Google Cloud consola para definir enable-oslogin e enable-oslogin-sk como TRUE nos metadados da instância:

  1. Aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Clique no nome da VM para a qual quer ativar as chaves de segurança.

  3. Clique em Edit.

  4. Na secção Metadados, clique em Adicionar item.

    1. No campo Chave, introduza enable-oslogin.
    2. No campo Valor, introduza TRUE.
  5. Clique em Adicionar item.

    1. No campo Chave, introduza enable-oslogin-sk.
    2. No campo Valor, introduza TRUE.
  6. Clique em Guardar.

gcloud

Para ativar as chaves de segurança numa única VM, use o comando gcloud compute instances add-metadata para definir enable-oslogin=TRUE e enable-oslogin-sk=TRUE nos metadados da instância:

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

Substitua VM_NAME pelo nome da sua VM.

Ligue-se a uma VM através de uma chave de segurança

Pode ligar-se a uma VM que usa chaves de segurança através da Google Cloud consola, da CLI gcloud ou de ferramentas de terceiros. Se estabelecer ligação a VMs através da consola ou da CLI gcloud, o Compute Engine configura a sua chave SSH automaticamente. Google Cloud Se estabelecer ligação a VMs através de ferramentas de terceiros, tem de fazer a configuração.

Consola

Quando estabelece ligação a VMs através da ferramenta Google Cloud consolaSSH no navegador, o SSH no navegador obtém as chaves privadas associadas às suas chaves de segurança.

Para estabelecer ligação a uma VM com chaves de segurança ativadas, faça o seguinte:

  1. Na Google Cloud consola, aceda à página Instâncias de VM.

  2. Na lista de VMs, clique em SSH na linha da VM à qual quer estabelecer ligação.

  3. Quando lhe for pedido, toque na chave de segurança.

gcloud

Quando se liga a VMs através da CLI gcloud, a CLI gcloud obtém as chaves privadas associadas às suas chaves de segurança e configura os ficheiros de chaves privadas. Esta configuração é persistente e aplica-se a todas as VMs que usam chaves de segurança.

Use o comando gcloud beta compute ssh para se ligar a uma VM que tenha chaves de segurança ativadas:

gcloud beta compute ssh VM_NAME

Ferramentas de terceiros

Antes de se ligar a uma VM com chaves de segurança ativadas, tem de obter as chaves privadas associadas às suas chaves de segurança e configurar os ficheiros de chaves privadas. Este exemplo usa a biblioteca cliente Python para fazer a configuração.

Só tem de fazer esta configuração na primeira vez que se liga a uma VM. A configuração é persistente e aplica-se a todas as VMs que usam chaves de segurança no seu projeto.

Num terminal da sua estação de trabalho, faça o seguinte:

  1. Se ainda não o fez, instale a biblioteca cliente Google para Python executando o seguinte comando:

    pip3 install google-api-python-client
    
  2. Guarde o seguinte script Python de exemplo, que obtém as chaves privadas associadas às suas chaves de segurança, configura os ficheiros de chaves privadas e estabelece ligação à 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. Execute o script para configurar as chaves e, opcionalmente, estabelecer ligação à VM.

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

    Substitua o seguinte:

    • SCRIPT_NAME: o nome do script de configuração.
    • USER_KEY: o seu endereço de email principal.
    • IP_ADDRESS: o endereço IP externo da VM à qual se está a ligar.
    • [--dryrun]: (opcional) adicione a flag --dryrun para imprimir o comando de ligação sem estabelecer ligação à VM. Se não especificar esta flag, o script executa o comando de ligação.

O que se segue?