SSH 認証鍵の追加と削除

このガイドでは、gcloud ツールまたは API メソッドを使用して、プロジェクト全体で使用する SSH 認証鍵やインスタンス専用の SSH 認証鍵を追加または削除する方法を説明します。gcloud ツールや API メソッドを使用することにより、プロジェクト内のすべてのインスタンスで使用する SSH 認証鍵の管理を Compute Engine で処理せずに自動化することができます。SSH 認証鍵を使用するユーザーは、インスタンスに対して sudo を使用してコマンドを実行できる管理者です。デフォルトでは、root のプロジェクトまたはインスタンス メタデータに SSH 認証鍵を指定しても、root ユーザーとしてインスタンスに SSH でアクセスすることはできません。

Linux インスタンスへの接続のみが必要である場合は、Linux インスタンスへの接続をご覧ください。Windows インスタンスに接続する必要がある場合は、Windows インスタンスへの接続をご覧ください。

始める前に

概要

SSH 認証鍵を追加または削除するときには、プロジェクトまたはインスタンスのメタデータ値を設定します。鍵を削除するには、既存のメタデータ値を取得して文字列にコピーし、その文字列から鍵を削除し、変更後の文字列でメタデータ値を再設定します。鍵を追加する手順も同様ですが、この場合は文字列から鍵を削除する代わりに、文字列に鍵を追加します。

SSH 認証鍵メタデータ値を正しく設定するには、次の手順で行います。

  1. プロジェクトまたはインスタンスに使用するために必要なメタデータ値を特定します

  2. 鍵を追加する必要がある場合は、次のいずれかの手順で SSH 認証鍵を作成します。

  3. どのメタデータ値が必要であるかに応じて、次のいずれかの手順で SSH 認証鍵を追加または削除します。

  4. インスタンスに接続して、SSH 認証鍵が機能するかどうかを確認します。

正しい形式での新しい SSH 認証鍵ペアの作成

新しい SSH 認証鍵ファイルとそれに対応する公開鍵が必要な場合は、新しい SSH 認証鍵ペアを生成して、Compute Engine メタデータ内で機能する公開鍵を書式設定します。

Linux と OSX


Linux または OSX ワークステーションでは、ssh-keygen ツールで認証鍵ペアを生成できます。

  1. ワークステーションで端末を開き、ssh-keygen コマンドを使用して新しい認証鍵のペアを生成します。Google ユーザー名を使ってコメントを追加するには、-C フラグを指定します。

    ssh-keygen -t rsa -f ~/.ssh/[KEY_FILE_NAME] -C [USERNAME]
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_FILE_NAME] は、認証鍵ファイルに使用する名前です。たとえば、値が my-ssh-key であれば、my-ssh-key という名前の秘密鍵ファイルと my-ssh-key.pub という名前の公開鍵ファイルが生成されます。
  2. gcloud ツールまたは API を使用して公開 SSH 認証鍵を設定する場合は、認証鍵にユーザー名の接頭辞を付ける必要があります。公開鍵ファイルを編集して、ユーザー名の接頭辞を含めます。次の例の場合、認証鍵には、認証鍵コメントのユーザー名に加えて、ユーザー名接頭辞も含まれます。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_VALUE] は、生成される SSH 認証鍵の値です。

    必要に応じて、認証鍵ファイルの末尾に google-ssh を追加し、その後に JSON 形式の userNameexpireOn フィールドを続けることで、認証鍵の有効期限を設定することができます。

      [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_VALUE] は、生成される SSH 認証鍵の値です。
    • [EXPIRE_TIME]RFC3339 形式の値です。たとえば、2018-12-04T20:12:00+0000 と記述します。
  3. アクセスを秘密鍵に制限することで、自分だけが読み取ることができ、誰も書き込めないようにすることができます。

    chmod 400 ~/.ssh/[KEY_FILE_NAME]
    

    ここで、[KEY_FILE_NAME] は秘密鍵ファイルの名前です。

  4. 公開鍵をプロジェクトに適用するか、公開鍵を特定のインスタンスに適用します。公開鍵ファイルは拡張子 .pub のファイルです。

