SSH キー認証を使用する

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

macOS、Linux、Windows から SSH を介して Git リポジトリに接続することにより、HTTPS 認証を使用して安全に接続することができます。

重要

SSH URL は変更されましたが、古い SSH URL は引き続き機能します。 SSH を既に設定している場合は、リモート URL を新しい形式に更新してください。

最新の SSH URL の先頭は ssh.dev.azure.com です。 前の URL では vs-ssh.visualstudio.com が使用されています。

  • SSH を使用しているリモートを確認します。 シェルで git remote -v を実行するか、GUI クライアントを使用します。
  • Web 上のリポジトリにアクセスして、[複製] を選択します。
  • [SSH] を選択し、新しい SSH URL をコピーします。
  • シェルで、リポジトリの更新対象のリモートごとに git remote set-url <remote name> <new SSH URL> を実行します。 別の方法として、GUI クライアントを使用してリモート URL を更新します。

SSH キー認証のしくみ

SSH 公開キー認証は、生成された暗号化キーの非対称ペアと連携して動作します。 "公開" キーは Azure DevOps と共有され、最初の SSH 接続を検証するために使用されます。 "秘密" キーは、システム上で安全に保護されます。

SSH キー認証を設定する

以降の手順は、次のプラットフォームでのコマンド ライン (shell とも呼ばれます) を使用した SSH キー認証の構成を対象にしています。

Note

Visual Studio 2017 以降、SSH を使用して Azure DevOps Git リポジトリに接続できます。

ヒント

Windows では、Git Credential Manager または個人用アクセス トークンの使用をお勧めします。

手順 1: SSH キーを作成する

Note

システムで RSA SSH キーを既に作成している場合は、この手順をスキップして、SSH キーを構成してください。 これを確認するには、ホーム ディレクトリに移動し、.ssh フォルダー (Windows では %UserProfile%\.ssh\、Linux、macOS、Git Bash を使用する Windows では ~/.ssh/) を調べます。 名前がそれぞれ id_rsaid_rsa.pub の 2 つのファイルが見つかったら、SSH キーの構成に進んでください。

キーベースの認証を使用するには、最初にクライアント用の公開/秘密キーのペアを生成する必要があります。 キー ファイルの生成には ssh-keygen.exe を使用し、アルゴリズム DSA、RSA、ECDSA、または Ed25519 を指定できます。 アルゴリズムが指定されていない場合は、RSA が使用されます。

Note

Azure DevOps でサポートされている SSH キーの種類は RSA のみです。

RSA アルゴリズムを使用してキー ファイルを生成するには、PowerShell またはクライアント上の bash などの別のシェルから次のコマンドを実行します。

ssh-keygen

コマンドからの出力には、次の出力が表示されます (username はユーザー名に置き換えられます)。

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):

Enter キーを押して既定値をそのまま使用することも、キーを生成するパスまたはファイル名 (あるいはその両方) を指定することもできます。 この時点で、秘密キー ファイルを暗号化するためにパスフレーズを使用するように求められます。 パスフレーズは空でもかまいませんが、推奨されません。 パスフレーズとキー ファイルが連携して、2 要素認証が提供されます。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_rsa.
Your public key has been saved in C:\Users\username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FHK6WjcUkcfQjdorarzlak1Ob/x7AmqQmmx5ryYYV+8 username@LOCAL-HOSTNAME
The key's randomart image is:
+---[RSA 3072]----+
|      . ** o     |
|       +.o= .    |
|      . o+       |
|      .+. .      |
|     .ooS  .     |
|  . .oo.=.o      |
|   =.= O.= .     |
|  . B BoE + . .  |
|   . *+*o. .o+   |
+----[SHA256]-----+

これで、指定された場所に公開/秘密 RSA キーの組が作成されました。 .pub ファイルが公開キーであり、拡張子のないファイルが秘密キーです。

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/11/2022   6:29 PM           2610 id_rsa
-a----        10/11/2022   6:29 PM            578 id_rsa.pub

重要

