1. Pengantar
Dalam codelab ini, Anda akan mempelajari cara melindungi BigQuery API menggunakan Kontrol Layanan VPC. Codelab dimulai tanpa layanan API yang dilindungi oleh perimeter layanan, sehingga kueri dapat dijalankan pada set data publik, dan hasilnya dapat disimpan dalam tabel project. Kueri berjalan di satu project dan tabel (tempat hasil disimpan) dibuat di project lain, meniru penyiapan tempat data dapat disimpan di satu project, tetapi perlu diakses menggunakan project lain.
Selanjutnya, kita akan memperkenalkan perimeter layanan untuk melindungi project data. Anda akan mempelajari cara memperbaiki pelanggaran yang teramati menggunakan aturan ingress dan aturan egress, lalu menambahkan level akses untuk membatasi akses menggunakan alamat IP internal. Sasaran codelab ini adalah:
- Pahami cara memperbaiki pelanggaran ingress dan egress menggunakan aturan ingress dan egress masing-masing.
- Pahami alasan terjadinya pelanggaran tertentu.
- Menganalisis cakupan perbaikan pelanggaran yang diterapkan.
- Ubah perbaikan (aturan ingress / egress) untuk mengubah cakupannya dengan memanfaatkan opsi untuk mengizinkan traffic dari alamat IP internal di jaringan VPC menggunakan tingkat akses.
2. Penyiapan dan Persyaratan Resource
Sebelum memulai
Dalam codelab ini, kami mengasumsikan bahwa Anda sudah mengetahui:
- Dasar-dasar untuk menjalankan kueri BigQuery: Anda dapat melihat codelab ini untuk mempelajari cara membuat kueri set data Wikipedia di BigQuery
- Cara membuat dan mengelola folder
- Cara membuat project di folder atau memindahkan project yang ada di folder
- Cara membuat kebijakan akses tercakup
- Cara membuat dan mengonfigurasi perimeter layanan
- Cara menemukan pelanggaran kebijakan keamanan di log
Penyiapan
Penyiapan awal kami dirancang sebagai berikut:
- Organisasi Google Cloud.
- Folder di bawah organisasi. Untuk codelab ini, kita akan menyebutnya
codelab-folder. - Dua project Google Cloud yang ditempatkan di folder yang sama,
codelab-folder. Untuk codelab ini, kita akan menyebutnyaproject-1danproject-2- Jika Anda belum membuat folder dan project, di konsol Google Cloud, buat folder di bawah organisasi dan buat dua project baru di bawah folder yang dibuat tersebut.
- Izin yang diperlukan:
- Peran IAM untuk mengelola folder: ditetapkan di tingkat folder
- Peran IAM untuk mengelola project: ditetapkan di level project
- Peran IAM yang diperlukan untuk mengonfigurasi Kontrol Layanan VPC: ditetapkan di tingkat organisasi
- Peran IAM untuk mengelola BigQuery: ditetapkan di tingkat project
- Peran IAM untuk mengelola instance Compute Engine: ditetapkan di tingkat project
- Akun penagihan untuk kedua project,
project-2danproject-1.
Membuat Perimeter Layanan Reguler
Dalam codelab ini, kita akan menggunakan perimeter layanan reguler yang melindungi project-1.
- Buat perimeter reguler,
perimeter-1, dan tambahkanproject-1.
Membuat VM Compute Engine
Dalam codelab ini, kita akan menggunakan 1 instance Compute Engine di project-2, yang berada di us-central1 dan menggunakan jaringan VPC default bernama default.
- Anda dapat melihat dokumentasi sebagai panduan untuk membuat instance Compute Engine dari image publik.
Biaya
Anda harus mengaktifkan penagihan di konsol Google Cloud untuk menggunakan API/resource cloud. Sebaiknya nonaktifkan resource yang digunakan agar tidak menimbulkan penagihan di luar codelab ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Resource yang menimbulkan biaya adalah instance BigQuery dan Compute Engine. Anda dapat memperkirakan biaya menggunakan kalkulator harga BigQuery dan kalkulator harga Compute Engine.
3. Akses ke BigQuery tanpa Pembatasan Kontrol Layanan VPC
Mengkueri Set Data Publik dan Menyimpan Hasil di project-1
- Akses
project-2danproject-1untuk memverifikasi apakah Anda dapat mengakses BigQuery API dengan membuka halaman BigQuery Studio. Anda akan dapat melakukannya karena meskipunproject-1berada dalam perimeter layanan, perimeter tersebut belum melindungi layanan apa pun. - Dari
project-2, jalankan kueri berikut untuk membuat kueri set data publik.
SELECT name, SUM(number) AS total
FROM `bigquery-public-data.usa_names.usa_1910_2013`
GROUP BY name
ORDER BY total DESC
LIMIT 10;
Setelah menjalankan kueri ke set data publik (sambil tetap berada di project-2):
- Klik Simpan Hasil, lalu pilih tabel BigQuery. (lihat screenshot di bawah).