Windows


Windows には、ssh-keygen ツールが組み込まれていないため、Windows ワークステーション上ではサード パーティー ツールを使用して認証鍵ペアを生成する必要があります。たとえば、PuTTYgen ツールを使用して認証鍵ペアを生成することができます。

  1. puttygen.exe をダウンロードします

  2. PuTTYgen を実行します。この例では、ダウンロードした puttygen.exe ファイルを実行します。認証鍵生成のための設定値を設定するためのウィンドウが開きます。

  3. [Generate] ボタンをクリックして、新しい認証鍵のペアを生成します。ほとんど場合、デフォルトのパラメータをそのまま使用できます。認証鍵ペアの生成が完了すると、ツールに公開鍵の値が表示されます。

  4. 必要に応じて、鍵パスフレーズを入力することで鍵を保護できます。

  5. [秘密鍵を保存] をクリックして、秘密鍵を .ppk 拡張子のファイルに書き込みます。

  6. [公開鍵を保存] をクリックして、公開鍵を .pub 拡張子のファイルに書き込みます。

  7. gcloud ツールまたは API を使用して公開 SSH 認証鍵を設定する場合は、認証鍵にユーザー名の接頭辞を付ける必要があります。公開鍵ファイルを編集して、ユーザー名の接頭辞を含めます。次の例の場合、認証鍵には、認証鍵コメントのユーザー名に加えて、ユーザー名接頭辞も含まれます。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_VALUE] は、生成される SSH 認証鍵の値です。

    必要に応じて、認証鍵ファイルの末尾に google-ssh を追加し、その後に JSON 形式の userNameexpireOn フィールドを続けることで、認証鍵の有効期限を設定することができます。

      [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_VALUE] は、生成される SSH 認証鍵の値です。
    • [EXPIRE_TIME]RFC3339 形式の値です。たとえば、2018-12-04T20:12:00+0000 と記述します。
  8. 公開鍵をプロジェクトに適用するか、公開鍵を特定のインスタンスに適用します。公開鍵ファイルは拡張子 .pub のファイルです。

既存の公開 SSH 認証鍵ファイルの書式設定

既存の公開 SSH 認証鍵をプロジェクトまたはインスタンス メタデータにアップロードするには、事前に追加情報で公開鍵ファイルを書式設定しておく必要があります。

  1. 既存の公開鍵ファイルのコピーを作成します。このコピーを Compute Engine で使用し、元のファイルは他の SSH 設定で使用するためにとっておきます。

  2. gcloud ツールまたは API を使用して公開 SSH 認証鍵を設定する場合は、認証鍵にユーザー名の接頭辞を付ける必要があります。公開鍵ファイルを編集して、ユーザー名の接頭辞を含めます。次の例の場合、認証鍵には、認証鍵コメントのユーザー名に加えて、ユーザー名接頭辞も含まれます。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_VALUE] は、生成される SSH 認証鍵の値です。

    必要に応じて、認証鍵ファイルの末尾に google-ssh を追加し、その後に JSON 形式の userNameexpireOn フィールドを続けることで、認証鍵の有効期限を設定することができます。

      [USERNAME]:ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}
    

    ここで:

    • [USERNAME] は、この SSH 認証鍵のユーザーです。
    • [KEY_VALUE] は、生成される SSH 認証鍵の値です。
    • [EXPIRE_TIME]RFC3339 形式の値です。たとえば、2018-12-04T20:12:00+0000 と記述します。

プロジェクト内のすべてのインスタンスに使用する SSH 認証鍵の追加または削除

公開 SSH 鍵をプロジェクト内のすべてのインスタンスに追加する場合は、プロジェクト全体の sshKeys メタデータ値を設定または変更します。プロジェクト全体の公開鍵を追加できるのは、プロジェクトのオーナーと編集者だけです。

gcloud


