Mengaktifkan kunci keamanan dengan Login OS


Dokumen ini menjelaskan cara menggunakan kunci keamanan fisik yang terdaftar di akun Google Anda untuk terhubung ke instance virtual machine (VM) yang menggunakan Login OS.

Kunci keamanan fisik digunakan untuk menghasilkan file kunci SSH pribadi untuk terhubung ke VM. Saat Anda menggunakan alat SSH-in-browser konsol Google Cloud atau Google Cloud CLI untuk terhubung ke VM menggunakan kunci keamanan, Login OS akan mengambil file kunci SSH pribadi yang terkait dengan kunci keamanan Anda dan mengonfigurasi file kunci SSH untuk Anda. Saat menggunakan alat pihak ketiga untuk terhubung, Anda harus menggunakan Login OS API untuk mengambil informasi kunci SSH dan mengonfigurasi file kunci SSH sendiri.

Sebelum memulai

  • Tambahkan kunci keamanan ke Akun Google Anda.
  • Siapkan Login OS.
  • Jika Anda belum melakukannya, siapkan autentikasi. Autentikasi adalah proses verifikasi identitas Anda untuk mengakses layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat mengautentikasi ke Compute Engine dengan memilih salah satu opsi berikut:

    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

      Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.

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

        gcloud init

      Untuk informasi selengkapnya, lihat Melakukan autentikasi untuk menggunakan REST dalam dokumentasi autentikasi Google Cloud.

Batasan

  • VM yang memiliki kunci keamanan hanya menerima koneksi dari kunci SSH yang terpasang ke kunci keamanan fisik yang terdaftar di Akun Google Anda.
  • Anda tidak dapat menggunakan Cloud Shell untuk terhubung ke VM yang mengaktifkan kunci keamanan.
  • VM yang Anda hubungkan dan workstation tempat Anda terhubung harus menggunakan versi OpenSSH 8.2 atau yang lebih baru yang mendukung jenis SSH kunci keamanan. Sistem operasi VM Compute Engine berikut mendukung kunci keamanan:

    • Debian 11 (atau yang lebih baru)
    • SUSE Linux Enterprise Server (SLES) 15 (atau yang lebih baru)
    • Ubuntu 20.04 LTS (atau yang lebih baru)
    • Container-Optimized OS 93 LTS (atau yang lebih baru)
    • Rocky Linux 9 (atau yang lebih baru)

    Untuk memeriksa apakah lingkungan Anda mendukung kunci keamanan, jalankan perintah berikut:

    ssh -Q key | grep ^sk-
    

    Jika perintah tersebut tidak menampilkan output apa pun, berarti lingkungan Anda tidak mendukung kunci keamanan.

  • Klien SSH di workstation tempat Anda terhubung harus mendukung kunci keamanan dan menyertakan library yang diperlukan, seperti libfido2.

Mengaktifkan kunci keamanan dengan Login OS

Anda dapat mengaktifkan penggunaan kunci keamanan untuk semua VM yang menggunakan Login OS di project Anda, atau untuk VM tunggal.

Mengaktifkan kunci keamanan untuk semua VM yang mengaktifkan Login OS dalam sebuah project

Untuk mengaktifkan kunci keamanan pada semua VM yang menggunakan Login OS di project Anda, gunakan konsol Google Cloud atau gcloud CLI.

Konsol

Guna mengaktifkan kunci keamanan untuk semua VM yang mendukung Login OS, gunakan konsol Google Cloud untuk menetapkan enable-oslogin dan enable-oslogin-sk ke TRUE dalam metadata project:

  1. Buka halaman Metadata.

    Buka Metadata

  2. Klik Edit.

  3. Klik Tambahkan item.

    1. Pada kolom Kunci, masukkan enable-oslogin.
    2. Di kolom Value, masukkan TRUE.
  4. Klik Tambahkan item.

    1. Pada kolom Kunci, masukkan enable-oslogin-sk.
    2. Di kolom Value, masukkan TRUE.
  5. Klik Simpan.

gcloud

Guna mengaktifkan kunci keamanan untuk semua VM yang mendukung Login OS, gunakan perintah gcloud compute project-info add-metadata untuk menetapkan enable-oslogin=TRUE dan enable-oslogin-sk=TRUE di metadata project:

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

Mengaktifkan kunci keamanan di satu VM yang mengaktifkan Login OS