- Pilih
project-1sebagai project tujuan. - Beri nama Set Data sebagai
codelab_dataset. (Pilih BUAT SET DATA BARU, kecuali jika menggunakan set data yang ada).
- Beri nama tabel sebagai:
codelab-table. - Klik Simpan.
Data set data publik telah berhasil disimpan di project-1 sebagai hasil dari menjalankan kueri dari project-2.
Kueri Set Data yang disimpan di project-1 dari project-2
Saat tetap berada di project-2 BigQuery Studio, jalankan kueri berikut untuk memilih data dari:
- Project:
project-1 - Set data:
codelab_dataset - Tabel:
codelab-table
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;
Kueri akan berhasil dijalankan, karena project-2 maupun project-1 tidak dibatasi untuk menggunakan BigQuery. Akses ke BigQuery diizinkan dari dan ke mana saja selama pengguna memiliki izin IAM yang sesuai.
Diagram ini menggambarkan proses saat prinsipal membuat kueri set data BigQuery. Setiap kueri BigQuery memulai tugas BigQuery, yang kemudian melakukan operasi sebenarnya, dalam skenario ini, mengambil data. Akses utama ditunjukkan dari instance Compute Engine dan dari internet, saat membuat kueri dari set data publik dan dari project Google Cloud terpisah. Proses untuk membuat kueri data (
GetData) berhasil, tanpa diblokir oleh Kontrol Layanan VPC.
4. Melindungi BigQuery API di Project Set Data Sumber
Ubah konfigurasi perimeter perimeter-1 dan batasi layanan BigQuery API bersama dengan resource yang dilindungi, yaitu project-1.

Memverifikasi Penerapan Perimeter Layanan
Dari project-2, jalankan kueri berikut di BigQuery Studio, seperti pada langkah sebelumnya:
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;
Terjadi pelanggaran RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER Kontrol Layanan VPC

Log audit pelanggaran akan berada di project-1, karena di situlah pelanggaran untuk melintasi perimeter terjadi. Log dapat difilter dengan vpcServiceControlsUniqueId yang diamati (ganti VPC_SC_DENIAL_UNIQUE_ID dengan ID unik yang diamati).
severity=ERROR
resource.type="audited_resource"
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="[*VPC_SC_DENIAL_UNIQUE_ID*]"
Pelanggaran tersebut adalah egressViolations dengan:
principalEmail: [akun pengguna yang menjalankan kueri]callerIp: [Alamat IP agen pengguna yang menjalankan kueri]
"egressViolations": [
{
"targetResource": "projects/project-2",
"sourceType": "Resource",
"source": "projects/project-1",
"servicePerimeter": "accessPolicies/REDACTED/servicePerimeters/perimeter-1",
"targetResourcePermissions": [ "bigquery.jobs.create"]
} ],
5. Memperbaiki Pelanggaran untuk Membuat Tugas BigQuery
Diagram ini menggambarkan saat prinsipal menjalankan kueri dari
project-2 untuk set data di project-1. Operasi untuk membuat tugas BigQuery, dari project set data (project-1) di project tempat kueri dijalankan (project-2) gagal karena pelanggaran keluar Kontrol Layanan VPC akibat perimeter layanan perimeter-1 yang melindungi BigQuery API. Dengan adanya perimeter, tidak ada permintaan BigQuery API yang dapat dimulai dari project-1 ke luar perimeter atau dimulai di luar perimeter ke project yang dilindungi; kecuali jika diizinkan oleh konfigurasi perimeter layanan.
Pelanggaran egress dapat diperbaiki dengan membuat aturan egress yang didasarkan pada:
- sumber (FROM): yaitu alamat email dan konteks pengguna (misalnya: alamat IP pemanggil, status perangkat, lokasi, dll.)
- tujuan (KE): yaitu resource, layanan, dan metode atau izin target.
Untuk memperbaiki pelanggaran keluar yang diamati, buat aturan keluar yang mengizinkan traffic menuju targetResource (project-2) oleh akun pengguna yang menjalankan kueri (user@example.com) di layanan BigQuery dan metode/ izin bigquery.jobs.create.

