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 yang tercakup. Jika Anda tidak memiliki kebijakan akses tingkat organisasi, Anda mungkin mengalami beberapa masalah tak terduga dengan kebijakan akses yang tercakup.

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 mencakup project yang termasuk dalam jaringan VPC Bersama juga harus mencakup project yang menghosting jaringan. Jika project yang termasuk dalam jaringan VPC Bersama tidak berada di perimeter yang sama dengan project host, layanan mungkin tidak berfungsi seperti yang diharapkan atau mungkin diblokir sepenuhnya.

Pastikan host jaringan VPC Bersama berada di 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 APIs & Services

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

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

  2. Verifikasi apakah 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 pada 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 memberikan peran IAM dengan izin compute.networks.get kepada pemanggil 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 dalam perimeter layanan.

Permintaan antar-perimeter

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

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

Misalnya, anggap Project A di Perimeter 1 meminta resource dari Project B. Resource di Project B dilindungi oleh Perimeter 2. Karena Project A berada di dalam perimeter, meskipun tingkat akses untuk Perimeter 2 biasanya mengizinkan permintaan untuk resource yang dilindungi, permintaan tersebut 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.

  • Menggunakan perantara perimeter. Jembatan memungkinkan dua project atau lebih dalam perimeter yang berbeda 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 mengalami error The email address is invalid or non-existent.

Untuk memperbaiki masalah ini, Anda harus menghapus alamat email tidak valid dari semua perimeter:

  1. Mengekspor semua perimeter Anda. Contoh perintah berikut mengekspor daftar perimeter layanan dalam format YAML:

    gcloud access-context-manager perimeters list \
        --policy=POLICY_NAME \
        --format="json(name,title,description,perimeterType,status,spec,useExplicitDryRunSpec)" \
        > my-perimeters.yaml
  2. Hapus alamat email tidak valid dari file my-perimeters.yaml dan simpan sebagai my-perimeters-updated.yaml.

  3. Mengganti semua perimeter Anda secara massal.

Pelanggaran aturan masuk dan keluar

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

Pelanggaran aturan 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 ingress atau tingkat akses yang cocok.

Pelanggaran aturan ingress dalam log audit berisi detail berikut:

  • Nama perimeter tempat pelanggaran aturan masuk terjadi.
  • Resource di dalam perimeter yang coba 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 ingress untuk perimeter Anda. Untuk mengetahui 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 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 perimeternya mengalami pelanggaran keluar.
  • Perimeter yang mengalami pelanggaran keluar.
  • Target resource di luar perimeter yang coba diakses oleh permintaan.

Dalam contoh pelanggaran aturan traffic keluar berikut, permintaan API menyertakan resource dari projects/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 mengetahui informasi selengkapnya tentang aturan traffic keluar, lihat Referensi aturan traffic keluar.

Men-debug permintaan yang 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 ditolak. Untuk informasi tentang cara mendiagnosis log audit, lihat Mengakses penganalisis pelanggaran.

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 ini:

  • Klien dalam jaringan VPC di 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 dalam jaringan VPC yang berada di luar perimeter layanan mencoba mengakses project yang dilindungi oleh perimeter layanan. Permintaan ini menyebabkan pelanggaran ingress. 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:

  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.
  • <PERIMETER_NAME> adalah nama perimeter layanan.
  • <NETWORK_PROJECT_NUMBER> adalah nomor project Google Cloud project yang menyimpan jaringan VPC Anda.
  • <RESOURCE_PROJECT_NUMBER> adalah nomor 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:

  • <RESOURCE_PROJECT_NUMBER> adalah nomor project Google Cloud yang berisi resource.
  • <NETWORK_PROJECT_NUMBER> adalah nomor project Google Cloud project 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:

  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.
  • <PERIMETER_NAME> adalah nama perimeter layanan.
  • <RESOURCE_PROJECT_INSIDE_THIS_PERIMETER> adalah nomor project Google Cloud project yang berada dalam perimeter.
  • <RESOURCE_PROJECT_OUTSIDE_THIS_PERIMETER> adalah nomor project dari 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 saat 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 Google Cloud resource jaringan dari luar perimeter. Misalnya, alamat IP yang sesuai dengan kolom callerIp dalam 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, maka pelanggaran ini mungkin disebabkan oleh layanan yang tidak terintegrasi dengan Kontrol Layanan VPC. Google Cloud Alasannya bisa jadi 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:

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

    Jika Anda menggunakan Google Cloud layanan yang tidak didukung oleh Kontrol Layanan VPC, alamat email yang termasuk dalam 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, alamat ini akan menjadi alamat IPv4 atau IPv6 publik.

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

  • <POLICY_NAME> adalah nama numerik kebijakan akses Anda.

  • <PERIMETER_NAME> adalah nama perimeter layanan.