gcloud ツールを使用して、プロジェクト全体の公開鍵を追加または削除します。

  1. インスタンスの既存のプロジェクト全体の sshKeys メタデータ値を取得します。

    gcloud compute project-info describe
    
    ...
    metadata:
      fingerprint: Rq1XCvmRVik=
      items:
      - key: sshKeys
        value: [USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]
    ...

    ここで:

    • [USERNAME] は、既存の鍵のユーザー名です。
    • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] は、既にプロジェクトに適用されている公開鍵の値です。
  2. 既存の鍵と追加する新しい鍵を統合し、削除する鍵は除外します。この例では、ファイルには新しい [KEY_VALUE] と、その後に前のステップで取得した既存の鍵の値が含まれています。[EXISTING_KEY_VALUE_1] は除外されているので、次のステップでインスタンスから削除されます。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]
    [USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]
    

    ここで:

    • [USERNAME] は、既存の鍵のユーザー名です。
    • [KEY_VALUE] は、プロジェクトに追加する新しい鍵の値です。
    • [EXISTING_KEY_VALUE_1] は、既にプロジェクトに適用されているが、削除する必要がある公開鍵の値です。
    • [EXISTING_KEY_VALUE_2] は、既にプロジェクトに適用されており、保持する必要がある公開鍵の値です。
  3. 次の compute project-info add-metadata コマンドを使用して、プロジェクト全体の sshKeys 値を設定します。この例では、--metadata-from-file フラグを含めて、ローカル クライアント上のファイルのパスを指定します。

    gcloud compute project-info add-metadata
    --metadata-from-file sshKeys=[KEY_FILE_NAME].pub
    

    ここで [KEY_FILE_NAME] は公開鍵ファイルの名前です。

API


instances.setMetadata メソッドを使用して、プロジェクト全体の公開鍵を追加または削除します。

  1. projects.get メソッドを使用して、メタデータ fingerprint 値を取得します。既存のプロジェクト全体の鍵を保持する場合は、既存の sshKeys 値を取得します。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]
    
    ...
    "fingerprint": "[FINGERPRINT]",
    "items": [
     {
      "key": "sshKeys",
      "value": "[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]"
     }
    ]
    ...

    ここで:

    • [PROJECT_ID] は、固有のプロジェクト ID です。
    • [FINGERPRINT] は、この特定のメタデータ設定の固有 ID です。これにより、意図せずに同時変更を上書きすることを避けられます。
    • [USERNAME] は、既存の鍵のユーザー名です。
    • [EXISTING_KEY_VALUE_1] と [EXISTING_KEY_VALUE_2] は、すでにプロジェクトに適用されている公開鍵の値です。
  2. 既存の鍵と追加する新しい鍵を統合し、削除する鍵は除外します。この例では、ファイルには新しい [KEY_VALUE] と、その後に前のステップで取得した既存の鍵の値が含まれています。[EXISTING_KEY_VALUE_1] は除外されているので、次のステップでインスタンスから削除されます。各鍵の値の区切りには、\n 文字を使用します。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]
    

    ここで:

    • [USERNAME] は、既存の鍵のユーザー名です。
    • [KEY_VALUE] は、プロジェクトに追加する新しい鍵の値です。
    • [EXISTING_KEY_VALUE_1] は、既にプロジェクトに適用されているが、削除する必要がある公開鍵の値です。
    • [EXISTING_KEY_VALUE_2] は、すでにプロジェクトに適用されており、保持する必要がある公開鍵の値です。
  3. projects.setcommoninstancemetadata メソッドを使用して、プロジェクト全体の sshKeys 値を設定します。fingerprint 値を組み込んで、このメタデータ値への同時変更が上書きされないようにします。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/setCommonInstanceMetadata
    
    {
     "items": [
      {
       "key": "sshKeys",
       "value": "[USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]"
      }
     ]
     "fingerprint": "[FINGERPRINT]"
    }
    

    ここで:

    • [PROJECT_ID] は、固有のプロジェクト ID です。
    • [USERNAME] は、既存の鍵のユーザー名です。
    • [KEY_VALUE] は、プロジェクトに追加する新しい鍵の値です。
    • [EXISTING_KEY_VALUE_1] は、既にプロジェクトに適用されているが、削除する必要がある公開鍵の値です。
    • [EXISTING_KEY_VALUE_2] は、既にプロジェクトに適用されており、保持する必要がある公開鍵の値です。
    • [FINGERPRINT] は、projects.get メソッドで事前に取得したフィンガープリントです。

