Membuat koneksi aman ke instance VM

Dokumen ini menjelaskan praktik terbaik untuk terhubung dengan aman ke instance virtual machine (VM) Compute Engine, termasuk menyimpan kunci host dengan mengaktifkan atribut tamu dan mencegah VM dijangkau dari internet publik.

Menyimpan kunci host dengan mengaktifkan atribut tamu

Kunci host adalah pasangan kunci yang mengidentifikasi host atau mesin tertentu. Saat Anda terhubung ke host jarak jauh, kunci host digunakan untuk memverifikasi bahwa Anda terhubung ke mesin yang diinginkan.

Jika menggunakan gcloud compute ssh untuk terhubung ke VM Linux, Anda dapat menambahkan lapisan keamanan dengan menyimpan kunci host sebagai atribut tamu.

Menyimpan kunci host SSH sebagai atribut tamu akan meningkatkan keamanan koneksi Anda dengan membantu melindungi dari kerentanan seperti serangan man-in-the-middle (MITM). Pada saat booting awal VM, jika atribut tamu diaktifkan, Compute Engine akan menyimpan kunci host yang dihasilkan sebagai atribut tamu. Setelah itu, Compute Engine akan menggunakan kunci host yang disimpan ini untuk memverifikasi semua koneksi berikutnya ke VM.

Kunci host dapat disimpan sebagai atribut tamu pada image sistem operasi publik berikut:

  • Debian
  • Ubuntu
  • Red Hat Enterprise Linux (RHEL)
  • CentOS
  • SUSE Linux Enterprise Server (SLES)

Untuk menulis kunci host ke atribut tamu, Anda harus mengaktifkan atribut tamu sebelum mem-booting VM untuk pertama kalinya. Anda dapat mengaktifkan atribut tamu di VM tertentu selama pembuatan VM atau di seluruh project.

Setelah Anda mengaktifkan atribut tamu untuk project atau VM, agen OS Tamu akan otomatis memublikasikan kunci host sebagai atribut tamu. Jika Anda menggunakan gcloud compute ssh alih-alih klien SSH biasa, gcloud CLI akan otomatis membaca atribut dan memperbarui file known_hosts saat Anda terhubung lagi.

Untuk menyimpan kunci host sebagai atribut tamu, selesaikan langkah-langkah berikut:

  1. Sebelum mem-booting VM untuk pertama kalinya, aktifkan atribut tamu entah di VM tertentu selama pembuatan VM atau di seluruh project Anda.

  2. Buat koneksi ke VM Anda menggunakan gcloud compute ssh.

    1. Pastikan Anda memiliki Google Cloud CLI versi terbaru:

      gcloud components update
      
    2. Buat koneksi ke VM:

      gcloud compute ssh --project=PROJECT_ID \
       --zone=ZONE \
       VM_NAME
      

      Ganti parameter berikut:

      • PROJECT_ID: ID project yang memuat VM
      • ZONE: nama zona tempat VM berada
      • VM_NAME: nama VM

      Jika sudah menetapkan properti default untuk Google Cloud CLI, Anda dapat menghilangkan flag --project dan --zone dari perintah ini. Contoh:

      gcloud compute ssh VM_NAME
      
    3. Tinjau pesan yang ditampilkan saat sistem dimulai. Misalnya, sistem operasi Debian mungkin menampilkan pesan berikut:

      Writing 3 keys to YOUR_HOME_DIRECTORY/.ssh/google_compute_known_hosts
      Linux host-key-2 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u3 (2019-06-16) x86_64
      

Guna memastikan bahwa kunci host disimpan sebagai atribut tamu untuk VM ini, tinjau nilai kunci host untuk memverifikasi bahwa kunci SSH ditulis ke atribut tamu untuk VM (Opsi 1), atau tinjau port serial untuk mengetahui keberadaan kunci host (Opsi 2):

Opsi 1: Meninjau nilai kunci host

Anda dapat menggunakan Google Cloud CLI untuk memverifikasi bahwa kunci SSH ditulis ke atribut tamu:

gcloud compute instances get-guest-attributes VM_NAME \
  --query-path="hostkeys/" \
  --zone=ZONE

Ganti parameter berikut:

  • VM_NAME: nama VM
  • ZONE: nama zona tempat VM berada

Outputnya mirip dengan berikut:

NAMESPACE  KEY                  VALUE
hostkeys   ecdsa-sha2-nistp256  AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBJAGpTm
                                V3mFxBTHK1NIu9a7kVQWaHsZVaFUsqF8cLxQRQ+N96/Djiiuz1tucHQ8vBTJI=