秘密キーの内容を共有しないでください。 秘密キーが侵害された場合、攻撃者はそれを使用してあなたが接続しようとしているとサーバーに勘違いさせることができます。 秘密キー ファイルはパスワードと同等であり、同様に保護する必要があります。

手順 2: 公開キーを Azure DevOps に追加する

前の手順で生成した公開キーをユーザー ID に関連付けます。

Note

この操作は、アクセス権を持ち、SSH を使用する組織ごとに繰り返す必要があります。

  1. Web ポータルを参照し、ユーザー インターフェイスの右上にあるアバターの横にあるアイコンを選択して、セキュリティ設定を開きます。 表示されるメニューで [SSH 公開キー] を選択します。

    SSH 公開キーのメニュー項目と、Azure DevOps で選択されたユーザー アバターを示すスクリーンショット。

  2. [+ 新しいキー] を選択します。

    Azure DevOps のセキュリティ構成へのアクセスを示すスクリーンショット。

  3. 生成した公開キー (id_rsa.pub など) の内容を [公開キー データ] フィールドにコピーします。

    重要

    [キー データ] フィールドに空白文字や改行を追加しないでください。Azure DevOps が無効な公開キーを使用する原因になる可能性があるためです。 キーへの貼り付け時には、多くの場合、最後に改行が追加されます。 この改行が発生した場合は、必ず削除してください。

    Azure DevOps での公開キーの構成を示すスクリーンショット。

  4. 後で思い出すことができるように、キーに有用な説明 (この説明はプロファイルの [SSH 公開キー] ページに表示されます) を入力します。 [保存] を選択して公開キーを格納します。 保存すると、キーを変更することはできません。 キーを削除するか、別のキーの新しいエントリを作成することはできます。 ユーザー プロファイルに追加できるキーの数に制限はありません。 Azure DevOps に格納されている SSH キーは、1 年後に期限切れになることにも注意してください。 キーの有効期限が切れた場合は、新しいキーまたは同じキーをアップロードして、SSH 経由での Azure DevOps へのアクセスを続行できます。

  5. 概要ページの上部に、サーバーのフィンガープリントを含む注意書きが表示されます。 これは SSH 経由で Azure DevOps に初めて接続するときに必要になるため、メモしておきます。

    Azure DevOps Services のセキュリティ構成へのアクセスのスクリーンショット。

  6. 次のコマンドを実行して接続をテストします。

    ssh -T git@ssh.dev.azure.com
    

    初めて接続した場合は、次の出力を受け取ります。

    The authenticity of host 'ssh.dev.azure.com (<IP>)' can't be established.
    RSA key fingerprint is SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    

    表示されたフィンガープリントと、前述の設定ページで提供されたフィンガープリントを比較します。 一致する場合にのみ続行してください。

    すべてが正しく構成されている場合、出力は次のようになります。

    remote: Shell access is not supported.
    

    そうでない場合は、「質問とトラブルシューティング」のセクションを参照してください。

手順 3: SSH を使用して Git リポジトリをクローンする

Note

前に HTTPS 経由で複製されたリポジトリで SSH を使用するには、リモートを SSH に更新する方法に関するページを参照してください。

  1. Web ポータルから SSH クローン URL をコピーします。 この例では、SSH 複製 URL は、URL の の後の最初の部分で示されているとおり、fabrikam-fiberdev.azure.com という名前の組織のリポジトリ用です。

    Azure Repos SSH によって複製された URL を示すスクリーンショット

    Note

    Azure DevOps Services では、プロジェクト URL の形式は dev.azure.com/{your organization}/{your project} です。 ただし、visualstudio.com 形式を参照する以前の形式は引き続きサポートされています。 詳細については、「Azure DevOps の概要」の「新しいドメイン名 URL を使用するように既存の組織を切り替える」を参照してください。

  2. コマンド プロンプトで git clone を実行します。

    git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
    

    SSH エージェントによって管理されていない限り、続行する前に SSH キーのパスフレーズの入力を求めるメッセージが表示されます。

    Cloning into 'FabrikamFiber'...
    Enter passphrase for key '/c/Users/username/.ssh/id_rsa':
    remote: Azure Repos
    remote: Found 127 objects to send. (50 ms)
    Receiving objects: 100% (127/127), 56.67 KiB | 2.58 MiB/s, done.
    Resolving deltas: 100% (15/15), done.
    

    代わりにフィンガープリントの確認を求めるメッセージが表示される場合は、「手順 2: 公開キーを Azure DevOps に追加する」を参照してください。 その他の問題については、「質問とトラブルシューティング」のセクションを参照してください。

