Memecahkan masalah umum

Halaman ini mencantumkan berbagai masalah yang mungkin Anda alami saat mengonfigurasi Kontrol Layanan VPC.

Perilaku kebijakan terbatas yang tidak terduga

Anda mungkin melihat beberapa pelanggaran Kontrol Layanan VPC yang tidak terduga yang seharusnya diizinkan oleh kebijakan cakupan Anda. Jika tidak memiliki kebijakan akses tingkat organisasi, Anda mungkin mengalami beberapa masalah yang tidak terduga dengan kebijakan akses terbatas.

Untuk mengatasi masalah ini, buat kebijakan akses di tingkat organisasi menggunakan perintah berikut:

gcloud access-context-manager policies create --organization <var>ORGANIZATION_ID</var> --title <var>POLICY_TITLE</var>

Ganti kode berikut:

  • ORGANIZATION_ID: ID organisasi.
  • POLICY_TITLE: Judul yang dapat dibaca manusia untuk kebijakan akses Anda.

Untuk mengetahui informasi selengkapnya, lihat Membuat kebijakan akses.

VPC Bersama

Saat menggunakan VPC Bersama, perimeter layanan yang menyertakan project yang termasuk dalam jaringan VPC Bersama juga harus menyertakan project yang menghosting jaringan. Jika project yang termasuk dalam jaringan VPC Bersama tidak berada dalam perimeter yang sama dengan project host, layanan mungkin tidak berfungsi seperti yang diharapkan atau mungkin diblokir sepenuhnya.

Pastikan host jaringan VPC Bersama berada dalam perimeter layanan yang sama dengan project yang terhubung ke jaringan.

Tidak dapat menambahkan jaringan VPC

Error berikut dapat terjadi saat Anda mencoba menambahkan jaringan VPC ke perimeter layanan:

ERROR: (gcloud.access-context-manager.perimeters.update) PERMISSION_DENIED: Permission 'compute.networks.get' denied on resource '//compute.googleapis.com/projects/PROJECT_NAME/global/networks/VPC_NETWORK_NAME' (or it may not exist)

Error ini terjadi karena salah satu alasan berikut:

  • Jaringan VPC tidak ada.
  • Jaringan VPC ada, tetapi tidak memiliki subnet.
  • Pemanggil tidak memiliki izin yang diperlukan.

Untuk mengatasi masalah ini, selesaikan beberapa langkah berikut:

  1. Verifikasi apakah jaringan VPC yang ditentukan dalam pesan error ada dengan melihat jaringan di project Anda.

    • Sebelum memverifikasi jaringan VPC, pastikan Compute Engine API diaktifkan di project yang terkait dengan panggilan API dengan menyelesaikan langkah-langkah berikut:

      1. Di konsol Google Cloud, buka halaman APIs & Services.
        Buka API & Layanan

      2. Di halaman APIs & Services, verifikasi apakah Compute Engine API tercantum.

      3. Jika Compute Engine API tidak ada, aktifkan API.
        Aktifkan API

  2. Pastikan setidaknya ada satu subnet di jaringan VPC dengan melihat subnet. Jika tidak ada subnet, tambahkan subnet ke jaringan VPC.

  3. Periksa apakah pemanggil memiliki izin berikut di project host jaringan VPC: compute.networks.get. Izin ini memungkinkan Anda melihat jaringan VPC dalam project.

    • Minta administrator organisasi yang memiliki project host jaringan VPC untuk memberi pemanggil peran IAM dengan izin compute.networks.get di project host. Misalnya, peran Compute Network Viewer.

      Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Pastikan Anda membaca batasan yang terkait dengan penggunaan jaringan VPC di perimeter layanan.

Permintaan antar-perimeter

Biasanya, tingkat akses digunakan untuk mengizinkan permintaan dari di luar perimeter layanan untuk resource yang dilindungi di dalam perimeter.

Namun, permintaan dari project di perimeter untuk resource yang dilindungi di perimeter lain akan ditolak, meskipun level akses biasanya mengizinkan permintaan tersebut.

Misalnya, asumsikan Project A di Perimeter 1 meminta resource dari Project B. Resource di Project B dilindungi oleh Perimeter 2. Karena Project A berada di perimeter, meskipun tingkat akses untuk Perimeter 2 biasanya mengizinkan permintaan untuk resource yang dilindungi, permintaan akan ditolak.

Gunakan salah satu pendekatan berikut untuk memfasilitasi permintaan antar-perimeter:

  • Gunakan kebijakan traffic keluar dan kebijakan traffic masuk. Untuk mengizinkan permintaan dari perimeter lain ke resource terlindungi di perimeter Anda, perimeter lain harus menggunakan kebijakan keluar dan Anda harus menetapkan kebijakan masuk di perimeter Anda.

  • Gunakan perantara perimeter. Jembatan memungkinkan dua atau beberapa project dalam perimeter yang berbeda untuk membuat permintaan ke layanan apa pun dalam project tersebut. Permintaan ini diizinkan meskipun layanan dilindungi oleh perimeter masing-masing.

  • Pastikan layanan yang meminta dan resource target tidak dilindungi oleh perimeter. Dalam skenario ini, operasi berhasil karena layanan tidak dilindungi.

Alamat email tidak valid atau tidak ada

Saat memperbarui perimeter yang berisi akun utama yang dihapus, Anda mungkin melihat pesan error The email address is invalid or non-existent.

Untuk memperbaiki masalah ini, Anda dapat melakukan salah satu tugas berikut:

  • Hapus alamat email yang tidak valid dari perimeter, yang mencakup tingkat akses serta aturan masuk dan keluar.

    Anda dapat menggunakan konsol Google Cloud atau Google Cloud CLI.

  • Lakukan operasi massal (khusus Google Cloud CLI) jika alamat email ada di keduanya, yaitu Pengujian Coba dan perimeter yang diterapkan.

    1. Mendapatkan semua perimeter Anda:
      gcloud access-context-manager perimeters list --format=list \
       --policy=<POLICY_NAME> > my-perimeters.yaml
    
    1. Hapus alamat email yang tidak valid dari file my-perimeters.yaml dan simpan sebagai my-perimeters-updated.yaml.

    2. Ganti semua perimeter Anda:

      gcloud access-context-manager perimeters replace-all --format=list \
        --source-file=my-perimeters-updated.yaml \
        --policy=<POLICY_NAME>
    

