Collecter les journaux 1Password
Ce document explique comment ingérer des journaux 1Password dans Google Security Operations à l'aide de Bindplane. L'analyseur transforme les données de journaux brutes au format JSON en un format structuré conforme au modèle UDM (Unified Data Model) de Google SecOps. Il se concentre spécifiquement sur la normalisation et l'enrichissement des événements liés aux tentatives de connexion des utilisateurs, en extrayant des informations sur l'utilisateur, sa position, les informations sur le client et le résultat de la tentative.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps
- Hôte Windows 2016 ou version ultérieure, ou hôte Linux avec systemd
- Si vous exécutez le programme derrière un proxy, les ports du pare-feu sont ouverts.
- Accès privilégié à 1Password
Obtenir le fichier d'authentification d'ingestion Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agents de collecte.
- Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel Bindplane sera installé.
Obtenir l'ID client Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
- Copiez et enregistrez le numéro client de la section Informations sur l'organisation.
Installer l'agent Bindplane
Installation de fenêtres
- Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Installation de Linux
- Ouvrez un terminal avec les droits root ou sudo.
Exécutez la commande suivante :
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Ressources d'installation supplémentaires
Pour plus d'options d'installation, consultez le guide d'installation.
Configurer l'agent Bindplane pour ingérer Syslog et l'envoyer à Google SecOps
- Accédez au fichier de configuration :
- Recherchez le fichier
config.yaml
. En règle générale, il se trouve dans le répertoire/etc/bindplane-agent/
sous Linux ou dans le répertoire d'installation sous Windows. - Ouvrez le fichier à l'aide d'un éditeur de texte (par exemple,
nano
,vi
ou le Bloc-notes).
- Recherchez le fichier
Modifiez le fichier
config.yaml
comme suit :receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: 'ONEPASSWORD' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Remplacez le port et l'adresse IP selon les besoins de votre infrastructure.
Remplacez
<customer_id>
par le numéro client réel.Mettez à jour
/path/to/ingestion-authentication-file.json
avec le chemin d'accès à l'emplacement où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification pour l'ingestion Google SecOps.
Redémarrez l'agent Bindplane pour appliquer les modifications.
Pour redémarrer l'agent Bindplane sous Linux, exécutez la commande suivante :
sudo systemctl restart bindplane-agent
Pour redémarrer l'agent Bindplane sous Windows, vous pouvez utiliser la console Services ou saisir la commande suivante :
net stop BindPlaneAgent && net start BindPlaneAgent
Obtenir le jeton d'API 1Password
- Connectez-vous à l'interface utilisateur Web 1Password.
- Accédez à Intégrations.
- Cliquez sur Annuaire en haut de la page.
- Saisissez un nom pour le jeton et définissez sa date d'expiration.
- Dans Rapports sur les événements, cliquez sur Autre.
- Sélectionnez les types d'événements correspondants.
- Cliquez sur Issue Token (Émettre un jeton) pour générer la clé du jeton d'accès.
- Cliquez sur Enregistrer dans 1Password, puis sélectionnez le coffre-fort dans lequel enregistrer votre jeton.
- Cliquez sur Afficher les détails de l'intégration pour afficher le jeton.
Configurez un hôte Linux pour exécuter les éléments suivants :
Exécutez la commande suivante :
import datetime import requests import os import socket import json # For more information, check out the support page: https://support.1password.com/events-reporting api_token = os.environ.get('EVENTS_API_TOKEN') url = "https://events.1password.com" if not api_token: print("Please set the EVENTS_API_TOKEN environment variable.") exit(1) start_time = datetime.datetime.now() - datetime.timedelta(hours=24) # Define the bindplane agent details syslog_server_ip = <ip-address> # Replace with your Bindplane IP syslog_server_port = <port-number> # Replace with your Bindplane port headers = { "Content-Type": "application/json", "Authorization": f"Bearer {api_token}" payload = { "limit": 20, "start_time": start_time.astimezone().replace(microsecond=0).isoformat() # Alternatively, use the cursor returned from previous responses to get any new events # payload = { "cursor": cursor } try: r = requests.post(f"{url}/api/v1/signinattempts", headers=headers, json=payload) r.raise_for_status() # Raise an exception if the request fails if r.status_code == requests.codes.ok: # Send the response to the bindplane server syslog_message = f"{json.dumps(r.json())}" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.connect((syslog_server_ip, syslog_server_port)) sock.sendall(f"{syslog_message}\n".encode()) else: print(f"Error getting sign-in attempts: status code {r.status_code}") except requests.exceptions.RequestException as e: print(f"Request error: {e}") except Exception as e: print(f"Error during syslog logging: {e}")
Table de mappage UDM
Champ du journal | Mappage UDM | Logique |
---|---|---|
category | security_result.category_details | La valeur est extraite du champ category du journal brut. |
client.app_name | principal.application | La valeur est extraite du champ client.app_name du journal brut. |
client.app_version | metadata.product_version | La valeur est extraite du champ client.app_version du journal brut. |
client.ip_address | principal.ip | La valeur est extraite du champ client.ip_address du journal brut. |
client.os_name | principal.platform | La valeur est extraite du champ client.os_name du journal brut et mappée à la valeur de plate-forme UDM correspondante (LINUX, WINDOWS, MAC). |
client.os_version | principal.platform_version | La valeur est extraite du champ client.os_version du journal brut. |
client.platform_name | principal.resource.attribute.labels.key : platform_name , principal.resource.attribute.labels.value : Chrome |
La valeur est extraite du champ client.platform_name du journal brut. |
client.platform_version | principal.asset.platform_software.platform_version | La valeur est extraite du champ client.platform_version du journal brut. |
pays | principal.location.country_or_region | La valeur est extraite du champ country du journal brut si location.country n'est pas présent. |
item_uuid | security_result.about.resource.attribute.labels.key: item_uuid , security_result.about.resource.attribute.labels.value: nx4f2lhmafhhfkvgid6ff2fyh4 |
La valeur est extraite du champ item_uuid du journal brut. |
location.city | principal.location.city | La valeur est extraite du champ location.city du journal brut. |
location.country | principal.location.country_or_region | La valeur est extraite du champ location.country du journal brut. |
location.latitude | principal.location.region_latitude | La valeur est extraite du champ location.latitude du journal brut. |
location.longitude | principal.location.region_longitude | La valeur est extraite du champ location.longitude du journal brut. |
location.region | principal.location.name | La valeur est extraite du champ location.region du journal brut. |
session.ip | principal.ip | La valeur est extraite du champ session.ip du journal brut. |
session_uuid | network.session_id | La valeur est extraite du champ session_uuid du journal brut. |
target_user.email | target.user.email_addresses | La valeur est extraite du champ target_user.email du journal brut. |
target_user.uuid | target.user.userid | La valeur est extraite du champ target_user.uuid du journal brut. |
timestamp | metadata.event_timestamp.seconds, metadata.event_timestamp.nanos | La valeur est extraite du champ timestamp du journal brut, puis convertie en secondes et en nanosecondes. |
type | additional.fields.key : type , additional.fields.value.string_value : mfa_ok |
La valeur est extraite du champ type du journal brut. |
user.email | principal.user.email_addresses | La valeur est extraite du champ user.email du journal brut. |
nom.utilisateur | principal.user.user_display_name | La valeur est extraite du champ user.name du journal brut. |
used_version | additional.fields.key : used_version , additional.fields.value.string_value : 1 |
La valeur est extraite du champ used_version du journal brut. |
uuid | principal.resource.attribute.labels.key : uuid , principal.resource.attribute.labels.value : EPNGUJLHFVHCXMJL5LJQGXTENA |
La valeur est extraite du champ uuid du journal brut. |
vault_uuid | security_result.about.resource.attribute.labels.key: vault_uuid , security_result.about.resource.attribute.labels.value: lddjidoxtrxteclqhubbo3pkyq |
La valeur est extraite du champ vault_uuid du journal brut. |
N/A | extensions.auth | Un objet vide est créé pour ce champ. |
N/A | metadata.event_type | La valeur est définie sur USER_LOGIN si category est success ou firewall_reported_success , sur STATUS_UPDATE si aucune information sur l'utilisateur n'est présente et sur USER_UNCATEGORIZED dans le cas contraire. |
N/A | metadata.log_type | La valeur est définie sur ONEPASSWORD . |
N/A | metadata.product_name | La valeur est définie sur ONEPASSWORD . |
N/A | metadata.vendor_name | La valeur est définie sur ONEPASSWORD . |
N/A | security_result.action | La valeur est définie sur ALLOW si category est success ou firewall_reported_success , sur BLOCK si category est credentials_failed , mfa_failed , modern_version_failed ou firewall_failed , et est laissée vide dans le cas contraire. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.