ヒント

SSH を最大限に活用するには、SSH エージェントを使用して SSH キーを管理するのが一般的です。 ただし、エージェントの設定は、この記事の範囲外です。

質問とトラブルシューティング

回答:次の2つの異なる警告メッセージが表示されます。

ssh-rsa is about to be deprecated and your request has been throttled. Please use rsa-sha2-256 or rsa-sha2-512 instead. Your session will continue automatically. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

または

You’re using ssh-rsa that is about to be deprecated and your request has been blocked intentionally. Any SSH session using SSH-RSA is subject to brown out (failure during random time periods). Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

~/.ssh/config(Windowsの%UserProfile%\.ssh\config)ファイルに次の項目を追加することで、Azure DevOpsのセキュリティ設定をダウングレードするようにSSH設定を変更している可能性があります。

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  HostkeyAlgorithms +ssh-rsa

今すぐこれらの行を削除し、rsa-sha2-256および/またはrsa-sha2-512が許可されていることを確認してください。

詳細については、ブログ投稿を参照してください。

Q: SSH で接続を確立できません。 どうすればよいですか。

A: 次のように複数の異なる問題が発生する可能性があります。

  • サポートされていないSSH-RSAの使用

    You’re using ssh-rsa that is unsupported. Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.
    

    ~/.ssh/config(Windowsの%UserProfile%\.ssh\config)ファイルに次の項目を追加することで、Azure DevOpsのセキュリティ設定をダウングレードするようにSSH設定を変更している可能性があります。

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    今すぐこれらの行を削除し、rsa-sha2-256および/またはrsa-sha2-512が許可されていることを確認してください。

    詳細については、ブログ投稿を参照してください。

  • 一致するホストキーがない

    これは、Azure DevOpsサービスでも、ブログ投稿で言及されている最新バージョンのAzure DevOpsサーバでも発生しないはずです。

    Unable to negotiate with <IP> port 22: no matching host key type found. Their offer: ssh-rsa
    

    SSH 構成を変更して、Azure DevOps のセキュリティ設定を ~/.ssh/config (Windows では %UserProfile%\.ssh\config) ファイルに追加することでダウングレードします。

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    重要

    OpenSSH は ssh-rsa 公開キー署名アルゴリズムを、バージョン 8.2 で非推奨にし、バージョン 8.8 で既定で無効にしました。

  • 一致するMACがない

    Unable to negotiate with <IP> port 22: no matching MAC found. Their offer: hmac-sha2-256,hmac-sha2-512
    

    SSH 構成を変更して、Azure DevOps のセキュリティ設定を ~/.ssh/config (Windows では %UserProfile%\.ssh\config) ファイルに追加することでダウングレードします。

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       MACs +hmac-sha2-512,+hmac-sha2-256
    
  • 一致するキー交換方式がない

    Unable to negotiate with <IP> 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256
    

    SSH 構成を変更して、Azure DevOps のセキュリティ設定を ~/.ssh/config (Windows では %UserProfile%\.ssh\config) ファイルに追加することでダウングレードします。

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       KexAlgorithms +diffie-hellman-group-exchange-sha256,+diffie-hellman-group14-sha1,+diffie-hellman-group1-sha1
    

    重要

    OpenSSH のdiffie-hellman-group1-sha1バージョン 6.9 ではキー交換アルゴリズム が、diffie-hellman-group14-sha1バージョン 8.2 では が既定で無効になりました。

ヒント

Azure DevOps Server と TFS のセルフホステッド インスタンスについては、Host 行に ssh.dev.azure.com vs-ssh.visualstudio.com の代わりに適切なホスト名を使用してください。