Perhatikan bahwa dalam kasus ini, metadata.accessLevels masih dapat ada karena tingkat 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 mencakup 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 di 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 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

Catatan 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 membedakannya. Resource yang relevan yang dibahas 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 mencakup jaringan tempat VM berada, tidak berada di dalam perimeter layanan. Dalam hal ini, akses ditolak seperti yang diharapkan.

Kueri BigQuery lintas project

Dalam contoh ini, VM yang termasuk dalam project perimeter-network berupaya 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

Catatan 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"
}

Dengan melihat callerNetwork dan VpcServiceControlAuditMetadata.resourceNames, kita dapat melihat tiga project: perimeter-network, 117961063178 (corp-resources-public), dan 690885588241 (corp-resources-protected). Ingatlah 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 berada di project corp-resources-protected, ke bucket lain, yang berada 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.

Catatan 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, catatan 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 di luar perimeter

Dalam contoh ini, VM di project public-network menggunakan perintah untuk memindahkan file dari satu bucket Cloud Storage, yang berada di project corp-resources-protected, ke bucket lain, yang berada 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.

Catatan 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). Ingatlah bahwa permintaan berasal dari luar perimeter (VM di public-network), dan salah satu bucket ada di luar perimeter (corp-resources-public-1).

Dari luar perimeter, seseorang dapat menulis ke bucket corp-resources-public-1, sehingga pemeriksaan yang gagal dalam contoh sebelumnya berhasil. Namun, pemeriksaan berikutnya untuk menyalin data yang sebenarnya gagal.

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

Penyalinan 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 berbagi perimeter, 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

Catatan 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 pokok yang menampilkan semua resource yang digunakan dalam permintaan ini karena batasan mekanisme logging dan arsitektur terdistribusi BigQuery.

Entri 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 karena upaya untuk mengekstraksi data ke corp-resources-public.

Contoh ini mengilustrasikan bahwa satu operasi konseptual, seperti menyalin data, dapat memicu beberapa upaya untuk mengakses data dari sistem penyimpanan yang berbeda, 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.

Tugas Dataproc membaca 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 catatan 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. Entri log audit menunjukkan bahwa operasi gagal karena jaringan di project corp-resources-private mencoba mengakses data (menulis, dalam kasus ini) resource di bucket corp-resources-public-1. Karena batasan log audit Cloud Storage, tidak jelas bucket project mana yang dimiliki 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 wajar.

Error karena layanan yang tidak didukung

Beberapa layanan Google Cloud bergantung pada layanan Google Cloud lain sebagai bagian dari penerapannya. Jika layanan yang tidak didukung seperti App Engine digunakan di dalam project yang dilindungi oleh perimeter, resource layanan 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 menghasilkan error 403. Misalnya, Kontrol Layanan VPC tidak mendukung App Engine, sehingga App Engine Admin API tidak tersedia saat menggunakan VIP terbatas.

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 diperkirakan terjadi untuk layanan yang tidak didukung oleh Kontrol Layanan VPC dan tidak tersedia di VIP yang dibatasi. Jika error ini terjadi pada layanan yang didukung oleh Kontrol Layanan VPC, sebaiknya periksa batasan layanan yang diketahui untuk layanan tersebut guna melihat apakah error tersebut merupakan batasan yang diketahui. Jika tidak, masalah harus dilaporkan.

Ekspor 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, sementara 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

Catatan 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"
}

Entri log audit dibuat untuk BigQuery, bukan untuk Logging. Hal ini karena BigQuery adalah layanan tujuan yang coba ditulisi oleh Logging.

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

Contoh ini menunjukkan bahwa untuk kasus saat satu layanan Google Cloud memanggil layanan lain menggunakan akun layanan terkelola yang bersifat internal untuk Google Cloud, sepertip927005422713-439672@gcp-sa-logging.iam.gserviceaccount.com, "project jaringan" (dalam hal ini, perimeter-network) 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 berada 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.

Catatan 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 menjalankan perintah.

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

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

{
 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 dua project 1004338142803 (corp-resources-private-1) dan corp-resources-public sedang digunakan untuk menyelesaikan perintah. Karena project tersebut tidak berbagi perimeter, tugas ekstraksi gagal.

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

Akses perimeter melalui gateway Cloud NAT

Dalam contoh ini, asumsikan bahwa project A dari Org A tidak dikonfigurasi dalam perimeter mana pun. Project B diamankan oleh perimeter di organisasi yang berbeda. Resource pribadi di project A menggunakan gateway Cloud NAT untuk mengakses internet serta Google API dan layanan Google. 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) berupaya mengakses resource yang dilindungi di project B, tetapi koneksi gagal, dan catatan 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. Daripada alamat IP eksternal gateway Cloud NAT, resource callerIp menampilkan gce-internal-ip.

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

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

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

Langkah berikutnya