Menggunakan autentikasi kunci SSH

| Layanan Azure DevOps Azure DevOps Server 2020 | | Azure DevOps Server 2019 TFS 2018

Sambungkan ke repositori Git Anda melalui SSH di macOS, Linux, atau Windows untuk tersambung dengan aman menggunakan autentikasi HTTPS. Di Windows, kami merekomendasikan penggunaan Git Credential Manager atau Token Akses Pribadi.

Penting

URL SSH telah berubah, tetapi URL SSH lama akan terus berfungsi. Jika Anda telah menyiapkan SSH, Anda harus memperbarui URL jarak jauh ke format baru:

  • Verifikasi remote mana yang menggunakan SSH dengan menjalankan git remote -v di klien Git Anda.
  • Kunjungi repositori Anda di web dan pilih tombol Kloning di kanan atas.
  • Pilih SSH dan salin URL SSH baru.
  • Di klien Git Anda, jalankan: git remote set-url <remote name, e.g. origin> <new SSH URL>. Atau, di Visual Studio, buka Pengaturan Repositori, dan edit remote Anda.

Catatan

Pada Visual Studio 2017, SSH dapat digunakan untuk menyambungkan ke repositori Azure DevOps Git.

Cara kerja autentikasi kunci SSH

Autentikasi kunci publik SSH berfungsi dengan sepasang kunci enkripsi yang dihasilkan asimetris. Kunci publik dibagikan dengan Azure DevOps dan digunakan untuk memverifikasi koneksi ssh awal. Kunci privat tetap aman dan aman pada sistem Anda.

Menyiapkan autentikasi kunci SSH

Langkah-langkah berikut mencakup konfigurasi autentikasi kunci SSH pada platform berikut:


  • Linux
  • macOS menjalankan setidaknya Leopard (10.5)
  • Sistem Windows yang menjalankan Git untuk Windows

Konfigurasikan SSH menggunakan baris perintah. bash adalah shell umum di Linux dan macOS dan penginstalan Git untuk Windows menambahkan pintasan ke Git Bash di menu Mulai. Lingkungan shell lainnya akan berfungsi, tetapi tidak tercakup dalam artikel ini.

Langkah 1: Buat kunci SSH Anda

Catatan

Jika Anda telah membuat kunci SSH pada sistem Anda, lewati langkah ini dan buka mengonfigurasi kunci SSH.

Perintah di sini akan memungkinkan Anda membuat kunci SSH default baru, menimpa kunci default yang ada. Sebelum melanjutkan, periksa folder Anda ~/.ssh (misalnya, /home/jamal/.ssh atau C:\Users\jamal\.ssh) dan cari file berikut:

  • id_rsa
  • id_rsa.pub

Jika file-file ini ada, maka Anda telah membuat kunci SSH. Anda dapat menimpa kunci dengan perintah berikut, atau melewati langkah ini dan pergi ke mengonfigurasi kunci SSH untuk menggunakan kembali kunci ini.

Buat kunci SSH Anda dengan ssh-keygen perintah dari bash prompt. Perintah ini akan membuat kunci RSA 3072-bit untuk digunakan dengan SSH. Anda dapat memberikan frasa sandi untuk kunci privat Anda saat diminta—frasa sandi ini menyediakan lapisan keamanan lain untuk kunci privat Anda. Jika Anda memberikan frase sandi, pastikan untuk mengonfigurasi agen SSH untuk menyimpan frase sandi Anda sehingga Anda tidak perlu memasukkannya setiap kali Anda terhubung.

$ ssh-keygen -C "jamal@fabrikam.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/jamal/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/jamal/.ssh/id_rsa.
Your public key has been saved in /c/Users/jamal/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:******************************************* jamal@fabrikam.com
The key's randomart image is:
+---[RSA 3072]----+
|+.   +yX*o .     |
|... ..E+*=o      |
|  ..o.=E=.o      |
|   . * =.o .     |
|    . S o o..    |
|       + .oo     |
|        S+.  .   |
|        ..+.+    |
|          o*..   |
+----[SHA256]-----+

Perintah ini menghasilkan dua kunci yang diperlukan untuk autentikasi SSH: kunci privat Anda ( id_rsa ) dan kunci publik ( id_rsa.pub ). Penting untuk tidak pernah membagikan konten kunci privat Anda. Jika kunci privat disusupi, penyerang dapat menggunakannya untuk mengelabui server agar berpikir koneksi berasal dari Anda.