Q: キーのパスフレーズを Git に記憶させるにはどうすればよいですか?

A: それには SSH エージェントを使用できます。 Linux、macOS、および Windows (Windows 10 (ビルド 1809) 以降、または Git Bash がある Git for Windows を使用) はすべて、SSH エージェント付きで出荷されます。 SSH エージェントを使用して SSH キーをキャッシュすることで繰り返し使用できます。 使用方法の詳細については、SSH ベンダーのマニュアルを参照してください。

Q: SSH クライアントとして PuTTY を使用し、PuTTYgen でキーを生成しました。 Azure DevOps Services でこれらのキーを使用できますか?

A: はい。 PuTTYgen で秘密キーを読み込み、[Conversions] メニューに移動し、[Export OpenSSH key] を選択します。 秘密キー ファイルを保存し、既定以外のキーを設定する手順に従います。 [PuTTYgen] ウィンドウから公開キーを直接コピーし、セキュリティ設定の [キー データ] フィールドに貼り付けます。

Q: アップロードした公開キーがローカル キーと同じキーであることを検証するにはどうすればよいですか?

A: コマンド ラインを使用して公開キーに対して次の ssh-keygen コマンドを実行して、アップロードされた公開キーのフィンガープリントが、プロファイルに表示されている公開キーのものと同じであることを検証できます。 既定値を使用していない場合は、パスと公開キーのファイル名を変更する必要があります。

ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub

次に、MD5 署名をプロファイル内のものと比較できます。 この確認は、キーを Azure DevOps に追加するときに、接続に問題があるか、公開キーを [キー データ] フィールドに誤って貼り付けることが懸念される場合に便利です。

Q: 現在 HTTPS を使用しているリポジトリで SSH の使用を開始するにはどうすればよいですか?

A: HTTPS から SSH URL に変更するには、Git で origin リモートを更新する必要があります。 SSH クローン URL を取得したら、次のコマンドを実行します。

git remote set-url origin <SSH URL to your repository>

origin という名前のリモートにアクセスする Git コマンドは SSH を使用するようになります。

Q: Azure DevOps Services で Git LFS を使用しているのですが、Git LFS によって追跡されたファイルをプルするときにエラーが発生します。

A: Azure DevOps Services は現在、LFS over SSH をサポートしていません。 Git LFS によって追跡されたファイルがあるリポジトリに接続する際は HTTPS を使用してください。

Q: ~/.ssh/id_rsa や ~/.ssh/id_rsa.pub ではなく、既定以外のキーの場所を使用するにはどうすればよいですか?

A: 既定とは異なる場所に保存されたキーを使用するには、次の 2 つのタスクを実行します。

  1. キーは、あなたのみが読み取りや編集を実行できるフォルダー内に配置する必要があります。 フォルダーのアクセス許可範囲がそれより広い場合、SSH はキーを使用しません。

  2. キーの場所を SSH に通知する必要があります。たとえば、次のように SSH 構成でそれを "Identity" として指定します。

    Host ssh.dev.azure.com
      IdentityFile ~/.ssh/id_rsa_azure
      IdentitiesOnly yes
    

この IdentitiesOnly yes 設定により、SSH が他の使用可能な ID を認証に使用しなくなります。 これは、複数の ID が使用可能な場合に特に重要です。

Q: 複数の SSH キーがあります。 Azure DevOps に正しい SSH キーを使用するにはどうすればよいですか?

A: 一般に、SSH クライアントに対して複数のキーを構成して、SSH サーバーに接続すると、クライアントはサーバーがキーを受け入れるまで一度に 1 つずつキーを試すことができます。

ただし、これは、SSH プロトコルに関連する技術的な理由と Git SSH URL の構造により、Azure DevOps では機能しません。 Azure DevOps は、認証時にクライアントが提供する最初のキーを無条件で受け入れます。 そのキーが要求されたリポジトリに対して無効な場合、次のエラーが発生するため、他の使用可能なキーを試みることなく要求が失敗します。

remote: Public key authentication failed.
fatal: Could not read from remote repository.