Pelanggaran aturan masuk dan keluar

Log audit berisi informasi tentang pelanggaran aturan traffic masuk dan keluar yang membantu Anda memahami pelanggaran perimeter.

Pelanggaran aturan traffic masuk

Pelanggaran aturan masuk menunjukkan bahwa klien API di luar perimeter mencoba mengakses resource di dalam perimeter. Perimeter layanan menolak permintaan karena tidak ada aturan masuk atau tingkat akses yang cocok.

Pelanggaran aturan masuk di log audit berisi detail berikut:

  • Nama perimeter tempat pelanggaran aturan masuk terjadi.
  • Resource di dalam perimeter yang dicoba diakses oleh klien API di luar perimeter.

Dalam contoh pelanggaran aturan masuk berikut, klien API di luar perimeter mencoba mengakses bucket Cloud Storage prod-protected-storage-bucket di dalam perimeter prod-perimeter.

ingressViolations: [
  0: {
    targetResource: "projects/1234/buckets/prod-protected-storage-bucket"
    servicePerimeter: "accessPolicies/123456789/servicePerimeters/prod-perimeter"
  }
]

Untuk mengatasi masalah ini, buat aturan masuk untuk perimeter Anda. Untuk informasi selengkapnya tentang aturan traffic masuk, lihat Referensi aturan traffic masuk.

Pelanggaran aturan keluar

Pelanggaran aturan keluar di log audit menunjukkan salah satu peristiwa berikut:

  • Klien API di dalam perimeter mencoba mengakses resource di luar perimeter.
  • Permintaan API yang melibatkan resource di dalam perimeter dan resource di luar perimeter. Misalnya, klien Cloud Storage yang memanggil perintah salin dengan satu bucket berada dalam perimeter dan bucket lainnya berada di luar perimeter.

Perimeter layanan menolak permintaan karena tidak ada aturan traffic keluar yang cocok. Pelanggaran aturan keluar di log audit mencakup detail berikut:

  • Jenis sumber seperti jaringan atau resource.
  • Sumber, yang merupakan resource atau jaringan, yang perimenternya mengalami pelanggaran ekspor.
  • Perimeter yang mengalami pelanggaran keluar.
  • Resource target di luar perimeter yang coba diakses oleh permintaan.

Dalam contoh pelanggaran aturan keluar berikut, permintaan API menyertakan resource dari project/5678, yang berada di dalam perimeter prod-perimeter, dan objek dari bucket Cloud Storage external-storage-bucket, yang berada di luar perimeter.

egressViolations: [
  0: {
    sourceType: "Resource"
    source: "projects/5678"
    targetResource: "projects/4321/buckets/external-storage-bucket/objects/corp-resources.json"
    servicePerimeter: "accessPolicies/123456789/servicePerimeters/prod-perimeter"
  }
]

Untuk mengatasi masalah ini, buat aturan keluar untuk perimeter Anda. Untuk informasi selengkapnya tentang aturan traffic keluar, lihat Referensi aturan traffic keluar.

Permintaan proses debug diblokir oleh Kontrol Layanan VPC

Log audit Kontrol Layanan VPC adalah alat utama untuk men-debug permintaan yang diblokir oleh Kontrol Layanan VPC.

Jika akses diblokir secara tidak terduga, lihat log audit di project yang dilindungi oleh perimeter layanan. Log ini berisi data penting tentang resource yang diminta dan alasan permintaan tersebut ditolak. Untuk informasi tentang log audit, lihat Mendiagnosis masalah menggunakan Pemecah Masalah.

Bagian berikut mencantumkan nilai violationReason yang mungkin Anda temui saat menggunakan Kontrol Layanan VPC.

NETWORK_NOT_IN_SAME_SERVICE_PERIMETER

Alasan masalah ini mungkin salah satu dari berikut:

  • Klien di jaringan VPC dalam perimeter layanan mencoba mengakses project yang tidak berada dalam perimeter yang sama. Permintaan ini menyebabkan pelanggaran keluar. Buat aturan egress untuk memperbaiki masalah ini.
  • Klien di jaringan VPC yang berada di luar perimeter layanan mencoba mengakses project yang dilindungi oleh perimeter layanan. Permintaan ini menyebabkan pelanggaran masuk. Buat aturan ingress untuk memperbaiki masalah ini.

Klien dapat mengirim permintaan dari VM Compute Engine atau Google Kubernetes Engine, atau dari jaringan lokal melalui Cloud Interconnect atau VPN yang dikonfigurasi menggunakan jaringan VPC.

Diagram berikut menunjukkan bahwa pelanggaran traffic keluar terjadi saat klien di jaringan VPC dalam perimeter layanan mencoba mengakses project di luar perimeter:

Pelanggaran keluar karena NETWORK_NOT_IN_SAME_SERVICE_PERIMETER.

Berikut adalah contoh pelanggaran keluar:

egressViolations: [
{
  servicePerimeter: "accessPolicies/<POLICY_NAME>/servicePerimeters/<PERIMETER_NAME>"
  source: "projects/<NETWORK_PROJECT_NUMBER>"
  sourceType: "Network"
  targetResource: "projects/<RESOURCE_PROJECT_NUMBER>"
}
]

Dengan keterangan:

  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.
  • <PERIMETER_NAME> adalah nama perimeter layanan.
  • <NETWORK_PROJECT_NUMBER> adalah nomor project project Google Cloud yang menyimpan jaringan VPC Anda.
  • <RESOURCE_PROJECT_NUMBER> adalah nomor project project Google Cloud yang berisi resource.

Diagram berikut menunjukkan bahwa pelanggaran ingress terjadi saat klien di luar perimeter mencoba mengakses project di dalam perimeter:

Pelanggaran ingress karena NETWORK_NOT_IN_SAME_SERVICE_PERIMETER.

Berikut adalah contoh pelanggaran masuk:

ingressViolations: [
{
          targetResource: "projects/<RESOURCE_PROJECT_NUMBER>",
      source: "projects/<NETWORK_PROJECT_NUMBER>"
          servicePerimeter: "accessPolicies/<POLICY_NAME>/servicePerimeters/<PERIMETER_NAME>"
}
]