Langkah 2: Tambahkan kunci publik ke Azure DevOps Services/TFS

Kaitkan kunci publik yang dihasilkan pada langkah sebelumnya dengan ID pengguna Anda.

  1. Buka pengaturan keamanan Anda dengan menelusuri portal web dan memilih avatar Anda di kanan atas antarmuka pengguna. Pilih kunci umum SSH di menu yang muncul.

    Cuplikan layar yang memperlihatkan item menu kunci publik SSH dan avatar pengguna yang dipilih di Azure DevOps Services.

  2. Pilih + Kunci Baru.

    Mengakses Konfigurasi Keamanan di Layanan Azure DevOps

  3. Salin konten kunci umum (misalnya, id_rsa.pub) yang Anda buat ke bidang Data Kunci Publik .

    Penting

    Hindari menambahkan spasi kosong atau baris baru ke bidang Data Kunci , karena dapat menyebabkan Layanan Azure DevOps menggunakan kunci publik yang tidak valid. Saat menempelkan kunci, garis baru sering ditambahkan di akhir. Pastikan untuk menghapus baris baru ini jika terjadi.

    Mengonfigurasi Kunci Umum di Layanan Azure DevOps

  4. Berikan deskripsi kunci yang berguna (deskripsi ini akan ditampilkan di halaman kunci umum SSH untuk profil Anda) sehingga Anda dapat mengingatnya nanti. Pilih Simpan untuk menyimpan kunci publik. Setelah disimpan, Anda tidak dapat mengubah kunci. Anda dapat menghapus kunci atau membuat entri baru untuk kunci lain. Tidak ada batasan berapa banyak kunci yang dapat Anda tambahkan ke profil pengguna Anda. Perhatikan juga bahwa kunci SSH yang disimpan di Azure DevOps kedaluwarsa setelah lima tahun. Jika kunci Anda kedaluwarsa, Anda dapat mengunggah kunci baru atau kunci yang sama untuk terus mengakses Azure DevOps melalui SSH.

  5. Uji koneksi dengan menjalankan perintah berikut: ssh -T git@ssh.dev.azure.com. Jika semuanya berfungsi dengan benar, Anda akan menerima respons yang mengatakan: remote: Shell access is not supported. Jika tidak, lihat bagian tentang Pertanyaan dan pemecahan masalah.

Langkah 2: Tambahkan kunci publik ke Azure DevOps

Kaitkan kunci publik yang dihasilkan pada langkah sebelumnya dengan ID pengguna Anda.

  1. Buka pengaturan keamanan Anda dengan menelusuri portal web dan memilih avatar Anda di kanan atas antarmuka pengguna. Pilih Keamanan di menu yang muncul.

    Mengakses Profil Pengguna di Layanan Azure DevOps

  2. Pilih + Kunci Baru.

    Mengakses Konfigurasi Keamanan di Layanan Azure DevOps

  3. Salin konten kunci umum (misalnya, id_rsa.pub) yang Anda buat ke bidang Data Kunci Publik .

    Catatan

    Anda dapat menggunakan perintah $ cat ~/.ssh/id_rsa.pub untuk mencetak konten file id_rsa.pub di terminal, lalu menyalinnya ke clipboard Anda. Jika file kunci publik SSH Anda memiliki nama yang berbeda dari kode contoh, ubah nama file agar sesuai dengan penyiapan Anda saat ini. Saat menyalin kunci Anda, jangan tambahkan baris baru atau spasi kosong apa pun. Atau, Anda dapat menemukan folder .ssh tersembunyi, membuka file di editor teks favorit Anda, dan menyalinnya ke clipboard Anda.

    Penting

    Hindari menambahkan spasi kosong atau baris baru ke bidang Data Kunci , karena dapat menyebabkan Layanan Azure DevOps menggunakan kunci publik yang tidak valid. Saat menempelkan kunci, garis baru sering ditambahkan di akhir. Pastikan untuk menghapus baris baru ini jika terjadi.

    Mengonfigurasi Kunci Umum di Layanan Azure DevOps

  4. Berikan deskripsi kunci yang berguna (deskripsi ini akan ditampilkan di halaman kunci umum SSH untuk profil Anda) sehingga Anda dapat mengingatnya nanti. Pilih Simpan untuk menyimpan kunci publik. Setelah disimpan, Anda tidak dapat mengubah kunci. Anda dapat menghapus kunci atau membuat entri baru untuk kunci lain. Tidak ada batasan berapa banyak kunci yang dapat Anda tambahkan ke profil pengguna Anda.

  5. Uji koneksi dengan menjalankan perintah berikut: ssh -T git@ssh.dev.azure.com. Jika semuanya berfungsi dengan benar, Anda akan menerima respons yang mengatakan: remote: Shell access is not supported. Jika tidak, lihat bagian tentang Pertanyaan dan pemecahan masalah.