Azure DevOps の場合は、特定のキー ファイルを明示的に使用するように SSH を構成する必要があります。 手順は、既定以外の場所に格納されているキーを使用するときと同じです。 Azure DevOps ホストに正しい SSH キーを使用するように SSH に指示するだけです。

Q: Azure DevOps 上の異なる組織に異なる SSH キーを使用するにはどうすればよいですか?

A: Azure DevOps は、認証時にクライアントが提供する最初のキーを無条件で受け入れます。 そのキーが要求されたリポジトリに対して無効な場合、要求は次のエラーで失敗します。

remote: Public key authentication failed.
fatal: Could not read from remote repository.

ただし、SSH 構成を変更することで、異なる組織を区別し、それぞれに異なるキーを提供できます。 これを行うには、ホスト別名を使用して、SSH 構成に個別の Host セクションを作成する必要があります。 これは、ホストされているすべての Azure DevOps URL が同じホスト名 (ssh.dev.azure.com) を持っていて、SSH には既定でそれらを区別する方法がないためです。

# The settings in each Host section are applied to any Git SSH remote URL with a
# matching hostname.
# Generally:
# * SSH uses the first matching line for each parameter name, e.g. if there's
#   multiple values for a parameter across multiple matching Host sections
# * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
#   the IdentityFile values we explicitly set.
# * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
#   e.g. C:\Users\<username>\.ssh\your_private_key.

# Imagine that we have the following two SSH URLs:
# * git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo
#   * For this, we want to use `fabrikamkey`, so we'll create `devops_fabrikam` as
#     a Host alias and tell SSH to use `fabrikamkey`.
# * git@ssh.dev.azure.com:v3/Contoso/Project2/con_repo
#   * For this, we want to use `contosokey`, so we'll create `devops_contoso` as
#     a Host alias and tell SSH to use `contosokey`.
#
# To set explicit keys for the two host aliases and to tell SSH to use the correct
# actual hostname, add the next two Host sections:
Host devops_fabrikam
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_fabrikam
  IdentitiesOnly yes

Host devops_contoso
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_contoso
  IdentitiesOnly yes

その後、実際の URL を使用する代わりに、既存のリモートのホスト名をそれぞれ devops_fabrikamdevops_contoso に置き換えて、各リポジトリにこれらの URL をリモートとして使用するように Git に指示します。 たとえば、git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repogit@devops_fabrikam:v3/Fabrikam/Project1/fab_repo になります。

Q: SSH キーに関してどのような通知を受け取りますか?

A: Azure DevOps Services に新しい SSH キーを登録するたびに、新しい SSH キーがアカウントに追加されたことを通知するメール通知が届きます。

SSH 通知の例

Q: 自分以外のユーザーが自分のアカウントに SSH キーを追加していると思われる場合はどうすればよいですか?

A: SSH キーが登録中であるという通知を受け取ったが、それをサービスに手動でアップロードしなかった場合は、資格情報が侵害されている可能性があります。

次のステップは、パスワードが侵害されたかどうかを調査することです。 パスワードを変更することは、この攻撃ベクトルに対する防衛として、常に適切な最初のステップです。 Microsoft Entra ユーザーの場合は、管理者に問い合わせて、不明なソース/場所からアカウントが使用されたかどうかを確認してください。

Q: まだパスワードの入力を求められ、GIT_SSH_COMMAND="ssh -v" git fetchno mutual signature algorithm または corresponding algo not in PubkeyAcceptedAlgorithms が表示される場合はどうすればよいですか?

A: Fedora Linux などの一部の Linux ディストリビューションには、Azure DevOps でサポートされているよりも強力な SSH 署名アルゴリズムを必要とする暗号化ポリシーがあります (2021 年 1 月現在)。 このサポートを追加するためのオープン機能要求があります。

SSH 構成 (~/.ssh/config) に次のコードを追加することで、この問題を回避できます。

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  PubkeyAcceptedKeyTypes +ssh-rsa

ヒント

Azure DevOps Server と TFS のセルフホステッド インスタンスについては、Host 行に ssh.dev.azure.com vs-ssh.visualstudio.com の代わりに適切なホスト名を使用してください。