Perilaku yang diharapkan dari aturan keluar yang dikonfigurasi:
- FROM | Identitas: hanya identitas
user@example.comyang ditentukan yang diizinkan untuk melintasi batas perimeter. - TO | projects: identitas yang ditentukan dapat melintasi batas perimeter hanya jika tujuannya adalah project
project-2yang ditentukan. - KE | Layanan: identitas yang ditentukan dapat memulai traffic di luar perimeter, menuju project yang ditentukan hanya jika panggilan API ditujukan untuk layanan dan metode yang ditentukan. Jika tidak, misalnya jika mereka mencoba layanan lain yang dilindungi oleh perimeter layanan, operasi akan diblokir karena layanan lain tidak diizinkan.
Menguji Perbaikan: Aturan Egress
Setelah aturan keluar diterapkan, jalankan kueri yang sama.
SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;
Pelanggaran lain akan terjadi, kali ini pelanggaran masuk NO_MATCHING_ACCESS_LEVEL. Pelanggaran baru berbeda dari pelanggaran pertama, dalam hal project target dan metode.

Pelanggaran baru adalah pelanggaran ingress dengan
principalEmail: [akun pengguna yang menjalankan kueri]callerIp: [Alamat IP agen pengguna yang menjalankan kueri]
ingressViolations: [
0: {
servicePerimeter: "accessPolicies/REDACTED/servicePerimeters/perimeter-1"
targetResource: "projects/project-1"
targetResourcePermissions: [0: "bigquery.tables.getData"]}
]
Pelanggaran untuk metode bigquery.tables.getData disebabkan oleh panggilan API yang dimulai oleh tugas BigQuery yang mencoba mendapatkan data dari tabel BigQuery.
6. Memperbaiki Pelanggaran untuk Mendapatkan Data Tabel BigQuery
Aturan ingress memperbaiki pelanggaran ingress, sekaligus memberikan kontrol terperinci tentang siapa yang diizinkan untuk melintasi batas perimeter layanan beserta konteks akses yang diizinkan, seperti project sumber/ target dan metode API yang dapat mereka akses.
Pelanggaran ingress diperbaiki dengan aturan ingress yang dikonfigurasi dengan:
- sumber (FROM): yaitu alamat email dan konteks pengguna (misalnya: alamat IP pemanggil, status perangkat, lokasi, dll.)
- tujuan (KE): yaitu resource, layanan, dan metode atau izin target.
Aturan ingress akan mengizinkan traffic menuju project-1 oleh pengguna tertentu pada layanan dan metode tertentu.