Langkah 3: Kloning repositori Git dengan SSH

Catatan

Untuk menyambungkan dengan SSH dari repositori kloning yang ada, lihat memperbarui remote Anda ke SSH.

  1. Salin URL klon SSH dari portal web. Dalam contoh ini, URL klon SSL adalah untuk repositori di organisasi bernama fabrikam-fiber, seperti yang ditunjukkan oleh bagian pertama URL setelah dev.azure.com.

    URL Kloning Azure Repos SSH

    Catatan

    Dengan Layanan Azure DevOps, format untuk URL proyek adalah dev.azure.com/{your organization}/{your project}. Namun, format sebelumnya yang mereferensikan visualstudio.com format masih didukung. Untuk informasi selengkapnya, lihat Memperkenalkan Azure DevOps, Mengalihkan organisasi yang sudah ada untuk menggunakan URL nama domain baru.

  2. Jalankan git clone dari prompt perintah.

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

SSH mungkin menampilkan sidik jari SSH server dan meminta Anda untuk memverifikasinya. Anda harus memverifikasi bahwa sidik jari yang ditampilkan cocok dengan salah satu sidik jari di halaman kunci umum SSH .

SSH menampilkan sidik jari ini ketika terhubung ke host yang tidak dikenal untuk melindungi Anda dari serangan man-in-the-middle. Setelah Anda menerima sidik jari host, SSH tidak akan meminta Anda lagi kecuali sidik jari berubah.

$ git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
Cloning into 'FabrikamFiber'...
The authenticity of host 'ssh.dev.azure.com (65.52.8.37)' can't be established.
RSA key fingerprint is SHA256:********************************************
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ssh.dev.azure.com,65.52.8.37' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/jamal/.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.

Ketika ditanya apakah Anda ingin terus tersambung, ketik yes. Git akan mengkloning repositori dan menyiapkan origin remote untuk terhubung dengan SSH untuk perintah Git di masa mendatang.

Tip

Untuk mencegah masalah, pengguna Windows harus menjalankan perintah agar Git menggunakan kembali frase sandi kunci SSH mereka.

Pertanyaan dan pemecahan masalah

T: Setelah menjalankan git clone, saya mendapatkan kesalahan berikut. Apa yang harus saya lakukan?

Host key verification failed. 
fatal: Could not read from remote repository.

J: Rekam kunci SSH secara manual dengan menjalankan: ssh-keyscan -t rsa ssh.dev.azure.com >> ~/.ssh/known_hosts

T: Bagaimana cara agar Git mengingat frasa sandi untuk kunci saya di Windows?

J: Jalankan perintah berikut yang disertakan dalam Git untuk Windows untuk memulai ssh-agent proses di PowerShell atau Perintah Windows. ssh-agent akan membuat cache frasa sandi Anda sehingga Anda tidak perlu menyediakannya setiap kali Anda terhubung ke repositori Anda.

start-ssh-agent.cmd

Jika Anda menggunakan shell Bash (termasuk Git Bash), mulai ssh-agent dengan:

eval `ssh-agent`

T: Saya menggunakan PuTTY sebagai klien SSH saya dan menghasilkan kunci saya dengan PuTTYgen. Dapatkah saya menggunakan kunci ini dengan Azure DevOps Services?

J: Ya. Muat kunci privat dengan PuTTYgen, buka menu Konversi dan pilih Ekspor kunci OpenSSH. Simpan file kunci privat lalu ikuti langkah-langkah untuk menyiapkan kunci non-default. Salin kunci umum Anda langsung dari jendela PuTTYgen dan tempelkan ke bidang Data Kunci di pengaturan keamanan Anda.