Untuk mengaktifkan kunci keamanan pada VM yang menggunakan Login OS, gunakan konsol Google Cloud atau gcloud CLI.

Konsol

Untuk mengaktifkan kunci keamanan pada satu VM, gunakan konsol Google Cloud untuk menetapkan enable-oslogin dan enable-oslogin-sk ke TRUE dalam metadata instance:

  1. Buka halaman instance VM.

    Buka instance VM

  2. Klik nama VM yang ingin Anda aktifkan kunci keamanannya.

  3. Klik Edit.

  4. Di bagian Metadata, klik Tambahkan item.

    1. Pada kolom Kunci, masukkan enable-oslogin.
    2. Di kolom Value, masukkan TRUE.
  5. Klik Tambahkan item.

    1. Pada kolom Kunci, masukkan enable-oslogin-sk.
    2. Di kolom Value, masukkan TRUE.
  6. Klik Simpan.

gcloud

Untuk mengaktifkan kunci keamanan pada satu VM, gunakan perintah gcloud compute instances add-metadata untuk menetapkan enable-oslogin=TRUE dan enable-oslogin-sk=TRUE di metadata instance:

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

Ganti VM_NAME dengan nama VM Anda.

Terhubung ke VM menggunakan kunci keamanan

Anda dapat terhubung ke VM yang menggunakan kunci keamanan menggunakan konsol Google Cloud, gcloud CLI, atau alat pihak ketiga. Jika Anda terhubung ke VM menggunakan konsol Google Cloud atau gcloud CLI, Compute Engine akan mengonfigurasi kunci SSH untuk Anda. Jika terhubung ke VM menggunakan alat pihak ketiga, Anda harus melakukan konfigurasi sendiri.

Konsol

Saat Anda terhubung ke VM menggunakan alat SSH-in-browser konsol Google Cloud, SSH-in-browser akan mengambil kunci pribadi yang terkait dengan kunci keamanan Anda.

Untuk terhubung ke VM yang mengaktifkan kunci keamanan, lakukan hal berikut:

  1. Di konsol Google Cloud, buka halaman Instance VM.

  2. Dalam daftar VM, klik SSH di baris VM yang ingin Anda hubungkan.

  3. Saat diminta, sentuh kunci keamanan Anda.

gcloud

Saat Anda terhubung ke VM menggunakan gcloud CLI, gcloud CLI akan mengambil kunci pribadi yang terkait dengan kunci keamanan Anda dan mengonfigurasi file kunci pribadi. Konfigurasi ini bersifat persisten dan berlaku untuk semua VM yang menggunakan kunci keamanan.

Gunakan perintah gcloud beta compute ssh untuk terhubung ke VM yang mengaktifkan kunci keamanan:

gcloud beta compute ssh VM_NAME

Alat pihak ketiga

Sebelum terhubung ke VM yang mengaktifkan kunci keamanan, Anda harus mengambil kunci pribadi yang terkait dengan kunci keamanan Anda dan mengonfigurasi file kunci pribadi. Contoh ini menggunakan library klien Python untuk melakukan konfigurasi.

Anda hanya perlu melakukan konfigurasi ini saat pertama kali terhubung ke VM. Konfigurasi ini bersifat persisten dan berlaku untuk semua VM yang menggunakan kunci keamanan di project Anda.

Dari terminal di workstation Anda, lakukan tindakan berikut:

  1. Jika Anda belum melakukannya, instal library klien Google untuk Python dengan menjalankan perintah berikut:

    pip3 install google-api-python-client
    
  2. Simpan contoh skrip Python berikut, yang mengambil kunci pribadi yang terkait dengan kunci keamanan Anda, mengonfigurasi file kunci pribadi, dan menghubungkan ke 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. Jalankan skrip untuk mengonfigurasi kunci Anda dan secara opsional terhubung ke VM.

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

    Ganti kode berikut:

    • SCRIPT_NAME: nama skrip konfigurasi Anda.
    • USER_KEY: Alamat email primer Anda
    • IP_ADDRESS: alamat IP eksternal VM yang Anda hubungkan.
    • [--dryrun]: (Opsional) tambahkan flag --dryrun untuk mencetak perintah koneksi tanpa terhubung ke VM. Jika Anda tidak menentukan tanda ini, skrip akan menjalankan perintah koneksi.

Apa langkah selanjutnya?