Perilaku yang diharapkan dari aturan ingress yang dikonfigurasi:
- FROM | Identitas: hanya identitas
user@example.comyang ditentukan yang diizinkan untuk melintasi batas perimeter. - TO | projects: identitas yang ditentukan dapat melintasi batas perimeter hanya jika tujuannya adalah project
project-1yang ditentukan. - TO | Layanan: identitas yang ditentukan hanya dapat memulai traffic di dalam perimeter jika panggilan API ditujukan untuk BigQuery API dan metode yang ditentukan
bigquery.tables.getData.
Eksekusi kueri yang identik selanjutnya akan berfungsi dengan tepat tanpa pelanggaran Kontrol Layanan VPC.
Kami telah berhasil membatasi BigQuery API di project-1 sehingga hanya dapat digunakan oleh user@example.com, bukan oleh user2@example.com.
Diagram ini menggambarkan bagaimana dua prinsipal yang berbeda mencoba membuat kueri pada set data yang sama. Akses oleh
user2@example.com (garis biru putus-putus) ditolak oleh Kontrol Layanan VPC, karena mereka tidak diizinkan untuk menjalankan operasi BigQuery dari atau ke project-1 oleh konfigurasi perimeter layanan. Akses oleh user@example.com (garis solid hijau) berhasil, karena mereka diizinkan oleh konfigurasi Kontrol Layanan VPC, untuk melakukan operasi dari dan ke project-1.
7. Membatasi Traffic yang Diizinkan oleh Perimeter Layanan berdasarkan Alamat IP Internal
Konfigurasi saat ini memungkinkan pengguna yang ditetapkan menjalankan kueri di BigQuery dalam project-1 dari lokasi mana pun; di mana pun di internet, jika mereka diberi izin IAM untuk membuat kueri data, dan selama mereka menggunakan akunnya. Dari perspektif keamanan, hal ini menyiratkan bahwa jika akun disusupi, setiap individu yang mendapatkan akses ke akun tersebut dapat mengakses data BigQuery tanpa batasan tambahan.
Pembatasan lebih lanjut dapat diterapkan dengan memanfaatkan tingkat akses dalam aturan ingress dan egress untuk menentukan konteks pengguna. Misalnya, Anda dapat mengizinkan akses berdasarkan IP sumber bersama dengan aturan ingress yang sebelumnya dikonfigurasi yang mengizinkan akses berdasarkan identitas pemanggil. Akses berdasarkan IP sumber dapat dilakukan untuk rentang CIDR IP publik, asalkan klien pengguna memiliki IP publik yang ditetapkan untuknya, atau dengan menggunakan alamat IP internal jika klien pengguna beroperasi dari project Google Cloud.
Membuat Tingkat Akses dengan Kondisi Akses Alamat IP Internal
Di folder kebijakan akses tercakup yang sama, buka halaman Access Context Manager untuk membuat tingkat akses.
- Di halaman Access Context Manager, pilih CREATE ACCESS LEVEL.
- Di panel Tingkat Akses Baru:
- Berikan judul: Anda dapat menggunakan
codelab-al. - Di bagian Kondisi, klik Subjaringan IP.
- Pilih tab Private IP, lalu klik PILIH JARINGAN VPC.
- Dari panel Add VPC Networks, Anda dapat menjelajahi dan menemukan jaringan
defaultatau memasukkan nama jaringan lengkap secara manual dalam format//compute.googleapis.com/projects/project-2/global/networks/default. - Klik ADD VPC Network.
- Klik PILIH SUBNET IP.
- Pilih region tempat instance VM berada. Untuk codelab ini, nilainya adalah
us-central1. - Klik SIMPAN.
- Berikan judul: Anda dapat menggunakan
Kita telah membuat tingkat akses, yang masih belum diterapkan pada perimeter atau kebijakan ingress/egress mana pun.

Menambahkan Tingkat Akses ke Aturan Ingress
Untuk memastikan bahwa pengguna yang diizinkan oleh aturan ingress juga diverifikasi berdasarkan tingkat akses, Anda harus mengonfigurasi tingkat akses dalam aturan ingress. Aturan ingress yang mengizinkan akses untuk membuat kueri data ada di perimeter-1. Ubah aturan ingress untuk menentukan sumber sebagai tingkat akses codelab-al.

Menguji Konfigurasi Baru
Setelah penambahan tingkat akses dalam aturan traffic masuk, kueri BigQuery yang sama akan gagal kecuali jika dieksekusi dari klien di jaringan VPC default untuk project project-2. Untuk memverifikasi perilaku ini, jalankan kueri dari konsol Google Cloud saat perangkat endpoint terhubung ke internet. Kueri akan berakhir tanpa berhasil, disertai dengan indikasi Pelanggaran ingress.
Kueri yang sama dapat dijalankan dari jaringan VPC default, yang berada di project-2. Demikian pula, menjalankan kueri BigQuery yang sama dari instance Compute Engine yang berada di project-2 menggunakan jaringan VPC default juga akan gagal. Hal ini karena aturan ingress masih dikonfigurasi untuk hanya mengizinkan akun utama user@example.com. Namun, VM menggunakan akun layanan default Compute Engine.
Agar berhasil menjalankan perintah yang sama dari instance Compute Engine di project-2,pastikan bahwa:
- VM memiliki cakupan akses untuk menggunakan BigQuery API. Hal ini dapat dilakukan dengan memilih Allow full access to all Cloud APIs sebagai cakupan akses VM.
- Akun layanan yang terlampir ke VM memerlukan izin IAM untuk:
- Membuat Tugas BigQuery di
project-2 - Mendapatkan data BigQuery dari tabel BigQuery yang berada di
project-1
- Membuat Tugas BigQuery di
- Akun layanan Compute Engine default harus diizinkan oleh aturan ingress dan egress.
Sekarang kita perlu menambahkan akun layanan default Compute Engine dalam aturan ingress (untuk mengizinkan pengambilan data dari tabel BigQuery) dan ke aturan egress (untuk mengizinkan pembuatan tugas BigQuery).