hostkeys   ssh-ed25519          AAAAC3NzaC1lZDI1NTE5AAAAIM/WYBn3jIEW5t3BZumx0X/Htm61J6S9FcU8L
hostkeys   ssh-rsa              AAAAB3NzaC1yc2EAAAADAQABAAABAQDU3jReR/MoSttlWYfauW6qEqS2dhe5
                                Zdd3guYk2H7ZyxblNuP56nOl/IMuniVmsFa9v8W6MExViu6G5Cy4iIesot09
                                1hsgkG0U7sbWrXM10PQ8pnpI3B5arplCiEMhRtXy64rlW3Nx156bLdcxv5l+
                                7Unu4IviKlY43uqqwSyTv+V8q4ThpQ9dNbk1Gg838+KzazljzHahtbIaE1rm
                                I0L1lUqKiKLSLKuBgrI2Y/WSuqvqGEz+bMH7Ri4ht+7sAwykph6FbOgKqoBI
                                hVWBo38/Na/gEuvtmgULUwK+xy9zWg9k8k/Qtihc6El9GD9y

Opsi 2: Meninjau port serial

  1. Lihat output port serial.
  2. Pilih port serial 1.
  3. Cari pesan berikut:

    INFO Wrote ssh-rsa host key to guest attributes

    Jika image Anda menggunakan sistem operasi yang didukung, tetapi setelan atribut tamu tidak diaktifkan sebelum mem-booting VM untuk pertama kali, Anda mungkin melihat pesan berikut:

    Unable to write ssh-rsa host key to guest attributes

    Hal ini berarti kunci host tidak disimpan sebagai atribut tamu untuk VM ini. Jika Anda ingin menyimpan kunci host untuk VM tambahan yang akan Anda buat, aktifkan atribut tamu sebelum mem-booting VM untuk pertama kalinya.

Mencegah VM dijangkau dari internet publik

Saat mengembangkan project di Compute Engine, ada berbagai skenario untuk membuat VM tidak dapat dijangkau dari internet publik:

  • Layanan web masih dalam pengembangan dan belum siap ditampilkan kepada pengguna eksternal karena fiturnya belum lengkap atau belum dikonfigurasi dengan HTTPS.
  • VM mungkin menyediakan layanan yang didesain agar hanya digunakan oleh VM lain dalam project itu.
  • VM hanya boleh dijangkau melalui opsi dedicated interconnect dari kantor atau pusat data perusahaan.

Meskipun layanan sengaja ditampilkan ke internet publik, komunikasi dengan layanan harus dibatasi hanya untuk grup pengguna target, dan dilakukan melalui saluran aman, seperti SSH atau HTTPS, untuk melindungi informasi sensitif.

Artikel ini menunjukkan beberapa metode untuk mengamankan komunikasi melalui VM dengan alamat IP eksternal dan VM tanpa alamat IP eksternal. Terlepas dari apakah Anda mengamankan komunikasi dengan metode ini atau tidak, Google Cloud selalu mengizinkan komunikasi antara instance VM dan server metadata terkaitnya. Untuk mendapatkan informasi selengkapnya, baca traffic yang selalu diizinkan.

Melindungi layanan di komputer dengan alamat IP eksternal

Jika VM memiliki alamat IP publik, pastikan bahwa hanya layanan dan traffic yang ingin Anda ekspos yang dapat dijangkau, dan semua informasi sensitif dalam layanan dan traffic yang Anda ekspos diamankan selama pengiriman. Ada beberapa metode untuk melindungi layanan di VM dengan alamat IP eksternal yang dijelaskan dalam dokumen ini, termasuk firewall, HTTPS dan SSL, penerusan port melalui SSH, dan proxy SOCKS melalui SSH.

Firewall

Lini pertahanan pertama Anda adalah menggunakan firewall untuk membatasi siapa yang dapat menjangkau VM. Dengan membuat aturan firewall, Anda dapat membatasi semua traffic ke jaringan atau mesin target di kumpulan port tertentu hanya untuk alamat IP sumber tertentu.

Firewall bukanlah solusi mandiri. Membatasi traffic hanya untuk IP sumber tertentu tidak akan melindungi informasi sensitif, seperti kredensial login, perintah yang membuat atau menghancurkan resource atau file, atau log. Saat menjalankan layanan web di mesin yang dapat diakses secara publik, seperti VM Compute Engine dengan IP eksternal, Anda harus mengenkripsi semua komunikasi antara host dan VM yang di-deploy untuk memastikan keamanan yang tepat.

