# GCP - Logging Enum

{{#include ../../../banners/hacktricks-training.md}}

## Informations de base

Ce service permet aux utilisateurs de stocker, rechercher, analyser, surveiller et alerter sur **les données et événements de journal** provenant de GCP.

Cloud Logging est entièrement intégré avec d'autres services GCP, fournissant un référentiel centralisé pour les journaux de toutes vos ressources GCP. Il **collecte automatiquement les journaux de divers services GCP** comme App Engine, Compute Engine et Cloud Functions. Vous pouvez également utiliser Cloud Logging pour des applications fonctionnant sur site ou dans d'autres clouds en utilisant l'agent ou l'API Cloud Logging.

Fonctionnalités clés :

- **Centralisation des données de journal :** Agréger les données de journal provenant de diverses sources, offrant une vue d'ensemble de vos applications et de votre infrastructure.
- **Gestion des journaux en temps réel :** Diffuser les journaux en temps réel pour une analyse et une réponse immédiates.
- **Analyse de données puissante :** Utiliser des capacités de filtrage et de recherche avancées pour trier rapidement de grands volumes de données de journal.
- **Intégration avec BigQuery :** Exporter les journaux vers BigQuery pour une analyse et des requêtes détaillées.
- **Métriques basées sur les journaux :** Créer des métriques personnalisées à partir de vos données de journal pour la surveillance et l'alerte.

### Flux de journaux

<figure><img src="../../../images/image (3) (1) (1).png" alt=""><figcaption><p><a href="https://betterstack.com/community/guides/logging/gcp-logging/">https://betterstack.com/community/guides/logging/gcp-logging/</a></p></figcaption></figure>

Fondamentalement, les sinks et les métriques basées sur les journaux détermineront où un journal doit être stocké.

### Configurations prises en charge par GCP Logging

Cloud Logging est hautement configurable pour répondre à divers besoins opérationnels :

1. **Seaux de journaux (Stockage des journaux sur le web) :** Définir des seaux dans Cloud Logging pour gérer **la conservation des journaux**, offrant un contrôle sur la durée de conservation de vos entrées de journal.
- Par défaut, les seaux `_Default` et `_Required` sont créés (l'un enregistre ce que l'autre n'enregistre pas).
- **\_Required** est :
````
```bash
LOG_ID("cloudaudit.googleapis.com/activity") OR LOG_ID("externalaudit.googleapis.com/activity") OR LOG_ID("cloudaudit.googleapis.com/system_event") OR LOG_ID("externalaudit.googleapis.com/system_event") OR LOG_ID("cloudaudit.googleapis.com/access_transparency") OR LOG_ID("externalaudit.googleapis.com/access_transparency")
```

````
- **La période de conservation** des données est configurée par bucket et doit être **d'au moins 1 jour.** Cependant, la **période de conservation de \_Required est de 400 jours** et ne peut pas être modifiée.
- Notez que les Log Buckets ne sont **pas visibles dans Cloud Storage.**

2. **Log Sinks (Routeur de logs dans le web) :** Créez des sinks pour **exporter des entrées de logs** vers diverses destinations telles que Pub/Sub, BigQuery ou Cloud Storage en fonction d'un **filtre**.
- Par **défaut**, des sinks pour les buckets `_Default` et `_Required` sont créés :
- ```bash
_Required  logging.googleapis.com/projects/<proj-name>/locations/global/buckets/_Required  LOG_ID("cloudaudit.googleapis.com/activity") OR LOG_ID("externalaudit.googleapis.com/activity") OR LOG_ID("cloudaudit.googleapis.com/system_event") OR LOG_ID("externalaudit.googleapis.com/system_event") OR LOG_ID("cloudaudit.googleapis.com/access_transparency") OR LOG_ID("externalaudit.googleapis.com/access_transparency")
_Default   logging.googleapis.com/projects/<proj-name>/locations/global/buckets/_Default   NOT LOG_ID("cloudaudit.googleapis.com/activity") AND NOT LOG_ID("externalaudit.googleapis.com/activity") AND NOT LOG_ID("cloudaudit.googleapis.com/system_event") AND NOT LOG_ID("externalaudit.googleapis.com/system_event") AND NOT LOG_ID("cloudaudit.googleapis.com/access_transparency") AND NOT LOG_ID("externalaudit.googleapis.com/access_transparency")
```
- **Filtres d'exclusion :** Il est possible de configurer des **exclusions pour empêcher des entrées de logs spécifiques** d'être ingérées, ce qui permet d'économiser des coûts et de réduire le bruit inutile.
3. **Métriques basées sur les logs :** Configurez des **métriques personnalisées** basées sur le contenu des logs, permettant des alertes et un suivi basés sur les données de logs.
4. **Vues de logs :** Les vues de logs offrent un contrôle avancé et **granulaire sur qui a accès** aux logs dans vos buckets de logs.
- Cloud Logging **crée automatiquement la vue `_AllLogs` pour chaque bucket**, qui montre tous les logs. Cloud Logging crée également une vue pour le bucket `_Default` appelée `_Default`. La vue `_Default` pour le bucket `_Default` montre tous les logs sauf les logs d'audit d'accès aux données. Les vues `_AllLogs` et `_Default` ne sont pas modifiables.

Il est possible de permettre à un principal **d'utiliser uniquement une vue de log spécifique** avec une politique IAM comme :
```json
{
"bindings": [
{
"members": ["user:username@gmail.com"],
"role": "roles/logging.viewAccessor",
"condition": {
"title": "Bucket reader condition example",
"description": "Grants logging.viewAccessor role to user username@gmail.com for the VIEW_ID log view.",
"expression": "resource.name == \"projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME/views/VIEW_ID\""
}
}
],
"etag": "BwWd_6eERR4=",
"version": 3
}
```
### Journaux par défaut

Par défaut, les opérations **Admin Write** (également appelées journaux d'audit d'activité admin) sont celles qui sont enregistrées (écrire des métadonnées ou des informations de configuration) et **ne peuvent pas être désactivées**.

Ensuite, l'utilisateur peut activer les **journaux d'audit d'accès aux données**, qui sont **Admin Read, Data Write et Data Write**.

Vous pouvez trouver plus d'infos sur chaque type de journal dans la documentation : [https://cloud.google.com/iam/docs/audit-logging](https://cloud.google.com/iam/docs/audit-logging)

Cependant, notez que cela signifie qu'en par défaut, les actions **`GetIamPolicy`** et d'autres actions de lecture **ne sont pas enregistrées**. Donc, par défaut, un attaquant essayant d'énumérer l'environnement ne sera pas détecté si l'administrateur système n'a pas configuré la génération de journaux supplémentaires.

Pour activer plus de journaux dans la console, l'administrateur système doit se rendre sur [https://console.cloud.google.com/iam-admin/audit](https://console.cloud.google.com/iam-admin/audit) et les activer. Il existe 2 options différentes :

- **Configuration par défaut** : Il est possible de créer une configuration par défaut et d'enregistrer tous les journaux Admin Read et/ou Data Read et/ou Data Write et même d'ajouter des principaux exemptés :

<figure><img src="../../../images/image (338).png" alt=""><figcaption></figcaption></figure>

- **Sélectionner les services** : Ou simplement **sélectionner les services** pour lesquels vous souhaitez générer des journaux et le type de journaux ainsi que le principal exempté pour ce service spécifique.

Notez également qu'en par défaut, seuls ces journaux sont générés car générer plus de journaux augmentera les coûts.

### Énumération

L'outil en ligne de commande `gcloud` est une partie intégrante de l'écosystème GCP, vous permettant de gérer vos ressources et services. Voici comment vous pouvez utiliser `gcloud` pour gérer vos configurations de journaux et accéder aux journaux.
```bash
# List buckets
gcloud logging buckets list
gcloud logging buckets describe <bucket-name> --location <location>

# List log entries: only logs that contain log entries are listed.
gcloud logging logs list

# Get log metrics
gcloud logging metrics list
gcloud logging metrics describe <metric-name>

# Get log sinks
gcloud logging sinks list
gcloud logging sinks describe <sink-name>

# Get log views
gcloud logging views list --bucket <bucket> --location global
gcloud logging views describe --bucket <bucket> --location global <view-id> # view-id is usually the same as the bucket name

# Get log links
gcloud logging links list --bucket _Default --location global
gcloud logging links describe <link-id> --bucket _Default --location global
```
Exemple pour vérifier les journaux de **`cloudresourcemanager`** (celui utilisé pour BF permissions) : [https://console.cloud.google.com/logs/query;query=protoPayload.serviceName%3D%22cloudresourcemanager.googleapis.com%22;summaryFields=:false:32:beginning;cursorTimestamp=2024-01-20T00:07:14.482809Z;startTime=2024-01-01T11:12:26.062Z;endTime=2024-02-02T17:12:26.062Z?authuser=2\&project=digital-bonfire-410512](https://console.cloud.google.com/logs/query;query=protoPayload.serviceName%3D%22cloudresourcemanager.googleapis.com%22;summaryFields=:false:32:beginning;cursorTimestamp=2024-01-20T00:07:14.482809Z;startTime=2024-01-01T11:12:26.062Z;endTime=2024-02-02T17:12:26.062Z?authuser=2&project=digital-bonfire-410512)

Il n'y a pas de journaux de **`testIamPermissions`** :

<figure><img src="../../../images/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>

### Post Exploitation

{{#ref}}
../gcp-post-exploitation/gcp-logging-post-exploitation.md
{{#endref}}

### Persistence

{{#ref}}
../gcp-persistence/gcp-logging-persistence.md
{{#endref}}

## Références

- [https://cloud.google.com/logging/docs/logs-views#gcloud](https://cloud.google.com/logging/docs/logs-views#gcloud)
- [https://betterstack.com/community/guides/logging/gcp-logging/](https://betterstack.com/community/guides/logging/gcp-logging/)

{{#include ../../../banners/hacktricks-training.md}}