T: Bagaimana cara memverifikasi bahwa kunci umum yang saya unggah adalah kunci yang sama dengan yang saya miliki secara lokal?

J: Anda dapat memverifikasi sidik jari kunci publik yang diunggah dengan yang ditampilkan di profil Anda melalui perintah berikut yang ssh-keygen dijalankan terhadap kunci publik Anda menggunakan bash baris perintah. Anda harus mengubah jalur dan nama file kunci publik jika Anda tidak menggunakan default.

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

Anda kemudian dapat membandingkan tanda tangan MD5 dengan tanda tangan di profil Anda. Pemeriksaan ini berguna jika Anda memiliki masalah koneksi atau memiliki kekhawatiran tentang salah menempelkan kunci publik ke bidang Data Kunci saat menambahkan kunci ke Layanan Azure DevOps.

T: Bagaimana cara mulai menggunakan SSH di repositori tempat saya saat ini menggunakan HTTPS?

J: Anda harus memperbarui origin remote di Git untuk mengubah dari HTTPS ke URL SSH. Setelah Anda memiliki URL klon SSH, jalankan perintah berikut:

git remote set-url origin git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber

Anda sekarang dapat menjalankan perintah Git apa pun yang terhubung ke origin.

T: Saya menggunakan Git LFS dengan Azure DevOps dan saya mengalami kesalahan saat menarik file yang dilacak oleh Git LFS.

J: Azure DevOps saat ini tidak mendukung LFS melalui SSH. Gunakan HTTPS untuk menyambungkan ke repositori dengan file terlacak Git LFS.

T: Bagaimana cara menggunakan lokasi kunci non-default, yaitu bukan ~/.ssh/id_rsa dan ~/.ssh/id_rsa.pub?

J: Untuk menggunakan kunci yang dibuat dengan di tempat yang berbeda dari ssh-keygen default, lakukan dua tugas ini:

  1. Kunci harus berada dalam folder yang hanya dapat Anda baca atau edit. Jika folder memiliki izin yang lebih luas, SSH tidak akan menggunakan kunci.
  2. Anda harus memberi tahu SSH lokasi kunci. Anda membuat SSH mengetahui kunci melalui ssh-add perintah , menyediakan jalur lengkap ke kunci privat.
ssh-add /home/jamal/.ssh/id_jamal.rsa

Di Windows, sebelum menjalankan ssh-add, Anda harus menjalankan perintah berikut dari yang disertakan dalam Git untuk Windows:

start-ssh-agent.cmd

Perintah ini berjalan di PowerShell dan Prompt Perintah. Jika Anda menggunakan Git Bash, perintah yang perlu Anda gunakan adalah:

eval `ssh-agent`

Anda dapat menemukan ssh-add sebagai bagian dari distribusi Git untuk Windows dan juga menjalankannya di lingkungan shell apa pun di Windows.

Di macOS dan Linux Anda juga harus menjalankan ssh-agent sebelum menjalankan ssh-add, tetapi lingkungan perintah pada platform ini biasanya mengurus memulai ssh-agent untuk Anda.

T: Saya memiliki beberapa kunci SSH. Bagaimana cara menggunakan kunci SSH yang berbeda untuk server atau repositori SSH yang berbeda?

J: Umumnya, jika Anda mengonfigurasi beberapa kunci untuk klien SSH dan terhubung ke server SSH, klien dapat mencoba kunci satu per satu sampai server menerimanya.

Namun, ini tidak berfungsi dengan Azure DevOps untuk alasan teknis yang terkait dengan protokol SSH dan bagaimana URL Git SSH kami disusun. Azure DevOps akan menerima kunci pertama yang disediakan klien secara membabi buta selama autentikasi. Jika kunci tersebut tidak valid untuk repositori yang diminta, permintaan akan gagal dengan kesalahan berikut:

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

Untuk Azure DevOps, Anda harus mengonfigurasi SSH untuk secara eksplisit menggunakan file kunci tertentu. Salah satu cara untuk melakukan ini untuk mengedit file Anda ~/.ssh/config (misalnya, /home/jamal/.ssh atau C:\Users\jamal\.ssh) sebagai berikut:

# 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.

