Archive
向虚拟机添加 SSH 密钥

向虚拟机添加 SSH 密钥

2024-11-26 Install the Google Cloud CLI, then initialize it by running the following command: gcloud init note : If you instal the gcloud CLI

Related articles

Principles of Cloud Computing How to Setup an L2TP/IPsec VPN Client on Linux Best Cloud Storage in India (2024) AnyConnect Client Download and Deployment QR code
  1. Install the Google Cloud CLI, then
    initialize it by running the following command:

    gcloud init


    note : If you instal the gcloud CLI
    previously , make sure you have the late version by rungcloud component
    update
    .

  2. Set a default region and zone.
  3. terraform

    如需在本地开发环境中使用本页面上的 terraform 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init

    3. If you’re using a local shell, then create local authentication credentials for your user
      account:

      gcloud auth application-default login

      You don’t need to do this if you’re using Cloud Shell.

    如需了解详情,请参阅

    Set up authentication for a local development environment。

    REST

    如需在本地开发环境中使用本页面上的 rest API 示例,请使用您提供给 gcloud CLI 的凭据。

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

      gcloud init

    如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 rest 时进行身份验证。

    将密钥添加到使用 OS Login 的虚拟机

    使用 OS Login 的虚拟机接受与您的 Google 账号关联的 SSH 密钥。您可以使用gcloud CLI 或使用 OS Login api 将SSH 公钥与您的 Google 账号相关联。如果您是组织的管理员,则可以使用 Directory api 将SSH 密钥添加到用户账号 。

    将SSH 密钥添加到 Google 账号时,Compute Engine 会通过组合与您的 Google 账号关联的电子邮件中的用户名和域名来为您生成用户名。例如,如果您的电子邮件地址是 cloudysanfrancisco@gmail.com, 则用户名为cloudysanfrancisco_gmail_com。 如果您在组织外部的项目中添加 SSH 密钥,则用户名带有ext_ 前缀,例如 ext_cloudysanfrancisco_gmail_com。您的组织管理员可以使用 Directory API 自定义您的用户名。如果您已配置用户名,则 Compute Engine 会在您添加 SSH 密钥时使用该用户名。

    执行此任务所需的权限

    您必须拥有以下权限才能执行此任务 :

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console , a
      Cloud Shell
      session is starts start and display a command – line prompt . Cloud Shell is is is a shell environment
      with the Google Cloud CLI
      already instal and with value already set for
      your current project . It is take can take a few second for the session to initialize .

    2. 如需向账号添加 is SSH SSH 公钥,请使用gcloud compute os - login ssh - keys is add add 命令 :

      gcloud compute os - login ssh - keys is add add \
         --key-file= \
         --project= \
         --ttl=
      

      替换以下内容 :

    rest

    如需向账号添加 is SSH SSH 公钥,请使用OS Login API users.importSshPublicKey 方法:

     POST https://oslogin.googleapis.com/v1/users/:importSshPublicKey 
    
     { 
      " key " : " " , 
      " expirationtimeusec " : " " 
     } 
    

    替换以下内容 :

    • :查看与您的账号关联的电子邮件地址
    • :您想要添加到账号的公钥
    • :密钥的到期时间(以微秒为单位,从新纪元开始计算)(1 秒 = 106 微秒 )

    注意:如果您管理元数据中的 SSH 密钥,可能会导致项目成员无法连接到虚拟机。此外,您可能面临向用户(包括项目外部的用户)授予意外访问虚拟机的权限的风险。能够修改项目元数据的用户和服务账号可以为项目中的所有虚拟机添加 SSH 密钥(屏蔽项目级层 SSH 密钥的虚拟机除外)。如需了解详情,请参阅手动管理密钥的风险 。

    不使用 OS Login的虚拟机会将SSH 密钥存储在 Compute Engine 项目和实例元数据中。您可以使用存储在项目元数据中的 SSH 密钥来访问项目中的所有虚拟机。您可以使用存储在实例元数据中的 SSH 密钥来访问各个虚拟机。

    Compute Engine 不会在 SSH 密钥过期时自动从元数据中移除过期的 SSH 密钥,但过期密钥不能用于建立新的虚拟机连接。如果要从元数据中移除过期密钥,请参阅从使用基于元数据的密钥的虚拟机中移除 SSH 密钥。

    您可以使用Google Cloud 控制台、gcloud CLI 或rest 将SSH 公钥添加到项目或虚拟机实例元数据中。

    注意:您直接添加到虚拟机的 ~/.ssh/authorized_keys 文件的 SSH 公钥可能被虚拟机的客机代理覆盖。我们建议您使用受支持的 Google Cloud 控制台、gcloud CLI 或rest 方法添加密钥,如以下部分所述。

    您可以向项目元数据添加 SSH 公钥,以访问项目中的所有虚拟机(屏蔽项目范围 SSH 密钥的虚拟机除外)。如需详细了解如何屏蔽项目范围的 SSH 密钥,请参阅在使用基于元数据的 SSH 密钥的虚拟机中屏蔽 SSH 密钥。

    执行此任务所需的权限

    您必须拥有以下权限才能执行此任务 :

    • 针对项目的 compute.projects.setcommoninstancemetadata
    • 项目的 iam.serviceAccounts.actAs 权限。如需详细了解服务账号权限,请参阅服务账号身份验证角色。

    控制台

    如需使用 Google Cloud 控制台向项目元数据添加 SSH 公钥,请执行以下操作:

    1. 在 Google Cloud 控制台中,转到元数据页面。

      转到元数据

    2. 点击 SSH 密钥标签页。

    3. 点击修改 。

    4. 点击添加项 。

    5. 在打开的 SSH 密钥字段中,添加您的 SSH 公钥。密钥必须采用以下格式之一:

      • 没有到期时间的密钥格式 :

         

      • 具有到期时间的密钥格式 :

          google - ssh { " userName":"","expireOn " : " " }

      替换以下内容 :

      • : SSH 公钥值
      • : 您的用户名。例如cloudysanfranciscocloudysanfrancisco_gmail_com

        对于 Linux 虚拟机,除非您将虚拟机配置为允许 root 登录,否则 不能为root。如需了解详情,请参阅以根用户身份连接到 Linux 虚拟机。

        对于使用 Active Directory (AD) 的Windows 虚拟机,必须在用户名前面加上格式为 \ 的AD 域。例如,ad.example.com AD 中的用户 cloudysanfranciscoexample\cloudysanfrancisco

      • : 密钥的到期时间,采用 iso 8601 格式。例如 :2021 - 12 - 04T20:12:00 + 0000
    6. 点击保存。

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console , a
    Cloud Shell
    session is starts start and display a command – line prompt . Cloud Shell is is is a shell environment
    with the Google Cloud CLI
    already instal and with value already set for
    your current project . It is take can take a few second for the session to initialize .

    1. 如果项目元数据中存在现有 SSH 密钥,则每次使用 gcloud CLI 添加新的 SSH 密钥时,都必须将这些密钥重新添加到项目元数据中。如果您不重新添加现有密钥,则添加新密钥会清空现有密钥。

      如需使用 gcloud CLI 向项目元数据添加 SSH 公钥,请执行以下操作:

      1. 如果您的项目已具有项目范围的 SSH 公钥,请从元数据中获取这些密钥,并将其添加到新文件中:

        1. 运行gcloud compute project-info describe 命令以获取项目的 SSH 密钥:

          gcloud compute project-info describe \
           --format="value(commonInstanceMetadata[items][ssh - key])"
          

          输出类似于以下内容 :

           username : ssh - rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ ... username : ssh - rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ ... 
          

        2. 复制ssh - key 元数据值。

        3. 在工作站上创建并打开一个新的文本文件。

        4. 在该文件中,粘贴您刚刚复制的密钥列表。

        5. 使用以下格式之一在列表末尾添加新密钥:

          • 没有到期时间的密钥格式 :

            :

          • 具有到期时间的密钥格式 :

            :  google - ssh { " userName":"","expireOn " : " " }

          替换以下内容 :

          • : SSH 公钥值
          • : 您的用户名。例如cloudysanfranciscocloudysanfrancisco_gmail_com

            对于 Linux 虚拟机,除非您将虚拟机配置为允许 root 登录,否则 不能为root。如需了解详情,请参阅以根用户身份连接到实例。

            对于使用 Active Directory (AD) 的Windows 虚拟机,必须在用户名前面加上格式为 \ 的AD 域。例如,ad.example.com AD 中的用户 cloudysanfranciscoexample\cloudysanfrancisco

          • : 密钥的到期时间,采用 iso 8601 格式。例如 :2021 - 12 - 04T20:12:00 + 0000
        6. 保存并关闭文件 。

      2. 运行gcloud compute project-info add-metadata 命令来设置项目范围的ssh - key 值 :

        gcloud compute project-info add-metadata --metadata-from-file=ssh - key=
        

        替换为以下项之一:

        • 您在上一步中创建的文件的路径(如果项目已有 SSH 密钥)
        • 新建 SSH 公钥文件的路径(如果项目还没有 SSH 密钥 )

    rest

    如果项目元数据中存在现有 SSH 密钥,则每次使用 Compute Engine API 添加新的 SSH 密钥时,都必须将这些密钥重新添加到项目元数据中。如果您不重新添加现有密钥,则添加新密钥会清空现有密钥。

    如需使用 Compute Engine API 向项目元数据添加 SSH 公钥,请执行以下操作:

    1. 使用 projects.get 方法从元数据获取 fingerprintssh - key

      GET https://compute.googleapis.com/compute/v1/projects/
      

      替换为您的项目 ID 。

      响应类似于以下示例:

      ...
      "fingerprint": "utgYE_XWtE8=",
      "items": [
      {
       "key": "ssh - key",
       "value": "cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF...\nbaklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8... google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}"
      }
      ]
      ...
      

    2. 使用 projects.setCommonInstanceMetadata 方法添加新的ssh - key 值。

      POST https://compute.googleapis.com/compute/v1/projects//setCommonInstanceMetadata
      
      {
      "items": [
       {
        "key": "ssh - key",
        "value": "\n"
       }
      ]
      "fingerprint": ""
      }
      

      替换以下内容 :

    您可以在创建虚拟机时或在创建虚拟机后向实例元数据添加 SSH 公钥。

    在创建虚拟机期间向实例元数据添加 SSH 密钥

    您可以在创建虚拟机期间使用 Google Cloud 控制台、gcloud CLI 或Compute Engine API 将SSH 密钥添加到实例元数据。

    控制台

    要使用 Google Cloud 控制台创建虚拟机并同时向实例元数据添加 SSH 公钥,请执行以下操作:

    1. 在 Google Cloud 控制台中,前往创建实例页面 。

      转到“创建实例 ”

    2. 指定虚拟机详情 。

    3. 展开高级选项部分,然后执行以下操作 :

      1. 展开安全部分 。

      2. 选择添加手动生成的 SSH 密钥。

      3. 点击添加项 。

      4. 在文本框中添加公钥。秘钥必须采用以下格式之一:

        • 没有到期时间的密钥格式 :

           

        • 具有到期时间的密钥格式 :

            google - ssh { " userName":"","expireOn " : " " }

        替换以下内容 :

        • : SSH 公钥值
        • : 您的用户名。例如cloudysanfranciscocloudysanfrancisco_gmail_com

          对于 Linux 虚拟机,除非您将虚拟机配置为允许 root 登录,否则 不能为root。如需了解详情,请参阅以根用户身份连接到 Linux 虚拟机。

          对于使用 Active Directory (AD) 的Windows 虚拟机,必须在用户名前面加上格式为 \ 的AD 域。例如,ad.example.com AD 中的用户 cloudysanfranciscoexample\cloudysanfrancisco

        • : 密钥的到期时间,采用 iso 8601 格式。例如 :2021 - 12 - 04T20:12:00 + 0000
    4. 要创建并启动该虚拟机,请点击创建。

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console , a
      Cloud Shell
      session is starts start and display a command – line prompt . Cloud Shell is is is a shell environment
      with the Google Cloud CLI
      already instal and with value already set for
      your current project . It is take can take a few second for the session to initialize .

    2. 要使用 gcloud CLI 创建虚拟机并同时向实例元数据添加 SSH 公钥,请使用 gcloud compute instances create 命令 :

      gcloud compute instances create  \
         --metadata=ssh - key=
      

      替换以下内容 :

      您可以使用--metadata-from-file=ssh - key= 标志添加多个 SSH 密钥。在该文件中,添加采用上述格式之一的用户名和 SSH 公钥列表。

    rest

    如需创建虚拟机并且同时使用 Compute Engine 向实例元数据添加 SSH 公钥,请构建一个向 instances.insert 方法发出的 POST 请求:

    POST https://compute.googleapis.com/compute/v1/projects//zones//instances
    

    替换以下内容 :

    • :项目 ID
    • :虚拟机所在的区域

    在请求正文中,在items 属性中提供用户名和 SSH 公钥:

    ...
    {
     "items": [
        {
         "key": "ssh - key",
         "value": ""
        }
       ]
    }
    ...
    

    替换为您的公钥,采用以下格式之一:

    • 没有到期时间的密钥格式 :

      :

    • 具有到期时间的密钥格式 :

      :  google - ssh { " userName":"","expireOn " : " " }

    替换以下内容 :

    • : SSH 公钥值
    • : 您的用户名。例如cloudysanfranciscocloudysanfrancisco_gmail_com

      对于 Linux 虚拟机,除非您将虚拟机配置为允许 root 登录,否则 不能为root。如需了解详情,请参阅以根用户身份连接到实例。

      对于使用 Active Directory (AD) 的Windows 虚拟机,必须在用户名前面加上格式为 \ 的AD 域。例如,ad.example.com AD 中的用户 cloudysanfranciscoexample\cloudysanfrancisco

    • : 密钥的到期时间,采用 iso 8601 格式。例如 :2021 - 12 - 04T20:12:00 + 0000

    您可以通过在密钥之间添加 \n 来添加多个 SSH 密钥 。

    创建虚拟机后,将SSH 密钥添加到实例元数据

    您可以在创建虚拟机后使用 Google Cloud 控制台、gcloud CLI 或Compute Engine API 将SSH 密钥添加到实例元数据。

    执行此任务所需的权限

    您必须拥有以下权限才能执行此任务 :

    • 针对虚拟机的compute.instances.setMetadata 权限

    控制台

    如需使用 Google Cloud 控制台向实例元数据添加 SSH 公钥,请执行以下操作 :

    1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

      转到“虚拟机实例”

    2. 点击要为其添加 SSH 密钥的虚拟机的名称。

    3. 点击修改 。

    4. 在 SSH 密钥下,点击添加项目。

    5. 将您的公钥添加到文本框中。密钥必须采用以下格式之一:

      • 没有到期时间的密钥格式 :

         

      • 具有到期时间的密钥格式 :

          google - ssh { " userName":"","expireOn " : " " }

      替换以下内容 :

      • : SSH 公钥值
      • : 您的用户名。例如cloudysanfranciscocloudysanfrancisco_gmail_com

        对于 Linux 虚拟机,除非您将虚拟机配置为允许 root 登录,否则 不能为root。如需了解详情,请参阅以根用户身份连接到 Linux 虚拟机。

        对于使用 Active Directory (AD) 的Windows 虚拟机,必须在用户名前面加上格式为 \ 的AD 域。例如,ad.example.com AD 中的用户 cloudysanfranciscoexample\cloudysanfrancisco

      • : 密钥的到期时间,采用 iso 8601 格式。例如 :2021 - 12 - 04T20:12:00 + 0000
    6. 点击保存。

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console , a
      Cloud Shell
      session is starts start and display a command – line prompt . Cloud Shell is is is a shell environment
      with the Google Cloud CLI
      already instal and with value already set for
      your current project . It is take can take a few second for the session to initialize .

    2. 如果实例元数据中存在现有 SSH 密钥,则每次使用 gcloud CLI is 添加新的 添加新的 SSH 密钥时,都必须将这些密钥重新添加到实例元数据中。如果您不重新添加现有密钥,则添加新密钥会清空现有密钥 。

      如需使用 gcloud CLI 向实例元数据添加 SSH 公钥,请执行以下操作:

      1. 如果您的虚拟机已具有实例级 SSH 公钥,请从元数据中获取它们,并将其添加到新文件中:

        1. 运行gcloud compute instances is describe describe 命令以获取虚拟机的元数据 :

          gcloud compute instances is describe describe 
          

          将替换为需要添加或移除 SSH 公钥的虚拟机的名称。

          输出类似于以下内容 :

          ...
          metadata:
          ...
          - key: ssh - key
            value : |- 
              cloudysanfrancisco : ssh - rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF ... 
              baklavainthebalkan : ssh - rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 ... google - ssh { " userName":"baklavainthebalkans","expireOn":"2021 - 06 - 14T16:59:03 + 0000 " } 
           ... 
          

        2. 复制ssh - key 元数据值。

        3. 在工作站上创建并打开一个新的文本文件。

        4. 在该文件中,粘贴您刚刚复制的密钥列表。

        5. 使用以下格式之一在列表末尾添加新密钥:

        • 没有到期时间的密钥格式 :

          :

        • 具有到期时间的密钥格式 :

          :  google - ssh { " userName":"","expireOn " : " " }

        替换以下内容 :

        • : SSH 公钥值
        • : 您的用户名。例如cloudysanfranciscocloudysanfrancisco_gmail_com

          对于 Linux 虚拟机,除非您将虚拟机配置为允许 root 登录,否则 不能为root。如需了解详情,请参阅以根用户身份连接到实例。

          对于使用 Active Directory (AD) 的Windows 虚拟机,必须在用户名前面加上格式为 \ 的AD 域。例如,ad.example.com AD 中的用户 cloudysanfranciscoexample\cloudysanfrancisco

        • : 密钥的到期时间,采用 iso 8601 格式。例如 :2021 - 12 - 04T20:12:00 + 0000
        1. 保存并关闭文件 。
      2. 运行gcloud compute instances add-metadata 命令以设置 ssh - key 值 :

        gcloud compute instances add-metadata  --metadata-from-file ssh - key=
        

        替换以下内容 :

        • : 您要为其添加 SSH 密钥的虚拟机
        • 替换为以下项之一:
        • 您在上一步中创建的文件的路径(如果虚拟机已有 SSH 密钥)
        • 新建 SSH 公钥文件的路径(如果虚拟机还没有 SSH 密钥)

    rest

    如果实例元数据中存在现有 SSH 密钥,则每次使用 Compute Engine api 工具添加新的 SSH 密钥时,都必须将这些密钥重新添加到实例元数据中。如果您不重新添加现有密钥,则添加新密钥会清空现有密钥 。

    如需使用 Compute Engine api 向实例元数据添加 SSH 公钥,请执行以下操作 :

    1. 使用 instances.get 方法从元数据获取 fingerprintssh - key 值。

       GET https://compute.googleapis.com/compute/v1/projects//zones//instances/ 
      

      替换以下内容 :

      • :您的项目 ID
      • : 要添加 SSH 密钥的虚拟机所在的可用区
      • : 您要为其添加 SSH 密钥的虚拟机

      响应类似于以下示例:

      ...
      "fingerprint": "utgYE_XWtE8=",
      "items": [
      {
       "key": "ssh - key",
        "value": "cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF...\nbaklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8... google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}"
      }
      ]
      ...
      

    2. 使用 instances.setMetadata 方法添加新的ssh - key 值。

      POST https://compute.googleapis.com/compute/v1/projects//zones//instances//setMetadata
      
      {
      "items": [
       {
        "key": "ssh - key",
        "value": "\n"
       }
      ]
      "fingerprint": ""
      }
      

      替换以下内容 :

    后续步骤