インスタンスの block-project-ssh-keys メタデータ値が TRUE に設定されているか、またはインスタンスに非推奨のインスタンス専用 sshKeysが設定されている場合は、プロジェクト全体の SSH 認証鍵すべてが無視されます。このようなインスタンスにプロジェクト全体の鍵を適用するには、このインスタンスから block-project-ssh-keys メタデータ値を削除するか、または非推奨のインスタンス専用 sshKeys 値を削除します。

特定のインスタンス用の SSH 認証鍵の追加または削除

プロジェクト内の特定のインスタンスに公開 SSH 認証鍵を追加する場合は、インスタンス専用の ssh-keys メタデータ値を設定または変更します。

gcloud


gcloud ツールを使用して、インスタンス専用の公開鍵を追加します。

  1. インスタンスの既存のインスタンス専用 ssh-keys メタデータ値を取得します。

    gcloud compute instances describe [INSTANCE_NAME]
    
    ...
    metadata:
      fingerprint: QCofVTHlggs=
      items:
      - key: ssh-keys
        value: [USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]
    ...

    ここで:

    • [INSTANCE_NAME] は、追加の公開 SSH 認証鍵を追加する必要があるインスタンスの名前です。
    • [USERNAME] は、既存の鍵のユーザー名です。
    • [EXISTING_KEY_VALUE_1][EXISTING_KEY_VALUE_2] は、既にインスタンスに適用されている公開鍵の値です。
  2. 既存の鍵と追加する新しい鍵を統合し、削除する鍵は除外します。この例では、.pub ファイルには新しい [KEY_VALUE] と、その後に前のステップで取得した既存の鍵の値が含まれています。[EXISTING_KEY_VALUE_1] は除外されているので、次のステップでインスタンスから削除されます。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]
    [USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]
    

    ここで:

    • [USERNAME] は、既存の鍵のユーザー名です。
    • [KEY_VALUE] は、インスタンスに追加する新しい鍵の値です。
    • [EXISTING_KEY_VALUE_1] は、既にインスタンスに適用されているが、削除する必要がある公開鍵の値です。
    • [EXISTING_KEY_VALUE_2] は、既にインスタンスに適用されており、保持する必要がある公開鍵の値です。
  3. 次の compute instances add-metadata コマンドを使用して、インスタンス専用の ssh-key 値を設定します。この例では、--metadata-from-file フラグを含めて、ローカル クライアント上の公開鍵ファイルのパスを指定します。

    gcloud compute instances add-metadata [INSTANCE_NAME] \
    --metadata-from-file ssh-keys=[KEY_FILE_NAME].pub
    

    ここで:

    • [INSTANCE_NAME] は、公開 SSH 認証鍵ファイルを適用するインスタンスの名前です。
    • [KEY_FILE_NAME] は、公開鍵ファイルの名前です。

API


