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 キー認証の構成を対象にしています。
- Linux
- macOS
- Git for Windows を実行している Windows システム
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_rsa
と id_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を使用する対象の組織ごとに繰り返す必要があります。
Web ポータルを参照し、ユーザー インターフェイスの右上にあるアバターの横にあるアイコンを選択して、セキュリティ設定を開きます。 表示されるメニューで [SSH 公開キー] を選択します。
[+ 新しいキー] を選択します。
生成した公開キー (
id_rsa.pub
など) の内容を [公開キー データ] フィールドにコピーします。重要
[キー データ] フィールドに空白文字や改行を追加しないでください。Azure DevOps が無効な公開キーを使用する原因になる可能性があるためです。 キーへの貼り付け時には、多くの場合、最後に改行が追加されます。 この改行が発生した場合は、必ず削除してください。
後で思い出すことができるように、キーに有用な説明 (この説明はプロファイルの [SSH 公開キー] ページに表示されます) を入力します。 [保存] を選択して公開キーを格納します。 保存すると、キーを変更することはできません。 キーを削除するか、別のキーの新しいエントリを作成することはできます。 ユーザー プロファイルに追加できるキーの数に制限はありません。 Azure DevOps に格納されている SSH キーは、1 年後に期限切れになることにも注意してください。 キーの有効期限が切れた場合は、新しいキーまたは同じキーをアップロードして、SSH 経由での Azure DevOps へのアクセスを続行できます。
[SSH 公開キー]概要ページに、サーバーのフィンガープリントが表示されます。 SSH 経由で Azure DevOps に初めて接続するときに使用できるよう、SHA256 フィンガープリントをメモしておきます。
次のコマンドを実行して接続をテストします。
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 フィンガープリントを比較します。 一致する場合にのみ続行してください。
「
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 に更新する方法に関するページを参照してください。
Web ポータルから SSH クローン URL をコピーします。 この例では、SSH 複製 URL は、URL の の後の最初の部分で示されているとおり、fabrikam-fiber
dev.azure.com
という名前の組織のリポジトリ用です。Note
Azure DevOps Services では、プロジェクト URL の形式は
dev.azure.com/{your organization}/{your project}
です。 ただし、visualstudio.com
形式を参照する以前の形式は引き続きサポートされています。 詳細については、「Azure DevOps の概要」の「新しいドメイン名 URL を使用するように既存の組織を切り替える」を参照してください。コマンド プロンプトで
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 キーを管理するのが一般的です。 ただし、エージェントの設定は、この記事の範囲外です。
質問とトラブルシューティング
Q: ssh-rsa 関連の警告が表示されます。 どうすればよいですか。
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
一致する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 つのタスクを実行します。
キーは、あなたのみが読み取りや編集を実行できるフォルダー内に配置する必要があります。 これより広範囲のアクセス許可がフォルダーに設定されていると、キーが SSH で使用されません。
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_fabrikam
と devops_contoso
に置き換えて、各リポジトリにこれらの URL をリモートとして使用するように Git に指示します。 たとえば、git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo
は git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo
になります。
Q: SSH キーに関してどのような通知を受け取りますか?
A: Azure DevOps Services に新しい SSH キーを登録するたびに、新しい SSH キーがアカウントに追加されたことを通知するメール通知が届きます。
Q: 自分以外のユーザーが自分のアカウントに SSH キーを追加していると思われる場合はどうすればよいですか?
A: 自分が開始していない SSH キー登録の通知を受信した場合は、資格情報が侵害されている可能性があります。
この場合の次のステップは、パスワードが侵害されていないかどうかを調査することです。 パスワードを変更することは、この攻撃ベクトルに対する防衛として、常に適切な最初のステップです。 Microsoft Entra ユーザーの場合は、管理者に問い合わせて、不明なソース/場所からアカウントが使用されたかどうかを確認してください。
Q: まだパスワードの入力を求められ、GIT_SSH_COMMAND="ssh -v" git fetch
で no 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
の代わりに適切なホスト名を使用してください。