Collecter les journaux Oracle DB
Ce guide explique comment ingérer des journaux Oracle DB dans Google Security Operations à l'aide de l'agent Bindplane.
L'analyseur extrait les champs des messages SYSLOG, en gérant plusieurs formats à l'aide de modèles Grok et de l'analyse clé-valeur. Il mappe ensuite ces champs extraits au modèle de données unifié (UDM), en enrichissant les données avec des métadonnées statiques telles que les noms de fournisseur et de produit, et en définissant dynamiquement les types d'événements en fonction de valeurs de champ spécifiques telles que ACTION et USERID.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
Une instance Google SecOps
Windows Server 2016 ou version ultérieure, ou hôte Linux avec
systemdConnectivité réseau entre l'agent Bindplane et l'hôte de la base de données Oracle
Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports de pare-feu sont ouverts conformément aux exigences de l'agent Bindplane.
Accès privilégié à l'instance Oracle Database (rôle SYSDBA ou AUDIT_ADMIN)
Oracle Database 19c ou version ultérieure avec l'audit unifié activé (ou l'audit en mode mixte sur Oracle 12c–18c)
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
Installez l'agent Bindplane sur votre système d'exploitation Windows ou Linux en suivant les instructions ci-dessous.
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" /quietAttendez la fin de l'installation.
Vérifiez l'installation en exécutant la commande suivante :
sc query observiq-otel-collector
Le service doit être indiqué comme RUNNING (EN COURS D'EXÉCUTION).
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.shAttendez la fin de l'installation.
Vérifiez l'installation en exécutant la commande suivante :
sudo systemctl status observiq-otel-collector
Le service doit être indiqué comme actif (en cours d'exécution).
Ressources d'installation supplémentaires
Pour obtenir d'autres options d'installation et de dépannage, consultez le guide d'installation de l'agent Bindplane.
Configurer l'agent Bindplane pour ingérer les journaux syslog et les envoyer à Google SecOps
Localiser le fichier de configuration
Linux :
```bash
sudo nano /etc/bindplane-agent/config.yaml
```
Windows :
```cmd
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
```
Modifiez le fichier de configuration
Remplacez l'intégralité du contenu de config.yaml par la configuration suivante :
```yaml
receivers:
udplog:
listen_address: "0.0.0.0:514"
exporters:
chronicle/oracle_db:
compression: gzip
creds_file_path: '/path/to/ingestion-authentication-file.json'
customer_id: '<customer_id>'
endpoint: malachiteingestion-pa.googleapis.com
log_type: ORACLE_DB
raw_log_field: body
ingestion_labels:
log_type: 'ORACLE_DB'
service:
pipelines:
logs/oracle_to_chronicle:
receivers:
- udplog
exporters:
- chronicle/oracle_db
```
Paramètres de configuration
- Remplacez les espaces réservés suivants :
Configuration du récepteur :
* listen_address : adresse IP et port à écouter :
- Remplacez 0.0.0.0 par une adresse IP spécifique pour écouter sur une interface, ou laissez 0.0.0.0 pour écouter sur toutes les interfaces (recommandé).
- Remplacez 514 par le numéro de port correspondant à la configuration de transfert syslog Oracle.
Configuration de l'exportateur :
* creds_file_path : chemin d'accès complet au fichier d'authentification de l'ingestion :
- Linux : /etc/bindplane-agent/ingestion-auth.json
- Windows : C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
* customer_id : ID client copié dans la section Obtenir l'ID client Google SecOps
* endpoint : URL du point de terminaison régional :
- États-Unis : malachiteingestion-pa.googleapis.com
- Europe : europe-malachiteingestion-pa.googleapis.com
- Asie : asia-southeast1-malachiteingestion-pa.googleapis.com
- Consultez Points de terminaison régionaux pour obtenir la liste complète.
Enregistrez le fichier de configuration.
- Après avoir modifié le fichier, enregistrez-le :
- Linux : appuyez sur
Ctrl+O, puis surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
- Linux : appuyez sur
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 observiq-otel-collector- Vérifiez que le service est en cours d'exécution :
sudo systemctl status observiq-otel-collector- Recherchez les erreurs dans les journaux :
sudo journalctl -u observiq-otel-collector -fPour redémarrer l'agent Bindplane dans Windows, choisissez l'une des options suivantes :
- Invite de commandes ou PowerShell en tant qu'administrateur :
net stop observiq-otel-collector && net start observiq-otel-collector- Console Services :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Localisez observIQ OpenTelemetry Collector.
- Effectuez un clic droit, puis sélectionnez Redémarrer.
- Appuyez sur
- Vérifiez que le service est en cours d'exécution :
sc query observiq-otel-collector- Recherchez les erreurs dans les journaux :
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configurer l'audit unifié de base de données Oracle et le transfert syslog
Activer l'audit unifié
Si l'audit unifié n'est pas encore activé, reliez les binaires Oracle avec l'option uniaud_on. Pour cela, vous devez arrêter tous les processus Oracle exécutés à partir d'Oracle Home (instance de base de données et écouteur).
- Connectez-vous à l'hôte Oracle Database en tant qu'utilisateur
oracledu système d'exploitation. Arrêtez l'instance et l'écouteur Oracle :
sqlplus / as sysdba <<EOF shutdown immediate; exit EOF lsnrctl stopReliez les binaires Oracle avec l'audit unifié activé :
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk uniaud_on ioracleDémarrez l'écouteur et l'instance Oracle :
lsnrctl start sqlplus / as sysdba <<EOF startup; exit EOFSi Oracle Enterprise Manager Cloud Control s'exécute sur le même hôte, redémarrez-le :
cd /u01/app/oracle/product/middleware/oms export OMS_HOME=/u01/app/oracle/product/middleware/oms $OMS_HOME/bin/emctl start omsVérifiez que l'audit unifié est activé. Connectez-vous à la base de données Oracle avec SQLplus :
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
Vérifiez que la commande renvoie une ligne avec VALUE égal à TRUE.
Configurer la sortie syslog de l'audit unifié
Définissez le paramètre d'initialisation UNIFIED_AUDIT_SYSTEMLOG pour écrire les enregistrements d'audit unifiés dans syslog. Ce paramètre a été introduit dans Oracle 19c et remplace le paramètre AUDIT_SYSLOG_LEVEL obsolète (qui ne s'applique qu'à l'audit traditionnel).
- Connectez-vous à la base de données Oracle avec SQLplus en tant que SYSDBA.
Définissez le paramètre
UNIFIED_AUDIT_SYSTEMLOG:- Sur les systèmes UNIX/Linux, définissez le paramètre sur une valeur
facility.priority:
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = 'LOCAL7.INFO' SCOPE=SPFILE;- Sur les systèmes Windows, définissez le paramètre sur
TRUEpour écrire dans l'Observateur d'événements Windows :
ALTER SYSTEM SET UNIFIED_AUDIT_SYSTEMLOG = TRUE SCOPE=SPFILE;- Sur les systèmes UNIX/Linux, définissez le paramètre sur une valeur
Facultatif : Pour écrire les enregistrements de règles d'audit unifiés courants à partir d'un conteneur racine CDB dans syslog sur les systèmes UNIX/Linux, définissez le paramètre
UNIFIED_AUDIT_COMMON_SYSTEMLOG:ALTER SYSTEM SET UNIFIED_AUDIT_COMMON_SYSTEMLOG = TRUE SCOPE=SPFILE;Redémarrez l'instance Oracle Database pour que les modifications de paramètres prennent effet :
SHUTDOWN IMMEDIATE; STARTUP;
Configurer le daemon syslog sur l'hôte Oracle
Sur l'hôte de la base de données Oracle, configurez le daemon syslog pour qu'il transfère les entrées du journal d'audit à l'agent BindPlane.
- Connectez-vous à l'hôte de la base de données Oracle en tant que
root. Ouvrez le fichier de configuration syslog :
- Sur RHEL/CentOS/Oracle Linux avec rsyslog :
sudo vi /etc/rsyslog.conf- Sur les anciens systèmes avec syslog :
sudo vi /etc/syslog.confAjoutez une règle de transfert qui correspond à la facilité et à la priorité que vous avez configurées dans
UNIFIED_AUDIT_SYSTEMLOG. Par exemple, si vous définissezLOCAL7.INFO:- Pour transférer via UDP (récepteur
udplogBindplane correspondant) :
local7.info @<BINDPLANE_HOST_IP>:514- Pour transférer via TCP (si Bindplane utilise le récepteur
tcplog) :
local7.info @@<BINDPLANE_HOST_IP>:514- Pour transférer via UDP (récepteur
Remplacez <BINDPLANE_HOST_IP> par l'adresse IP ou le nom d'hôte du système exécutant l'agent Bindplane.
Note: A single `@` prefix indicates UDP forwarding. A double `@@` prefix indicates TCP forwarding. Ensure this matches the receiver type in the Bindplane `config.yaml`.
Facultatif : Pour conserver également une copie locale des journaux d'audit, ajoutez la ligne suivante :
local7.info /var/log/oracle_audit.logEnregistrez le fichier et redémarrez le daemon syslog :
- Sur RHEL/CentOS/Oracle Linux avec rsyslog :
sudo systemctl restart rsyslog- Sur les anciens systèmes avec syslog :
sudo service syslog restart
Vérifier le transfert des journaux d'audit
Générez un événement d'audit de test en effectuant une action auditable dans la base de données Oracle. Par exemple, connectez-vous en tant qu'utilisateur et exécutez la commande suivante :
SELECT * FROM DBA_USERS WHERE ROWNUM = 1;Consultez les journaux de l'agent Bindplane pour les messages syslog entrants :
sudo journalctl -u observiq-otel-collector -fVérifiez que le message syslog contient le tag
Oracle Unified Auditavec des paires clé/valeur telles queTYPE,DBID,SESID,DBUSER,ACTIONetRETCODE.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
ACTION |
security_result.action_details |
La valeur de ACTION du journal brut est directement mappée sur ce champ UDM. Une logique supplémentaire est appliquée pour déterminer security_result.action et security_result.description en fonction de la valeur de ACTION (par exemple, 100 correspond à ALLOW et Success). |
ACTION_NAME |
metadata.product_event_type |
Mappé directement. |
ACTION_NUMBER |
additional.fields[action_number].value.string_value |
Mappé directement avec la clé Source Event. Également utilisé en combinaison avec d'autres champs pour dériver metadata.event_type et metadata.product_event_type. |
APPLICATION_CONTEXTS |
additional.fields[application_contexts_label].value.string_value |
Mappé directement avec la clé APPLICATION_CONTEXTS. |
AUDIT_POLICY |
additional.fields[audit_policy_label].value.string_value ou additional.fields[AUDIT_POLICY_#].value.string_value |
Si AUDIT_POLICY contient une virgule, il est divisé en plusieurs libellés avec des clés telles que AUDIT_POLICY_0, AUDIT_POLICY_1, etc. Sinon, il est mappé directement avec la clé AUDIT_POLICY. |
AUDIT_TYPE |
additional.fields[audit_type_label].value.string_value |
Mappé directement avec la clé AUDIT_TYPE. |
AUTHENTICATION_TYPE |
metadata.event_type, extensions.auth.type |
Permet de dériver metadata.event_type en tant que USER_LOGIN si auth_type (extrait de AUTHENTICATION_TYPE) n'est pas vide et si d'autres conditions sont remplies. extensions.auth.type est défini sur AUTHTYPE_UNSPECIFIED. |
CLIENT_ADDRESS |
principal.ip, principal.port, network.ip_protocol, intermediary[host].user.userid |
L'adresse IP, le port et le protocole sont extraits à l'aide de modèles Grok. Si un nom d'utilisateur est présent dans le champ CLIENT_ADDRESS, il est mappé à intermediary[host].user.userid. |
CLIENT_ID |
target.user.userid |
Mappé directement. |
CLIENT_PROGRAM_NAME |
additional.fields[client_program_name_label].value.string_value |
Mappé directement avec la clé CLIENT_PROGRAM_NAME. |
CLIENT_TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mappé directement avec la clé CLIENT_TERMINAL. |
CLIENT_USER |
target.user.user_display_name |
Mappé directement. |
COMMENT$TEXT |
additional.fields[comment_text_label].value.string_value |
Directement mappé avec la clé comment_text après avoir remplacé + par :. |
CURRENT_USER |
additional.fields[current_user_label].value.string_value |
Mappé directement avec la clé current_user. |
CURUSER |
additional.fields[current_user_label].value.string_value |
Mappé directement avec la clé current_user. |
DATABASE_USER |
principal.user.user_display_name |
Mappé directement s'il n'est pas vide ou si la valeur est /. |
DBID |
metadata.product_log_id |
Mappé directement après la suppression des guillemets simples. |
DBNAME |
target.resource.resource_type, target.resource.resource_subtype, target.resource.name |
Définit resource_type sur DATABASE, resource_subtype sur Oracle Database et mappe DBNAME sur name. |
DBPROXY_USERRNAME |
intermediary[dbproxy].user.userid |
Mappé directement. |
DBUSERNAME |
target.user.user_display_name |
Mappé directement. |
ENTRYID |
target.resource.attribute.labels[entry_id_label].value |
Mappé directement avec la clé Entry Id. |
EXTERNAL_USERID |
additional.fields[external_userid_label].value.string_value |
Mappé directement avec la clé EXTERNAL_USERID. |
LENGTH |
additional.fields[length_label].value.string_value |
Mappé directement avec la clé length. |
LOGOFF$DEAD |
target.resource.attribute.labels[LOGOFFDEAD_label].value |
Mappé directement avec la clé LOGOFFDEAD. |
LOGOFF$LREAD |
target.resource.attribute.labels[LOGOFFLREAD_label].value |
Mappé directement avec la clé LOGOFFLREAD. |
LOGOFF$LWRITE |
target.resource.attribute.labels[LOGOFFLWRITE_label].value |
Mappé directement avec la clé LOGOFFLWRITE. |
LOGOFF$PREAD |
target.resource.attribute.labels[LOGOFFPREAD_label].value |
Mappé directement avec la clé LOGOFFPREAD. |
NTIMESTAMP# |
metadata.event_timestamp |
Analysée et convertie au format RFC 3339 ou ISO 8601. |
OBJCREATOR |
target.resource.attribute.labels[obj_creator_label].value |
Mappé directement avec la clé OBJ Creator. |
OBJNAME |
target.resource.attribute.labels[obj_name_label].value |
Mappé directement avec la clé OBJ Name. |
OS_USERNAME |
principal.user.user_display_name |
Mappé directement. |
OSUSERID |
target.user.userid |
Mappé directement. |
PDB_GUID |
principal.resource.product_object_id |
Mappé directement. |
PRIV$USED |
additional.fields[privused_label].value.string_value |
Mappé directement avec la clé privused. |
PRIVILEGE |
principal.user.attribute.permissions.name |
Mappé directement. |
RETURN_CODE |
security_result.summary |
Mappé directement. Une logique est appliquée pour dériver security_result.action et security_result.description. |
RETURNCODE |
security_result.summary |
Mappé directement. Une logique est appliquée pour dériver security_result.action et security_result.description. |
RLS_INFO |
additional.fields[rls_info_label].value.string_value |
Mappé directement avec la clé RLS_INFO. |
SCHEMA |
additional.fields[schema_label].value.string_value |
Mappé directement avec la clé schema. |
SESSIONCPU |
target.resource.attribute.labels[SESSIONCPU_label].value |
Mappé directement avec la clé SESSIONCPU. |
SESSIONID |
network.session_id |
Mappé directement. |
SESID |
network.session_id |
Mappé directement. |
SQL_TEXT |
target.process.command_line |
Mappé directement. |
SQLTEXT |
target.process.command_line |
Mappé directement. |
STATEMENT |
target.resource.attribute.labels[statement_label].value |
Mappé directement avec la clé STATEMENT. |
STATUS |
security_result.summary |
Mappé directement. Une logique est appliquée pour dériver security_result.action et security_result.description. |
SYSTEM_PRIVILEGE_USED |
additional.fields[system_privilege_used_label].value.string_value |
Mappé directement avec la clé SYSTEM_PRIVILEGE_USED. |
TARGET_USER |
additional.fields[target_user_label].value.string_value |
Mappé directement avec la clé TARGET_USER. |
TERMINAL |
additional.fields[CLIENT_TERMINAL_label].value |
Mappé directement avec la clé CLIENT_TERMINAL. |
TYPE |
additional.fields[type_label].value.string_value |
Mappé directement avec la clé type. |
USERHOST |
principal.hostname, principal.administrative_domain |
Le nom d'hôte et le domaine sont extraits à l'aide de modèles Grok. |
USERID |
principal.user.userid |
Mappé directement. |
device_host_name |
target.hostname |
Mappé directement. |
event_name |
metadata.product_event_type |
Mappé directement après la conversion en majuscules. |
file_name |
target.file.full_path |
Mappé directement. |
hostname |
principal.hostname |
Mappé directement. |
length |
additional.fields[length_label].value.string_value |
Mappé directement avec la clé length. |
log_source_name |
principal.application |
Mappé directement. |
message |
Diverses | Utilisé pour l'analyse grok afin d'extraire plusieurs champs. |
returncode |
RETURNCODE |
Mappé directement. |
src_ip |
principal.ip |
Mappé directement. |
t_hostname |
target.hostname |
Mappé directement. |
| (Logique de l'analyseur) | metadata.vendor_name |
Codé en dur sur Oracle. |
| (Logique de l'analyseur) | metadata.product_name |
Codé en dur sur Oracle DB. |
| (Logique de l'analyseur) | metadata.event_type |
Déterminée en fonction des valeurs de ACTION, ACTION_NUMBER, source_event, OSUSERID, USERID, SQLTEXT, AUTHENTICATION_TYPE, DBUSERNAME, device_host_name et database_name. La valeur par défaut est USER_RESOURCE_ACCESS si aucune condition spécifique n'est remplie. |
| (Logique de l'analyseur) | metadata.product_event_type |
Déterminé en fonction des valeurs de ACTION, ACTION_NUMBER, source_event, p_event_type et ACTION_NAME. |
| (Logique de l'analyseur) | metadata.log_type |
Codé en dur sur ORACLE_DB. |
| (Logique de l'analyseur) | extensions.auth.mechanism |
Définissez-le sur USERNAME_PASSWORD dans certaines conditions en fonction de ACTION, ACTION_NUMBER, source_event et OSUSERID. |
| (Logique de l'analyseur) | extensions.auth.type |
Définissez-la sur AUTHTYPE_UNSPECIFIED dans certaines conditions en fonction de ACTION, ACTION_NUMBER et AUTHENTICATION_TYPE. |
| (Logique de l'analyseur) | security_result.description |
Dérivé de RETURNCODE ou STATUS. |
| (Logique de l'analyseur) | security_result.action |
Dérivé de RETURNCODE ou STATUS. |
| (Logique de l'analyseur) | target.resource.attribute.labels |
Plusieurs libellés sont ajoutés en fonction de la présence et des valeurs de différents champs de journaux. |
| (Logique de l'analyseur) | additional.fields |
Plusieurs champs sont ajoutés sous forme de paires clé/valeur en fonction de la présence et des valeurs de différents champs de journaux. |
| (Logique de l'analyseur) | intermediary |
Créé et rempli en fonction de la présence et des valeurs de DBPROXY_USERRNAME et CLIENT_ADDRESS. |
| (Logique de l'analyseur) | network.ip_protocol |
Dérivé du protocole extrait de CLIENT_ADDRESS à l'aide d'un fichier d'inclusion parse_ip_protocol.include. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.