Sebelum mengirimkan informasi sensitif ke instance mesin virtual (VM), aplikasi dapat memverifikasi identitas instance tersebut menggunakan token identitas instance yang ditandatangani oleh Google. Setiap instance memiliki Token Web JSON (JWT) unik yang menyertakan detail tentang instance serta tanda tangan RS256 Google. Aplikasi Anda dapat memverifikasi tanda tangan berdasarkan sertifikat Oauth2 publik Google untuk mengonfirmasi identitas instance yang telah terhubung dengannya.
Compute Engine menghasilkan token instance yang ditandatangani hanya jika instance memintanya dari metadata instance. Instance hanya dapat mengakses token uniknya sendiri, bukan token untuk instance lainnya.
Anda mungkin ingin memverifikasi identitas instance dalam skenario berikut:
- Saat Anda memulai instance untuk pertama kalinya, aplikasi Anda mungkin perlu memastikan bahwa instance yang terhubung memiliki identitas yang valid sebelum mengirimkan informasi sensitif ke instance.
- Ketika kebijakan mengharuskan Anda menyimpan kredensial di luar lingkungan Compute Engine, dan Anda secara rutin mengirimkan kredensial tersebut ke instance Anda untuk digunakan sementara. Aplikasi Anda dapat mengonfirmasi identitas instance setiap kali perlu mengirimkan kredensial.
Metode autentikasi instance Google memiliki manfaat sebagai berikut:
- Compute Engine membuat token unik setiap kali instance memintanya, dan setiap token berakhir dalam waktu satu jam. Anda dapat mengonfigurasi aplikasi untuk menerima token identitas instance hanya sekali, sehingga mengurangi risiko token tersebut dapat digunakan kembali oleh sistem yang tidak sah.
- Token metadata yang ditandatangani menggunakan standar industri terbuka RFC 7519 dan OpenID Connect 1.0, sehingga alat dan library yang sudah ada akan bekerja secara lancar dengan token identitas.
Sebelum memulai
- Pahami cara mengambil nilai metadata instance.
- Pahami dasar-dasar Token Web JSON agar Anda mengetahui cara menggunakannya di aplikasi.
- Pahami cara membuat dan mengaktifkan akun layanan di instance Anda. Instance Anda harus memiliki akun layanan yang terkait agar dapat mengambil token identitasnya. Akun layanan tidak memerlukan izin IAM apa pun untuk mengambil token identitas ini.
-
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.
Untuk menggunakan contoh Python di halaman ini dari lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.
- Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
-
Buat kredensial autentikasi lokal untuk Akun Google Anda:
gcloud auth application-default login
Untuk informasi selengkapnya, lihat Siapkan autentikasi untuk lingkungan pengembangan lokal.
Memverifikasi identitas instance
Dalam beberapa skenario, aplikasi Anda harus memverifikasi identitas instance yang berjalan di Compute Engine sebelum mengirimkan data sensitif ke instance tersebut. Dalam satu contoh umum, ada satu sistem yang berjalan di luar Compute Engine yang disebut "Host1" dan instance Compute Engine bernama "VM1". VM1 dapat terhubung ke Host1 dan memvalidasi identitas instance tersebut dengan proses berikut:
VM1 membuat koneksi yang aman ke Host1 melalui protokol koneksi yang aman pilihan Anda, seperti HTTPS.
VM1 meminta token identitas uniknya dari server metadata dan menentukan audiens token. Dalam contoh ini, nilai audiens adalah URI untuk Host1. Permintaan ke server metadata menyertakan URI audiens sehingga Host1 dapat memeriksa nilai nanti selama langkah verifikasi token.
Google membuat token identitas instance unik baru dalam format JWT dan menyediakannya ke VM1. Payload token mencakup beberapa detail tentang instance dan juga mencakup URI audiens. Baca Konten Token untuk mengetahui deskripsi lengkap tentang konten token.
VM1 mengirimkan token identitas ke Host1 melalui koneksi aman yang ada.
Host1 mendekode token identitas untuk mendapatkan header token dan nilai payload.
Host1 memverifikasi bahwa token ditandatangani oleh Google dengan memeriksa nilai audiens dan memverifikasi tanda tangan sertifikat berdasarkan sertifikat Google publik.
Jika token valid, Host1 akan melanjutkan transmisi dan menutup koneksi setelah selesai. Host1 dan sistem lainnya harus meminta token baru untuk setiap koneksi berikutnya ke VM1.
Mendapatkan token identitas instance
Saat instance mesin virtual Anda menerima permintaan untuk memberikan token identitasnya, instance akan meminta token tersebut dari server metadata menggunakan proses normal untuk mendapatkan metadata instance. Misalnya, Anda dapat menggunakan salah satu metode berikut:
cURL
Buat permintaan curl
dan sertakan nilai dalam parameter audience
.
Secara opsional, Anda dapat menyertakan parameter format
untuk menentukan apakah Anda ingin menyertakan detail project dan instance dalam payload atau tidak. Jika menggunakan format full
, Anda dapat menyertakan parameter licenses
untuk menentukan apakah Anda ingin menyertakan kode lisensi dalam payload atau tidak.
curl -H "Metadata-Flavor: Google" \ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE&format=FORMAT&licenses=LICENSES'
Ganti kode berikut:
AUDIENCE
: URI unik yang disepakati oleh instance dan sistem yang memverifikasi identitas instance. Misalnya, audiens dapat berupa URL untuk koneksi antara dua sistem.FORMAT
: parameter opsional yang menentukan apakah detail project dan instance disertakan dalam payload atau tidak. Tentukanfull
untuk menyertakan informasi ini dalam payload ataustandard
untuk menghapus informasi dari payload. Nilai defaultnya adalahstandard
. Untuk mengetahui informasi selengkapnya, lihat Format token identitas.LICENSES
: parameter opsional yang menentukan apakah kode lisensi untuk image yang terkait dengan instance ini disertakan dalam payload. TentukanTRUE
untuk menyertakan informasi ini atauFALSE
untuk menghapus informasi ini dari payload. Nilai defaultnya adalahFALSE
. Tidak berpengaruh kecuali jikaformat
adalahfull
Server metadata merespons permintaan ini dengan Token Web JSON yang ditandatangani menggunakan algoritma RS256. Token ini mencakup tanda tangan Google dan informasi tambahan dalam payload. Anda dapat mengirim token ini ke sistem dan aplikasi lain agar dapat memverifikasi token dan mengonfirmasi bahwa itu adalah identitas instance Anda.
Python
Anda dapat mengirimkan permintaan sederhana dari instance ke server metadata menggunakan metode di library requests
Python. Contoh permintaan berikut, lalu mencetak token identitas instance. Token tersebut bersifat unik untuk instance yang membuat permintaan ini.
Server metadata merespons permintaan ini dengan Token Web JSON yang ditandatangani menggunakan algoritma RS256. Token ini mencakup tanda tangan Google dan informasi tambahan dalam payload. Anda dapat mengirim token ini ke sistem dan aplikasi lain agar dapat memverifikasi token dan mengonfirmasi bahwa itu adalah identitas instance Anda.
Memverifikasi token
Setelah aplikasi Anda menerima token identitas instance dari instance Compute Engine, aplikasi tersebut dapat memverifikasi token menggunakan proses berikut.
Terima token dari instance mesin virtual, dekode token menggunakan dekoder JWT RS256, dan baca konten header untuk mendapatkan nilai
kid
.Pastikan token ditandatangani dengan membandingkan token dengan sertifikat Google publik. Setiap sertifikat publik memiliki nilai
kid
yang sesuai dengan nilaikid
di header token.Jika token valid, bandingkan konten payload dengan nilai yang diharapkan. Jika payload token menyertakan detail tentang instance dan project, aplikasi Anda dapat memeriksa nilai
instance_id
,project_id
, danzone
. Nilai tersebut adalah tuple unik secara global yang mengonfirmasi bahwa aplikasi Anda berkomunikasi dengan instance yang benar dalam project yang diinginkan.
Anda dapat mendekode dan memverifikasi token menggunakan alat apa pun yang diinginkan, tetapi metode yang umum adalah menggunakan library untuk bahasa pilihan Anda. Misalnya,
Anda dapat menggunakan metode verify_token
dari
library Google OAuth 2.0
untuk Python. Metode verify_token
mencocokkan nilai kid
dengan sertifikat
yang sesuai, memverifikasi tanda tangan, memeriksa klaim audiens, dan menampilkan
konten payload dari token.
Setelah memverifikasi token dan kontennya, aplikasi Anda dapat melanjutkan komunikasi dengan instance tersebut melalui koneksi yang aman, lalu menutup koneksi setelah selesai. Untuk koneksi berikutnya, minta token baru dari instance dan verifikasi ulang identitas instance tersebut.
Konten token
Token identitas instance berisi tiga bagian utama:
Header
Header menyertakan nilai kid
untuk mengidentifikasi
sertifikat Oauth2 publik
yang harus Anda gunakan untuk memverifikasi tanda tangan. Header juga menyertakan nilai alg
untuk mengonfirmasi bahwa tanda tangan dibuat menggunakan
algoritma RS256.
{
"alg": "RS256",
"kid": "511a3e85d2452aee960ed557e2666a8c5cedd8ae",
}
Payload
Payload berisi klaim audiens aud
. Jika instance menentukan format=full
saat meminta token, payload juga menyertakan klaim tentang instance mesin virtual dan project-nya.
Saat meminta token format lengkap, menentukan licenses=TRUE
juga akan menyertakan klaim tentang lisensi yang terkait dengan instance.
{
"iss": "[TOKEN_ISSUER]",
"iat": [ISSUED_TIME],
"exp": [EXPIRED_TIME],
"aud": "[AUDIENCE]",
"sub": "[SUBJECT]",
"azp": "[AUTHORIZED_PARTY]",
"google": {
"compute_engine": {
"project_id": "[PROJECT_ID]",
"project_number": [PROJECT_NUMBER],
"zone": "[ZONE]",
"instance_id": "[INSTANCE_ID]",
"instance_name": "[INSTANCE_NAME]",
"instance_creation_timestamp": [CREATION_TIMESTAMP],
"instance_confidentiality": [INSTANCE_CONFIDENTIALITY],
"license_id": [
"[LICENSE_1]",
...
"[LICENSE_N]"
]
}
}
}
Dengan keterangan:
[TOKEN_ISSUER]
: URL yang mengidentifikasi siapa yang menerbitkan token. Untuk Compute Engine, nilai ini adalahhttps://accounts.google.com
.[ISSUED_TIME]
: stempel waktu unix yang menunjukkan kapan token dikeluarkan. Nilai ini diupdate setiap kali instance meminta token dari server metadata.[EXPIRED_TIME]
: stempel waktu unix yang menunjukkan kapan token berakhir.[AUDIENCE]
: URI unik yang disepakati oleh instance dan sistem yang memverifikasi identitas instance. Misalnya, audiens dapat berupa URL untuk koneksi antara dua sistem.[SUBJECT]
: subjek token, yang merupakan ID unik untuk akun layanan yang Anda kaitkan dengan instance.[AUTHORIZED_PARTY]
: pihak yang dikirimi Token ID yang merupakan ID unik untuk akun layanan yang terkait dengan instance Anda.[PROJECT_ID]
: ID untuk project tempat Anda membuat instance.[PROJECT_NUMBER]
: nomor unik untuk project tempat Anda membuat instance.[ZONE]
: zona tempat instance berada.[INSTANCE_ID]
: ID unik untuk instance yang memiliki token ini. ID ini bersifat unik dalam project dan zona.[INSTANCE_NAME]
: nama instance tempat token ini berada. Jika project Anda menggunakan DNS zona, nama ini dapat digunakan kembali di seluruh zona. Jadi, gunakan kombinasiproject_id
,zone
, daninstance_id
nilai untuk mengidentifikasi ID instance yang unik. Project dengan DNS global aktif memiliki nama instance unik di seluruh project.[CREATION_TIMESTAMP]
: stempel waktu Unix yang menunjukkan kapan Anda membuat instance.[INSTANCE_CONFIDENTIALITY]
:1
jika instance adalah confidential VM.[LICENSE_1]
hingga[LICENSE_N]
: kode lisensi untuk image yang terkait dengan instance ini.
Payload Anda mungkin terlihat mirip dengan contoh berikut:
{
"iss": "https://accounts.google.com",
"iat": 1496953245,
"exp": 1496956845,
"aud": "https://www.example.com",
"sub": "107517467455664443765",
"azp": "107517467455664443765",
"google": {
"compute_engine": {
"project_id": "my-project",
"project_number": 739419398126,
"zone": "us-west1-a",
"instance_id": "152986662232938449",
"instance_name": "example",
"instance_creation_timestamp": 1496952205,
"instance_confidentiality": 1,
"license_id": [
"1000204"
]
}
}
}
Tanda Tangan
Google menghasilkan tanda tangan dengan mengenkode base64url pada header dan payload, serta menggabungkan kedua nilai tersebut. Anda dapat memeriksa nilai ini terhadap sertifikat Oauth2 publik untuk memverifikasi token.