Saat menambahkan host KVM ke Apache CloudStack menggunakan opsi System SSH Key, proses penambahan host gagal karena Management Server tidak dapat melakukan autentikasi SSH.
Error yang Muncul
Pada log CloudStack, error yang muncul mengarah ke kegagalan autentikasi SSH key:
Failed to authenticate with ssh key
Failed to authenticate with ssh key, retrying with password
Pada CloudStack UI, error dapat ditampilkan dalam bentuk:
Could not add host at [http://192.168.14.135] ...
due to: [Authentication error with ssh private key]
Ketika koneksi diuji secara manual, autentikasi SSH juga gagal:
root@192.168.14.135: Permission denied (publickey).
Error tersebut menunjukkan bahwa private key milik CloudStack belum dikenali oleh user root pada host KVM.
Kondisi Lab
Server yang digunakan pada lab ini adalah:
- Hostname:
csmgmt-kvm.lab.local - IP address:
192.168.14.135 - Fungsi: CloudStack Management Server sekaligus host KVM
- Autentikasi host: System SSH Key
Walaupun Management Server dan host KVM berada pada server yang sama, CloudStack tetap melakukan koneksi SSH ke:
root@192.168.14.135
Proses CloudStack berjalan menggunakan user sistem cloud. Oleh karena itu, private key yang digunakan harus dapat dibaca oleh user cloud, sedangkan public key-nya harus terdaftar pada /root/.ssh/authorized_keys.
Memeriksa Home Directory User cloud
Jangan langsung menggunakan /var/cloudstack/management karena lokasi home directory user cloud dapat berbeda berdasarkan sistem operasi dan paket CloudStack yang digunakan.
Periksa lokasi sebenarnya dengan:
getent passwd cloud
Ambil home directory user cloud:
CLOUD_USER_HOME=$(getent passwd cloud | cut -d: -f6)
printf 'Home user cloud: %s\n' "$CLOUD_USER_HOME"
Pada Ubuntu atau Debian, lokasinya umumnya:
/var/lib/cloudstack/management
Sementara pada distribusi berbasis RHEL dapat menggunakan:
/var/cloudstack/management
Karena itu, seluruh perintah berikut menggunakan variabel $CLOUD_USER_HOME.
Memeriksa System SSH Key CloudStack
Periksa apakah key CloudStack sudah tersedia:
ls -la "$CLOUD_USER_HOME/.ssh"
Seharusnya tersedia dua file berikut:
id_rsa
id_rsa.pub
Private key id_rsa digunakan oleh Management Server, sedangkan id_rsa.pub perlu didaftarkan pada host KVM.
Jika kedua file sudah tersedia, jangan membuat key baru. Cukup perbaiki ownership dan permission-nya:
chown -R cloud:cloud "$CLOUD_USER_HOME/.ssh"
chmod 700 "$CLOUD_USER_HOME/.ssh"
chmod 600 "$CLOUD_USER_HOME/.ssh/id_rsa"
chmod 644 "$CLOUD_USER_HOME/.ssh/id_rsa.pub"
Pastikan private key dapat dibaca oleh user cloud:
sudo -u cloud -H test -r "$CLOUD_USER_HOME/.ssh/id_rsa" \
&& echo "Private key dapat dibaca oleh user cloud"
Membuat SSH Key Jika Belum Tersedia
Langkah ini hanya dilakukan jika id_rsa dan id_rsa.pub benar-benar belum tersedia.
Buat directory SSH:
install -d -m 700 -o cloud -g cloud "$CLOUD_USER_HOME/.ssh"
Kemudian buat SSH key sebagai user cloud:
sudo -u cloud -H ssh-keygen \
-t rsa \
-b 4096 \
-f "$CLOUD_USER_HOME/.ssh/id_rsa" \
-N ""
Periksa kembali hasilnya:
ls -l "$CLOUD_USER_HOME/.ssh/id_rsa"*
Menambahkan Public Key ke Host KVM
Pada kasus ini, host KVM berada pada server yang sama, yaitu 192.168.14.135. Tambahkan public key CloudStack ke authorized_keys milik user root:
install -d -m 700 -o root -g root /root/.ssh
touch /root/.ssh/authorized_keys
Tambahkan key hanya jika belum terdaftar:
grep -qxF "$(cat "$CLOUD_USER_HOME/.ssh/id_rsa.pub")" \
/root/.ssh/authorized_keys || \
cat "$CLOUD_USER_HOME/.ssh/id_rsa.pub" \
>> /root/.ssh/authorized_keys
Sesuaikan ownership dan permission:
chown root:root /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
CloudStack memang menyediakan opsi penambahan host KVM menggunakan System SSH Key dengan menempatkan public key Management Server pada /root/.ssh/authorized_keys host KVM. Prosedur tersebut juga dijelaskan dalam dokumentasi konfigurasi Apache CloudStack.
Memeriksa Konfigurasi SSH Server
Periksa konfigurasi SSH yang sedang aktif:
sshd -T | grep -E '^(permitrootlogin|pubkeyauthentication)'
Konfigurasi yang dibutuhkan adalah:
permitrootlogin prohibit-password
pubkeyauthentication yes
PermitRootLogin prohibit-password mengizinkan login root menggunakan public key, tetapi tetap menolak login root menggunakan password.
Jika hasilnya belum sesuai, buat konfigurasi tambahan:
nano /etc/ssh/sshd_config.d/99-cloudstack.conf
Isi dengan:
PermitRootLogin prohibit-password
PubkeyAuthentication yes
Validasi syntax:
sshd -t
Apabila tidak terdapat output, restart SSH:
systemctl restart ssh
Menguji SSH sebagai User cloud
Pengujian harus dilakukan sebagai user cloud, bukan sebagai root, karena proses CloudStack Management Server berjalan menggunakan user tersebut.
Jalankan:
sudo -u cloud -H ssh \
-o BatchMode=yes \
-o IdentitiesOnly=yes \
-o StrictHostKeyChecking=accept-new \
-i "$CLOUD_USER_HOME/.ssh/id_rsa" \
root@192.168.14.135 \
'whoami && hostname -f'
Jika berhasil, hasilnya kurang lebih:
root
csmgmt-kvm.lab.local
Opsi BatchMode=yes memastikan SSH tidak meminta password. Dengan demikian, keberhasilan perintah tersebut membuktikan bahwa autentikasi benar-benar menggunakan SSH key.
Jika masih gagal, jalankan pengujian verbose:
sudo -u cloud -H ssh -vvv \
-o BatchMode=yes \
-o IdentitiesOnly=yes \
-i "$CLOUD_USER_HOME/.ssh/id_rsa" \
root@192.168.14.135
Perhatikan bagian yang menunjukkan apakah private key ditawarkan, diterima, atau ditolak oleh SSH server.
Mengulangi Penambahan Host
Setelah pengujian SSH berhasil, ulangi penambahan host KVM pada CloudStack dengan parameter:
Host Name : 192.168.14.135
Username : root
Authentication: System SSH Key
Konfigurasi berikut tidak diperlukan pada kasus ini:
Defaults:cloud !requiretty
Pengaturan tersebut berkaitan dengan penggunaan sudo oleh user non-root pada host tujuan. Pada kasus ini CloudStack melakukan koneksi langsung sebagai root, sehingga masalahnya murni pada autentikasi SSH key.
Kesimpulan
Penyebab error bukan berasal dari status cloudstack-management, libvirtd, ataupun socket libvirt. Masalahnya adalah System SSH Key CloudStack belum dapat digunakan untuk login sebagai root ke host KVM.
Alur autentikasi yang harus dipastikan adalah:
Proses CloudStack sebagai user cloud
↓
Membaca private key dari home user cloud
↓
SSH ke root@192.168.14.135
↓
Public key ditemukan di /root/.ssh/authorized_keys
↓
Login berhasil tanpa password
Setelah koneksi SSH sebagai user cloud berhasil dan menghasilkan output root, proses penambahan host KVM dapat diulangi menggunakan opsi System SSH Key.
https://docs.cloudstack.apache.org/en/4.21.0.0/installguide/configuration.html#adding-a-kvm-host