Dengan keterangan:

  • <RESOURCE_PROJECT_NUMBER> adalah nomor project project Google Cloud yang berisi resource.
  • <NETWORK_PROJECT_NUMBER> adalah nomor project project Google Cloud yang menyimpan jaringan VPC Anda.
  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.
  • <PERIMETER_NAME> adalah nama perimeter layanan.

Resolusi

Untuk mengatasi error ini, buat aturan masuk atau keluar untuk perimeter Anda.

RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER

Masalah ini terjadi saat satu permintaan mengakses beberapa resource, tetapi resource tersebut tidak berada dalam perimeter layanan yang sama. Masalah ini terjadi terlepas dari lokasi klien dan apakah klien memiliki akses ke resource.

Diagram berikut menunjukkan klien yang mengakses resource dari project di luar perimeter dan dari project dalam perimeter layanan:

Pelanggaran keluar karena klien mengakses resource dari project di luar
perimeter.

Diagram berikut menunjukkan klien yang mengakses resource dari project yang berada di dua perimeter layanan yang berbeda, tetapi perimeter tersebut tidak berkomunikasi satu sama lain:

Pelanggaran keluar karena klien mengakses resource dari project yang berada dalam dua perimeter layanan yang berbeda.

Berikut adalah contoh pelanggaran keluar:

egressViolations: [
{
  servicePerimeter: "accessPolicies/<POLICY_NAME>/servicePerimeters/<PERIMETER_NAME>"
  source: "projects/<RESOURCE_PROJECT_INSIDE_THIS_PERIMETER>"
  sourceType: "Resource"
  targetResource: "projects/<RESOURCE_PROJECT_OUTSIDE_THIS-PERIMETER>"
}
]

Dengan keterangan:

  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.
  • <PERIMETER_NAME> adalah nama perimeter layanan.
  • <RESOURCE_PROJECT_INSIDE_THIS_PERIMETER> adalah nomor project project Google Cloud yang berada dalam perimeter.
  • <RESOURCE_PROJECT_OUTSIDE_THIS_PERIMETER> adalah nomor project project Google Cloud yang berada di luar perimeter.

Resolusi

Untuk mengatasi masalah ini, buat aturan keluar untuk perimeter Anda.

NO_MATCHING_ACCESS_LEVEL

Masalah ini terjadi jika alamat IP, persyaratan perangkat, atau identitas pengguna tidak cocok dengan aturan masuk atau tingkat akses yang ditetapkan ke perimeter. Hal ini berarti bahwa klien yang bukan bagian dari jaringan Google Cloud mencoba mengakses resource jaringan Google Cloud dari luar perimeter. Misalnya, alamat IP yang sesuai dengan kolom callerIp data audit tidak cocok dengan rentang CIDR yang ditentukan dalam tingkat akses untuk perimeter layanan.

Jika alamat IP pemanggil tidak ada atau muncul sebagai alamat IP internal, pelanggaran ini mungkin disebabkan oleh layanan Google Cloud yang tidak terintegrasi dengan Kontrol Layanan VPC. Alasannya mungkin karena layanan Google Cloud mencoba mengakses layanan yang dilindungi dan gagal, seperti yang diharapkan.

Untuk memperbaiki masalah ini, sebaiknya buat aturan ingress, bukan tingkat akses, karena aturan ingress memberikan kontrol akses terperinci.

Diagram berikut menunjukkan klien yang mencoba mengakses resource dari luar perimeter:

Pelanggaran ingress karena NO_MATCHING_ACCESS_LEVEL.

Berikut adalah contoh pelanggaran masuk:

authenticationInfo: {
  principalEmail: "EMAIL"
}
requestMetadata: {
callerIp: "<PUBLIC_IP_ADDRESS>"
deviceState: "Cross Organization"
}
ingressViolations: [
        {
          targetResource: "projects/<RESOURCE_PROJECT_NUMBER>",
          servicePerimeter: "accessPolicies/<POLICY_NAME>/servicePerimeters/<PERIMETER-NAME>"
        }
  ]

Dengan keterangan:

  • <EMAIL> adalah alamat email akun layanan atau pengguna yang diautentikasi.

    Jika Anda menggunakan layanan Google Cloud yang tidak didukung oleh Kontrol Layanan VPC, alamat email yang merupakan bagian dari domain google.com akan disamarkan dan diganti dengan google-internal. google-internal mengacu pada identitas internal milik Google.

  • <PUBLIC_IP_ADDRESS> adalah alamat IP pemanggil. Untuk pemanggil dari internet, ini akan menjadi alamat IPv4 atau IPv6 publik.

  • <RESOURCE_PROJECT_NUMBER> adalah nomor project project Google Cloud yang berisi resource.

  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.

  • <PERIMETER_NAME> adalah nama perimeter layanan.

Perhatikan bahwa dalam hal ini, metadata.accessLevels masih dapat ada karena level akses ini mungkin tidak ditentukan dalam perimeter yang dilanggar.

SERVICE_NOT_ALLOWED_FROM_VPC

Masalah ini terjadi saat klien mencoba mengakses resource Google Cloud dari jaringan VPC. Klien dapat mengirim permintaan dari VM Compute Engine atau Google Kubernetes Engine, atau dari jaringan lokal melalui Cloud Interconnect atau VPN yang dikonfigurasi menggunakan jaringan VPC.

Untuk memperbaiki masalah ini, pastikan layanan yang dipanggil diizinkan oleh konfigurasi layanan yang dapat diakses VPC dari perimeter layanan.

Contoh skenario

Contoh berikut membahas masalah yang mungkin Anda alami saat menggunakan Kontrol Layanan VPC.

Akses Cloud Storage dari lokal

Dalam contoh ini, Kontrol Layanan VPC memblokir permintaan dari workstation karyawan (diidentifikasi oleh callerIp) ke bucket Cloud Storage dalam project corp-storage.

Permintaan ini menghasilkan catatan log audit berikut:

{
 insertId:  "222lvajc6f7"
 logName:  "projects/corp-storage/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "someone@google.com"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/_"
   ]
   violationReason:  "NO_MATCHING_ACCESS_LEVEL"
  }
  methodName:  "google.storage.NoBillingOk"
  requestMetadata: {
   callerIp:  "b1d5:d26d:5b17:43fe:d358:586b:db59:9617"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/690885588241"
  serviceName:  "storage.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-27T21:40:43.823209571Z"
 resource: {
  labels: {
   method:  "google.storage.NoBillingOk"
   project_id:  "corp-storage"
   service:  "storage.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-27T21:40:42.973784140Z"
}

Project corp-storage disertakan dalam perimeter layanan. Workstation karyawan bukan bagian dari jaringan apa pun dalam perimeter tersebut. Karena workstation karyawan berada di luar perimeter, permintaan akan diblokir.

Akses BigQuery dari VM di luar project

Dalam contoh ini, VM yang termasuk dalam project 458854174376 (data-collector) mencoba menjalankan kueri BigQuery terhadap set data di project 798816221974 (corp-resources-protected) dan ditolak.

VM menggunakan kueri berikut:

bq --project=corp-resources-protected query 'select count(*) from babynames.yob2000'

Kueri menampilkan output berikut:

BigQuery error in query operation: VPC Service Controls: Request is
prohibited by organization's policy. Operation ID:
33643962-6a0f-4091-9283-bcdf7e9271f0

Data log audit berikut akan dibuat:

{
 insertId:  "1ei551d2pdq"
 logName:  "projects/corp-resources-protected/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "714877721106-compute@developer.gserviceaccount.com"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/1004338142803"
   ]
   violationReason:  "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "bigquery.googleapis.com/bigquery.jobs.create"
  requestMetadata: {
   callerIp:  "10.105.0.2"
   callerNetwork:  "//compute.googleapis.com/projects/ameet-dataflow/global/networks/__unknown__"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/1004338142803"
  serviceName:  "bigquery.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-28T23:06:13.579882505Z"
 resource: {
  labels: {
   method:  "bigquery.googleapis.com/bigquery.jobs.create"
   project_id:  "corp-resources-protected"
   service:  "bigquery.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-28T23:06:12.799656975Z"
}

Dalam contoh ini, violationReason adalah NETWORK_NOT_IN_SAME_SERVICE_PERIMETER. callerNetwork disertakan selain callerIp. Alamat IP bersifat pribadi dan jaringan disediakan untuk membedakan alamat tersebut. Resource relevan yang dipermasalahkan di sini tercantum di dua tempat: VpcServiceControlAuditMetadata.resourceNames dan requestMetadata.callerNetwork (project yang memiliki jaringan).

Masalahnya adalah project corp-resources-protected berada di dalam perimeter layanan, sedangkan data-collector, project yang menyertakan jaringan tempat VM berada, tidak. Dalam hal ini, akses akan ditolak seperti yang diharapkan.

Kueri BigQuery lintas project

Dalam contoh ini, VM yang termasuk dalam project perimeter-network mencoba membuat kueri instance BigQuery dari dua project yang berbeda: corp-resources-protected, yang berada dalam perimeter layanan yang sama dengan perimeter-network, dan corp-resources-public, yang tidak.

VM menggunakan perintah berikut:

bq query --use_legacy_sql=false \
  'select count(priv.name),count(pub.name) from \
  `corp-resources-protected.babynames.yob2000` as priv, \
  `corp-resources-public.babynames.yob2000` as pub'

Kueri menampilkan output berikut:

BigQuery error in query operation: Error processing job
'example:bqjob_r211e6f6eec928ffb_000001675c996aa8_1': VPC Service Controls:
Request is prohibited by organization's policy. Operation ID:
dc4fc177-4850-4fc5-b2e7-8c33f302149a

Data log audit berikut akan dibuat:

{
 insertId:  "17kg4exd24ag"
 logName:  "projects/perimeter-network/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/117961063178"
    1:  "projects/690885588241"
   ]
   violationReason:  "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "bigquery.googleapis.com/bigquery.tables.getData"
  requestMetadata: {
   callerIp:  "130.211.225.66"
   callerNetwork:  "//compute.googleapis.com/projects/perimeter-network/global/networks/__unknown__"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/927005422713"
  serviceName:  "bigquery.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-28T20:48:51.384237810Z"
 resource: {
  labels: {
   method:  "bigquery.googleapis.com/bigquery.tables.getData"
   project_id:  "perimeter-network"
   service:  "bigquery.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-28T20:48:50.561884949Z"
}

Melihat callerNetwork dan VpcServiceControlAuditMetadata.resourceNames, kita dapat melihat tiga project: perimeter-network, 117961063178 (corp-resources-public), dan 690885588241 (corp-resources-protected). Ingat bahwa corp-resources-public tidak berada di perimeter layanan yang sama dengan perimeter-network dan corp-resources-protected.

violationReason, RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER menunjukkan bahwa beberapa resource dalam permintaan berada di luar perimeter yang berlaku untuk permintaan. Dalam hal ini, resource tersebut adalah corp-resources-public.

Memindahkan file Cloud Storage di dalam perimeter

Dalam contoh ini, VM di project perimeter-network menggunakan perintah untuk memindahkan file dari satu bucket Cloud Storage, yang terletak di project corp-resources-protected, ke bucket lain, yang terletak di project corp-resources-public.

VM menggunakan perintah berikut:

gcloud storage mv gs://corp-resources-private-1/yob2000.txt gs://corp-resources-public-1/babynames/

Perintah ini menampilkan output berikut:

Copying gs://corp-resources-private-1/yob2000.txt [Content-Type=text/plain]...
AccessDeniedException: 403 Request violates VPC Service Controls.

Data log audit berikut akan dibuat:

{
 insertId:  "1xxnssmd2hqo"
 logName:  "projects/perimeter-network/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "storage-accessing@example.iam.gserviceaccount.com"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/_/buckets/corp-resources-public-1"
   ]
   violationReason:  "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "google.storage.BillingRequiredRead"
  requestMetadata: {
   callerIp:  "130.211.225.66"
   callerNetwork:  "//compute.googleapis.com/projects/perimeter-network/global/networks/__unknown__"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/927005422713"
  serviceName:  "storage.googleapis.com"
  status: {}
 }
 receiveTimestamp:  "2018-11-28T00:45:31.531623485Z"
 resource: {
  labels: {
   method:  "google.storage.BillingRequiredRead"
   project_id:  "perimeter-network"
   service:  "storage.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-28T00:45:31.351140381Z"
}

Dalam hal ini, log kurang jelas karena metode yang tercantum adalah BillingRequiredRead dan tindakan yang diambil adalah move. Hal ini merupakan batasan fungsi log audit Kontrol Layanan VPC saat ini.

Meskipun alasannya kurang jelas, data log audit ini menunjukkan bahwa beberapa resource dalam permintaan berada di luar perimeter yang berlaku untuk permintaan. Dalam hal ini, resource tersebut adalah corp-resources-public.

Memindahkan file Cloud Storage ke luar perimeter

Dalam contoh ini, VM di project public-network menggunakan perintah untuk memindahkan file dari satu bucket Cloud Storage, yang terletak di project corp-resources-protected, ke bucket lain, yang terletak di project corp-resources-public.

Project corp-resources-protected dilindungi oleh perimeter layanan. Project public-network dan corp-resources-public berada di luar perimeter.

VM menggunakan perintah berikut:

gcloud storage mv gs://corp-resources-private-1/yob2000.txt gs://corp-resources-public-1/babynames/

Perintah ini menampilkan output berikut:

Copying gs://corp-resources-private-1/yob2000.txt [Content-Type=text/plain]...
AccessDeniedException: 403 Request violates VPC Service Controls.

Data log audit berikut akan dibuat:

{
 insertId:  "10moqhsch9v"
 logName:  "projects/corp-resources-private/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "user@example.biz"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/_/buckets/corp-resources-private-1/objects/yob2000.txt"
    1:  "projects/_/buckets/corp-resources-public-1/objects/out.txt"
   ]
   violationReason:  "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "google.storage.Write"
  requestMetadata: {
   callerIp:  "2620:15c:2c4:203:63d6:5eb8:418d:c034"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/1004338142803"
  serviceName:  "storage.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-30T16:34:46.948010626Z"
 resource: {
  labels: {
   method:  "google.storage.Write"
   project_id:  "corp-resources-private"
   service:  "storage.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-30T16:34:46.898098978Z"
}

Dalam contoh ini, log audit menunjukkan bahwa seseorang tidak dapat menyalin data di seluruh batas perimeter layanan (kedua resource ada dalam data log audit). Ingat bahwa permintaan berasal dari luar perimeter (VM di public-network), dan salah satu bucket berada di luar perimeter (corp-resources-public-1).

Dari luar perimeter, seseorang dapat menulis ke bucket corp-resources-public-1, sehingga pemeriksaan yang gagal di contoh sebelumnya akan lulus. Namun, pemeriksaan berikutnya untuk benar-benar menyalin data gagal.

Contoh ini menunjukkan bagaimana terkadang satu operasi pengguna menghasilkan beberapa operasi internal yang harus lulus penerapan Kontrol Layanan VPC.

Salinan set data BigQuery dari VM di dalam perimeter

Dalam contoh ini, VM di project 927005422713 (perimeter-network) mencoba menyalin set data BigQuery dari project corp-resources-private ke corp-resources-public (117961063178). perimeter-network dan corp-resources-private memiliki perimeter yang sama, sedangkan corp-resources-public berada di luar perimeter.

VM menggunakan perintah berikut:

bq cp corp-resources-private:babynames.yob2000 \
  corp-resources-public:babynames.yob2000

Perintah ini menampilkan output berikut:

BigQuery error in cp operation: VPC Service Controls: Request is prohibited by
organization's policy. Operation ID: c00dbc44-460f-4bd0-9d09-cda98ac800f9

Data log audit berikut akan dibuat:

{
 insertId:  "146o5fd2hbp"
 logName:  "projects/perimeter-network/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/117961063178"
   ]
   violationReason:  "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "bigquery.googleapis.com/bigquery.tables.get"
  requestMetadata: {
   callerIp:  "131.201.221.16"
   callerNetwork:  "//compute.googleapis.com/projects/perimeter-network/global/networks/__unknown__"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/927005422713"
  serviceName:  "bigquery.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-28T00:27:05.688803777Z"
 resource: {
  labels: {
   method:  "bigquery.googleapis.com/bigquery.tables.get"
   project_id:  "perimeter-network"
   service:  "bigquery.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-28T00:27:05.378584819Z"
}

Dalam contoh ini, tidak ada satu tindakan API dasar yang menunjukkan semua resource yang digunakan dalam permintaan ini karena batasan mekanisme logging dan arsitektur BigQuery yang terdistribusi.

Data log audit menunjukkan bahwa operasi gagal karena untuk menyalin data, BigQuery harus mengakses project target (corp-resources-public) menggunakan jaringan di project perimeter-network (sumber permintaan). Ingat bahwa corp-resources-public berada di luar perimeter yang melindungi perimeter-network. Permintaan ditolak sebagai upaya untuk mengeksfiltrasi data ke corp-resources-public.

Contoh ini mengilustrasikan bahwa satu operasi konseptual, seperti menyalin data, dapat memicu beberapa upaya untuk mengakses data dari berbagai sistem penyimpanan, seperti Cloud Storage, BigQuery, dan Bigtable. Berdasarkan cara operasi dijalankan, catatan log audit yang dihasilkan berbeda dengan perintah pengguna asli. Selain itu, saat beberapa pemeriksaan dalam layanan tertentu dilakukan dan berpotensi gagal, catatan log audit yang dihasilkan akan terlihat berbeda dari perintah pengguna asli.

Pembacaan tugas Dataproc dari project

Contoh ini menunjukkan cara men-debug error Kontrol Layanan VPC tidak langsung yang terjadi saat menggunakan layanan pemrosesan data seperti Dataproc.

Dalam contoh ini, cluster Dataproc berjalan di project yang dilindungi oleh Kontrol Layanan VPC. Hello-world.py adalah tugas pyspark yang mencoba mengakses data dari bucket Cloud Storage di dalam perimeter, lalu menulisnya ke bucket lain yang ada di luar perimeter. Kontrol Layanan VPC memblokir operasi yang menulis data ke bucket di luar perimeter.

Perintah berikut digunakan untuk menjalankan Hello-world.py:

gcloud dataproc jobs submit pyspark hello-world.py --cluster test-cluster-new2

Perintah ini menampilkan output berikut:

Job [50f16ca8-5102-442b-a545-eed5e4f5f5da] submitted.
Waiting for job output...
18/11/29 00:31:34 INFO org.spark_project.jetty.util.log: Logging initialized @2552ms
18/11/29 00:31:34 INFO org.spark_project.jetty.server.Server: jetty-9.3.z-SNAPSHOT
18/11/29 00:31:34 INFO org.spark_project.jetty.server.Server: Started @2640ms
18/11/29 00:31:34 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@1f1c18ec{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}
18/11/29 00:31:34 INFO com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase: GHFS version: 1.6.4-hadoop2
18/11/29 00:31:35 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at test-cluster-new2-m/10.246.0.3:8032
18/11/29 00:31:37 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1522454176466_0005
Traceback (most recent call last):
  File "/tmp/50f16ca8-5102-442b-a545-eed5e4f5f5da/hello-world.py", line 8, in <module>
    lear.saveAsTextFile("gs://corp-resources-public-1/out.txt")
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/rdd.py", line 1553, in saveAsTextFile
  File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
  File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o49.saveAsTextFile.
: java.io.IOException: Error accessing: bucket: corp-resources-public-1, object: out.txt
    at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.wrapException(GoogleCloudStorageImpl.java:1767)
$sp(PairRDDFunctions.scala:961)

 (truncated)

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Request violates VPC Service Controls.",
    "reason" : "vpcServiceControls"
  } ],
  "message" : "Request violates VPC Service Controls."
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)

 (truncated)

18/11/29 00:31:43 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@1f1c18ec{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}
ERROR: (gcloud.dataproc.jobs.submit.pyspark) Job [50f16ca8-5102-442b-a545-eed5e4f5f5da] entered state [ERROR] while waiting for [DONE].

Perhatikan pengecualian IO yang terjadi saat metode saveAsTextFile dipanggil. Cloud Storage menampilkan error 403 dengan pesan Request violates VPC Service Controls. Error ini menunjukkan bahwa operasi log audit Cloud Storage harus ditinjau.

Dalam log audit untuk project perimeter-network, tempat perintah dijalankan, ada data log audit untuk operasi saveAsTextFile:

{
 insertId:  "qdj1o9d1run"
 logName:  "projects/corp-resources-private/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "1004338142803-compute@developer.gserviceaccount.com"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/_/buckets/corp-resources-public-1/objects/out.txt"
   ]
   violationReason:  "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "google.storage.BillingRequiredRead"
  requestMetadata: {
   callerIp:  "10.246.0.3"
   callerNetwork:  "//compute.googleapis.com/projects/corp-resources-private/global/networks/__unknown__"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/1004338142803"
  serviceName:  "storage.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-29T00:31:43.666227930Z"
 resource: {
  labels: {
   method:  "google.storage.BillingRequiredRead"
   project_id:  "corp-resources-private"
   service:  "storage.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-29T00:31:43.608250320Z"
}

Karena batasan log audit, methodName untuk Cloud Storage tercantum sebagai Read meskipun sebenarnya merupakan operasi write. Data log audit menunjukkan bahwa operasi gagal karena jaringan di project corp-resources-private mencoba mengakses data (penulisan, dalam hal ini) resource di bucket corp-resources-public-1. Karena keterbatasan log audit Cloud Storage, tidak jelas bucket project mana yang menjadi milik corp-resources-public-1.

Untuk mengidentifikasi project yang berisi corp-resources-public-1, gunakan perintah berikut:

gcloud storage ls gs://corp-resources-public-1 --buckets --log-http 2>&1 | grep projectNumber

Perintah ini menampilkan output berikut: "projectNumber": "117961063178",

117961063178 adalah project corp-resources-public, yang berada di luar perimeter. Oleh karena itu, kegagalan ini sudah diperkirakan.

Error karena layanan tidak didukung

Beberapa layanan Google Cloud bergantung pada layanan Google Cloud lainnya sebagai bagian dari penerapannya. Jika layanan yang tidak didukung seperti App Engine digunakan di dalam project yang dilindungi oleh perimeter, resource layanan tersebut mungkin tidak dapat diakses.

Untuk mengetahui informasi tentang kasus bermasalah yang diketahui, lihat Batasan layanan yang diketahui.

Layanan yang tidak didukung dengan VIP yang dibatasi

Mencoba mengakses API yang tidak didukung oleh VIP yang dibatasi Kontrol Layanan VPC akan menyebabkan error 403. Misalnya, Kontrol Layanan VPC tidak mendukung App Engine, sehingga App Engine Admin API tidak tersedia saat menggunakan VIP yang dibatasi.

Misalnya, perintah berikut digunakan untuk mencantumkan semua layanan App Engine dalam perimeter layanan:

gcloud app services list

Perintah ini menampilkan output berikut:

ERROR: (gcloud.app.services.list) User [***] does not have permission to access apps instance [***] (or it may not exist): <!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 403 (Forbidden)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){ #logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){ #logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>403.</b> <ins>That's an error.</ins>
  <p>Your client does not have permission to get URL <code>/v1/apps/***/services</code> from this server.  <ins>That's all we know.</ins>

Jenis error ini sudah diperhitungkan untuk layanan yang tidak didukung oleh Kontrol Layanan VPC dan tidak tersedia di VIP yang dibatasi. Jika error ini terjadi untuk layanan yang didukung oleh Kontrol Layanan VPC, sebaiknya Anda memeriksa batasan layanan yang diketahui untuk layanan tersebut guna melihat apakah ini adalah batasan yang diketahui. Jika tidak, masalah tersebut harus dilaporkan.

Mengekspor log ke project di luar perimeter

Dalam contoh ini, ekspor log diblokir oleh Kontrol Layanan VPC. Tujuan ekspor, project corp-resources-public, berada di luar perimeter Kontrol Layanan VPC, sedangkan sink dibuat di project perimeter-network, yang berada di dalam perimeter.

Misalnya, perintah berikut digunakan:

gcloud logging sinks describe example-sink

Perintah ini menampilkan output berikut:

destination: bigquery.googleapis.com/projects/corp-resources-public/datasets/logs
filter: |-
  resource.type="audited_resource"
  resource.labels.service="bigquery.googleapis.com"
name: example-sink
outputVersionFormat: V2
writerIdentity: serviceAccount:p927005422713-439672@gcp-sa-logging.iam.gserviceaccount.com

Data log audit berikut akan dibuat:

{
 insertId:  "e5i2i8cbqw"
 logName:  "projects/perimeter-network/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "p927005422713-439672@gcp-sa-logging.iam.gserviceaccount.com"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "corp-resources-public"
   ]
   violationReason:  "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "google.cloud.bigquery.v2.TableDataService.InsertAll"
  requestMetadata: {
   callerIp:  "2002:a49:8c51::"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/927005422713"
  serviceName:  "bigquery.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-11-29T17:32:19.287138882Z"
 resource: {
  labels: {
   method:  "google.cloud.bigquery.v2.TableDataService.InsertAll"
   project_id:  "perimeter-network"
   service:  "bigquery.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-11-29T17:32:19.054662413Z"
}

Data log audit dibuat untuk BigQuery, bukan untuk Logging. Hal ini karena BigQuery adalah layanan sink yang dicoba ditulis oleh Logging.

Ekspor gagal karena corp-resources-public ada di luar perimeter yang melindungi perimeter-network.

Contoh ini menunjukkan bahwa untuk kasus saat satu layanan Google Cloud memanggil layanan lainnya menggunakan akun layanan terkelola yang bersifat internal untuk Google Cloud, seperti p927005422713-439672@gcp-sa-logging.iam.gserviceaccount.com, "project jaringan" (dalam hal ini, perimeter-network) dari permintaan berasal dari identitas tersebut. Identitas yang sama mewakili resource ekspor log itu sendiri.

Pola ini umum di Google Cloud dan berlaku untuk banyak kasus interaksi layanan ke layanan.

Ekstrak BigQuery ke Cloud Storage

Contoh ini menjelaskan cara men-debug ekstraksi BigQuery yang gagal ke Cloud Storage.

Dalam contoh ini, corp-resources-private dan perimeter-network adalah project yang dilindungi oleh perimeter layanan. corp-resources-public adalah project yang ada di luar perimeter.

Misalkan perintah berikut digunakan:

bq extract babynames.yob2000

Perintah ini menampilkan output berikut:

gs://corp-resources-public-1/export.txt
Waiting on bqjob_r47ee34109d02b41_000001676b27157c_1 ... (1s) Current status: DONE
BigQuery error in extract operation: Error processing job 'corp-resources-private:bqjob_r47ee34109d02b41_000001676b27157c_1': Access
Denied: BigQuery BigQuery: Permission denied while writing data.

Dalam hal ini, error tidak secara khusus melibatkan Kontrol Layanan VPC. Error serupa akan ditampilkan jika terjadi kegagalan Identity and Access Management.

Data log audit berikut akan dibuat:

{
 insertId:  "4gbh6pe8jld7"
 logName:  "projects/corp-resources-private/logs/cloudaudit.googleapis.com%2Fdata_access"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "storage-accessing@example.iam.gserviceaccount.com"
  }
  methodName:  "jobservice.jobcompleted"
  requestMetadata: {
   callerIp:  "10.5.0.4"
   callerNetwork:  "//compute.googleapis.com/projects/perimeter-network/global/networks/__unknown__"
   callerSuppliedUserAgent:  "google-api-python-client/1.6.5 (gzip),gzip(gfe)"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/corp-resources-private/jobs/bqjob_r47ee34109d02b41_000001676b27157c_1"
  serviceData: {
   @type:  "type.googleapis.com/google.cloud.bigquery.logging.v1.AuditData"
   jobCompletedEvent: {
    eventName:  "extract_job_completed"
    job: {
     jobConfiguration: {
      extract: {
       destinationUris: [
        0:  "gs://corp-resources-public-1/export.txt"
       ]
       sourceTable: {
        datasetId:  "babynames"
        projectId:  "corp-resources-private"
        tableId:  "yob2000"
       }
      }
     }
     jobName: {
      jobId:  "bqjob_r47ee34109d02b41_000001676b27157c_1"
      location:  "US"
      projectId:  "corp-resources-private"
     }
     jobStatistics: {
      createTime:  "2018-12-01T19:03:03.908Z"
      endTime:  "2018-12-01T19:03:05.494Z"
      startTime:  "2018-12-01T19:03:04.013Z"
     }
     jobStatus: {
      additionalErrors: [
       0: {
        code:  7
        message:  "Access Denied: BigQuery BigQuery: Permission denied while writing data."
       }
      ]
      error: {
       code:  7
       message:  "Access Denied: BigQuery BigQuery: Permission denied while writing data."
      }
      state:  "DONE"
     }
    }
   }
  }
  serviceName:  "bigquery.googleapis.com"
  status: {
   code:  7
   message:  "Access Denied: BigQuery BigQuery: Permission denied while writing data."
  }
 }
 receiveTimestamp:  "2018-12-01T19:03:05.532169998Z"
 resource: {
  labels: {
   project_id:  "corp-resources-private"
  }
  type:  "bigquery_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-12-01T19:03:05.503Z"
}

Dalam catatan log audit ini, storage-accessing@example.iam.gserviceaccount.com diidentifikasi sebagai identitas yang mencoba menjalankan operasi. Dalam contoh ini, asumsikan bahwa storage-accessing@example.iam.gserviceaccount.com memiliki izin IAM yang diperlukan untuk mengeksekusi perintah.

Karena izin IAM bukan masalahnya, langkah berikutnya adalah memeriksa kegagalan Kontrol Layanan VPC.

Data log audit untuk layanan tujuan (Cloud Storage) berisi alasan mendetail untuk kegagalan tersebut:

{
 insertId:  "1bq397kcfj1"
 logName:  "projects/corp-resources-private/logs/cloudaudit.googleapis.com%2Fpolicy"
 protoPayload: {
  @type:  "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {
   principalEmail:  "storage-accessing@example.iam.gserviceaccount.com"
  }
  metadata: {
   @type:  "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
   resourceNames: [
    0:  "projects/1004338142803"
    1:  "projects/_/buckets/corp-resources-public-1"
   ]
   violationReason:  "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
  }
  methodName:  "google.storage.BillingRequiredRead"
  requestMetadata: {
   callerIp:  "10.5.0.4"
   callerNetwork:  "//compute.googleapis.com/projects/perimeter-network/global/networks/__unknown__"
   destinationAttributes: {
   }
   requestAttributes: {
   }
  }
  resourceName:  "projects/1004338142803"
  serviceName:  "storage.googleapis.com"
  status: {
   code:  7
   details: [
    0: {
     @type:  "type.googleapis.com/google.rpc.PreconditionFailure"
     violations: [
      0: {
       type:  "VPC_SERVICE_CONTROLS"
      }
     ]
    }
   ]
   message:  "Request is prohibited by organization's policy"
  }
 }
 receiveTimestamp:  "2018-12-01T19:03:05.617451586Z"
 resource: {
  labels: {
   method:  "google.storage.BillingRequiredRead"
   project_id:  "corp-resources-private"
   service:  "storage.googleapis.com"
  }
  type:  "audited_resource"
 }
 severity:  "ERROR"
 timestamp:  "2018-12-01T19:03:05.420005215Z"
}

Dari log ini, jelas bahwa kedua project 1004338142803 (corp-resources-private-1) dan corp-resources-public digunakan untuk menyelesaikan perintah. Karena project tersebut tidak memiliki perimeter yang sama, tugas ekstrak akan gagal.

Contoh ini mengilustrasikan bahwa dalam operasi multi-layanan yang kompleks, log audit untuk layanan sumber dan tujuan mungkin berisi data proses debug yang berguna.

Akses perimeter melalui gateway Cloud NAT

Dalam contoh ini, asumsikan bahwa project A dari Org A tidak dikonfigurasi dalam perimeter apa pun. Project B diamankan oleh perimeter di organisasi lain. Resource pribadi di project A menggunakan gateway Cloud NAT untuk menjangkau internet serta Google API dan layanan. Tingkat akses dikonfigurasi di project B untuk mengizinkan akses berdasarkan alamat IP gateway eksternal project A.

VM yang termasuk dalam project A (yang dapat berupa node Google Kubernetes Engine) mencoba mengakses resource yang dilindungi di project B, tetapi koneksinya gagal, dan data log audit berikut dibuat di project B:

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 7,
      "message": "Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: kmpY9Fgfuhgi2NE90lURjFWuiS1nGRqxCw4L12HdW8h46Un__-_LZw",
      "details": [
        {
          "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
          "violations": [
            {
              "type": "VPC_SERVICE_CONTROLS",
              "description": "kmpY9Fgfuhgi2NE90lURjFWuiS1nGRqxCw4L12HdW8h46Un__-_LZw"
            }
          ]
        }
      ]
    },
    "authenticationInfo": {
      "principalEmail": "my-user@example.iam.gserviceaccount.com",
      "serviceAccountKeyName": "//iam.googleapis.com/projects/my-project/serviceAccounts/my-user@example.iam.gserviceaccount.com/keys/<code><var>ACCOUNT_KEY</var></code>"
    },
    "requestMetadata": {
      "callerIp": "gce-internal-ip",
      "requestAttributes": {},
      "destinationAttributes": {}
    },
    "serviceName": "cloudfunctions.googleapis.com",
    "methodName": "google.cloud.functions.v1.CloudFunctionsService.ListFunctions",
    "resourceName": "<code><var>PROJECT_ID_1</var></code>",
    "metadata": {
      "violationReason": "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER",
      "resourceNames": [
        "projects/<code><var>PROJECT_ID_2</var></code>/locations/-"
      ],
      "securityPolicyInfo": {
        "servicePerimeterName": "accessPolicies/<code><var>ACCESS_POLICY</var></code>/servicePerimeters/us_sandbox",
        "organizationId": "<code><var>ORGANIZATION_ID</var></code>"
      },
      "deviceState": "Unknown",
      "vpcServiceControlsUniqueId": "kmpY9Fgfuhgi2NE90lURjFWuiS1nGRqxCw4L12HdW8h46Un__-_LZw",
      "ingressViolations": [
        {
          "targetResource": "projects/<code><var>PROJECT_ID_1</var></code>",
          "servicePerimeter": "accessPolicies/<code><var>ACCESS_POLICY</var></code>/servicePerimeters/<code><var>PERIMETER_NAME</var></code>",
          "source": "<code><var>PROJECT_ID_2</var></code>"
        }
      ],
      "@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
    }
  },
  "insertId": "tzf7fd103i",
  "resource": {
    "type": "audited_resource",
    "labels": {
      "service": "cloudfunctions.googleapis.com",
      "method": "google.cloud.functions.v1.CloudFunctionsService.ListFunctions",
      "project_id": "<code><var>PROJECT_ID_2</var></code>"
    }
  },
  "timestamp": "2024-04-02T19:56:10.770681816Z",
  "severity": "ERROR",
  "logName": "projects/<code><var>PROJECT_ID_2</var></code>/logs/cloudaudit.googleapis.com%2Fpolicy",
  "receiveTimestamp": "2024-04-02T19:56:11.463811603Z"
}

Resource callerIp tidak mencatat alamat IP eksternal. Resource callerIp menampilkan gce-internal-ip, bukan alamat IP eksternal gateway Cloud NAT.

Kolom callerIp disamarkan menjadi gce-internal-ip saat permintaan berasal dari project atau organisasi lain dan VM Compute Engine sumber tidak memiliki alamat IP eksternal.

Cloud NAT memiliki integrasi dengan Akses Google Pribadi yang otomatis mengaktifkan Akses Google Pribadi di subnet resource, dan membuat traffic ke API dan layanan Google tetap bersifat internal, bukan merutekannya ke internet menggunakan alamat IP eksternal gateway Cloud NAT.

Dalam hal ini, saat traffic dirutekan dalam jaringan Google internal, kolom RequestMetadata.caller_ip dari objek AuditLog akan disamarkan menjadi gce-internal-ip. Untuk memperbaikinya, konfigurasikan aturan masuk untuk mengizinkan dari project atau akun layanan, bukan menggunakan alamat IP eksternal gateway Cloud NAT di tingkat akses untuk daftar yang diizinkan berbasis IP.

Langkah selanjutnya