Selain itu, firewall tidak selalu menjadi solusi yang tepat. Misalnya, firewall tidak ideal untuk lingkungan pengembangan yang tidak memiliki alamat IP statis, seperti laptop roaming.

HTTPS dan SSL

Untuk sistem web produksi, sebaiknya Anda mengonfigurasi HTTPS/SSL. HTTPS/SSL dapat dikonfigurasi dengan menyiapkan VM untuk menghentikan HTTPS, atau dengan mengonfigurasi load balancing HTTPS. HTTPS/SSL memiliki sedikit kompleksitas awal, yang mengharuskan Anda melakukan tugas berikut:

  • Mendaftarkan nama domain.
  • Memperoleh sertifikat SSL dari certificate authority.
  • Mendaftarkan sertifikat ke load balancer HTTPS dan VM terkaitnya, atau mengonfigurasi proxy atau server web yang dihentikan SSL di satu atau beberapa VM Compute Engine.

Penerusan port melalui SSH

Anda dapat menggunakan Google Cloud CLI untuk memulai server di port lokal tertentu yang meneruskan semua traffic ke host jarak jauh melalui koneksi SSH.

Pertama, catat VM dan port yang menyediakan layanan tempat Anda ingin membuat koneksi aman. Selanjutnya, jalankan perintah berikut:

gcloud compute ssh VM_NAME \
    --project PROJECT_ID \
    --zone ZONE \
    -- -NL LOCAL_PORT:localhost:REMOTE_PORT

Ganti parameter berikut:

  • VM_NAME adalah nama VM yang ingin Anda hubungi.
  • PROJECT_ID adalah project IDGoogle Cloud Anda.
  • ZONE: Zona tempat VM Anda berjalan, misalnya us-central1-a.
  • LOCAL_PORT: Port lokal yang Anda proses, misalnya 2222.
  • REMOTE_PORT: Port jarak jauh yang Anda hubungi, misalnya 8888.

Misalnya, jika Anda menentukan port lokal '2222' dan port jarak jauh '8888', lalu membuka http://localhost:2222/ di browser, koneksi HTTP akan menggunakan tunnel SSH yang Anda buat ke host jarak jauh untuk terhubung ke VM yang ditentukan menggunakan SSH. Koneksi HTTP kemudian akan menggunakan tunnel SSH untuk terhubung ke port 8888 di mesin yang sama, tetapi melalui koneksi SSH yang aman dan terenkripsi.

Perintah gcloud membuat dan mempertahankan koneksi SSH selama sesi SSH aktif. Begitu Anda keluar dari sesi SSH, penerusan port yang menggunakan http://VM_NAME:LOCAL_PORT akan berhenti berfungsi.

Untuk membuat lebih dari satu aturan penerusan port, Anda dapat menentukan beberapa aturan di satu command line dengan mengulang flag:

gcloud compute ssh VM_NAME \
    --project PROJECT_ID \
    --zone ZONE \
    -- -NL LOCAL_PORT:localhost:REMOTE_PORT \
    -- -NL LOCAL_PORT:localhost:REMOTE_PORT

Atau, Anda dapat menjalankan perintah gcloud baru setiap kali untuk membuat tunnel terpisah. Perhatikan bahwa Anda tidak dapat menambahkan atau menghapus penerusan port dari koneksi yang ada tanpa menutup dan membuat ulang koneksi dari awal.

Proxy SOCKS melalui SSH

Jika Anda ingin terhubung ke sejumlah host berbeda dalam deployment cloud Anda, cara termudah melakukannya adalah dengan mengubah browser Anda agar melakukan pencarian langsung dari jaringan Anda. Dengan pendekatan ini, Anda dapat menggunakan nama pendek host, alih-alih mencari setiap alamat IP host, membuka port untuk setiap layanan, atau membuat tunnel SSH untuk setiap pasangan host/port.

Pendekatan yang Anda gunakan di sini adalah sebagai berikut:

  1. Menyiapkan satu tunnel SSH ke salah satu host di jaringan, lalu membuat proxy SOCKS di host tersebut.
  2. Mengubah konfigurasi browser agar melakukan semua pencarian menggunakan host proxy SOCKS tersebut.

Perlu diperhatikan bahwa karena semua traffic disalurkan menggunakan host ini, hindari penggunaan browser atau profil spesifik tersebut untuk menjelajahi web karena bandwidth-nya harus dikhususkan untuk layanan cloud. Secara umum, Anda sebaiknya menggunakan profil browser terpisah dan beralih ke profil tersebut jika diperlukan.

Memulai proxy SOCKS

