次の方法で共有


SSH キー認証を使用する

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

macOS、Linux、または Windows 上の SSH 経由で Git リポジトリに接続して、Azure DevOps に安全に接続できます。

重要

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 を指定できます。 アルゴリズムが指定されていない場合は、Ed25519 が使用されます。

Note

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

Azure DevOps でサポートされている RSA アルゴリズム (RSA-SHA2-256 または RSA-SHA2-512) を使用してキー ファイルを生成するには、クライアントで PowerShell を使用するか bash などの別のシェルを使用して、次のコマンドのいずれかを実行します。

ssh-keygen -t rsa-sha2-256

または

ssh-keygen -t rsa-sha2-512

コマンドからの出力には、次の出力が表示されます ( 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 公開キー]概要ページに、サーバーのフィンガープリントが表示されます。 SSH 経由で Azure DevOps に初めて接続するときに使用できるよう、SHA256 フィンガープリントをメモしておきます。

    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])?
    

    このフィンガープリントと、さきほどの [SSH 公開キー] ページに表示された SHA256 フィンガープリントを比較します。 一致する場合にのみ続行してください。

  7. yes」と入力して続行します。 すべてが構成されていれば、出力は次のようになります。

     Warning: Permanently added 'ssh.dev.azure.com' (RSA) to the list of known hosts.
     remote: Shell access is not supported.
     shell request failed on channel 0
    

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

手順 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 エージェントを使用していない場合は、パスフレーズを入力するように求められます。

    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 キーを管理するのが一般的です。 ただし、エージェントの設定は、この記事の範囲外です。

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

A: 表示される可能性のある警告メッセージには、次の 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) ファイルに次の行を追加して SSH 構成を変更して Azure DevOps のセキュリティ設定をダウングレードした場合:

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) ファイルに次の行を追加して SSH 構成を変更して Azure DevOps のセキュリティ設定をダウングレードした場合:

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

    これらの行を削除して、rsa-sha2-256 または rsa-sha2-512、あるいはその両方が許可されていることを確認してください。

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

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

    この問題は、ブログ記事に記載されているように、Azure DevOps Service または最近のバージョンの Azure DevOps Server では発生しません。

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

Note

2024 年 8 月/9 月の時点で、MD5 から SHA-256 ハッシュに移行しています。 移行期間中に正しい関数を選択することが必要な場合があります。

ssh-keygen -l -E md5 -f <path_to_your_public_key> -- use this for MD5 fingerprints
ssh-keygen -l -E sha256 -f <path_to_your_public_key> -- use this for SHA-256 fingerprints

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

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

A: HTTPS URL から 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 サーバーがいずれかのキーを受け入れるまで、各キーで順番に認証を試みます。

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

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

Azure DevOps の場合は、特定のキー ファイルを明示的に使用するように SSH を構成する必要があります。 プロシージャは、 nondefault の場所に格納されているキーを使用する場合と同じです。 Azure DevOps ホストに正しい SSH キーを使用するように、SSH に指示します。

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

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

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

この失敗は、すべての Azure DevOps URL で同じホスト名 (ssh.dev.azure.com) が共有されていて、既定では SSH がこれらを区別できないことが原因です。 ただし、SSH 設定を変更して、組織ごとに別々のキーを提供することで、異なる組織を区別することができます。 ホストのエイリアスを使用して、SSH 設定ファイル内に個別の Host セクションを作成します。

# 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 の代わりに適切なホスト名を使用してください。