Dokumen ini menjelaskan cara mengonfigurasi akses berbasis sertifikat untuk Workload Identity Federation menggunakan sertifikat X.509.
Akses berbasis sertifikat menggunakan TLS Timbal Balik (mTLS) untuk mengautentikasi klien dan server selama TLS handshake. Dalam proses ini, binding mTLS menggabungkan kebijakan berdasarkan konteks transport dan menggunakan status sertifikat klien dalam sesi TLS untuk membuat keputusan otorisasi.
Untuk workload identity federation X.509, binding mTLS memastikan bahwa seluruh alur autentikasi terikat dengan aman ke workload tepercaya. Hal ini mengurangi risiko pencurian kredensial, karena autentikasi terikat ke endpoint tepercaya tertentu.
Ringkasan konfigurasi Akses berbasis sertifikat untuk Workload Identity Federation
Berikut ringkasan umum proses untuk mengonfigurasi akses berbasis sertifikat untuk Workload Identity Federation:
Buat workload identity federation dengan mengonfigurasi kepercayaan dengan anchor kepercayaan sertifikat X.509.
Buat tingkat akses untuk akses berbasis sertifikat.
Tambahkan tingkat akses ke kebijakan Akses Kontekstual yang menerapkan pengikatan mTLS.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
Google Cloud CLI versi terbaru
Untuk mengupdate ke Google Cloud CLI versi terbaru, jalankan perintah berikut:
gcloud components update
Jika Anda perlu menginstal Google Cloud CLI, lihat bagian Menginstal Google Cloud CLI.
Konfigurasi Workload Identity Federation yang menggunakan anchor kepercayaan sertifikat X.509 Anda
Untuk menggunakan fitur ini, isi formulir berikut agar ditambahkan ke daftar yang diizinkan: Formulir permintaan daftar yang diizinkan. Anda akan dihubungi setelah ditambahkan ke daftar yang diizinkan.
Membuat tingkat akses untuk sertifikat
Buat tingkat akses mTLS. Tingkat akses mTLS memvalidasi sertifikat saat menentukan akses ke resource.
Konsol
Di Access Context Manager, buat tingkat akses kustom dan masukkan ekspresi berikut di kolom ekspresi CEL:
request.auth.matchesMtlsTokens(origin) == true
.gcloud
Untuk membuat tingkat akses kustom, jalankan perintah berikut:
gcloud access-context-manager levels create ACCESS_LEVEL_NAME
--title=TITLE
--custom-level-spec=FILE
--description=DESCRIPTION
--policy=POLICY_NAMEGanti kode berikut:
ACCESS_LEVEL_NAME
: nama tingkat akses.TITLE
: judul tingkat akses.FILE
: file YAML dengan konten berikut:request.auth.matchesMtlsTokens(origin) == true
.DESCRIPTION
: deskripsi tingkat akses.POLICY_NAME
: nama kebijakan akses.
Ekspor tingkat akses yang Anda buat ke variabel lingkungan. Variabel ini digunakan dalam langkah-langkah berikutnya.
export ACCESS_LEVEL_ID=ACCESS_LEVEL_ID
Ganti
ACCESS_LEVEL_ID
dengan nama tingkat akses, misalnya,accessPolicies/12345/accessLevels/acl_1
.
Membuat binding Akses Kontekstual untuk workload identity pool
Tetapkan variabel lingkungan berikut.
export ORG_ID=ORG_ID export CALLER_PROJECT_ID=CALLER_PROJECT_ID export FEDERATED_PRINCIPAL=FEDERATED_PRINCIPAL
Ganti kode berikut:
ORG_ID
: ID organisasi Anda.CALLER_PROJECT_ID
: ID project yang akan digunakan untuk memanggil API.FEDERATED_PRINCIPAL
: nama akun utama identitas di workload identity pool yang mematuhi kebijakan Context-Aware Access. Anda dapat menggunakan salah satu opsi berikut:satu identitas dengan format -
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
ATAU
semua identitas dalam pool dengan format -
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
gcloud
gcloud alpha access-context-manager cloud-bindings create \ --organization=
ORG_ID
\ --federated-principal=FEDERATED_PRINCIPAL
\ --level=ACCESS_LEVEL_ID
--dry-run-level=DRY_RUN_ACCESS_LEVEL_ID
Ganti kode berikut:
ACCESS_LEVEL_ID
: nama tingkat akses.DRY_RUN_ACCESS_LEVEL_ID
: nama tingkat akses uji coba. Sebaiknya aktifkan pengikatan kebijakan uji coba terlebih dahulu untuk memahami potensi dampaknya terhadap traffic yang ada.
curl
Buat file JSON dengan binding Akses Kontekstual.
Anda hanya dapat memberikan satu tingkat akses dalam permintaan, meskipun kolomnya berulang. Anda dapat menggunakan jenis principal gabungan berikut:
- Identitas tunggal:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
- Semua identitas dalam pool:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
echo { \ \"principal\": { \ \"federatedPrincipal\": \"${FEDERATED_PRINCIPAL:?}\" \ },\ \"accessLevels\": [\"${ACCESS_LEVEL_ID:?}\"] \ } \ >> request.json
- Identitas tunggal:
Gunakan
curl
untuk mengirim permintaan HTTP berikut.curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings"
Memberikan otorisasi menggunakan Google Cloud library klien
Untuk memberi otorisasi beban kerja Workforce Identity Federation menggunakan Google Cloud library klien, selesaikan langkah-langkah berikut.
Buat file Kredensial Default Aplikasi (ADC) yang dikonfigurasi untuk autentikasi Workforce Identity Federation.
gcloud iam workload-identity-pools create-cred-config IDENTITY_POOL_ID \ --credential-cert-path WORKLOAD_CERTIFICATE_PATH \ --credential-cert-private-key-path WORKLOAD_KEY_PATH \ --output-file ADC_FILE_OUTPUT_PATH
Ganti kode berikut:
IDENTITY_POOL_ID
: ID workload identity pool Anda.WORKLOAD_CERTIFICATE_PATH
: jalur ke file sertifikat beban kerja Anda.WORKLOAD_KEY_PATH
: jalur ke file kunci pribadi beban kerja Anda.ADC_FILE_OUTPUT_PATH
: jalur output untuk file ADC.
Perintah ini juga menghasilkan file konfigurasi sertifikat di direktori konfigurasi default gcloud CLI Anda. File konfigurasi sertifikat mendukung autentikasi awal dan membuat handshake mTLS untuk permintaan berikutnya ke resource Google Cloud .
Tetapkan variabel lingkungan untuk mengarah ke file ADC. Tindakan ini membuat kredensial Anda dapat ditemukan oleh library klien Google.
export GOOGLE_APPLICATION_CREDENTIALS=${application_default_credentials.json}
Langkah ini bersifat opsional jika Anda menghilangkan argumen
--output-file
saat Anda membuat file ADC. Jika Anda tidak menyertakan argumen, file ADC akan dibuat dan dibaca dari direktori konfigurasi default gcloud CLI Anda.Untuk membuat dan menguji akses ke Google Cloud API, selesaikan langkah-langkah berikut. Anda dapat menggunakan Go atau Python.
Go
Gunakan contoh berikut untuk membuat file Go, seperti
golang_test.go
.package golang_test import ( "io" "log" "testing" "cloud.google.com/go/auth/credentials" "cloud.google.com/go/auth/httptransport" ) func TestGoExample(t *testing.T) { scopes := []string{ "https://www.googleapis.com/auth/pubsub", // Scope for Pub/Sub access // Add other scopes as needed } dopts := credentials.DetectOptions{ Scopes: scopes, } // Create httptransport.Options with the scopes opts := &httptransport.Options{ DetectOpts: &dopts, } hc, err := httptransport.NewClient(opts) if err != nil { t.Fatalf("NewHTTPClient: %v", err) } resp, err := hc.Get("https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics") if err != nil { t.Fatalf("Get: %v", err) } t.Logf("Status: %s", resp.Status) t.Cleanup(func() { resp.Body.Close() }) b, err := io.ReadAll(resp.Body) if err != nil { t.Fatal(err) } log.Println(string(b)) }
Ganti PROJECT_ID dengan project ID gcloud CLI Anda.
Untuk menjalankan pengujian di VM Compute Engine, gunakan perintah berikut.
go mod init example.com go mod tidy go test -v golang_test.go --count=1
Python
Gunakan contoh berikut untuk membuat file pengujian, seperti
python_test.py
.import google.auth import google.auth.transport.requests import requests def test_go_example(): # Define the required scopes for your application scopes = [ "https://www.googleapis.com/auth/pubsub", # Scope for Pub/Sub access # Add other scopes as needed ] # Obtain Application Default Credentials (ADC) with the specified scopes credentials, _ = google.auth.default(scopes=scopes) # Create an authorized HTTP session using the ADC credentials authed_session = google.auth.transport.requests.AuthorizedSession(credentials) try: # Make a GET request to the Pub/Sub API endpoint response = authed_session.get( "https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics" ) # Check if the request was successful response.raise_for_status() # Raise an exception for error statuses # Log the response status and content print(f"Status: {response.status_code}") print(response.text) except requests.exceptions.RequestException as e: print(f"Error making the request: {e}") if __name__ == "__main__": test_go_example()
Ganti PROJECT_ID dengan project ID gcloud CLI Anda.
Untuk menjalankan pengujian di VM Compute Engine, selesaikan langkah-langkah berikut.
- Siapkan lingkungan virtual Python.
Instal library yang diperlukan.
pip install google-auth google-auth-httplib2 requests
Jalankan pengujian:
python3 python_test.py
Memberikan otorisasi menggunakan permintaan HTTP biasa
Untuk memberi otorisasi pada workload Workforce Identity Federation menggunakan permintaan HTTP biasa, selesaikan langkah-langkah berikut.
Dapatkan token akses terikat sertifikat dari Google Cloud Layanan Token Keamanan melalui handshake mTLS standar.
Panggil layanan Google Cloud dengan token akses yang Anda peroleh dari Layanan Token Keamanan. Contoh ini membuat kueri Cloud Storage.
$ curl --key ${workload_key.pem} --cert ${workload_cert.pem} -X GET 'https://storage.mtls.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
Binding mTLS menerapkan penggunaan mTLS. Jalankan perintah berikut untuk memverifikasi bahwa koneksi non-mTLS gagal dengan error tidak sah.
$ curl -X GET 'https://storage.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
Mencantumkan binding kebijakan
Untuk mencantumkan binding kebijakan untuk Workload Identity Federation, jalankan perintah berikut.
gcloud
Perintah berikut mencantumkan binding tertentu dalam organisasi tertentu, memfilter binding yang berlaku untuk principal gabungan.
gcloud alpha access-context-manager cloud-bindings list \
--organization=ORG_ID
\
--filter='principal:federatedPrincipal'
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings?filter=principal%3Afederated_principal"
Memperbarui pengikatan kebijakan
Untuk memperbarui binding kebijakan, tambahkan tingkat akses baru ke file JSON dan jalankan perintah berikut.
gcloud
gcloud alpha access-context-manager cloud-bindings update \ --binding=BINDING_ID
\ --level=NEW_ACCESS_LEVEL_ID
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}?updateMask=access_levels"
Menghapus binding kebijakan
Untuk menghapus binding kebijakan, jalankan perintah berikut.
gcloud
gcloud alpha access-context-manager cloud-bindings delete \
--binding=BINDING_ID
curl
curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}"
Pemecahan masalah
Berikut adalah beberapa masalah umum dan tindakan yang disarankan untuk mengatasinya:
Error:
403 Forbidden, user does not have permission.
Tindakan: Periksa kebijakan IAM untuk memverifikasi bahwa kumpulan identitas workload memiliki akses ke resource Google Cloud Anda.
Error:
Unauthorized_client: Could not obtain a value for google.subject from the given credential.
Tindakan: Backend tidak dapat mengekstrak nilai untuk
google.subject
dari sertifikat klien Anda berdasarkan pemetaan atribut. Periksa sertifikat klien Anda untuk memverifikasi bahwa kolom yang Anda gunakan untuk melakukan pemetaan memiliki nilai.Jika Anda mengalami penolakan akses yang tidak terduga setelah mengaktifkan Akses Kontekstual, Anda dapat dengan cepat mengizinkan traffic dengan menghapus binding Akses Kontekstual menggunakan perintah berikut:
gcloud alpha access-context-manager cloud-bindings delete
Setelah akses dipulihkan, tinjau log audit untuk mengetahui alasan permintaan ditolak.