Dari instance Compute Engine di project-2 pada jaringan VPC default, jalankan perintah kueri bq berikut:
bq query --nouse_legacy_sql \
'SELECT name, total
FROM `project-1.codelab_dataset.codelab-table`
ORDER BY total DESC
LIMIT 10;'
Dengan konfigurasi saat ini, perintah BigQuery hanya akan berhasil jika:
- berjalan di VM menggunakan jaringan VPC default di
project-2, dan - berada di region
us-central1yang ditentukan (subnetwork IP), dan - dijalankan menggunakan akun layanan Compute Engine default yang dikonfigurasi dalam perimeter layanan.
Kueri perintah BigQuery akan gagal jika dijalankan dari tempat lain, termasuk:
- jika dijalankan di VM menggunakan jaringan VPC default di
project-2, tetapi berada di region yang berbeda dengan subnet yang ditambahkan di tingkat akses, atau - jika dijalankan oleh pengguna
user@example.comdengan klien pengguna di internet.
Diagram ini menggambarkan akses yang dimulai oleh prinsipal yang sama,
user@example.com, dari dua lokasi yang berbeda: internet dan instance Compute Engine. Akses ke BigQuery langsung dari internet (garis putus-putus biru) diblokir oleh Kontrol Layanan VPC, sedangkan akses dari VM (garis solid hijau) —saat menirukan identitas akun layanan default Compute Engine— diizinkan. Akses yang diizinkan disebabkan oleh perimeter layanan yang dikonfigurasi untuk mengizinkan akses ke resource yang dilindungi dari alamat IP internal.
8. Pembersihan
Meskipun tidak ada biaya terpisah untuk menggunakan Kontrol Layanan VPC saat layanan tidak digunakan, sebaiknya bersihkan penyiapan yang digunakan di laboratorium ini. Anda juga dapat menghapus instance VM dan set data BigQuery, atau project Google Cloud untuk menghindari tagihan. Menghapus project Cloud akan menghentikan penagihan untuk semua resource yang digunakan dalam project tersebut.
- Untuk menghapus instance VM, selesaikan langkah-langkah berikut:
- Di konsol Google Cloud, buka halaman instance VM.
- Pilih kotak centang di sisi kiri nama instance VM, lalu pilih Hapus, kemudian klik Hapus lagi untuk mengonfirmasi.

- Untuk menghapus perimeter layanan, selesaikan langkah-langkah berikut:
- Di konsol Google Cloud, pilih Keamanan, lalu VPC Service Controls di tingkat tempat kebijakan akses dicakup, dalam hal ini, di tingkat folder.
- Di halaman VPC Service Controls, pada baris tabel yang sesuai dengan perimeter yang ingin Anda hapus, klik Hapus.
- Untuk menghapus Tingkat Akses, selesaikan langkah-langkah berikut:
- Di konsol Google Cloud, buka halaman Access Context Manager di cakupan Folder.
- Di petak, identifikasi baris untuk tingkat akses yang ingin Anda hapus, pilih menu tiga titik, lalu pilih Hapus.
- Untuk mematikan project, selesaikan langkah-langkah berikut:
- Di konsol Google Cloud, buka halaman IAM & Admin Settings project yang ingin Anda hapus.
- Di halaman Setelan IAM & Admin, pilih Shutdown.
- Masukkan project ID, lalu pilih Shutdown anyway.
9. Selamat!
Dalam codelab ini, Anda telah membuat perimeter Kontrol Layanan VPC, menerapkannya, dan memecahkan masalahnya.
Pelajari Lebih Lanjut
Anda juga dapat mempelajari skenario berikut:
- Jalankan kueri yang sama pada set data publik, setelah project dilindungi oleh Kontrol Layanan VPC.
- Tambahkan
project-2di perimeter yang sama denganproject-1. - Tambahkan
project-2di perimeternya sendiri dan pertahankanproject-1di perimeter saat ini. - Menjalankan kueri untuk memperbarui data dalam tabel, bukan hanya untuk mengambil data.
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.