Untuk memulai proxy SOCKS, jalankan perintah berikut:

gcloud compute ssh VM_NAME \
    --project PROJECT_ID \
    --zone ZONE
    --ssh-flag="-D" \
    --ssh-flag="LOCAL_PORT" \
    --ssh-flag="-N"

Ganti parameter berikut:

  • VM_NAME: Nama VM yang ingin Anda hubungi.
  • PROJECT_ID: Project IDGoogle Cloud Anda.
  • ZONE: Zona tempat VM Anda berjalan, misalnya us-central1-a.
  • LOCAL_PORT: Port lokal yang Anda proses, misalnya 1080.

Perhatikan bahwa, dalam kasus ini, Anda tidak perlu menentukan port jarak jauh. Karena proxy SOCKS tidak terikat ke port jarak jauh spesifik mana pun, setiap koneksi yang Anda buat menggunakan proxy SOCKS akan di-resolve ke host yang Anda hubungi.

Dengan proxy SOCKS, Anda dapat terhubung ke VM mana pun yang berbagi jaringan Compute Engine dengan VM proxy Anda menggunakan nama pendek VM. Selain itu, Anda dapat terhubung ke port mana pun di VM tertentu.

Pendekatan ini jauh lebih fleksibel dibanding metode penerusan port yang sederhana, tetapi juga akan mengharuskan Anda mengubah setelan di browser web agar dapat memanfaatkan proxy.

Selanjutnya, konfigurasi Chrome atau Firefox untuk menggunakan proxy.

Chrome

Secara default, Chrome menggunakan setelan proxy seluruh sistem sehingga Anda perlu menentukan proxy berbeda menggunakan tanda command line. Meluncurkan Chrome secara default akan membuat VM untuk profil yang sudah berjalan. Oleh karena itu, agar Anda dapat menjalankan beberapa salinan Chrome secara bersamaan, baik yang menggunakan proxy maupun yang tidak, Anda memerlukan profil baru.

Luncurkan Chrome menggunakan profil baru. Profil baru akan otomatis dibuat, jika belum ada.

Linux:

/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

Tetapkan port localhost ke nilai yang sama dengan yang Anda gunakan dalam perintah gcloud sebelumnya (1080 dalam contoh ini).

Firefox

Sebelum mengubah setelan ini, sebaiknya Anda membuat profil Firefox baru. Jika tidak, semua VM di Firefox akan terpengaruh sehingga menggunakan host itu sebagai proxy, yang mungkin tidak Anda harapkan.

Setelah Firefox berjalan dengan profil terpisah, Anda dapat menyiapkan proxy SOCKS:

  1. Buka Preferences.
  2. Klik Advanced > Network > Settings untuk membuka dialog Connection Settings.
  3. Pilih opsi Manual proxy configuration.
    1. Di bagian SOCKS Host, isikan localhost sebagai host dan port yang Anda pilih saat menjalankan perintah gcloud sebelumnya.
    2. Pilih SOCKS v5.
    3. Centang kotak Remote DNS.
    4. Biarkan semua entri lainnya kosong.
  4. Klik OK dan tutup kotak dialog Preferences.

Membuat koneksi ke VM yang tidak memiliki alamat IP eksternal

Jika VM tidak memiliki alamat IP eksternal (termasuk VM yang merupakan backend untuk load balancer proxy HTTPS dan SSL), VM tersebut hanya dapat dijangkau oleh:

Anda dapat menyediakan VM di jaringan Anda untuk bertindak sebagai relai tepercaya bagi koneksi masuk, yang juga dikenal sebagai bastion host. Selain itu, Anda dapat mengonfigurasi Cloud NAT untuk traffic jaringan keluar, atau menyiapkan konsol serial interaktif untuk mengelola atau memecahkan masalah VM tanpa alamat IP eksternal.

Bastion host

Bastion host menyediakan titik entri eksternal ke jaringan yang berisi instance jaringan pribadi, seperti yang diilustrasikan dalam diagram berikut.

Arsitektur Bastion host bertindak sebagai titik entri eksternal untuk jaringan instance pribadi.

Host ini dapat menyediakan satu titik fortifikasi atau audit, serta dapat dimulai dan dihentikan untuk mengaktifkan atau menonaktifkan SSH masuk. Dengan menggunakan bastion host, Anda dapat terhubung ke VM yang tidak memiliki alamat IP eksternal. Pendekatan ini memungkinkan Anda terhubung ke lingkungan pengembangan atau mengelola instance database untuk aplikasi eksternal, misalnya, tanpa mengonfigurasi aturan firewall tambahan.

Hardening lengkap bastion host berada di luar cakupan artikel ini, tetapi beberapa langkah awal yang diambil dapat mencakup:

  • Membatasi rentang CIDR IP sumber yang dapat berkomunikasi dengan bastion.
  • Mengonfigurasi aturan firewall untuk mengizinkan traffic SSH ke VM pribadi hanya dari bastion host.

Secara default, SSH di VM dikonfigurasi agar menggunakan kunci pribadi untuk autentikasi. Saat menggunakan bastion host, Anda login ke bastion host terlebih dahulu, lalu ke VM pribadi target. Karena login dua langkah ini, yang membuat bastion host terkadang disebut "jump server", Anda harus menggunakan penerusan ssh alih-alih menyimpan kunci pribadi mesin target di bastion host sebagai cara untuk menjangkau mesin target. Hal ini perlu dilakukan meskipun Anda menggunakan pasangan kunci yang sama untuk VM bastion dan target, karena bastion hanya memiliki akses langsung ke sisi publik dari pasangan kunci tersebut.

Untuk mempelajari cara menggunakan instance bastion host agar dapat terhubung ke VM lain di jaringan Google Cloud Anda, baca Membuat koneksi ke VM Linux menggunakan bastion host.

Untuk mempelajari cara menggunakan penerusan ssh dan metode lain untuk terhubung ke VM yang tidak memiliki alamat IP eksternal, baca Membuat koneksi ke VM yang tidak memiliki alamat IP eksternal.

IAP untuk penerusan TCP

Menggunakan SSH dengan fitur penerusan TCP IAP akan menggabung koneksi SSH ke dalam HTTPS. Selanjutnya, fitur penerusan TCP IAP akan mengirimkannya ke VM jarak jauh.

Untuk mempelajari cara membuat koneksi ke VM jarak jauh dengan IAP, baca Membuat koneksi ke VM Linux menggunakan Identity-Aware Proxy.

VPN

Cloud VPN memungkinkan Anda menghubungkan jaringan yang ada ke jaringanGoogle Cloud dengan menggunakan koneksi IPsec ke perangkat gateway VPN. Hal ini memungkinkan perutean langsung traffic dari infrastruktur Anda ke antarmuka IP pribadi VM Compute Engine. Traffic dienkripsi saat dikirim melalui link publik ke Google.

Untuk mengetahui cara menyiapkan, mengonfigurasi, dan menggunakan VPN dengan Compute Engine, lihat dokumentasi Cloud VPN.

Untuk mempelajari cara membuat koneksi ke VM di jaringan Google Cloud Anda melalui VPN yang sudah ada, bukan melalui alamat IP eksternal VM, baca Membuat koneksi ke VM Linux menggunakan Cloud VPN atau Cloud Interconnect.

Traffic keluar menggunakan Cloud NAT

VM yang tidak memiliki alamat IP eksternal tidak dapat membuat koneksi langsung ke layanan eksternal, termasuk ke layanan Google Cloudlainnya. Agar VM ini dapat menjangkau layanan di internet publik, Anda perlu menyiapkan dan mengonfigurasi Cloud NAT, yang dapat merutekan traffic atas nama VM apa pun di jaringan itu. Jangan menganggap satu VM sangat tersedia atau dapat mendukung throughput traffic yang tinggi untuk banyak VM.

Akses konsol serial interaktif

Anda mungkin masih perlu berinteraksi dengan VM yang tidak memiliki alamat IP eksternal untuk keperluan pemecahan masalah atau pemeliharaan. Menyiapkan Bastion host, seperti yang dibahas di atas, merupakan salah satu opsi, tetapi mungkin memerlukan banyak penyiapan untuk kebutuhan Anda. Untuk memecahkan masalah VM semacam ini, Anda dapat mengaktifkan akses interaktif di konsol serial. Cara ini akan memungkinkan Anda berinteraksi dengan konsol serial VM menggunakan SSH dan menjalankan perintah di konsol serial.

Untuk mempelajari lebih lanjut, baca Berinteraksi dengan Konsol Serial.

Load balancer proxy HTTPS dan SSL

VM yang merupakan backend untuk load balancer proxy HTTPS dan SSL tidak harus memiliki alamat IP eksternal agar dapat diakses melalui load balancer. Untuk mengakses resource ini secara langsung, Anda harus menggunakan metode yang tercantum di bagian Membuat koneksi ke VM yang tidak memiliki alamat IP eksternal.

Untuk mempelajari lebih lanjut, baca dokumentasi load balancing untuk load balancer tersebut.