instances.setMetadata メソッドを使用して、プロジェクトのメタデータにインスタンス専用の sshKeys 値を追加します。

  1. instances.get メソッドを使用して、リクエストに使用するメタデータ fingerprint 値を取得します。既存のプロジェクト全体の鍵を保持する場合は、既存の ssh-keys 値を取得します。

    GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-d/instances/[INSTANCE_NAME]
    
    ...
    "fingerprint": "[FINGERPRINT]",
    "items": [
     {
      "key": "ssh-keys",
      "value": "[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]"
     }
    ]
    ...

    ここで:

    • [PROJECT_ID] は、固有のプロジェクト ID です。
    • [INSTANCE_NAME] は、新しい鍵を設定するインスタンスです。
    • [FINGERPRINT] は、この特定のメタデータ設定の固有 ID です。これにより、意図せずに同時変更を上書きすることを避けられます。
    • [USERNAME] は、既存の鍵のユーザー名です。
    • [EXISTING_KEY_VALUE_1] と [EXISTING_KEY_VALUE_2] は、既にインスタンスに適用されている公開鍵の値です。
  2. 既存の鍵と追加する新しい鍵を統合し、削除する鍵は除外します。この例では、ファイルには新しい [KEY_VALUE] と、その後に前のステップで取得した既存の鍵の値が含まれています。[EXISTING_KEY_VALUE_1] は除外されているので、次のステップでインスタンスから削除されます。各鍵の値の区切りには、\n 文字を使用します。

    [USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]
    

    ここで:

    • [USERNAME] は、既存の鍵のユーザー名です。
    • [KEY_VALUE] は、インスタンスに追加する新しい鍵の値です。
    • [EXISTING_KEY_VALUE_1] は、既にインスタンスに適用されているが、削除する必要がある公開鍵の値です。
    • [EXISTING_KEY_VALUE_2] は、すでにインスタンスに適用されており、保持する必要がある公開鍵の値です。
  3. instances.setMetadata メソッドを使用して、インスタンス専用の ssh-keys 値を設定します。fingerprint 値を組み込んで、このメタデータ値への同時変更が上書きされないようにします。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-d/instances/[INSTANCE_NAME]/setMetadata
    
    {
     "items": [
      {
       "key": "ssh-keys",
       "value": "[USERNAME]:ssh-rsa [KEY_VALUE] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_1] [USERNAME]\n[USERNAME]:ssh-rsa [EXISTING_KEY_VALUE_2] [USERNAME]"
      }
     ]
     "fingerprint": "[FINGERPRINT]"
    }
    

    ここで:

    • [PROJECT_ID] は、固有のプロジェクト ID です。
    • [INSTANCE_NAME] は、新しい鍵を設定するインスタンスです。
    • [FINGERPRINT] は、この特定のメタデータ設定の固有 ID です。これにより、意図せずに同時変更を上書きすることを避けられます。
    • [USERNAME] は、既存の鍵のユーザー名です。
    • [EXISTING_KEY_VALUE_1] と [EXISTING_KEY_VALUE_2] は、既にインスタンスに適用されている公開鍵の値です。

プロジェクト レベルの鍵が特定のインスタンスで機能しないようにブロックする

インスタンスでプロジェクト全体の鍵を無視して、インスタンスに設定されたインスタンス専用の鍵のみを使用する必要がある場合は、block-project-ssh-keys メタデータ値を TRUE に設定します。

gcloud


block-project-ssh-keys メタデータ値をインスタンスに追加し、その値を TRUE に設定します。メタデータ値をこの値に設定することにより、プロジェクト全体の鍵すべてがこのインスタンスに対して機能しないようにブロックすることができ、それによってインスタンス専用の鍵のみが機能するようになります。

gcloud compute instances add-metadata [INSTANCE_NAME]
--metadata block-project-ssh-keys=TRUE

ここで、[INSTANCE_NAME] は公開 SSH 認証鍵ファイルを適用するインスタンスの名前です。

API


block-project-ssh-keys メタデータ値をインスタンスに追加し、その値を TRUE に設定します。メタデータ値をこの値に設定することにより、プロジェクト全体の鍵すべてがこのインスタンスに対して機能しないようにブロックすることができ、それによってインスタンス専用の鍵のみが機能するようになります。

 POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-d/instances/[INSTANCE_NAME]/setMetadata

 {
  "items": [
   {
    "key": "block-project-ssh-keys",
    "value": TRUE
   }
  ]
  "fingerprint": "[FINGERPRINT]"
 }

ここで:

  • [PROJECT_ID] は、固有のプロジェクト ID です。
  • [INSTANCE_NAME] は、新しい鍵を設定するインスタンスです。
  • [FINGERPRINT] は、この特定のメタデータ設定の固有 ID です。これにより、意図せずに同時変更を上書きすることを避けられます。

次のステップ

外出先でもリソースをモニタリング

Google Cloud Console アプリを入手して、プロジェクトの管理にお役立てください。

フィードバックを送信...

Compute Engine ドキュメント