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
-
Instal Google Cloud CLI, lalu initialize dengan menjalankan perintah berikut:
gcloud init
- 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:
Sebelum mem-booting VM untuk pertama kalinya, aktifkan atribut tamu baik pada VM tertentu selama pembuatan VM maupun di seluruh project Anda.
Hubungkan ke VM Anda menggunakan
gcloud compute ssh
.Pastikan Anda memiliki Google Cloud CLI versi terbaru:
gcloud components update
Menghubungkan ke VM:
gcloud compute ssh --project=PROJECT_ID \ --zone=ZONE \ VM_NAME
Ganti kode berikut:
PROJECT_ID
: ID project yang berisi VMZONE
: nama zona tempat VM beradaVM_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
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 VMZONE
: 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
- Melihat output port serial.
- Pilih port serial 1.
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, misalnya8888
.
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:
- Siapkan satu tunnel SSH ke salah satu host di jaringan, lalu buat proxy SOCKS pada host tersebut.
- 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:
- Buka Preferences.
- Klik Advanced > Network > Settings untuk membuka dialog Connection Settings.
- Pilih opsi Manual proxy configuration.
- Di bagian SOCKS Host, isi
localhost
sebagai host dan port yang Anda pilih saat menjalankan perintahgcloud
sebelumnya. - Pilih SOCKS v5.
- Centang kotak Remote DNS.
- Biarkan semua entri lain kosong.
- Di bagian SOCKS Host, isi
- 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:
- VM lain di jaringan
- Fitur penerusan TCP Identity-Aware Proxy
- Server metadata
- Google Cloud SDK
- Gateway VPN terkelola
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.
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.