# Most common scenario: to use the same key across all hosted Azure DevOps
# organizations, add a Host entry like this:
Host ssh.dev.azure.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# This model will also work if you still use the older SSH URLs with a
# hostname of vs-ssh.visualstudio.com:
Host vs-ssh.visualstudio.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# OpenSSL 8.7 has DEPRECATED RSA. IF using OpenSSL version > 8.6 you will need to 
# add the 'HostkeyAlgorithms' and 'PubkeyAcceptedAlgorithms' entries below. You can 
# check the version of OpenSSL/OpenSSH you're using by running the command 'ssh -v localhost'    
Host ssh.dev.azure.com
  IdentityFile ~/.ssh/id_rsa
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa   

# Less common scenario: if you need different keys for different organizations,
# you'll need to use host aliases to create separate Host sections.
# This is because all hosted Azure DevOps URLs have the same hostname
# (ssh.dev.azure.com), so SSH has no way to distinguish them by default.
#
# 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
#
# Then, instead of using the real URLs, tell Git you want to use these URLs:
# * git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo
# * git@devops_contoso:v3/Contoso/Project2/con_repo
#

# At the end of the file, you can put global defaults for other SSH hosts you
# may connect to.  Note that "*" also matches any hosts that match the sections
# above, and remember that SSH uses the first matching line for each parameter name.
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.

# Say your on-premises Azure DevOps Server instance has SSH URLs like this:
#   ssh://someHost:22/someCollection/some_project/_git/some_repo
# Add the following Host section:
Host someHost
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# At the end of the file, you can put global defaults for other SSH hosts you
# may connect to.  Note that "*" also matches any hosts that match the sections
# above, and remember that SSH uses the first matching line for each parameter name.
Host *

T: Bagaimana cara memperbaiki kesalahan yang menyebutkan "tidak ada metode pertukaran kunci yang cocok yang ditemukan"?

J: Git untuk Windows 2.25.1 dikirim dengan versi baru OpenSSH yang menghapus beberapa protokol pertukaran utama secara default. Secara khusus, diffie-hellman-group14-sha1 telah diidentifikasi sebagai bermasalah untuk beberapa pelanggan Azure DevOps Server dan TFS. Anda dapat mengatasi masalah dengan menambahkan hal berikut ke konfigurasi SSH Anda (~/.ssh/config):

Host <your-azure-devops-host>
    KexAlgorithms +diffie-hellman-group14-sha1

Ganti <your-azure-devops-host> dengan nama host server Azure DevOps atau TFS Anda, seperti tfs.mycompany.com.

T: Pemberitahuan apa yang mungkin saya terima tentang kunci SSH saya?

J: Setiap kali Anda mendaftarkan Kunci SSH baru dengan Layanan Azure DevOps, Anda akan menerima pemberitahuan email yang memberi tahu Anda bahwa kunci SSH baru telah ditambahkan ke akun Anda.

Contoh pemberitahuan SSH

T: Apa yang harus saya lakukan jika saya percaya bahwa seseorang selain saya menambahkan kunci SSH di akun saya?

J: Jika Anda menerima pemberitahuan tentang kunci SSH yang didaftarkan dan Anda tidak mengunggahnya secara manual ke layanan, kredensial Anda mungkin telah disusupi.

Langkah selanjutnya adalah menyelidiki apakah kata sandi Anda telah disusupi atau tidak. Mengubah kata sandi Anda selalu merupakan langkah pertama yang baik untuk bertahan dari vektor serangan ini. Jika Anda adalah pengguna Azure Active Directory, hubungi administrator Anda untuk memeriksa apakah akun Anda digunakan dari sumber/lokasi yang tidak diketahui.

T: Apa yang harus saya lakukan jika saya masih dimintai kata sandi dan GIT_SSH_COMMAND="ssh -v" git fetch menunjukkan no mutual signature algorithm?

J: Beberapa distribusi Linux, seperti Fedora Linux, memiliki kebijakan kripto yang memerlukan algoritma tanda tangan SSH yang lebih kuat daripada yang didukung Azure DevOps (per Januari 2021). Ada permintaan fitur terbuka untuk menambahkan dukungan ini.

Anda dapat mengatasi masalah ini dengan menambahkan kode berikut ke konfigurasi SSH Anda (~/.ssh/config):

Host ssh.dev.azure.com
  PubkeyAcceptedKeyTypes=ssh-rsa

Ganti ssh.dev.azure.com dengan nama host yang benar jika Anda menggunakan Azure DevOps Server.