Mengatasi Error SSH Key CloudStack saat Menambahkan Host KVM

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

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *