Membuat sambungan 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 agar tidak dapat diakses dari internet publik.

Sebelum memulai

  • Siapkan autentikasi, jika Anda belum melakukannya. Autentikasi adalah proses verifikasi identitas Anda untuk akses ke layanan dan API Google Cloud. Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke Compute Engine sebagai berikut.

    Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:

    Konsol

    Saat menggunakan Konsol Google Cloud untuk mengakses API dan layanan Google Cloud, Anda tidak perlu menyiapkan autentikasi.

    gcloud

    1. Instal Google Cloud CLI, lalu initialize dengan menjalankan perintah berikut:

      gcloud init
    2. Menetapkan region dan zona default.

Menyimpan kunci host dengan mengaktifkan atribut tamu

Kunci host adalah pasangan kunci yang mengidentifikasi host atau komputer 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 baik pada VM tertentu selama pembuatan VM maupun di seluruh project Anda.

Setelah Anda mengaktifkan atribut tamu untuk project atau VM, agen Guest OS akan otomatis memublikasikan kunci host sebagai atribut tamu. Jika Anda menggunakan gcloud compute ssh, bukan 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 baik pada VM tertentu selama pembuatan VM maupun di seluruh project Anda.

  2. Hubungkan ke VM Anda menggunakan gcloud compute ssh.

    1. Pastikan Anda memiliki Google Cloud CLI versi terbaru:

      gcloud components update
      
    2. Menghubungkan ke VM:

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

      Ganti kode berikut:

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

      Jika telah 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 startup. 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 memastikan bahwa kunci SSH ditulis ke atribut tamu untuk VM (Opsi 1), atau tinjau port serial untuk 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 kode berikut:

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

Outputnya mirip dengan hal berikut ini:

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: Tinjau port serial

  1. Melihat 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 booting VM pertama, Anda mungkin melihat pesan berikut:

    Unable to write ssh-rsa host key to guest attributes

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

Mencegah VM dijangkau dari internet publik

Saat mengembangkan project di Compute Engine, ada berbagai skenario untuk mencegah VM 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.
  • VM hanya boleh dijangkau melalui opsi interkoneksi khusus dari kantor perusahaan atau pusat data.

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

Artikel ini menunjukkan beberapa metode untuk mengamankan komunikasi dengan 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 metadatanya yang sesuai. Untuk informasi selengkapnya, lihat traffic yang selalu diizinkan.

Melindungi layanan di komputer dengan alamat IP eksternal

Saat VM memiliki alamat IP publik, penting bahwa hanya layanan dan traffic yang ingin Anda ungkap yang dapat dijangkau, dan bagi layanan yang terekspos, semua informasi sensitif harus diamankan saat dalam pengiriman. Ada beberapa metode untuk melindungi layanan pada VM dengan alamat IP eksternal yang dijelaskan dalam okumen ini, termasukfirewall, HTTPS dan SSL, .penerusan port melalui SSH, dan Proxy SOCKS melalui SSH.

Firewall

Baris pertahanan pertama Anda adalah membatasi siapa yang dapat menjangkau VM menggunakan firewall. Dengan membuat aturan firewall, Anda dapat membatasi semua traffic ke jaringan atau menargetkan mesin pada sekumpulan port tertentu ke alamat IP sumber tertentu.

Firewall bukan solusi yang berdiri sendiri. Membatasi traffic ke 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, Anda harus mengonfigurasi HTTPS/SSL. HTTPS/SSL dapat disiapkan dengan menyiapkan VM untuk menghentikan HTTPS atau dengan mengonfigurasi load balancing HTTPS. HTTPS/SSL memang melibatkan beberapa kerumitan awal, yang mengharuskan Anda melakukan tugas berikut:

  • Mendaftarkan nama domain.
  • Mendapatkan sertifikat SSL dari certificate authority.
  • Mendaftarkan sertifikat dengan load balancer HTTPS dan VM yang terhubung, atau mengonfigurasikan proxy atau server web yang dihentikan SSL pada satu atau beberapa VM Compute Engine.

Penerusan port melalui SSH

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

Pertama, catat VM dan port yang menyediakan layanan yang koneksinya ingin Anda amankan. Selanjutnya, jalankan perintah berikut:

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

Ganti kode berikut:

  • VM_NAME adalah nama VM yang ingin Anda hubungkan.
  • PROJECT_ID adalah project ID Google 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 terhubung dengan Anda, misalnya 8888.

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

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

Untuk membuat lebih dari satu aturan penerusan port, Anda dapat menentukan beberapa aturan pada satu command line dengan mengulangi 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 keluar dan membangun kembali koneksi dari awal.

Proxy SOCKS melalui SSH

Jika Anda ingin terhubung ke sejumlah host berbeda dalam deployment cloud, cara termudah untuk melakukannya adalah dengan mengubah browser Anda agar melakukan pencarian langsung dari jaringan Anda. Dengan pendekatan ini, Anda dapat menggunakan nama pendek host, daripada 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. Siapkan satu tunnel SSH ke salah satu host di jaringan, lalu buat proxy SOCKS pada host tersebut.
  2. Ubah konfigurasi browser untuk melakukan semua pencarian menggunakan host proxy SOCKS tersebut.

Perlu diperhatikan bahwa karena Anda menyalurkan semua traffic menggunakan host tersebut, hindari penggunaan browser atau profil tertentu tersebut untuk menjelajahi web karena Anda harus mendedikasikan bandwidth tersebut 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 kode berikut:

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

Perhatikan bahwa dalam hal ini, Anda tidak perlu menentukan port jarak jauh. Karena proxy SOCKS tidak terikat ke port jarak jauh tertentu, setiap koneksi yang Anda buat menggunakan proxy SOCKS akan diselesaikan secara relatif terhadap host tempat Anda terhubung.

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

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

Selanjutnya, konfigurasi Chrome atau Firefox untuk menggunakan proxy.

Chrome

Chrome menggunakan setelan proxy seluruh sistem secara default, sehingga Anda perlu menentukan proxy yang berbeda menggunakan tanda command line. Meluncurkan Chrome secara default akan membuat VM dari 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. Grup ini akan dibuat secara otomatis jika grup 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 kita).

Firefox

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

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, isi 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 lain kosong.
  4. Klik OK dan tutup kotak dialog Preferences.

Menghubungkan ke VM tanpa alamat IP eksternal

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

Anda dapat menyediakan VM di jaringan Anda agar berfungsi sebagai relai tepercaya untuk 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 masuk eksternal yang terhubung ke jaringan yang berisi instance jaringan pribadi, seperti yang diilustrasikan dalam diagram berikut.

Arsitektur host Bastion yang bertindak sebagai titik masuk yang menghadap eksternal untuk jaringan instance pribadi.

Host ini dapat menyediakan satu titik fortifikasi atau audit, dan 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 IP sumber CIDR yang dapat berkomunikasi dengan bastion.
  • Mengonfigurasi aturan firewall untuk mengizinkan traffic SSH ke VM pribadi hanya dari bastion host.

Secara default, SSH pada VM dikonfigurasi untuk menggunakan kunci pribadi untuk autentikasi. Saat menggunakan bastion host, Anda login ke bastion host terlebih dahulu, lalu ke VM pribadi target Anda. Karena login dua langkah ini, itulah alasan host bastion terkadang disebut "server jump", Anda harus menggunakan penerusan ssh, bukan menyimpan kunci pribadi mesin target di bastion host sebagai cara untuk mencapai komputer target. Hal ini perlu dilakukan meskipun Anda menggunakan pasangan kunci yang sama untuk bastion dan VM target, karena bastion hanya memiliki akses langsung ke separuh publik pasangan kunci tersebut.

Untuk mempelajari cara menggunakan instance bastion host agar dapat terhubung ke VM lain di jaringan Google Cloud Anda, baca artikel Menghubungkan 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 artikel Menghubungkan ke VM yang tidak memiliki alamat IP eksternal.

IAP untuk penerusan TCP

Menggunakan SSH dengan fitur penerusan TCP IAP akan menggabungkan koneksi SSH di dalam HTTPS. fitur penerusan TCP IAP kemudian mengirimkannya ke VM jarak jauh.

Untuk mempelajari cara menghubungkan ke VM jarak jauh dengan IAP, baca Menghubungkan ke VM Linux menggunakan Identity-Aware Proxy.

VPN

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

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

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

Traffic keluar menggunakan Cloud NAT

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

Akses konsol serial interaktif

Jika VM tidak memiliki alamat IP eksternal, Anda mungkin masih perlu berinteraksi dengan VM untuk tujuan pemecahan masalah atau pemeliharaan. Menyiapkan Bastion host, seperti yang telah dibahas sebelumnya, merupakan salah satu opsi, tetapi mungkin memerlukan lebih banyak penyiapan daripada yang layak untuk kebutuhan Anda. Jika Anda ingin memecahkan masalah VM tanpa alamat IP eksternal, pertimbangkan untuk mengaktifkan akses interaktif pada konsol serial, yang memungkinkan Anda berinteraksi dengan konsol serial VM menggunakan SSH dan menjalankan perintah pada 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 Menghubungkan ke VM tanpa alamat IP eksternal.

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